diff --git a/dist/tangram.debug.js b/dist/tangram.debug.js index 35070b628..06c85f333 100644 --- a/dist/tangram.debug.js +++ b/dist/tangram.debug.js @@ -1,6 +1,418 @@ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Tangram = f()}})(function(){var define,module,exports;return (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 capacity) { + // Manually shift all values starting at the index back to the + // beginning of the queue. + for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) { + queue[scan] = queue[scan + index]; + } + queue.length -= index; + index = 0; + } + } + queue.length = 0; + index = 0; + flushing = false; +} + +// `requestFlush` is implemented using a strategy based on data collected from +// every available SauceLabs Selenium web driver worker at time of writing. +// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593 -},{}],2:[function(_dereq_,module,exports){ +// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that +// have WebKitMutationObserver but not un-prefixed MutationObserver. +// Must use `global` or `self` instead of `window` to work in both frames and web +// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop. + +/* globals self */ +var scope = typeof global !== "undefined" ? global : self; +var BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver; + +// MutationObservers are desirable because they have high priority and work +// reliably everywhere they are implemented. +// They are implemented in all modern browsers. +// +// - Android 4-4.3 +// - Chrome 26-34 +// - Firefox 14-29 +// - Internet Explorer 11 +// - iPad Safari 6-7.1 +// - iPhone Safari 7-7.1 +// - Safari 6-7 +if (typeof BrowserMutationObserver === "function") { + requestFlush = makeRequestCallFromMutationObserver(flush); + +// MessageChannels are desirable because they give direct access to the HTML +// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera +// 11-12, and in web workers in many engines. +// Although message channels yield to any queued rendering and IO tasks, they +// would be better than imposing the 4ms delay of timers. +// However, they do not work reliably in Internet Explorer or Safari. + +// Internet Explorer 10 is the only browser that has setImmediate but does +// not have MutationObservers. +// Although setImmediate yields to the browser's renderer, it would be +// preferrable to falling back to setTimeout since it does not have +// the minimum 4ms penalty. +// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and +// Desktop to a lesser extent) that renders both setImmediate and +// MessageChannel useless for the purposes of ASAP. +// https://github.com/kriskowal/q/issues/396 + +// Timers are implemented universally. +// We fall back to timers in workers in most engines, and in foreground +// contexts in the following browsers. +// However, note that even this simple case requires nuances to operate in a +// broad spectrum of browsers. +// +// - Firefox 3-13 +// - Internet Explorer 6-9 +// - iPad Safari 4.3 +// - Lynx 2.8.7 +} else { + requestFlush = makeRequestCallFromTimer(flush); +} + +// `requestFlush` requests that the high priority event queue be flushed as +// soon as possible. +// This is useful to prevent an error thrown in a task from stalling the event +// queue if the exception handled by Node.js’s +// `process.on("uncaughtException")` or by a domain. +rawAsap.requestFlush = requestFlush; + +// To request a high priority event, we induce a mutation observer by toggling +// the text of a text node between "1" and "-1". +function makeRequestCallFromMutationObserver(callback) { + var toggle = 1; + var observer = new BrowserMutationObserver(callback); + var node = document.createTextNode(""); + observer.observe(node, {characterData: true}); + return function requestCall() { + toggle = -toggle; + node.data = toggle; + }; +} + +// The message channel technique was discovered by Malte Ubl and was the +// original foundation for this library. +// http://www.nonblocking.io/2011/06/windownexttick.html + +// Safari 6.0.5 (at least) intermittently fails to create message ports on a +// page's first load. Thankfully, this version of Safari supports +// MutationObservers, so we don't need to fall back in that case. + +// function makeRequestCallFromMessageChannel(callback) { +// var channel = new MessageChannel(); +// channel.port1.onmessage = callback; +// return function requestCall() { +// channel.port2.postMessage(0); +// }; +// } + +// For reasons explained above, we are also unable to use `setImmediate` +// under any circumstances. +// Even if we were, there is another bug in Internet Explorer 10. +// It is not sufficient to assign `setImmediate` to `requestFlush` because +// `setImmediate` must be called *by name* and therefore must be wrapped in a +// closure. +// Never forget. + +// function makeRequestCallFromSetImmediate(callback) { +// return function requestCall() { +// setImmediate(callback); +// }; +// } + +// Safari 6.0 has a problem where timers will get lost while the user is +// scrolling. This problem does not impact ASAP because Safari 6.0 supports +// mutation observers, so that implementation is used instead. +// However, if we ever elect to use timers in Safari, the prevalent work-around +// is to add a scroll event listener that calls for a flush. + +// `setTimeout` does not call the passed callback if the delay is less than +// approximately 7 in web workers in Firefox 8 through 18, and sometimes not +// even then. + +function makeRequestCallFromTimer(callback) { + return function requestCall() { + // We dispatch a timeout with a specified delay of 0 for engines that + // can reliably accommodate that request. This will usually be snapped + // to a 4 milisecond delay, but once we're flushing, there's no delay + // between events. + var timeoutHandle = setTimeout(handleTimer, 0); + // However, since this timer gets frequently dropped in Firefox + // workers, we enlist an interval handle that will try to fire + // an event 20 times per second until it succeeds. + var intervalHandle = setInterval(handleTimer, 50); + + function handleTimer() { + // Whichever timer succeeds will cancel both timers and + // execute the callback. + clearTimeout(timeoutHandle); + clearInterval(intervalHandle); + callback(); + } + }; +} + +// This is for `asap.js` only. +// Its name will be periodically randomized to break any code that depends on +// its existence. +rawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer; + +// ASAP was originally a nextTick shim included in Q. This was factored out +// into this ASAP package. It was later adapted to RSVP which made further +// amendments. These decisions, particularly to marginalize MessageChannel and +// to capture the MutationObserver implementation in a closure, were integrated +// back into ASAP proper. +// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],3:[function(_dereq_,module,exports){ +'use strict' + +exports.byteLength = byteLength +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i +} + +revLookup['-'.charCodeAt(0)] = 62 +revLookup['_'.charCodeAt(0)] = 63 + +function placeHoldersCount (b64) { + var len = b64.length + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 +} + +function byteLength (b64) { + // base64 is 4/3 + up to two characters of the original data + return b64.length * 3 / 4 - placeHoldersCount(b64) +} + +function toByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + var len = b64.length + placeHolders = placeHoldersCount(b64) + + arr = new Arr(len * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len + + var L = 0 + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] + arr[L++] = (tmp >> 16) & 0xFF + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[L++] = tmp & 0xFF + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var output = '' + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + output += lookup[tmp >> 2] + output += lookup[(tmp << 4) & 0x3F] + output += '==' + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) + output += lookup[tmp >> 10] + output += lookup[(tmp >> 4) & 0x3F] + output += lookup[(tmp << 2) & 0x3F] + output += '=' + } + + parts.push(output) + + return parts.join('') +} + +},{}],4:[function(_dereq_,module,exports){ + +},{}],5:[function(_dereq_,module,exports){ (function (global){ /*! * The buffer module from node.js, for the browser. @@ -1794,758 +2206,1237 @@ function isnan (val) { }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"base64-js":3,"ieee754":4,"isarray":5}],3:[function(_dereq_,module,exports){ -'use strict' - -exports.byteLength = byteLength -exports.toByteArray = toByteArray -exports.fromByteArray = fromByteArray - -var lookup = [] -var revLookup = [] -var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array +},{"base64-js":3,"ieee754":91,"isarray":94}],6:[function(_dereq_,module,exports){ +_dereq_('../modules/es6.object.to-string'); +_dereq_('../modules/es6.string.iterator'); +_dereq_('../modules/web.dom.iterable'); +_dereq_('../modules/es6.promise'); +module.exports = _dereq_('../modules/_core').Promise; +},{"../modules/_core":14,"../modules/es6.object.to-string":66,"../modules/es6.promise":67,"../modules/es6.string.iterator":68,"../modules/web.dom.iterable":69}],7:[function(_dereq_,module,exports){ +module.exports = function(it){ + if(typeof it != 'function')throw TypeError(it + ' is not a function!'); + return it; +}; +},{}],8:[function(_dereq_,module,exports){ +// 22.1.3.31 Array.prototype[@@unscopables] +var UNSCOPABLES = _dereq_('./_wks')('unscopables') + , ArrayProto = Array.prototype; +if(ArrayProto[UNSCOPABLES] == undefined)_dereq_('./_hide')(ArrayProto, UNSCOPABLES, {}); +module.exports = function(key){ + ArrayProto[UNSCOPABLES][key] = true; +}; +},{"./_hide":25,"./_wks":63}],9:[function(_dereq_,module,exports){ +module.exports = function(it, Constructor, name, forbiddenField){ + if(!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)){ + throw TypeError(name + ': incorrect invocation!'); + } return it; +}; +},{}],10:[function(_dereq_,module,exports){ +var isObject = _dereq_('./_is-object'); +module.exports = function(it){ + if(!isObject(it))throw TypeError(it + ' is not an object!'); + return it; +}; +},{"./_is-object":31}],11:[function(_dereq_,module,exports){ +// false -> Array#indexOf +// true -> Array#includes +var toIObject = _dereq_('./_to-iobject') + , toLength = _dereq_('./_to-length') + , toIndex = _dereq_('./_to-index'); +module.exports = function(IS_INCLUDES){ + return function($this, el, fromIndex){ + var O = toIObject($this) + , length = toLength(O.length) + , index = toIndex(fromIndex, length) + , value; + // Array#includes uses SameValueZero equality algorithm + if(IS_INCLUDES && el != el)while(length > index){ + value = O[index++]; + if(value != value)return true; + // Array#toIndex ignores holes, Array#includes - not + } else for(;length > index; index++)if(IS_INCLUDES || index in O){ + if(O[index] === el)return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; +},{"./_to-index":56,"./_to-iobject":58,"./_to-length":59}],12:[function(_dereq_,module,exports){ +// getting tag from 19.1.3.6 Object.prototype.toString() +var cof = _dereq_('./_cof') + , TAG = _dereq_('./_wks')('toStringTag') + // ES3 wrong here + , ARG = cof(function(){ return arguments; }()) == 'Arguments'; -var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i] - revLookup[code.charCodeAt(i)] = i -} +// fallback for IE11 Script Access Denied error +var tryGet = function(it, key){ + try { + return it[key]; + } catch(e){ /* empty */ } +}; -revLookup['-'.charCodeAt(0)] = 62 -revLookup['_'.charCodeAt(0)] = 63 +module.exports = function(it){ + var O, T, B; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T + // builtinTag case + : ARG ? cof(O) + // ES3 arguments fallback + : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; +}; +},{"./_cof":13,"./_wks":63}],13:[function(_dereq_,module,exports){ +var toString = {}.toString; -function placeHoldersCount (b64) { - var len = b64.length - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') +module.exports = function(it){ + return toString.call(it).slice(8, -1); +}; +},{}],14:[function(_dereq_,module,exports){ +var core = module.exports = {version: '2.4.0'}; +if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef +},{}],15:[function(_dereq_,module,exports){ +// optional / simple context binding +var aFunction = _dereq_('./_a-function'); +module.exports = function(fn, that, length){ + aFunction(fn); + if(that === undefined)return fn; + switch(length){ + case 1: return function(a){ + return fn.call(that, a); + }; + case 2: return function(a, b){ + return fn.call(that, a, b); + }; + case 3: return function(a, b, c){ + return fn.call(that, a, b, c); + }; } + return function(/* ...args */){ + return fn.apply(that, arguments); + }; +}; +},{"./_a-function":7}],16:[function(_dereq_,module,exports){ +// 7.2.1 RequireObjectCoercible(argument) +module.exports = function(it){ + if(it == undefined)throw TypeError("Can't call method on " + it); + return it; +}; +},{}],17:[function(_dereq_,module,exports){ +// Thank's IE8 for his funny defineProperty +module.exports = !_dereq_('./_fails')(function(){ + return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; +}); +},{"./_fails":21}],18:[function(_dereq_,module,exports){ +var isObject = _dereq_('./_is-object') + , document = _dereq_('./_global').document + // in old IE typeof document.createElement is 'object' + , is = isObject(document) && isObject(document.createElement); +module.exports = function(it){ + return is ? document.createElement(it) : {}; +}; +},{"./_global":23,"./_is-object":31}],19:[function(_dereq_,module,exports){ +// IE 8- don't enum bug keys +module.exports = ( + 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' +).split(','); +},{}],20:[function(_dereq_,module,exports){ +var global = _dereq_('./_global') + , core = _dereq_('./_core') + , hide = _dereq_('./_hide') + , redefine = _dereq_('./_redefine') + , ctx = _dereq_('./_ctx') + , PROTOTYPE = 'prototype'; - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 -} - -function byteLength (b64) { - // base64 is 4/3 + up to two characters of the original data - return b64.length * 3 / 4 - placeHoldersCount(b64) -} - -function toByteArray (b64) { - var i, j, l, tmp, placeHolders, arr - var len = b64.length - placeHolders = placeHoldersCount(b64) - - arr = new Arr(len * 3 / 4 - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? len - 4 : len - - var L = 0 - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] - arr[L++] = (tmp >> 16) & 0xFF - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF +var $export = function(type, name, source){ + var IS_FORCED = type & $export.F + , IS_GLOBAL = type & $export.G + , IS_STATIC = type & $export.S + , IS_PROTO = type & $export.P + , IS_BIND = type & $export.B + , target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE] + , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) + , expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}) + , key, own, out, exp; + if(IS_GLOBAL)source = name; + for(key in source){ + // contains in native + own = !IS_FORCED && target && target[key] !== undefined; + // export native or passed + out = (own ? target : source)[key]; + // bind timers to global for call from export context + exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; + // extend global + if(target)redefine(target, key, out, type & $export.U); + // export + if(exports[key] != out)hide(exports, key, exp); + if(IS_PROTO && expProto[key] != out)expProto[key] = out; } - - if (placeHolders === 2) { - tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[L++] = tmp & 0xFF - } else if (placeHolders === 1) { - tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF +}; +global.core = core; +// type bitmap +$export.F = 1; // forced +$export.G = 2; // global +$export.S = 4; // static +$export.P = 8; // proto +$export.B = 16; // bind +$export.W = 32; // wrap +$export.U = 64; // safe +$export.R = 128; // real proto method for `library` +module.exports = $export; +},{"./_core":14,"./_ctx":15,"./_global":23,"./_hide":25,"./_redefine":48}],21:[function(_dereq_,module,exports){ +module.exports = function(exec){ + try { + return !!exec(); + } catch(e){ + return true; } - - return arr -} - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] -} - -function encodeChunk (uint8, start, end) { - var tmp - var output = [] - for (var i = start; i < end; i += 3) { - tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output.push(tripletToBase64(tmp)) +}; +},{}],22:[function(_dereq_,module,exports){ +var ctx = _dereq_('./_ctx') + , call = _dereq_('./_iter-call') + , isArrayIter = _dereq_('./_is-array-iter') + , anObject = _dereq_('./_an-object') + , toLength = _dereq_('./_to-length') + , getIterFn = _dereq_('./core.get-iterator-method') + , BREAK = {} + , RETURN = {}; +var exports = module.exports = function(iterable, entries, fn, that, ITERATOR){ + var iterFn = ITERATOR ? function(){ return iterable; } : getIterFn(iterable) + , f = ctx(fn, that, entries ? 2 : 1) + , index = 0 + , length, step, iterator, result; + if(typeof iterFn != 'function')throw TypeError(iterable + ' is not iterable!'); + // fast case for arrays with default iterator + if(isArrayIter(iterFn))for(length = toLength(iterable.length); length > index; index++){ + result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); + if(result === BREAK || result === RETURN)return result; + } else for(iterator = iterFn.call(iterable); !(step = iterator.next()).done; ){ + result = call(iterator, f, step.value, entries); + if(result === BREAK || result === RETURN)return result; } - return output.join('') -} - -function fromByteArray (uint8) { - var tmp - var len = uint8.length - var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes - var output = '' - var parts = [] - var maxChunkLength = 16383 // must be multiple of 3 +}; +exports.BREAK = BREAK; +exports.RETURN = RETURN; +},{"./_an-object":10,"./_ctx":15,"./_is-array-iter":30,"./_iter-call":32,"./_to-length":59,"./core.get-iterator-method":64}],23:[function(_dereq_,module,exports){ +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); +if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef +},{}],24:[function(_dereq_,module,exports){ +var hasOwnProperty = {}.hasOwnProperty; +module.exports = function(it, key){ + return hasOwnProperty.call(it, key); +}; +},{}],25:[function(_dereq_,module,exports){ +var dP = _dereq_('./_object-dp') + , createDesc = _dereq_('./_property-desc'); +module.exports = _dereq_('./_descriptors') ? function(object, key, value){ + return dP.f(object, key, createDesc(1, value)); +} : function(object, key, value){ + object[key] = value; + return object; +}; +},{"./_descriptors":17,"./_object-dp":41,"./_property-desc":46}],26:[function(_dereq_,module,exports){ +module.exports = _dereq_('./_global').document && document.documentElement; +},{"./_global":23}],27:[function(_dereq_,module,exports){ +module.exports = !_dereq_('./_descriptors') && !_dereq_('./_fails')(function(){ + return Object.defineProperty(_dereq_('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7; +}); +},{"./_descriptors":17,"./_dom-create":18,"./_fails":21}],28:[function(_dereq_,module,exports){ +// fast apply, http://jsperf.lnkit.com/fast-apply/5 +module.exports = function(fn, args, that){ + var un = that === undefined; + switch(args.length){ + case 0: return un ? fn() + : fn.call(that); + case 1: return un ? fn(args[0]) + : fn.call(that, args[0]); + case 2: return un ? fn(args[0], args[1]) + : fn.call(that, args[0], args[1]); + case 3: return un ? fn(args[0], args[1], args[2]) + : fn.call(that, args[0], args[1], args[2]); + case 4: return un ? fn(args[0], args[1], args[2], args[3]) + : fn.call(that, args[0], args[1], args[2], args[3]); + } return fn.apply(that, args); +}; +},{}],29:[function(_dereq_,module,exports){ +// fallback for non-array-like ES3 and non-enumerable old V8 strings +var cof = _dereq_('./_cof'); +module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){ + return cof(it) == 'String' ? it.split('') : Object(it); +}; +},{"./_cof":13}],30:[function(_dereq_,module,exports){ +// check on default Array iterator +var Iterators = _dereq_('./_iterators') + , ITERATOR = _dereq_('./_wks')('iterator') + , ArrayProto = Array.prototype; - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) +module.exports = function(it){ + return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); +}; +},{"./_iterators":37,"./_wks":63}],31:[function(_dereq_,module,exports){ +module.exports = function(it){ + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; +},{}],32:[function(_dereq_,module,exports){ +// call something on iterator step with safe closing on error +var anObject = _dereq_('./_an-object'); +module.exports = function(iterator, fn, value, entries){ + try { + return entries ? fn(anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch(e){ + var ret = iterator['return']; + if(ret !== undefined)anObject(ret.call(iterator)); + throw e; } +}; +},{"./_an-object":10}],33:[function(_dereq_,module,exports){ +'use strict'; +var create = _dereq_('./_object-create') + , descriptor = _dereq_('./_property-desc') + , setToStringTag = _dereq_('./_set-to-string-tag') + , IteratorPrototype = {}; - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1] - output += lookup[tmp >> 2] - output += lookup[(tmp << 4) & 0x3F] - output += '==' - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) - output += lookup[tmp >> 10] - output += lookup[(tmp >> 4) & 0x3F] - output += lookup[(tmp << 2) & 0x3F] - output += '=' - } +// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() +_dereq_('./_hide')(IteratorPrototype, _dereq_('./_wks')('iterator'), function(){ return this; }); - parts.push(output) +module.exports = function(Constructor, NAME, next){ + Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)}); + setToStringTag(Constructor, NAME + ' Iterator'); +}; +},{"./_hide":25,"./_object-create":40,"./_property-desc":46,"./_set-to-string-tag":50,"./_wks":63}],34:[function(_dereq_,module,exports){ +'use strict'; +var LIBRARY = _dereq_('./_library') + , $export = _dereq_('./_export') + , redefine = _dereq_('./_redefine') + , hide = _dereq_('./_hide') + , has = _dereq_('./_has') + , Iterators = _dereq_('./_iterators') + , $iterCreate = _dereq_('./_iter-create') + , setToStringTag = _dereq_('./_set-to-string-tag') + , getPrototypeOf = _dereq_('./_object-gpo') + , ITERATOR = _dereq_('./_wks')('iterator') + , BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next` + , FF_ITERATOR = '@@iterator' + , KEYS = 'keys' + , VALUES = 'values'; - return parts.join('') -} +var returnThis = function(){ return this; }; -},{}],4:[function(_dereq_,module,exports){ -exports.read = function (buffer, offset, isLE, mLen, nBytes) { - var e, m - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var nBits = -7 - var i = isLE ? (nBytes - 1) : 0 - var d = isLE ? -1 : 1 - var s = buffer[offset + i] +module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){ + $iterCreate(Constructor, NAME, next); + var getMethod = function(kind){ + if(!BUGGY && kind in proto)return proto[kind]; + switch(kind){ + case KEYS: return function keys(){ return new Constructor(this, kind); }; + case VALUES: return function values(){ return new Constructor(this, kind); }; + } return function entries(){ return new Constructor(this, kind); }; + }; + var TAG = NAME + ' Iterator' + , DEF_VALUES = DEFAULT == VALUES + , VALUES_BUG = false + , proto = Base.prototype + , $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT] + , $default = $native || getMethod(DEFAULT) + , $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined + , $anyNative = NAME == 'Array' ? proto.entries || $native : $native + , methods, key, IteratorPrototype; + // Fix native + if($anyNative){ + IteratorPrototype = getPrototypeOf($anyNative.call(new Base)); + if(IteratorPrototype !== Object.prototype){ + // Set @@toStringTag to native iterators + setToStringTag(IteratorPrototype, TAG, true); + // fix for some old engines + if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis); + } + } + // fix Array#{values, @@iterator}.name in V8 / FF + if(DEF_VALUES && $native && $native.name !== VALUES){ + VALUES_BUG = true; + $default = function values(){ return $native.call(this); }; + } + // Define iterator + if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){ + hide(proto, ITERATOR, $default); + } + // Plug for library + Iterators[NAME] = $default; + Iterators[TAG] = returnThis; + if(DEFAULT){ + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: $entries + }; + if(FORCED)for(key in methods){ + if(!(key in proto))redefine(proto, key, methods[key]); + } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; +}; +},{"./_export":20,"./_has":24,"./_hide":25,"./_iter-create":33,"./_iterators":37,"./_library":38,"./_object-gpo":43,"./_redefine":48,"./_set-to-string-tag":50,"./_wks":63}],35:[function(_dereq_,module,exports){ +var ITERATOR = _dereq_('./_wks')('iterator') + , SAFE_CLOSING = false; - i += d +try { + var riter = [7][ITERATOR](); + riter['return'] = function(){ SAFE_CLOSING = true; }; + Array.from(riter, function(){ throw 2; }); +} catch(e){ /* empty */ } - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} +module.exports = function(exec, skipClosing){ + if(!skipClosing && !SAFE_CLOSING)return false; + var safe = false; + try { + var arr = [7] + , iter = arr[ITERATOR](); + iter.next = function(){ return {done: safe = true}; }; + arr[ITERATOR] = function(){ return iter; }; + exec(arr); + } catch(e){ /* empty */ } + return safe; +}; +},{"./_wks":63}],36:[function(_dereq_,module,exports){ +module.exports = function(done, value){ + return {value: value, done: !!done}; +}; +},{}],37:[function(_dereq_,module,exports){ +module.exports = {}; +},{}],38:[function(_dereq_,module,exports){ +module.exports = false; +},{}],39:[function(_dereq_,module,exports){ +var global = _dereq_('./_global') + , macrotask = _dereq_('./_task').set + , Observer = global.MutationObserver || global.WebKitMutationObserver + , process = global.process + , Promise = global.Promise + , isNode = _dereq_('./_cof')(process) == 'process'; - m = e & ((1 << (-nBits)) - 1) - e >>= (-nBits) - nBits += mLen - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} +module.exports = function(){ + var head, last, notify; - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen) - e = e - eBias - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} + var flush = function(){ + var parent, fn; + if(isNode && (parent = process.domain))parent.exit(); + while(head){ + fn = head.fn; + head = head.next; + try { + fn(); + } catch(e){ + if(head)notify(); + else last = undefined; + throw e; + } + } last = undefined; + if(parent)parent.enter(); + }; -exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - var i = isLE ? 0 : (nBytes - 1) - var d = isLE ? 1 : -1 - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 - - value = Math.abs(value) - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax + // Node.js + if(isNode){ + notify = function(){ + process.nextTick(flush); + }; + // browsers with MutationObserver + } else if(Observer){ + var toggle = true + , node = document.createTextNode(''); + new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new + notify = function(){ + node.data = toggle = !toggle; + }; + // environments with maybe non-completely correct, but existent Promise + } else if(Promise && Promise.resolve){ + var promise = Promise.resolve(); + notify = function(){ + promise.then(flush); + }; + // for other environments - macrotask based on: + // - setImmediate + // - MessageChannel + // - window.postMessag + // - onreadystatechange + // - setTimeout } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 - } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) - } - if (value * c >= 2) { - e++ - c /= 2 - } - - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen) - e = e + eBias - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 - } + notify = function(){ + // strange IE + webpack dev server bug - use .call(global) + macrotask.call(global, flush); + }; } - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128 -} - -},{}],5:[function(_dereq_,module,exports){ -var toString = {}.toString; - -module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; + return function(fn){ + var task = {fn: fn, next: undefined}; + if(last)last.next = task; + if(!head){ + head = task; + notify(); + } last = task; + }; }; +},{"./_cof":13,"./_global":23,"./_task":55}],40:[function(_dereq_,module,exports){ +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) +var anObject = _dereq_('./_an-object') + , dPs = _dereq_('./_object-dps') + , enumBugKeys = _dereq_('./_enum-bug-keys') + , IE_PROTO = _dereq_('./_shared-key')('IE_PROTO') + , Empty = function(){ /* empty */ } + , PROTOTYPE = 'prototype'; -},{}],6:[function(_dereq_,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -function EventEmitter() { - this._events = this._events || {}; - this._maxListeners = this._maxListeners || undefined; -} -module.exports = EventEmitter; - -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -EventEmitter.defaultMaxListeners = 10; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function(n) { - if (!isNumber(n) || n < 0 || isNaN(n)) - throw TypeError('n must be a positive number'); - this._maxListeners = n; - return this; +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var createDict = function(){ + // Thrash, waste and sodomy: IE GC bug + var iframe = _dereq_('./_dom-create')('iframe') + , i = enumBugKeys.length + , lt = '<' + , gt = '>' + , iframeDocument; + iframe.style.display = 'none'; + _dereq_('./_html').appendChild(iframe); + iframe.src = 'javascript:'; // eslint-disable-line no-script-url + // createDict = iframe.contentWindow.Object; + // html.removeChild(iframe); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]]; + return createDict(); }; -EventEmitter.prototype.emit = function(type) { - var er, handler, len, args, i, listeners; - - if (!this._events) - this._events = {}; - - // If there is no 'error' event listener then throw. - if (type === 'error') { - if (!this._events.error || - (isObject(this._events.error) && !this._events.error.length)) { - er = arguments[1]; - if (er instanceof Error) { - throw er; // Unhandled 'error' event - } else { - // At least give some kind of context to the user - var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); - err.context = er; - throw err; - } - } - } - - handler = this._events[type]; - - if (isUndefined(handler)) - return false; - - if (isFunction(handler)) { - switch (arguments.length) { - // fast cases - case 1: - handler.call(this); - break; - case 2: - handler.call(this, arguments[1]); - break; - case 3: - handler.call(this, arguments[1], arguments[2]); - break; - // slower - default: - args = Array.prototype.slice.call(arguments, 1); - handler.apply(this, args); - } - } else if (isObject(handler)) { - args = Array.prototype.slice.call(arguments, 1); - listeners = handler.slice(); - len = listeners.length; - for (i = 0; i < len; i++) - listeners[i].apply(this, args); - } - - return true; +module.exports = Object.create || function create(O, Properties){ + var result; + if(O !== null){ + Empty[PROTOTYPE] = anObject(O); + result = new Empty; + Empty[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = createDict(); + return Properties === undefined ? result : dPs(result, Properties); }; -EventEmitter.prototype.addListener = function(type, listener) { - var m; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - if (!this._events) - this._events = {}; - - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (this._events.newListener) - this.emit('newListener', type, - isFunction(listener.listener) ? - listener.listener : listener); - - if (!this._events[type]) - // Optimize the case of one listener. Don't need the extra array object. - this._events[type] = listener; - else if (isObject(this._events[type])) - // If we've already got an array, just append. - this._events[type].push(listener); - else - // Adding the second element, need to change to array. - this._events[type] = [this._events[type], listener]; - - // Check for listener leak - if (isObject(this._events[type]) && !this._events[type].warned) { - if (!isUndefined(this._maxListeners)) { - m = this._maxListeners; - } else { - m = EventEmitter.defaultMaxListeners; - } - - if (m && m > 0 && this._events[type].length > m) { - this._events[type].warned = true; - console.error('(node) warning: possible EventEmitter memory ' + - 'leak detected. %d listeners added. ' + - 'Use emitter.setMaxListeners() to increase limit.', - this._events[type].length); - if (typeof console.trace === 'function') { - // not supported in IE 10 - console.trace(); - } - } - } +},{"./_an-object":10,"./_dom-create":18,"./_enum-bug-keys":19,"./_html":26,"./_object-dps":42,"./_shared-key":51}],41:[function(_dereq_,module,exports){ +var anObject = _dereq_('./_an-object') + , IE8_DOM_DEFINE = _dereq_('./_ie8-dom-define') + , toPrimitive = _dereq_('./_to-primitive') + , dP = Object.defineProperty; - return this; +exports.f = _dereq_('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){ + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if(IE8_DOM_DEFINE)try { + return dP(O, P, Attributes); + } catch(e){ /* empty */ } + if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!'); + if('value' in Attributes)O[P] = Attributes.value; + return O; }; +},{"./_an-object":10,"./_descriptors":17,"./_ie8-dom-define":27,"./_to-primitive":61}],42:[function(_dereq_,module,exports){ +var dP = _dereq_('./_object-dp') + , anObject = _dereq_('./_an-object') + , getKeys = _dereq_('./_object-keys'); -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.once = function(type, listener) { - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - var fired = false; - - function g() { - this.removeListener(type, g); - - if (!fired) { - fired = true; - listener.apply(this, arguments); - } - } - - g.listener = listener; - this.on(type, g); - - return this; +module.exports = _dereq_('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties){ + anObject(O); + var keys = getKeys(Properties) + , length = keys.length + , i = 0 + , P; + while(length > i)dP.f(O, P = keys[i++], Properties[P]); + return O; }; +},{"./_an-object":10,"./_descriptors":17,"./_object-dp":41,"./_object-keys":45}],43:[function(_dereq_,module,exports){ +// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) +var has = _dereq_('./_has') + , toObject = _dereq_('./_to-object') + , IE_PROTO = _dereq_('./_shared-key')('IE_PROTO') + , ObjectProto = Object.prototype; -// emits a 'removeListener' event iff the listener was removed -EventEmitter.prototype.removeListener = function(type, listener) { - var list, position, length, i; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - if (!this._events || !this._events[type]) - return this; - - list = this._events[type]; - length = list.length; - position = -1; - - if (list === listener || - (isFunction(list.listener) && list.listener === listener)) { - delete this._events[type]; - if (this._events.removeListener) - this.emit('removeListener', type, listener); - - } else if (isObject(list)) { - for (i = length; i-- > 0;) { - if (list[i] === listener || - (list[i].listener && list[i].listener === listener)) { - position = i; - break; - } - } - - if (position < 0) - return this; - - if (list.length === 1) { - list.length = 0; - delete this._events[type]; - } else { - list.splice(position, 1); - } +module.exports = Object.getPrototypeOf || function(O){ + O = toObject(O); + if(has(O, IE_PROTO))return O[IE_PROTO]; + if(typeof O.constructor == 'function' && O instanceof O.constructor){ + return O.constructor.prototype; + } return O instanceof Object ? ObjectProto : null; +}; +},{"./_has":24,"./_shared-key":51,"./_to-object":60}],44:[function(_dereq_,module,exports){ +var has = _dereq_('./_has') + , toIObject = _dereq_('./_to-iobject') + , arrayIndexOf = _dereq_('./_array-includes')(false) + , IE_PROTO = _dereq_('./_shared-key')('IE_PROTO'); - if (this._events.removeListener) - this.emit('removeListener', type, listener); +module.exports = function(object, names){ + var O = toIObject(object) + , i = 0 + , result = [] + , key; + for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while(names.length > i)if(has(O, key = names[i++])){ + ~arrayIndexOf(result, key) || result.push(key); } - - return this; + return result; }; +},{"./_array-includes":11,"./_has":24,"./_shared-key":51,"./_to-iobject":58}],45:[function(_dereq_,module,exports){ +// 19.1.2.14 / 15.2.3.14 Object.keys(O) +var $keys = _dereq_('./_object-keys-internal') + , enumBugKeys = _dereq_('./_enum-bug-keys'); -EventEmitter.prototype.removeAllListeners = function(type) { - var key, listeners; - - if (!this._events) - return this; +module.exports = Object.keys || function keys(O){ + return $keys(O, enumBugKeys); +}; +},{"./_enum-bug-keys":19,"./_object-keys-internal":44}],46:[function(_dereq_,module,exports){ +module.exports = function(bitmap, value){ + return { + enumerable : !(bitmap & 1), + configurable: !(bitmap & 2), + writable : !(bitmap & 4), + value : value + }; +}; +},{}],47:[function(_dereq_,module,exports){ +var redefine = _dereq_('./_redefine'); +module.exports = function(target, src, safe){ + for(var key in src)redefine(target, key, src[key], safe); + return target; +}; +},{"./_redefine":48}],48:[function(_dereq_,module,exports){ +var global = _dereq_('./_global') + , hide = _dereq_('./_hide') + , has = _dereq_('./_has') + , SRC = _dereq_('./_uid')('src') + , TO_STRING = 'toString' + , $toString = Function[TO_STRING] + , TPL = ('' + $toString).split(TO_STRING); - // not listening for removeListener, no need to emit - if (!this._events.removeListener) { - if (arguments.length === 0) - this._events = {}; - else if (this._events[type]) - delete this._events[type]; - return this; - } +_dereq_('./_core').inspectSource = function(it){ + return $toString.call(it); +}; - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - for (key in this._events) { - if (key === 'removeListener') continue; - this.removeAllListeners(key); +(module.exports = function(O, key, val, safe){ + var isFunction = typeof val == 'function'; + if(isFunction)has(val, 'name') || hide(val, 'name', key); + if(O[key] === val)return; + if(isFunction)has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); + if(O === global){ + O[key] = val; + } else { + if(!safe){ + delete O[key]; + hide(O, key, val); + } else { + if(O[key])O[key] = val; + else hide(O, key, val); } - this.removeAllListeners('removeListener'); - this._events = {}; - return this; - } - - listeners = this._events[type]; - - if (isFunction(listeners)) { - this.removeListener(type, listeners); - } else if (listeners) { - // LIFO order - while (listeners.length) - this.removeListener(type, listeners[listeners.length - 1]); } - delete this._events[type]; +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +})(Function.prototype, TO_STRING, function toString(){ + return typeof this == 'function' && this[SRC] || $toString.call(this); +}); +},{"./_core":14,"./_global":23,"./_has":24,"./_hide":25,"./_uid":62}],49:[function(_dereq_,module,exports){ +'use strict'; +var global = _dereq_('./_global') + , dP = _dereq_('./_object-dp') + , DESCRIPTORS = _dereq_('./_descriptors') + , SPECIES = _dereq_('./_wks')('species'); - return this; +module.exports = function(KEY){ + var C = global[KEY]; + if(DESCRIPTORS && C && !C[SPECIES])dP.f(C, SPECIES, { + configurable: true, + get: function(){ return this; } + }); }; +},{"./_descriptors":17,"./_global":23,"./_object-dp":41,"./_wks":63}],50:[function(_dereq_,module,exports){ +var def = _dereq_('./_object-dp').f + , has = _dereq_('./_has') + , TAG = _dereq_('./_wks')('toStringTag'); -EventEmitter.prototype.listeners = function(type) { - var ret; - if (!this._events || !this._events[type]) - ret = []; - else if (isFunction(this._events[type])) - ret = [this._events[type]]; - else - ret = this._events[type].slice(); - return ret; +module.exports = function(it, tag, stat){ + if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag}); }; - -EventEmitter.prototype.listenerCount = function(type) { - if (this._events) { - var evlistener = this._events[type]; - - if (isFunction(evlistener)) - return 1; - else if (evlistener) - return evlistener.length; - } - return 0; +},{"./_has":24,"./_object-dp":41,"./_wks":63}],51:[function(_dereq_,module,exports){ +var shared = _dereq_('./_shared')('keys') + , uid = _dereq_('./_uid'); +module.exports = function(key){ + return shared[key] || (shared[key] = uid(key)); }; - -EventEmitter.listenerCount = function(emitter, type) { - return emitter.listenerCount(type); +},{"./_shared":52,"./_uid":62}],52:[function(_dereq_,module,exports){ +var global = _dereq_('./_global') + , SHARED = '__core-js_shared__' + , store = global[SHARED] || (global[SHARED] = {}); +module.exports = function(key){ + return store[key] || (store[key] = {}); }; - -function isFunction(arg) { - return typeof arg === 'function'; -} - -function isNumber(arg) { - return typeof arg === 'number'; -} - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; +},{"./_global":23}],53:[function(_dereq_,module,exports){ +// 7.3.20 SpeciesConstructor(O, defaultConstructor) +var anObject = _dereq_('./_an-object') + , aFunction = _dereq_('./_a-function') + , SPECIES = _dereq_('./_wks')('species'); +module.exports = function(O, D){ + var C = anObject(O).constructor, S; + return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); +}; +},{"./_a-function":7,"./_an-object":10,"./_wks":63}],54:[function(_dereq_,module,exports){ +var toInteger = _dereq_('./_to-integer') + , defined = _dereq_('./_defined'); +// true -> String#at +// false -> String#codePointAt +module.exports = function(TO_STRING){ + return function(that, pos){ + var s = String(defined(that)) + , i = toInteger(pos) + , l = s.length + , a, b; + if(i < 0 || i >= l)return TO_STRING ? '' : undefined; + a = s.charCodeAt(i); + return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff + ? TO_STRING ? s.charAt(i) : a + : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; + }; +}; +},{"./_defined":16,"./_to-integer":57}],55:[function(_dereq_,module,exports){ +var ctx = _dereq_('./_ctx') + , invoke = _dereq_('./_invoke') + , html = _dereq_('./_html') + , cel = _dereq_('./_dom-create') + , global = _dereq_('./_global') + , process = global.process + , setTask = global.setImmediate + , clearTask = global.clearImmediate + , MessageChannel = global.MessageChannel + , counter = 0 + , queue = {} + , ONREADYSTATECHANGE = 'onreadystatechange' + , defer, channel, port; +var run = function(){ + var id = +this; + if(queue.hasOwnProperty(id)){ + var fn = queue[id]; + delete queue[id]; + fn(); + } +}; +var listener = function(event){ + run.call(event.data); +}; +// Node.js 0.9+ & IE10+ has setImmediate, otherwise: +if(!setTask || !clearTask){ + setTask = function setImmediate(fn){ + var args = [], i = 1; + while(arguments.length > i)args.push(arguments[i++]); + queue[++counter] = function(){ + invoke(typeof fn == 'function' ? fn : Function(fn), args); + }; + defer(counter); + return counter; + }; + clearTask = function clearImmediate(id){ + delete queue[id]; + }; + // Node.js 0.8- + if(_dereq_('./_cof')(process) == 'process'){ + defer = function(id){ + process.nextTick(ctx(run, id, 1)); + }; + // Browsers with MessageChannel, includes WebWorkers + } else if(MessageChannel){ + channel = new MessageChannel; + port = channel.port2; + channel.port1.onmessage = listener; + defer = ctx(port.postMessage, port, 1); + // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){ + defer = function(id){ + global.postMessage(id + '', '*'); + }; + global.addEventListener('message', listener, false); + // IE8- + } else if(ONREADYSTATECHANGE in cel('script')){ + defer = function(id){ + html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){ + html.removeChild(this); + run.call(id); + }; + }; + // Rest old browsers + } else { + defer = function(id){ + setTimeout(ctx(run, id, 1), 0); + }; + } } +module.exports = { + set: setTask, + clear: clearTask +}; +},{"./_cof":13,"./_ctx":15,"./_dom-create":18,"./_global":23,"./_html":26,"./_invoke":28}],56:[function(_dereq_,module,exports){ +var toInteger = _dereq_('./_to-integer') + , max = Math.max + , min = Math.min; +module.exports = function(index, length){ + index = toInteger(index); + return index < 0 ? max(index + length, 0) : min(index, length); +}; +},{"./_to-integer":57}],57:[function(_dereq_,module,exports){ +// 7.1.4 ToInteger +var ceil = Math.ceil + , floor = Math.floor; +module.exports = function(it){ + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); +}; +},{}],58:[function(_dereq_,module,exports){ +// to indexed object, toObject with fallback for non-array-like ES3 strings +var IObject = _dereq_('./_iobject') + , defined = _dereq_('./_defined'); +module.exports = function(it){ + return IObject(defined(it)); +}; +},{"./_defined":16,"./_iobject":29}],59:[function(_dereq_,module,exports){ +// 7.1.15 ToLength +var toInteger = _dereq_('./_to-integer') + , min = Math.min; +module.exports = function(it){ + return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 +}; +},{"./_to-integer":57}],60:[function(_dereq_,module,exports){ +// 7.1.13 ToObject(argument) +var defined = _dereq_('./_defined'); +module.exports = function(it){ + return Object(defined(it)); +}; +},{"./_defined":16}],61:[function(_dereq_,module,exports){ +// 7.1.1 ToPrimitive(input [, PreferredType]) +var isObject = _dereq_('./_is-object'); +// instead of the ES6 spec version, we didn't implement @@toPrimitive case +// and the second argument - flag - preferred type is a string +module.exports = function(it, S){ + if(!isObject(it))return it; + var fn, val; + if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; + if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val; + if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; + throw TypeError("Can't convert object to primitive value"); +}; +},{"./_is-object":31}],62:[function(_dereq_,module,exports){ +var id = 0 + , px = Math.random(); +module.exports = function(key){ + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); +}; +},{}],63:[function(_dereq_,module,exports){ +var store = _dereq_('./_shared')('wks') + , uid = _dereq_('./_uid') + , Symbol = _dereq_('./_global').Symbol + , USE_SYMBOL = typeof Symbol == 'function'; -function isUndefined(arg) { - return arg === void 0; -} +var $exports = module.exports = function(name){ + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); +}; -},{}],7:[function(_dereq_,module,exports){ -/*! - * Determine if an object is a Buffer - * - * @author Feross Aboukhadijeh - * @license MIT - */ +$exports.store = store; +},{"./_global":23,"./_shared":52,"./_uid":62}],64:[function(_dereq_,module,exports){ +var classof = _dereq_('./_classof') + , ITERATOR = _dereq_('./_wks')('iterator') + , Iterators = _dereq_('./_iterators'); +module.exports = _dereq_('./_core').getIteratorMethod = function(it){ + if(it != undefined)return it[ITERATOR] + || it['@@iterator'] + || Iterators[classof(it)]; +}; +},{"./_classof":12,"./_core":14,"./_iterators":37,"./_wks":63}],65:[function(_dereq_,module,exports){ +'use strict'; +var addToUnscopables = _dereq_('./_add-to-unscopables') + , step = _dereq_('./_iter-step') + , Iterators = _dereq_('./_iterators') + , toIObject = _dereq_('./_to-iobject'); -// The _isBuffer check is for Safari 5-7 support, because it's missing -// Object.prototype.constructor. Remove this eventually -module.exports = function (obj) { - return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) -} +// 22.1.3.4 Array.prototype.entries() +// 22.1.3.13 Array.prototype.keys() +// 22.1.3.29 Array.prototype.values() +// 22.1.3.30 Array.prototype[@@iterator]() +module.exports = _dereq_('./_iter-define')(Array, 'Array', function(iterated, kind){ + this._t = toIObject(iterated); // target + this._i = 0; // next index + this._k = kind; // kind +// 22.1.5.2.1 %ArrayIteratorPrototype%.next() +}, function(){ + var O = this._t + , kind = this._k + , index = this._i++; + if(!O || index >= O.length){ + this._t = undefined; + return step(1); + } + if(kind == 'keys' )return step(0, index); + if(kind == 'values')return step(0, O[index]); + return step(0, [index, O[index]]); +}, 'values'); -function isBuffer (obj) { - return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) -} +// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) +Iterators.Arguments = Iterators.Array; -// For Node v0.10 support. Remove this eventually. -function isSlowBuffer (obj) { - return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); +},{"./_add-to-unscopables":8,"./_iter-define":34,"./_iter-step":36,"./_iterators":37,"./_to-iobject":58}],66:[function(_dereq_,module,exports){ +'use strict'; +// 19.1.3.6 Object.prototype.toString() +var classof = _dereq_('./_classof') + , test = {}; +test[_dereq_('./_wks')('toStringTag')] = 'z'; +if(test + '' != '[object z]'){ + _dereq_('./_redefine')(Object.prototype, 'toString', function toString(){ + return '[object ' + classof(this) + ']'; + }, true); } +},{"./_classof":12,"./_redefine":48,"./_wks":63}],67:[function(_dereq_,module,exports){ +'use strict'; +var LIBRARY = _dereq_('./_library') + , global = _dereq_('./_global') + , ctx = _dereq_('./_ctx') + , classof = _dereq_('./_classof') + , $export = _dereq_('./_export') + , isObject = _dereq_('./_is-object') + , aFunction = _dereq_('./_a-function') + , anInstance = _dereq_('./_an-instance') + , forOf = _dereq_('./_for-of') + , speciesConstructor = _dereq_('./_species-constructor') + , task = _dereq_('./_task').set + , microtask = _dereq_('./_microtask')() + , PROMISE = 'Promise' + , TypeError = global.TypeError + , process = global.process + , $Promise = global[PROMISE] + , process = global.process + , isNode = classof(process) == 'process' + , empty = function(){ /* empty */ } + , Internal, GenericPromiseCapability, Wrapper; -},{}],8:[function(_dereq_,module,exports){ -// shim for using process in browser -var process = module.exports = {}; - -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. - -var cachedSetTimeout; -var cachedClearTimeout; +var USE_NATIVE = !!function(){ + try { + // correct subclassing with @@species support + var promise = $Promise.resolve(1) + , FakePromise = (promise.constructor = {})[_dereq_('./_wks')('species')] = function(exec){ exec(empty, empty); }; + // unhandled rejections tracking support, NodeJS Promise without it fails @@species test + return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise; + } catch(e){ /* empty */ } +}(); -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -(function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; +// helpers +var sameConstructor = function(a, b){ + // with library wrapper special case + return a === b || a === $Promise && b === Wrapper; +}; +var isThenable = function(it){ + var then; + return isObject(it) && typeof (then = it.then) == 'function' ? then : false; +}; +var newPromiseCapability = function(C){ + return sameConstructor($Promise, C) + ? new PromiseCapability(C) + : new GenericPromiseCapability(C); +}; +var PromiseCapability = GenericPromiseCapability = function(C){ + var resolve, reject; + this.promise = new C(function($$resolve, $$reject){ + if(resolve !== undefined || reject !== undefined)throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aFunction(resolve); + this.reject = aFunction(reject); +}; +var perform = function(exec){ + try { + exec(); + } catch(e){ + return {error: e}; + } +}; +var notify = function(promise, isReject){ + if(promise._n)return; + promise._n = true; + var chain = promise._c; + microtask(function(){ + var value = promise._v + , ok = promise._s == 1 + , i = 0; + var run = function(reaction){ + var handler = ok ? reaction.ok : reaction.fail + , resolve = reaction.resolve + , reject = reaction.reject + , domain = reaction.domain + , result, then; + try { + if(handler){ + if(!ok){ + if(promise._h == 2)onHandleUnhandled(promise); + promise._h = 1; + } + if(handler === true)result = value; + else { + if(domain)domain.enter(); + result = handler(value); + if(domain)domain.exit(); + } + if(result === reaction.promise){ + reject(TypeError('Promise-chain cycle')); + } else if(then = isThenable(result)){ + then.call(result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch(e){ + reject(e); + } + }; + while(chain.length > i)run(chain[i++]); // variable length - can't use forEach + promise._c = []; + promise._n = false; + if(isReject && !promise._h)onUnhandled(promise); + }); +}; +var onUnhandled = function(promise){ + task.call(global, function(){ + var value = promise._v + , abrupt, handler, console; + if(isUnhandled(promise)){ + abrupt = perform(function(){ + if(isNode){ + process.emit('unhandledRejection', value, promise); + } else if(handler = global.onunhandledrejection){ + handler({promise: promise, reason: value}); + } else if((console = global.console) && console.error){ + console.error('Unhandled promise rejection', value); } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } -} ()) -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); + }); + // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should + promise._h = isNode || isUnhandled(promise) ? 2 : 1; + } promise._a = undefined; + if(abrupt)throw abrupt.error; + }); +}; +var isUnhandled = function(promise){ + if(promise._h == 1)return false; + var chain = promise._a || promise._c + , i = 0 + , reaction; + while(chain.length > i){ + reaction = chain[i++]; + if(reaction.fail || !isUnhandled(reaction.promise))return false; + } return true; +}; +var onHandleUnhandled = function(promise){ + task.call(global, function(){ + var handler; + if(isNode){ + process.emit('rejectionHandled', promise); + } else if(handler = global.onrejectionhandled){ + handler({promise: promise, reason: promise._v}); } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ + }); +}; +var $reject = function(value){ + var promise = this; + if(promise._d)return; + promise._d = true; + promise = promise._w || promise; // unwrap + promise._v = value; + promise._s = 2; + if(!promise._a)promise._a = promise._c.slice(); + notify(promise, true); +}; +var $resolve = function(value){ + var promise = this + , then; + if(promise._d)return; + promise._d = true; + promise = promise._w || promise; // unwrap + try { + if(promise === value)throw TypeError("Promise can't be resolved itself"); + if(then = isThenable(value)){ + microtask(function(){ + var wrapper = {_w: promise, _d: false}; // wrap try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); + then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); + $reject.call(wrapper, e); } + }); + } else { + promise._v = value; + promise._s = 1; + notify(promise, false); } + } catch(e){ + $reject.call({_w: promise, _d: false}, e); // wrap + } +}; - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } +// constructor polyfill +if(!USE_NATIVE){ + // 25.4.3.1 Promise(executor) + $Promise = function Promise(executor){ + anInstance(this, $Promise, PROMISE, '_h'); + aFunction(executor); + Internal.call(this); try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; + executor(ctx($resolve, this, 1), ctx($reject, this, 1)); + } catch(err){ + $reject.call(this, err); } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); + }; + Internal = function Promise(executor){ + this._c = []; // <- awaiting reactions + this._a = undefined; // <- checked in isUnhandled reactions + this._s = 0; // <- state + this._d = false; // <- done + this._v = undefined; // <- value + this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled + this._n = false; // <- notify + }; + Internal.prototype = _dereq_('./_redefine-all')($Promise.prototype, { + // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) + then: function then(onFulfilled, onRejected){ + var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); + reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; + reaction.fail = typeof onRejected == 'function' && onRejected; + reaction.domain = isNode ? process.domain : undefined; + this._c.push(reaction); + if(this._a)this._a.push(reaction); + if(this._s)notify(this, false); + return reaction.promise; + }, + // 25.4.5.1 Promise.prototype.catch(onRejected) + 'catch': function(onRejected){ + return this.then(undefined, onRejected); } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; + }); + PromiseCapability = function(){ + var promise = new Internal; + this.promise = promise; + this.resolve = ctx($resolve, promise, 1); + this.reject = ctx($reject, promise, 1); + }; } -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; +$export($export.G + $export.W + $export.F * !USE_NATIVE, {Promise: $Promise}); +_dereq_('./_set-to-string-tag')($Promise, PROMISE); +_dereq_('./_set-species')(PROMISE); +Wrapper = _dereq_('./_core')[PROMISE]; -},{}],9:[function(_dereq_,module,exports){ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } +// statics +$export($export.S + $export.F * !USE_NATIVE, PROMISE, { + // 25.4.4.5 Promise.reject(r) + reject: function reject(r){ + var capability = newPromiseCapability(this) + , $$reject = capability.reject; + $$reject(r); + return capability.promise; + } +}); +$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { + // 25.4.4.6 Promise.resolve(x) + resolve: function resolve(x){ + // instanceof instead of internal slot check because we should fix it without replacement native Promise core + if(x instanceof $Promise && sameConstructor(x.constructor, this))return x; + var capability = newPromiseCapability(this) + , $$resolve = capability.resolve; + $$resolve(x); + return capability.promise; + } +}); +$export($export.S + $export.F * !(USE_NATIVE && _dereq_('./_iter-detect')(function(iter){ + $Promise.all(iter)['catch'](empty); +})), PROMISE, { + // 25.4.4.1 Promise.all(iterable) + all: function all(iterable){ + var C = this + , capability = newPromiseCapability(C) + , resolve = capability.resolve + , reject = capability.reject; + var abrupt = perform(function(){ + var values = [] + , index = 0 + , remaining = 1; + forOf(iterable, false, function(promise){ + var $index = index++ + , alreadyCalled = false; + values.push(undefined); + remaining++; + C.resolve(promise).then(function(value){ + if(alreadyCalled)return; + alreadyCalled = true; + values[$index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor + if(abrupt)reject(abrupt.error); + return capability.promise; + }, + // 25.4.4.4 Promise.race(iterable) + race: function race(iterable){ + var C = this + , capability = newPromiseCapability(C) + , reject = capability.reject; + var abrupt = perform(function(){ + forOf(iterable, false, function(promise){ + C.resolve(promise).then(capability.resolve, reject); + }); + }); + if(abrupt)reject(abrupt.error); + return capability.promise; } -} +}); +},{"./_a-function":7,"./_an-instance":9,"./_classof":12,"./_core":14,"./_ctx":15,"./_export":20,"./_for-of":22,"./_global":23,"./_is-object":31,"./_iter-detect":35,"./_library":38,"./_microtask":39,"./_redefine-all":47,"./_set-species":49,"./_set-to-string-tag":50,"./_species-constructor":53,"./_task":55,"./_wks":63}],68:[function(_dereq_,module,exports){ +'use strict'; +var $at = _dereq_('./_string-at')(true); -},{}],10:[function(_dereq_,module,exports){ -module.exports = function isBuffer(arg) { - return arg && typeof arg === 'object' - && typeof arg.copy === 'function' - && typeof arg.fill === 'function' - && typeof arg.readUInt8 === 'function'; +// 21.1.3.27 String.prototype[@@iterator]() +_dereq_('./_iter-define')(String, 'String', function(iterated){ + this._t = String(iterated); // target + this._i = 0; // next index +// 21.1.5.2.1 %StringIteratorPrototype%.next() +}, function(){ + var O = this._t + , index = this._i + , point; + if(index >= O.length)return {value: undefined, done: true}; + point = $at(O, index); + this._i += point.length; + return {value: point, done: false}; +}); +},{"./_iter-define":34,"./_string-at":54}],69:[function(_dereq_,module,exports){ +var $iterators = _dereq_('./es6.array.iterator') + , redefine = _dereq_('./_redefine') + , global = _dereq_('./_global') + , hide = _dereq_('./_hide') + , Iterators = _dereq_('./_iterators') + , wks = _dereq_('./_wks') + , ITERATOR = wks('iterator') + , TO_STRING_TAG = wks('toStringTag') + , ArrayValues = Iterators.Array; + +for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){ + var NAME = collections[i] + , Collection = global[NAME] + , proto = Collection && Collection.prototype + , key; + if(proto){ + if(!proto[ITERATOR])hide(proto, ITERATOR, ArrayValues); + if(!proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME); + Iterators[NAME] = ArrayValues; + for(key in $iterators)if(!proto[key])redefine(proto, key, $iterators[key], true); + } } -},{}],11:[function(_dereq_,module,exports){ -(function (process,global){ +},{"./_global":23,"./_hide":25,"./_iterators":37,"./_redefine":48,"./_wks":63,"./es6.array.iterator":65}],70:[function(_dereq_,module,exports){ +(function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -2567,2653 +3458,1249 @@ module.exports = function isBuffer(arg) { // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. -var formatRegExp = /%[sdj%]/g; -exports.format = function(f) { - if (!isString(f)) { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect(arguments[i])); - } - return objects.join(' '); - } - - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - default: - return x; - } - }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; - } else { - str += ' ' + inspect(x); - } - } - return str; -}; - - -// Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. -exports.deprecate = function(fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined(global.process)) { - return function() { - return exports.deprecate(fn, msg).apply(this, arguments); - }; - } - - if (process.noDeprecation === true) { - return fn; - } +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. - var warned = false; - function deprecated() { - if (!warned) { - if (process.throwDeprecation) { - throw new Error(msg); - } else if (process.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - warned = true; - } - return fn.apply(this, arguments); +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; - return deprecated; -}; - - -var debugs = {}; -var debugEnviron; -exports.debuglog = function(set) { - if (isUndefined(debugEnviron)) - debugEnviron = process.env.NODE_DEBUG || ''; - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = process.pid; - debugs[set] = function() { - var msg = exports.format.apply(exports, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; - } - } - return debugs[set]; -}; +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. - */ -/* legacy: obj, showHidden, depth, colors*/ -function inspect(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor - }; - // legacy... - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - if (isBoolean(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - exports._extend(ctx, opts); - } - // set default options - if (isUndefined(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined(ctx.depth)) ctx.depth = 2; - if (isUndefined(ctx.colors)) ctx.colors = false; - if (isUndefined(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); +function isNullOrUndefined(arg) { + return arg == null; } -exports.inspect = inspect; +exports.isNullOrUndefined = isNullOrUndefined; +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; -// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect.colors = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'white' : [37, 39], - 'grey' : [90, 39], - 'black' : [30, 39], - 'blue' : [34, 39], - 'cyan' : [36, 39], - 'green' : [32, 39], - 'magenta' : [35, 39], - 'red' : [31, 39], - 'yellow' : [33, 39] -}; +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; -// Don't use 'blue' not visible on cmd.exe -inspect.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; -function stylizeWithColor(str, styleType) { - var style = inspect.styles[styleType]; +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; - if (style) { - return '\u001b[' + inspect.colors[style][0] + 'm' + str + - '\u001b[' + inspect.colors[style][1] + 'm'; - } else { - return str; - } +function isObject(arg) { + return typeof arg === 'object' && arg !== null; } +exports.isObject = isObject; +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; -function stylizeNoColor(str, styleType) { - return str; +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); } +exports.isError = isError; +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; -function arrayToHash(array) { - var hash = {}; +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; - array.forEach(function(val, idx) { - hash[val] = true; - }); +exports.isBuffer = Buffer.isBuffer; - return hash; +function objectToString(o) { + return Object.prototype.toString.call(o); } +}).call(this,{"isBuffer":_dereq_("../../is-buffer/index.js")}) -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && - value && - isFunction(value.inspect) && - // Filter out the util module, it's inspect function is special - value.inspect !== exports.inspect && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (!isString(ret)) { - ret = formatValue(ctx, ret, recurseTimes); - } - return ret; - } - - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } +},{"../../is-buffer/index.js":93}],71:[function(_dereq_,module,exports){ +// (c) Dean McNamee , 2012. +// +// https://github.com/deanm/css-color-parser-js +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. - // Look up the keys of the object. - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); +// http://www.w3.org/TR/css3-color/ +var kCSSColorTable = { + "transparent": [0,0,0,0], "aliceblue": [240,248,255,1], + "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1], + "aquamarine": [127,255,212,1], "azure": [240,255,255,1], + "beige": [245,245,220,1], "bisque": [255,228,196,1], + "black": [0,0,0,1], "blanchedalmond": [255,235,205,1], + "blue": [0,0,255,1], "blueviolet": [138,43,226,1], + "brown": [165,42,42,1], "burlywood": [222,184,135,1], + "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1], + "chocolate": [210,105,30,1], "coral": [255,127,80,1], + "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1], + "crimson": [220,20,60,1], "cyan": [0,255,255,1], + "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1], + "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1], + "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1], + "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1], + "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1], + "darkorchid": [153,50,204,1], "darkred": [139,0,0,1], + "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1], + "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1], + "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1], + "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1], + "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1], + "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1], + "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1], + "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1], + "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1], + "gold": [255,215,0,1], "goldenrod": [218,165,32,1], + "gray": [128,128,128,1], "green": [0,128,0,1], + "greenyellow": [173,255,47,1], "grey": [128,128,128,1], + "honeydew": [240,255,240,1], "hotpink": [255,105,180,1], + "indianred": [205,92,92,1], "indigo": [75,0,130,1], + "ivory": [255,255,240,1], "khaki": [240,230,140,1], + "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1], + "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1], + "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1], + "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1], + "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1], + "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1], + "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1], + "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1], + "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1], + "lightyellow": [255,255,224,1], "lime": [0,255,0,1], + "limegreen": [50,205,50,1], "linen": [250,240,230,1], + "magenta": [255,0,255,1], "maroon": [128,0,0,1], + "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1], + "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1], + "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1], + "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1], + "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1], + "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1], + "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1], + "navy": [0,0,128,1], "oldlace": [253,245,230,1], + "olive": [128,128,0,1], "olivedrab": [107,142,35,1], + "orange": [255,165,0,1], "orangered": [255,69,0,1], + "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1], + "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1], + "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1], + "peachpuff": [255,218,185,1], "peru": [205,133,63,1], + "pink": [255,192,203,1], "plum": [221,160,221,1], + "powderblue": [176,224,230,1], "purple": [128,0,128,1], + "rebeccapurple": [102,51,153,1], + "red": [255,0,0,1], "rosybrown": [188,143,143,1], + "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1], + "salmon": [250,128,114,1], "sandybrown": [244,164,96,1], + "seagreen": [46,139,87,1], "seashell": [255,245,238,1], + "sienna": [160,82,45,1], "silver": [192,192,192,1], + "skyblue": [135,206,235,1], "slateblue": [106,90,205,1], + "slategray": [112,128,144,1], "slategrey": [112,128,144,1], + "snow": [255,250,250,1], "springgreen": [0,255,127,1], + "steelblue": [70,130,180,1], "tan": [210,180,140,1], + "teal": [0,128,128,1], "thistle": [216,191,216,1], + "tomato": [255,99,71,1], "turquoise": [64,224,208,1], + "violet": [238,130,238,1], "wheat": [245,222,179,1], + "white": [255,255,255,1], "whitesmoke": [245,245,245,1], + "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]} - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); - } +function clamp_css_byte(i) { // Clamp to integer 0 .. 255. + i = Math.round(i); // Seems to be what Chrome does (vs truncation). + return i < 0 ? 0 : i > 255 ? 255 : i; +} - // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - if (isError(value) - && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } +function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0. + return f < 0 ? 0 : f > 1 ? 1 : f; +} - // Some type of object without properties can be shortcutted. - if (keys.length === 0) { - if (isFunction(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); - } - } +function parse_css_int(str) { // int or percentage. + if (str[str.length - 1] === '%') + return clamp_css_byte(parseFloat(str) / 100 * 255); + return clamp_css_byte(parseInt(str)); +} - var base = '', array = false, braces = ['{', '}']; +function parse_css_float(str) { // float or percentage. + if (str[str.length - 1] === '%') + return clamp_css_float(parseFloat(str) / 100); + return clamp_css_float(parseFloat(str)); +} - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } +function css_hue_to_rgb(m1, m2, h) { + if (h < 0) h += 1; + else if (h > 1) h -= 1; - // Make functions say that they are functions - if (isFunction(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } + if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; + if (h * 2 < 1) return m2; + if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; + return m1; +} - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } +function parseCSSColor(css_str) { + // Remove all whitespace, not compliant, but should just be more accepting. + var str = css_str.replace(/ /g, '').toLowerCase(); - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } + // Color keywords (and transparent) lookup. + if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup. - // Make error with message first say the error - if (isError(value)) { - base = ' ' + formatError(value); - } + // #abc and #abc123 syntax. + if (str[0] === '#') { + if (str.length === 4) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN. + return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), + (iv & 0xf0) | ((iv & 0xf0) >> 4), + (iv & 0xf) | ((iv & 0xf) << 4), + 1]; + } else if (str.length === 7) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN. + return [(iv & 0xff0000) >> 16, + (iv & 0xff00) >> 8, + iv & 0xff, + 1]; + } - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; + return null; } - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); + var op = str.indexOf('('), ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === str.length) { + var fname = str.substr(0, op); + var params = str.substr(op+1, ep-(op+1)).split(','); + var alpha = 1; // To allow case fallthrough. + switch (fname) { + case 'rgba': + if (params.length !== 4) return null; + alpha = parse_css_float(params.pop()); + // Fall through. + case 'rgb': + if (params.length !== 3) return null; + return [parse_css_int(params[0]), + parse_css_int(params[1]), + parse_css_int(params[2]), + alpha]; + case 'hsla': + if (params.length !== 4) return null; + alpha = parse_css_float(params.pop()); + // Fall through. + case 'hsl': + if (params.length !== 3) return null; + var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1 + // NOTE(deanm): According to the CSS spec s/l should only be + // percentages, but we don't bother and let float or percentage. + var s = parse_css_float(params[1]); + var l = parse_css_float(params[2]); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255), + clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), + clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255), + alpha]; + default: + return null; } } - ctx.seen.push(value); + return null; +} - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } +try { exports.parseCSSColor = parseCSSColor } catch(e) { } - ctx.seen.pop(); +},{}],72:[function(_dereq_,module,exports){ +'use strict'; - return reduceToSingleString(output, base, braces); -} +module.exports = earcut; +function earcut(data, holeIndices, dim) { -function formatPrimitive(ctx, value) { - if (isUndefined(value)) - return ctx.stylize('undefined', 'undefined'); - if (isString(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - } - if (isNumber(value)) - return ctx.stylize('' + value, 'number'); - if (isBoolean(value)) - return ctx.stylize('' + value, 'boolean'); - // For some reason typeof null is "object", so special case here. - if (isNull(value)) - return ctx.stylize('null', 'null'); -} + dim = dim || 2; + var hasHoles = holeIndices && holeIndices.length, + outerLen = hasHoles ? holeIndices[0] * dim : data.length, + outerNode = linkedList(data, 0, outerLen, dim, true), + triangles = []; -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; -} + if (!outerNode) return triangles; + var minX, minY, maxX, maxY, x, y, size; -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } - } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); - } - }); - return output; -} + if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + if (data.length > 80 * dim) { + minX = maxX = data[0]; + minY = maxY = data[1]; -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); - } - } - if (!hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); + for (var i = dim; i < outerLen; i += dim) { + x = data[i]; + y = data[i + 1]; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - if (isUndefined(name)) { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); + + // minX, minY and size are later used to transform coords into integers for z-order calculation + size = Math.max(maxX - minX, maxY - minY); } - } - return name + ': ' + str; + earcutLinked(outerNode, triangles, dim, minX, minY, size); + + return triangles; } +// create a circular doubly linked list from polygon points in the specified winding order +function linkedList(data, start, end, dim, clockwise) { + var i, last; -function reduceToSingleString(output, base, braces) { - var numLinesEst = 0; - var length = output.reduce(function(prev, cur) { - numLinesEst++; - if (cur.indexOf('\n') >= 0) numLinesEst++; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); + if (clockwise === (signedArea(data, start, end, dim) > 0)) { + for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last); + } else { + for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last); + } - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - } + if (last && equals(last, last.next)) { + removeNode(last); + last = last.next; + } - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; + return last; } +// eliminate colinear or duplicate points +function filterPoints(start, end) { + if (!start) return start; + if (!end) end = start; -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; + var p = start, + again; + do { + again = false; -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; + if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { + removeNode(p); + p = end = p.prev; + if (p === p.next) return null; + again = true; -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; + } else { + p = p.next; + } + } while (again || p !== end); -function isNumber(arg) { - return typeof arg === 'number'; + return end; } -exports.isNumber = isNumber; -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; +// main ear slicing loop which triangulates a polygon (given as a linked list) +function earcutLinked(ear, triangles, dim, minX, minY, size, pass) { + if (!ear) return; -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; + // interlink polygon nodes in z-order + if (!pass && size) indexCurve(ear, minX, minY, size); -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; + var stop = ear, + prev, next; -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; + // iterate through ears, slicing them one by one + while (ear.prev !== ear.next) { + prev = ear.prev; + next = ear.next; -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; + if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) { + // cut off the triangle + triangles.push(prev.i / dim); + triangles.push(ear.i / dim); + triangles.push(next.i / dim); -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; + removeNode(ear); -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; + // skipping the next vertice leads to less sliver triangles + ear = next.next; + stop = next.next; -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; + continue; + } -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; + ear = next; -exports.isBuffer = _dereq_('./support/isBuffer'); + // if we looped through the whole remaining polygon and can't find any more ears + if (ear === stop) { + // try filtering points and slicing again + if (!pass) { + earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1); -function objectToString(o) { - return Object.prototype.toString.call(o); -} + // if this didn't work, try curing all small self-intersections locally + } else if (pass === 1) { + ear = cureLocalIntersections(ear, triangles, dim); + earcutLinked(ear, triangles, dim, minX, minY, size, 2); + // as a last resort, try splitting the remaining polygon into two + } else if (pass === 2) { + splitEarcut(ear, triangles, dim, minX, minY, size); + } -function pad(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); + break; + } + } } +// check whether a polygon node forms a valid ear with adjacent nodes +function isEar(ear) { + var a = ear.prev, + b = ear, + c = ear.next; -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', - 'Oct', 'Nov', 'Dec']; + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear -// 26 Feb 16:19:34 -function timestamp() { - var d = new Date(); - var time = [pad(d.getHours()), - pad(d.getMinutes()), - pad(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); + // now make sure we don't have other points inside the potential ear + var p = ear.next.next; + + while (p !== ear.prev) { + if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && + area(p.prev, p, p.next) >= 0) return false; + p = p.next; + } + + return true; } +function isEarHashed(ear, minX, minY, size) { + var a = ear.prev, + b = ear, + c = ear.next; -// log is just a thin wrapper to console.log that prepends a timestamp -exports.log = function() { - console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); -}; + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + // triangle bbox; min & max are calculated like this for speed + var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x), + minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y), + maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x), + maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y); -/** - * Inherit the prototype methods from one constructor into another. - * - * The Function.prototype.inherits from lang.js rewritten as a standalone - * function (not on Function.prototype). NOTE: If this file is to be loaded - * during bootstrapping this function needs to be rewritten using some native - * functions as prototype setup using normal JavaScript does not work as - * expected during bootstrapping (see mirror.js in r114903). - * - * @param {function} ctor Constructor function which needs to inherit the - * prototype. - * @param {function} superCtor Constructor function to inherit prototype from. - */ -exports.inherits = _dereq_('inherits'); + // z-order range for the current triangle bbox; + var minZ = zOrder(minTX, minTY, minX, minY, size), + maxZ = zOrder(maxTX, maxTY, minX, minY, size); -exports._extend = function(origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject(add)) return origin; + // first look for points inside the triangle in increasing z-order + var p = ear.nextZ; - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin; -}; + while (p && p.z <= maxZ) { + if (p !== ear.prev && p !== ear.next && + pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && + area(p.prev, p, p.next) >= 0) return false; + p = p.nextZ; + } -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); + // then look for points in decreasing z-order + p = ear.prevZ; + + while (p && p.z >= minZ) { + if (p !== ear.prev && p !== ear.next && + pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && + area(p.prev, p, p.next) >= 0) return false; + p = p.prevZ; + } + + return true; } -}).call(this,_dereq_('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +// go through all polygon nodes and cure small local self-intersections +function cureLocalIntersections(start, triangles, dim) { + var p = start; + do { + var a = p.prev, + b = p.next.next; -},{"./support/isBuffer":10,"_process":8,"inherits":9}],12:[function(_dereq_,module,exports){ -_dereq_('../modules/es6.object.to-string'); -_dereq_('../modules/es6.string.iterator'); -_dereq_('../modules/web.dom.iterable'); -_dereq_('../modules/es6.promise'); -module.exports = _dereq_('../modules/_core').Promise; -},{"../modules/_core":20,"../modules/es6.object.to-string":72,"../modules/es6.promise":73,"../modules/es6.string.iterator":74,"../modules/web.dom.iterable":75}],13:[function(_dereq_,module,exports){ -module.exports = function(it){ - if(typeof it != 'function')throw TypeError(it + ' is not a function!'); - return it; -}; -},{}],14:[function(_dereq_,module,exports){ -// 22.1.3.31 Array.prototype[@@unscopables] -var UNSCOPABLES = _dereq_('./_wks')('unscopables') - , ArrayProto = Array.prototype; -if(ArrayProto[UNSCOPABLES] == undefined)_dereq_('./_hide')(ArrayProto, UNSCOPABLES, {}); -module.exports = function(key){ - ArrayProto[UNSCOPABLES][key] = true; -}; -},{"./_hide":31,"./_wks":69}],15:[function(_dereq_,module,exports){ -module.exports = function(it, Constructor, name, forbiddenField){ - if(!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)){ - throw TypeError(name + ': incorrect invocation!'); - } return it; -}; -},{}],16:[function(_dereq_,module,exports){ -var isObject = _dereq_('./_is-object'); -module.exports = function(it){ - if(!isObject(it))throw TypeError(it + ' is not an object!'); - return it; -}; -},{"./_is-object":37}],17:[function(_dereq_,module,exports){ -// false -> Array#indexOf -// true -> Array#includes -var toIObject = _dereq_('./_to-iobject') - , toLength = _dereq_('./_to-length') - , toIndex = _dereq_('./_to-index'); -module.exports = function(IS_INCLUDES){ - return function($this, el, fromIndex){ - var O = toIObject($this) - , length = toLength(O.length) - , index = toIndex(fromIndex, length) - , value; - // Array#includes uses SameValueZero equality algorithm - if(IS_INCLUDES && el != el)while(length > index){ - value = O[index++]; - if(value != value)return true; - // Array#toIndex ignores holes, Array#includes - not - } else for(;length > index; index++)if(IS_INCLUDES || index in O){ - if(O[index] === el)return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; -},{"./_to-index":62,"./_to-iobject":64,"./_to-length":65}],18:[function(_dereq_,module,exports){ -// getting tag from 19.1.3.6 Object.prototype.toString() -var cof = _dereq_('./_cof') - , TAG = _dereq_('./_wks')('toStringTag') - // ES3 wrong here - , ARG = cof(function(){ return arguments; }()) == 'Arguments'; + if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { -// fallback for IE11 Script Access Denied error -var tryGet = function(it, key){ - try { - return it[key]; - } catch(e){ /* empty */ } -}; + triangles.push(a.i / dim); + triangles.push(p.i / dim); + triangles.push(b.i / dim); -module.exports = function(it){ - var O, T, B; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T - // builtinTag case - : ARG ? cof(O) - // ES3 arguments fallback - : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; -}; -},{"./_cof":19,"./_wks":69}],19:[function(_dereq_,module,exports){ -var toString = {}.toString; + // remove two nodes involved + removeNode(p); + removeNode(p.next); -module.exports = function(it){ - return toString.call(it).slice(8, -1); -}; -},{}],20:[function(_dereq_,module,exports){ -var core = module.exports = {version: '2.4.0'}; -if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef -},{}],21:[function(_dereq_,module,exports){ -// optional / simple context binding -var aFunction = _dereq_('./_a-function'); -module.exports = function(fn, that, length){ - aFunction(fn); - if(that === undefined)return fn; - switch(length){ - case 1: return function(a){ - return fn.call(that, a); - }; - case 2: return function(a, b){ - return fn.call(that, a, b); - }; - case 3: return function(a, b, c){ - return fn.call(that, a, b, c); - }; - } - return function(/* ...args */){ - return fn.apply(that, arguments); - }; -}; -},{"./_a-function":13}],22:[function(_dereq_,module,exports){ -// 7.2.1 RequireObjectCoercible(argument) -module.exports = function(it){ - if(it == undefined)throw TypeError("Can't call method on " + it); - return it; -}; -},{}],23:[function(_dereq_,module,exports){ -// Thank's IE8 for his funny defineProperty -module.exports = !_dereq_('./_fails')(function(){ - return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; -}); -},{"./_fails":27}],24:[function(_dereq_,module,exports){ -var isObject = _dereq_('./_is-object') - , document = _dereq_('./_global').document - // in old IE typeof document.createElement is 'object' - , is = isObject(document) && isObject(document.createElement); -module.exports = function(it){ - return is ? document.createElement(it) : {}; -}; -},{"./_global":29,"./_is-object":37}],25:[function(_dereq_,module,exports){ -// IE 8- don't enum bug keys -module.exports = ( - 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' -).split(','); -},{}],26:[function(_dereq_,module,exports){ -var global = _dereq_('./_global') - , core = _dereq_('./_core') - , hide = _dereq_('./_hide') - , redefine = _dereq_('./_redefine') - , ctx = _dereq_('./_ctx') - , PROTOTYPE = 'prototype'; + p = start = b; + } + p = p.next; + } while (p !== start); -var $export = function(type, name, source){ - var IS_FORCED = type & $export.F - , IS_GLOBAL = type & $export.G - , IS_STATIC = type & $export.S - , IS_PROTO = type & $export.P - , IS_BIND = type & $export.B - , target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE] - , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) - , expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}) - , key, own, out, exp; - if(IS_GLOBAL)source = name; - for(key in source){ - // contains in native - own = !IS_FORCED && target && target[key] !== undefined; - // export native or passed - out = (own ? target : source)[key]; - // bind timers to global for call from export context - exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; - // extend global - if(target)redefine(target, key, out, type & $export.U); - // export - if(exports[key] != out)hide(exports, key, exp); - if(IS_PROTO && expProto[key] != out)expProto[key] = out; - } -}; -global.core = core; -// type bitmap -$export.F = 1; // forced -$export.G = 2; // global -$export.S = 4; // static -$export.P = 8; // proto -$export.B = 16; // bind -$export.W = 32; // wrap -$export.U = 64; // safe -$export.R = 128; // real proto method for `library` -module.exports = $export; -},{"./_core":20,"./_ctx":21,"./_global":29,"./_hide":31,"./_redefine":54}],27:[function(_dereq_,module,exports){ -module.exports = function(exec){ - try { - return !!exec(); - } catch(e){ - return true; - } -}; -},{}],28:[function(_dereq_,module,exports){ -var ctx = _dereq_('./_ctx') - , call = _dereq_('./_iter-call') - , isArrayIter = _dereq_('./_is-array-iter') - , anObject = _dereq_('./_an-object') - , toLength = _dereq_('./_to-length') - , getIterFn = _dereq_('./core.get-iterator-method') - , BREAK = {} - , RETURN = {}; -var exports = module.exports = function(iterable, entries, fn, that, ITERATOR){ - var iterFn = ITERATOR ? function(){ return iterable; } : getIterFn(iterable) - , f = ctx(fn, that, entries ? 2 : 1) - , index = 0 - , length, step, iterator, result; - if(typeof iterFn != 'function')throw TypeError(iterable + ' is not iterable!'); - // fast case for arrays with default iterator - if(isArrayIter(iterFn))for(length = toLength(iterable.length); length > index; index++){ - result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); - if(result === BREAK || result === RETURN)return result; - } else for(iterator = iterFn.call(iterable); !(step = iterator.next()).done; ){ - result = call(iterator, f, step.value, entries); - if(result === BREAK || result === RETURN)return result; - } -}; -exports.BREAK = BREAK; -exports.RETURN = RETURN; -},{"./_an-object":16,"./_ctx":21,"./_is-array-iter":36,"./_iter-call":38,"./_to-length":65,"./core.get-iterator-method":70}],29:[function(_dereq_,module,exports){ -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -var global = module.exports = typeof window != 'undefined' && window.Math == Math - ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); -if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef -},{}],30:[function(_dereq_,module,exports){ -var hasOwnProperty = {}.hasOwnProperty; -module.exports = function(it, key){ - return hasOwnProperty.call(it, key); -}; -},{}],31:[function(_dereq_,module,exports){ -var dP = _dereq_('./_object-dp') - , createDesc = _dereq_('./_property-desc'); -module.exports = _dereq_('./_descriptors') ? function(object, key, value){ - return dP.f(object, key, createDesc(1, value)); -} : function(object, key, value){ - object[key] = value; - return object; -}; -},{"./_descriptors":23,"./_object-dp":47,"./_property-desc":52}],32:[function(_dereq_,module,exports){ -module.exports = _dereq_('./_global').document && document.documentElement; -},{"./_global":29}],33:[function(_dereq_,module,exports){ -module.exports = !_dereq_('./_descriptors') && !_dereq_('./_fails')(function(){ - return Object.defineProperty(_dereq_('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7; -}); -},{"./_descriptors":23,"./_dom-create":24,"./_fails":27}],34:[function(_dereq_,module,exports){ -// fast apply, http://jsperf.lnkit.com/fast-apply/5 -module.exports = function(fn, args, that){ - var un = that === undefined; - switch(args.length){ - case 0: return un ? fn() - : fn.call(that); - case 1: return un ? fn(args[0]) - : fn.call(that, args[0]); - case 2: return un ? fn(args[0], args[1]) - : fn.call(that, args[0], args[1]); - case 3: return un ? fn(args[0], args[1], args[2]) - : fn.call(that, args[0], args[1], args[2]); - case 4: return un ? fn(args[0], args[1], args[2], args[3]) - : fn.call(that, args[0], args[1], args[2], args[3]); - } return fn.apply(that, args); -}; -},{}],35:[function(_dereq_,module,exports){ -// fallback for non-array-like ES3 and non-enumerable old V8 strings -var cof = _dereq_('./_cof'); -module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){ - return cof(it) == 'String' ? it.split('') : Object(it); -}; -},{"./_cof":19}],36:[function(_dereq_,module,exports){ -// check on default Array iterator -var Iterators = _dereq_('./_iterators') - , ITERATOR = _dereq_('./_wks')('iterator') - , ArrayProto = Array.prototype; + return p; +} -module.exports = function(it){ - return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); -}; -},{"./_iterators":43,"./_wks":69}],37:[function(_dereq_,module,exports){ -module.exports = function(it){ - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; -},{}],38:[function(_dereq_,module,exports){ -// call something on iterator step with safe closing on error -var anObject = _dereq_('./_an-object'); -module.exports = function(iterator, fn, value, entries){ - try { - return entries ? fn(anObject(value)[0], value[1]) : fn(value); - // 7.4.6 IteratorClose(iterator, completion) - } catch(e){ - var ret = iterator['return']; - if(ret !== undefined)anObject(ret.call(iterator)); - throw e; - } -}; -},{"./_an-object":16}],39:[function(_dereq_,module,exports){ -'use strict'; -var create = _dereq_('./_object-create') - , descriptor = _dereq_('./_property-desc') - , setToStringTag = _dereq_('./_set-to-string-tag') - , IteratorPrototype = {}; +// try splitting polygon into two and triangulate them independently +function splitEarcut(start, triangles, dim, minX, minY, size) { + // look for a valid diagonal that divides the polygon into two + var a = start; + do { + var b = a.next.next; + while (b !== a.prev) { + if (a.i !== b.i && isValidDiagonal(a, b)) { + // split the polygon in two by the diagonal + var c = splitPolygon(a, b); -// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() -_dereq_('./_hide')(IteratorPrototype, _dereq_('./_wks')('iterator'), function(){ return this; }); + // filter colinear points around the cuts + a = filterPoints(a, a.next); + c = filterPoints(c, c.next); -module.exports = function(Constructor, NAME, next){ - Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)}); - setToStringTag(Constructor, NAME + ' Iterator'); -}; -},{"./_hide":31,"./_object-create":46,"./_property-desc":52,"./_set-to-string-tag":56,"./_wks":69}],40:[function(_dereq_,module,exports){ -'use strict'; -var LIBRARY = _dereq_('./_library') - , $export = _dereq_('./_export') - , redefine = _dereq_('./_redefine') - , hide = _dereq_('./_hide') - , has = _dereq_('./_has') - , Iterators = _dereq_('./_iterators') - , $iterCreate = _dereq_('./_iter-create') - , setToStringTag = _dereq_('./_set-to-string-tag') - , getPrototypeOf = _dereq_('./_object-gpo') - , ITERATOR = _dereq_('./_wks')('iterator') - , BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next` - , FF_ITERATOR = '@@iterator' - , KEYS = 'keys' - , VALUES = 'values'; + // run earcut on each half + earcutLinked(a, triangles, dim, minX, minY, size); + earcutLinked(c, triangles, dim, minX, minY, size); + return; + } + b = b.next; + } + a = a.next; + } while (a !== start); +} -var returnThis = function(){ return this; }; +// link every hole into the outer loop, producing a single-ring polygon without holes +function eliminateHoles(data, holeIndices, outerNode, dim) { + var queue = [], + i, len, start, end, list; -module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){ - $iterCreate(Constructor, NAME, next); - var getMethod = function(kind){ - if(!BUGGY && kind in proto)return proto[kind]; - switch(kind){ - case KEYS: return function keys(){ return new Constructor(this, kind); }; - case VALUES: return function values(){ return new Constructor(this, kind); }; - } return function entries(){ return new Constructor(this, kind); }; - }; - var TAG = NAME + ' Iterator' - , DEF_VALUES = DEFAULT == VALUES - , VALUES_BUG = false - , proto = Base.prototype - , $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT] - , $default = $native || getMethod(DEFAULT) - , $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined - , $anyNative = NAME == 'Array' ? proto.entries || $native : $native - , methods, key, IteratorPrototype; - // Fix native - if($anyNative){ - IteratorPrototype = getPrototypeOf($anyNative.call(new Base)); - if(IteratorPrototype !== Object.prototype){ - // Set @@toStringTag to native iterators - setToStringTag(IteratorPrototype, TAG, true); - // fix for some old engines - if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis); + for (i = 0, len = holeIndices.length; i < len; i++) { + start = holeIndices[i] * dim; + end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + list = linkedList(data, start, end, dim, false); + if (list === list.next) list.steiner = true; + queue.push(getLeftmost(list)); } - } - // fix Array#{values, @@iterator}.name in V8 / FF - if(DEF_VALUES && $native && $native.name !== VALUES){ - VALUES_BUG = true; - $default = function values(){ return $native.call(this); }; - } - // Define iterator - if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){ - hide(proto, ITERATOR, $default); - } - // Plug for library - Iterators[NAME] = $default; - Iterators[TAG] = returnThis; - if(DEFAULT){ - methods = { - values: DEF_VALUES ? $default : getMethod(VALUES), - keys: IS_SET ? $default : getMethod(KEYS), - entries: $entries - }; - if(FORCED)for(key in methods){ - if(!(key in proto))redefine(proto, key, methods[key]); - } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); - } - return methods; -}; -},{"./_export":26,"./_has":30,"./_hide":31,"./_iter-create":39,"./_iterators":43,"./_library":44,"./_object-gpo":49,"./_redefine":54,"./_set-to-string-tag":56,"./_wks":69}],41:[function(_dereq_,module,exports){ -var ITERATOR = _dereq_('./_wks')('iterator') - , SAFE_CLOSING = false; -try { - var riter = [7][ITERATOR](); - riter['return'] = function(){ SAFE_CLOSING = true; }; - Array.from(riter, function(){ throw 2; }); -} catch(e){ /* empty */ } + queue.sort(compareX); -module.exports = function(exec, skipClosing){ - if(!skipClosing && !SAFE_CLOSING)return false; - var safe = false; - try { - var arr = [7] - , iter = arr[ITERATOR](); - iter.next = function(){ return {done: safe = true}; }; - arr[ITERATOR] = function(){ return iter; }; - exec(arr); - } catch(e){ /* empty */ } - return safe; -}; -},{"./_wks":69}],42:[function(_dereq_,module,exports){ -module.exports = function(done, value){ - return {value: value, done: !!done}; -}; -},{}],43:[function(_dereq_,module,exports){ -module.exports = {}; -},{}],44:[function(_dereq_,module,exports){ -module.exports = false; -},{}],45:[function(_dereq_,module,exports){ -var global = _dereq_('./_global') - , macrotask = _dereq_('./_task').set - , Observer = global.MutationObserver || global.WebKitMutationObserver - , process = global.process - , Promise = global.Promise - , isNode = _dereq_('./_cof')(process) == 'process'; + // process holes from left to right + for (i = 0; i < queue.length; i++) { + eliminateHole(queue[i], outerNode); + outerNode = filterPoints(outerNode, outerNode.next); + } -module.exports = function(){ - var head, last, notify; + return outerNode; +} - var flush = function(){ - var parent, fn; - if(isNode && (parent = process.domain))parent.exit(); - while(head){ - fn = head.fn; - head = head.next; - try { - fn(); - } catch(e){ - if(head)notify(); - else last = undefined; - throw e; - } - } last = undefined; - if(parent)parent.enter(); - }; +function compareX(a, b) { + return a.x - b.x; +} - // Node.js - if(isNode){ - notify = function(){ - process.nextTick(flush); - }; - // browsers with MutationObserver - } else if(Observer){ - var toggle = true - , node = document.createTextNode(''); - new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new - notify = function(){ - node.data = toggle = !toggle; - }; - // environments with maybe non-completely correct, but existent Promise - } else if(Promise && Promise.resolve){ - var promise = Promise.resolve(); - notify = function(){ - promise.then(flush); - }; - // for other environments - macrotask based on: - // - setImmediate - // - MessageChannel - // - window.postMessag - // - onreadystatechange - // - setTimeout - } else { - notify = function(){ - // strange IE + webpack dev server bug - use .call(global) - macrotask.call(global, flush); - }; - } +// find a bridge between vertices that connects hole with an outer ring and and link it +function eliminateHole(hole, outerNode) { + outerNode = findHoleBridge(hole, outerNode); + if (outerNode) { + var b = splitPolygon(outerNode, hole); + filterPoints(b, b.next); + } +} - return function(fn){ - var task = {fn: fn, next: undefined}; - if(last)last.next = task; - if(!head){ - head = task; - notify(); - } last = task; - }; -}; -},{"./_cof":19,"./_global":29,"./_task":61}],46:[function(_dereq_,module,exports){ -// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) -var anObject = _dereq_('./_an-object') - , dPs = _dereq_('./_object-dps') - , enumBugKeys = _dereq_('./_enum-bug-keys') - , IE_PROTO = _dereq_('./_shared-key')('IE_PROTO') - , Empty = function(){ /* empty */ } - , PROTOTYPE = 'prototype'; +// David Eberly's algorithm for finding a bridge between hole and outer polygon +function findHoleBridge(hole, outerNode) { + var p = outerNode, + hx = hole.x, + hy = hole.y, + qx = -Infinity, + m; -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var createDict = function(){ - // Thrash, waste and sodomy: IE GC bug - var iframe = _dereq_('./_dom-create')('iframe') - , i = enumBugKeys.length - , lt = '<' - , gt = '>' - , iframeDocument; - iframe.style.display = 'none'; - _dereq_('./_html').appendChild(iframe); - iframe.src = 'javascript:'; // eslint-disable-line no-script-url - // createDict = iframe.contentWindow.Object; - // html.removeChild(iframe); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); - iframeDocument.close(); - createDict = iframeDocument.F; - while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]]; - return createDict(); -}; + // find a segment intersected by a ray from the hole's leftmost point to the left; + // segment's endpoint with lesser x will be potential connection point + do { + if (hy <= p.y && hy >= p.next.y) { + var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); + if (x <= hx && x > qx) { + qx = x; + if (x === hx) { + if (hy === p.y) return p; + if (hy === p.next.y) return p.next; + } + m = p.x < p.next.x ? p : p.next; + } + } + p = p.next; + } while (p !== outerNode); -module.exports = Object.create || function create(O, Properties){ - var result; - if(O !== null){ - Empty[PROTOTYPE] = anObject(O); - result = new Empty; - Empty[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = createDict(); - return Properties === undefined ? result : dPs(result, Properties); -}; + if (!m) return null; -},{"./_an-object":16,"./_dom-create":24,"./_enum-bug-keys":25,"./_html":32,"./_object-dps":48,"./_shared-key":57}],47:[function(_dereq_,module,exports){ -var anObject = _dereq_('./_an-object') - , IE8_DOM_DEFINE = _dereq_('./_ie8-dom-define') - , toPrimitive = _dereq_('./_to-primitive') - , dP = Object.defineProperty; + if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint -exports.f = _dereq_('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){ - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if(IE8_DOM_DEFINE)try { - return dP(O, P, Attributes); - } catch(e){ /* empty */ } - if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!'); - if('value' in Attributes)O[P] = Attributes.value; - return O; -}; -},{"./_an-object":16,"./_descriptors":23,"./_ie8-dom-define":33,"./_to-primitive":67}],48:[function(_dereq_,module,exports){ -var dP = _dereq_('./_object-dp') - , anObject = _dereq_('./_an-object') - , getKeys = _dereq_('./_object-keys'); + // look for points inside the triangle of hole point, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the point of the minimum angle with the ray as connection point -module.exports = _dereq_('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties){ - anObject(O); - var keys = getKeys(Properties) - , length = keys.length - , i = 0 - , P; - while(length > i)dP.f(O, P = keys[i++], Properties[P]); - return O; -}; -},{"./_an-object":16,"./_descriptors":23,"./_object-dp":47,"./_object-keys":51}],49:[function(_dereq_,module,exports){ -// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) -var has = _dereq_('./_has') - , toObject = _dereq_('./_to-object') - , IE_PROTO = _dereq_('./_shared-key')('IE_PROTO') - , ObjectProto = Object.prototype; + var stop = m, + mx = m.x, + my = m.y, + tanMin = Infinity, + tan; -module.exports = Object.getPrototypeOf || function(O){ - O = toObject(O); - if(has(O, IE_PROTO))return O[IE_PROTO]; - if(typeof O.constructor == 'function' && O instanceof O.constructor){ - return O.constructor.prototype; - } return O instanceof Object ? ObjectProto : null; -}; -},{"./_has":30,"./_shared-key":57,"./_to-object":66}],50:[function(_dereq_,module,exports){ -var has = _dereq_('./_has') - , toIObject = _dereq_('./_to-iobject') - , arrayIndexOf = _dereq_('./_array-includes')(false) - , IE_PROTO = _dereq_('./_shared-key')('IE_PROTO'); + p = m.next; -module.exports = function(object, names){ - var O = toIObject(object) - , i = 0 - , result = [] - , key; - for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while(names.length > i)if(has(O, key = names[i++])){ - ~arrayIndexOf(result, key) || result.push(key); - } - return result; -}; -},{"./_array-includes":17,"./_has":30,"./_shared-key":57,"./_to-iobject":64}],51:[function(_dereq_,module,exports){ -// 19.1.2.14 / 15.2.3.14 Object.keys(O) -var $keys = _dereq_('./_object-keys-internal') - , enumBugKeys = _dereq_('./_enum-bug-keys'); + while (p !== stop) { + if (hx >= p.x && p.x >= mx && + pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { -module.exports = Object.keys || function keys(O){ - return $keys(O, enumBugKeys); -}; -},{"./_enum-bug-keys":25,"./_object-keys-internal":50}],52:[function(_dereq_,module,exports){ -module.exports = function(bitmap, value){ - return { - enumerable : !(bitmap & 1), - configurable: !(bitmap & 2), - writable : !(bitmap & 4), - value : value - }; -}; -},{}],53:[function(_dereq_,module,exports){ -var redefine = _dereq_('./_redefine'); -module.exports = function(target, src, safe){ - for(var key in src)redefine(target, key, src[key], safe); - return target; -}; -},{"./_redefine":54}],54:[function(_dereq_,module,exports){ -var global = _dereq_('./_global') - , hide = _dereq_('./_hide') - , has = _dereq_('./_has') - , SRC = _dereq_('./_uid')('src') - , TO_STRING = 'toString' - , $toString = Function[TO_STRING] - , TPL = ('' + $toString).split(TO_STRING); + tan = Math.abs(hy - p.y) / (hx - p.x); // tangential -_dereq_('./_core').inspectSource = function(it){ - return $toString.call(it); -}; + if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) { + m = p; + tanMin = tan; + } + } -(module.exports = function(O, key, val, safe){ - var isFunction = typeof val == 'function'; - if(isFunction)has(val, 'name') || hide(val, 'name', key); - if(O[key] === val)return; - if(isFunction)has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); - if(O === global){ - O[key] = val; - } else { - if(!safe){ - delete O[key]; - hide(O, key, val); - } else { - if(O[key])O[key] = val; - else hide(O, key, val); + p = p.next; } - } -// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative -})(Function.prototype, TO_STRING, function toString(){ - return typeof this == 'function' && this[SRC] || $toString.call(this); -}); -},{"./_core":20,"./_global":29,"./_has":30,"./_hide":31,"./_uid":68}],55:[function(_dereq_,module,exports){ -'use strict'; -var global = _dereq_('./_global') - , dP = _dereq_('./_object-dp') - , DESCRIPTORS = _dereq_('./_descriptors') - , SPECIES = _dereq_('./_wks')('species'); -module.exports = function(KEY){ - var C = global[KEY]; - if(DESCRIPTORS && C && !C[SPECIES])dP.f(C, SPECIES, { - configurable: true, - get: function(){ return this; } - }); -}; -},{"./_descriptors":23,"./_global":29,"./_object-dp":47,"./_wks":69}],56:[function(_dereq_,module,exports){ -var def = _dereq_('./_object-dp').f - , has = _dereq_('./_has') - , TAG = _dereq_('./_wks')('toStringTag'); + return m; +} -module.exports = function(it, tag, stat){ - if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag}); -}; -},{"./_has":30,"./_object-dp":47,"./_wks":69}],57:[function(_dereq_,module,exports){ -var shared = _dereq_('./_shared')('keys') - , uid = _dereq_('./_uid'); -module.exports = function(key){ - return shared[key] || (shared[key] = uid(key)); -}; -},{"./_shared":58,"./_uid":68}],58:[function(_dereq_,module,exports){ -var global = _dereq_('./_global') - , SHARED = '__core-js_shared__' - , store = global[SHARED] || (global[SHARED] = {}); -module.exports = function(key){ - return store[key] || (store[key] = {}); -}; -},{"./_global":29}],59:[function(_dereq_,module,exports){ -// 7.3.20 SpeciesConstructor(O, defaultConstructor) -var anObject = _dereq_('./_an-object') - , aFunction = _dereq_('./_a-function') - , SPECIES = _dereq_('./_wks')('species'); -module.exports = function(O, D){ - var C = anObject(O).constructor, S; - return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); -}; -},{"./_a-function":13,"./_an-object":16,"./_wks":69}],60:[function(_dereq_,module,exports){ -var toInteger = _dereq_('./_to-integer') - , defined = _dereq_('./_defined'); -// true -> String#at -// false -> String#codePointAt -module.exports = function(TO_STRING){ - return function(that, pos){ - var s = String(defined(that)) - , i = toInteger(pos) - , l = s.length - , a, b; - if(i < 0 || i >= l)return TO_STRING ? '' : undefined; - a = s.charCodeAt(i); - return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff - ? TO_STRING ? s.charAt(i) : a - : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; - }; -}; -},{"./_defined":22,"./_to-integer":63}],61:[function(_dereq_,module,exports){ -var ctx = _dereq_('./_ctx') - , invoke = _dereq_('./_invoke') - , html = _dereq_('./_html') - , cel = _dereq_('./_dom-create') - , global = _dereq_('./_global') - , process = global.process - , setTask = global.setImmediate - , clearTask = global.clearImmediate - , MessageChannel = global.MessageChannel - , counter = 0 - , queue = {} - , ONREADYSTATECHANGE = 'onreadystatechange' - , defer, channel, port; -var run = function(){ - var id = +this; - if(queue.hasOwnProperty(id)){ - var fn = queue[id]; - delete queue[id]; - fn(); - } -}; -var listener = function(event){ - run.call(event.data); -}; -// Node.js 0.9+ & IE10+ has setImmediate, otherwise: -if(!setTask || !clearTask){ - setTask = function setImmediate(fn){ - var args = [], i = 1; - while(arguments.length > i)args.push(arguments[i++]); - queue[++counter] = function(){ - invoke(typeof fn == 'function' ? fn : Function(fn), args); - }; - defer(counter); - return counter; - }; - clearTask = function clearImmediate(id){ - delete queue[id]; - }; - // Node.js 0.8- - if(_dereq_('./_cof')(process) == 'process'){ - defer = function(id){ - process.nextTick(ctx(run, id, 1)); - }; - // Browsers with MessageChannel, includes WebWorkers - } else if(MessageChannel){ - channel = new MessageChannel; - port = channel.port2; - channel.port1.onmessage = listener; - defer = ctx(port.postMessage, port, 1); - // Browsers with postMessage, skip WebWorkers - // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' - } else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){ - defer = function(id){ - global.postMessage(id + '', '*'); - }; - global.addEventListener('message', listener, false); - // IE8- - } else if(ONREADYSTATECHANGE in cel('script')){ - defer = function(id){ - html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){ - html.removeChild(this); - run.call(id); - }; - }; - // Rest old browsers - } else { - defer = function(id){ - setTimeout(ctx(run, id, 1), 0); - }; - } +// interlink polygon nodes in z-order +function indexCurve(start, minX, minY, size) { + var p = start; + do { + if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + } while (p !== start); + + p.prevZ.nextZ = null; + p.prevZ = null; + + sortLinked(p); } -module.exports = { - set: setTask, - clear: clearTask -}; -},{"./_cof":19,"./_ctx":21,"./_dom-create":24,"./_global":29,"./_html":32,"./_invoke":34}],62:[function(_dereq_,module,exports){ -var toInteger = _dereq_('./_to-integer') - , max = Math.max - , min = Math.min; -module.exports = function(index, length){ - index = toInteger(index); - return index < 0 ? max(index + length, 0) : min(index, length); -}; -},{"./_to-integer":63}],63:[function(_dereq_,module,exports){ -// 7.1.4 ToInteger -var ceil = Math.ceil - , floor = Math.floor; -module.exports = function(it){ - return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); -}; -},{}],64:[function(_dereq_,module,exports){ -// to indexed object, toObject with fallback for non-array-like ES3 strings -var IObject = _dereq_('./_iobject') - , defined = _dereq_('./_defined'); -module.exports = function(it){ - return IObject(defined(it)); -}; -},{"./_defined":22,"./_iobject":35}],65:[function(_dereq_,module,exports){ -// 7.1.15 ToLength -var toInteger = _dereq_('./_to-integer') - , min = Math.min; -module.exports = function(it){ - return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 -}; -},{"./_to-integer":63}],66:[function(_dereq_,module,exports){ -// 7.1.13 ToObject(argument) -var defined = _dereq_('./_defined'); -module.exports = function(it){ - return Object(defined(it)); -}; -},{"./_defined":22}],67:[function(_dereq_,module,exports){ -// 7.1.1 ToPrimitive(input [, PreferredType]) -var isObject = _dereq_('./_is-object'); -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -module.exports = function(it, S){ - if(!isObject(it))return it; - var fn, val; - if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val; - if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - throw TypeError("Can't convert object to primitive value"); -}; -},{"./_is-object":37}],68:[function(_dereq_,module,exports){ -var id = 0 - , px = Math.random(); -module.exports = function(key){ - return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); -}; -},{}],69:[function(_dereq_,module,exports){ -var store = _dereq_('./_shared')('wks') - , uid = _dereq_('./_uid') - , Symbol = _dereq_('./_global').Symbol - , USE_SYMBOL = typeof Symbol == 'function'; -var $exports = module.exports = function(name){ - return store[name] || (store[name] = - USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); -}; +// Simon Tatham's linked list merge sort algorithm +// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html +function sortLinked(list) { + var i, p, q, e, tail, numMerges, pSize, qSize, + inSize = 1; -$exports.store = store; -},{"./_global":29,"./_shared":58,"./_uid":68}],70:[function(_dereq_,module,exports){ -var classof = _dereq_('./_classof') - , ITERATOR = _dereq_('./_wks')('iterator') - , Iterators = _dereq_('./_iterators'); -module.exports = _dereq_('./_core').getIteratorMethod = function(it){ - if(it != undefined)return it[ITERATOR] - || it['@@iterator'] - || Iterators[classof(it)]; -}; -},{"./_classof":18,"./_core":20,"./_iterators":43,"./_wks":69}],71:[function(_dereq_,module,exports){ -'use strict'; -var addToUnscopables = _dereq_('./_add-to-unscopables') - , step = _dereq_('./_iter-step') - , Iterators = _dereq_('./_iterators') - , toIObject = _dereq_('./_to-iobject'); + do { + p = list; + list = null; + tail = null; + numMerges = 0; -// 22.1.3.4 Array.prototype.entries() -// 22.1.3.13 Array.prototype.keys() -// 22.1.3.29 Array.prototype.values() -// 22.1.3.30 Array.prototype[@@iterator]() -module.exports = _dereq_('./_iter-define')(Array, 'Array', function(iterated, kind){ - this._t = toIObject(iterated); // target - this._i = 0; // next index - this._k = kind; // kind -// 22.1.5.2.1 %ArrayIteratorPrototype%.next() -}, function(){ - var O = this._t - , kind = this._k - , index = this._i++; - if(!O || index >= O.length){ - this._t = undefined; - return step(1); - } - if(kind == 'keys' )return step(0, index); - if(kind == 'values')return step(0, O[index]); - return step(0, [index, O[index]]); -}, 'values'); + while (p) { + numMerges++; + q = p; + pSize = 0; + for (i = 0; i < inSize; i++) { + pSize++; + q = q.nextZ; + if (!q) break; + } -// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) -Iterators.Arguments = Iterators.Array; + qSize = inSize; -addToUnscopables('keys'); -addToUnscopables('values'); -addToUnscopables('entries'); -},{"./_add-to-unscopables":14,"./_iter-define":40,"./_iter-step":42,"./_iterators":43,"./_to-iobject":64}],72:[function(_dereq_,module,exports){ -'use strict'; -// 19.1.3.6 Object.prototype.toString() -var classof = _dereq_('./_classof') - , test = {}; -test[_dereq_('./_wks')('toStringTag')] = 'z'; -if(test + '' != '[object z]'){ - _dereq_('./_redefine')(Object.prototype, 'toString', function toString(){ - return '[object ' + classof(this) + ']'; - }, true); -} -},{"./_classof":18,"./_redefine":54,"./_wks":69}],73:[function(_dereq_,module,exports){ -'use strict'; -var LIBRARY = _dereq_('./_library') - , global = _dereq_('./_global') - , ctx = _dereq_('./_ctx') - , classof = _dereq_('./_classof') - , $export = _dereq_('./_export') - , isObject = _dereq_('./_is-object') - , aFunction = _dereq_('./_a-function') - , anInstance = _dereq_('./_an-instance') - , forOf = _dereq_('./_for-of') - , speciesConstructor = _dereq_('./_species-constructor') - , task = _dereq_('./_task').set - , microtask = _dereq_('./_microtask')() - , PROMISE = 'Promise' - , TypeError = global.TypeError - , process = global.process - , $Promise = global[PROMISE] - , process = global.process - , isNode = classof(process) == 'process' - , empty = function(){ /* empty */ } - , Internal, GenericPromiseCapability, Wrapper; + while (pSize > 0 || (qSize > 0 && q)) { -var USE_NATIVE = !!function(){ - try { - // correct subclassing with @@species support - var promise = $Promise.resolve(1) - , FakePromise = (promise.constructor = {})[_dereq_('./_wks')('species')] = function(exec){ exec(empty, empty); }; - // unhandled rejections tracking support, NodeJS Promise without it fails @@species test - return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise; - } catch(e){ /* empty */ } -}(); + if (pSize === 0) { + e = q; + q = q.nextZ; + qSize--; + } else if (qSize === 0 || !q) { + e = p; + p = p.nextZ; + pSize--; + } else if (p.z <= q.z) { + e = p; + p = p.nextZ; + pSize--; + } else { + e = q; + q = q.nextZ; + qSize--; + } -// helpers -var sameConstructor = function(a, b){ - // with library wrapper special case - return a === b || a === $Promise && b === Wrapper; -}; -var isThenable = function(it){ - var then; - return isObject(it) && typeof (then = it.then) == 'function' ? then : false; -}; -var newPromiseCapability = function(C){ - return sameConstructor($Promise, C) - ? new PromiseCapability(C) - : new GenericPromiseCapability(C); -}; -var PromiseCapability = GenericPromiseCapability = function(C){ - var resolve, reject; - this.promise = new C(function($$resolve, $$reject){ - if(resolve !== undefined || reject !== undefined)throw TypeError('Bad Promise constructor'); - resolve = $$resolve; - reject = $$reject; - }); - this.resolve = aFunction(resolve); - this.reject = aFunction(reject); -}; -var perform = function(exec){ - try { - exec(); - } catch(e){ - return {error: e}; - } -}; -var notify = function(promise, isReject){ - if(promise._n)return; - promise._n = true; - var chain = promise._c; - microtask(function(){ - var value = promise._v - , ok = promise._s == 1 - , i = 0; - var run = function(reaction){ - var handler = ok ? reaction.ok : reaction.fail - , resolve = reaction.resolve - , reject = reaction.reject - , domain = reaction.domain - , result, then; - try { - if(handler){ - if(!ok){ - if(promise._h == 2)onHandleUnhandled(promise); - promise._h = 1; - } - if(handler === true)result = value; - else { - if(domain)domain.enter(); - result = handler(value); - if(domain)domain.exit(); - } - if(result === reaction.promise){ - reject(TypeError('Promise-chain cycle')); - } else if(then = isThenable(result)){ - then.call(result, resolve, reject); - } else resolve(result); - } else reject(value); - } catch(e){ - reject(e); - } - }; - while(chain.length > i)run(chain[i++]); // variable length - can't use forEach - promise._c = []; - promise._n = false; - if(isReject && !promise._h)onUnhandled(promise); - }); -}; -var onUnhandled = function(promise){ - task.call(global, function(){ - var value = promise._v - , abrupt, handler, console; - if(isUnhandled(promise)){ - abrupt = perform(function(){ - if(isNode){ - process.emit('unhandledRejection', value, promise); - } else if(handler = global.onunhandledrejection){ - handler({promise: promise, reason: value}); - } else if((console = global.console) && console.error){ - console.error('Unhandled promise rejection', value); - } - }); - // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should - promise._h = isNode || isUnhandled(promise) ? 2 : 1; - } promise._a = undefined; - if(abrupt)throw abrupt.error; - }); -}; -var isUnhandled = function(promise){ - if(promise._h == 1)return false; - var chain = promise._a || promise._c - , i = 0 - , reaction; - while(chain.length > i){ - reaction = chain[i++]; - if(reaction.fail || !isUnhandled(reaction.promise))return false; - } return true; -}; -var onHandleUnhandled = function(promise){ - task.call(global, function(){ - var handler; - if(isNode){ - process.emit('rejectionHandled', promise); - } else if(handler = global.onrejectionhandled){ - handler({promise: promise, reason: promise._v}); - } - }); -}; -var $reject = function(value){ - var promise = this; - if(promise._d)return; - promise._d = true; - promise = promise._w || promise; // unwrap - promise._v = value; - promise._s = 2; - if(!promise._a)promise._a = promise._c.slice(); - notify(promise, true); -}; -var $resolve = function(value){ - var promise = this - , then; - if(promise._d)return; - promise._d = true; - promise = promise._w || promise; // unwrap - try { - if(promise === value)throw TypeError("Promise can't be resolved itself"); - if(then = isThenable(value)){ - microtask(function(){ - var wrapper = {_w: promise, _d: false}; // wrap - try { - then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); - } catch(e){ - $reject.call(wrapper, e); + if (tail) tail.nextZ = e; + else list = e; + + e.prevZ = tail; + tail = e; + } + + p = q; } - }); - } else { - promise._v = value; - promise._s = 1; - notify(promise, false); - } - } catch(e){ - $reject.call({_w: promise, _d: false}, e); // wrap - } -}; -// constructor polyfill -if(!USE_NATIVE){ - // 25.4.3.1 Promise(executor) - $Promise = function Promise(executor){ - anInstance(this, $Promise, PROMISE, '_h'); - aFunction(executor); - Internal.call(this); - try { - executor(ctx($resolve, this, 1), ctx($reject, this, 1)); - } catch(err){ - $reject.call(this, err); - } - }; - Internal = function Promise(executor){ - this._c = []; // <- awaiting reactions - this._a = undefined; // <- checked in isUnhandled reactions - this._s = 0; // <- state - this._d = false; // <- done - this._v = undefined; // <- value - this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled - this._n = false; // <- notify - }; - Internal.prototype = _dereq_('./_redefine-all')($Promise.prototype, { - // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) - then: function then(onFulfilled, onRejected){ - var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); - reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; - reaction.fail = typeof onRejected == 'function' && onRejected; - reaction.domain = isNode ? process.domain : undefined; - this._c.push(reaction); - if(this._a)this._a.push(reaction); - if(this._s)notify(this, false); - return reaction.promise; - }, - // 25.4.5.1 Promise.prototype.catch(onRejected) - 'catch': function(onRejected){ - return this.then(undefined, onRejected); - } - }); - PromiseCapability = function(){ - var promise = new Internal; - this.promise = promise; - this.resolve = ctx($resolve, promise, 1); - this.reject = ctx($reject, promise, 1); - }; + tail.nextZ = null; + inSize *= 2; + + } while (numMerges > 1); + + return list; } -$export($export.G + $export.W + $export.F * !USE_NATIVE, {Promise: $Promise}); -_dereq_('./_set-to-string-tag')($Promise, PROMISE); -_dereq_('./_set-species')(PROMISE); -Wrapper = _dereq_('./_core')[PROMISE]; +// z-order of a point given coords and size of the data bounding box +function zOrder(x, y, minX, minY, size) { + // coords are transformed into non-negative 15-bit integer range + x = 32767 * (x - minX) / size; + y = 32767 * (y - minY) / size; -// statics -$export($export.S + $export.F * !USE_NATIVE, PROMISE, { - // 25.4.4.5 Promise.reject(r) - reject: function reject(r){ - var capability = newPromiseCapability(this) - , $$reject = capability.reject; - $$reject(r); - return capability.promise; - } -}); -$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { - // 25.4.4.6 Promise.resolve(x) - resolve: function resolve(x){ - // instanceof instead of internal slot check because we should fix it without replacement native Promise core - if(x instanceof $Promise && sameConstructor(x.constructor, this))return x; - var capability = newPromiseCapability(this) - , $$resolve = capability.resolve; - $$resolve(x); - return capability.promise; - } -}); -$export($export.S + $export.F * !(USE_NATIVE && _dereq_('./_iter-detect')(function(iter){ - $Promise.all(iter)['catch'](empty); -})), PROMISE, { - // 25.4.4.1 Promise.all(iterable) - all: function all(iterable){ - var C = this - , capability = newPromiseCapability(C) - , resolve = capability.resolve - , reject = capability.reject; - var abrupt = perform(function(){ - var values = [] - , index = 0 - , remaining = 1; - forOf(iterable, false, function(promise){ - var $index = index++ - , alreadyCalled = false; - values.push(undefined); - remaining++; - C.resolve(promise).then(function(value){ - if(alreadyCalled)return; - alreadyCalled = true; - values[$index] = value; - --remaining || resolve(values); - }, reject); - }); - --remaining || resolve(values); - }); - if(abrupt)reject(abrupt.error); - return capability.promise; - }, - // 25.4.4.4 Promise.race(iterable) - race: function race(iterable){ - var C = this - , capability = newPromiseCapability(C) - , reject = capability.reject; - var abrupt = perform(function(){ - forOf(iterable, false, function(promise){ - C.resolve(promise).then(capability.resolve, reject); - }); - }); - if(abrupt)reject(abrupt.error); - return capability.promise; - } -}); -},{"./_a-function":13,"./_an-instance":15,"./_classof":18,"./_core":20,"./_ctx":21,"./_export":26,"./_for-of":28,"./_global":29,"./_is-object":37,"./_iter-detect":41,"./_library":44,"./_microtask":45,"./_redefine-all":53,"./_set-species":55,"./_set-to-string-tag":56,"./_species-constructor":59,"./_task":61,"./_wks":69}],74:[function(_dereq_,module,exports){ -'use strict'; -var $at = _dereq_('./_string-at')(true); + x = (x | (x << 8)) & 0x00FF00FF; + x = (x | (x << 4)) & 0x0F0F0F0F; + x = (x | (x << 2)) & 0x33333333; + x = (x | (x << 1)) & 0x55555555; -// 21.1.3.27 String.prototype[@@iterator]() -_dereq_('./_iter-define')(String, 'String', function(iterated){ - this._t = String(iterated); // target - this._i = 0; // next index -// 21.1.5.2.1 %StringIteratorPrototype%.next() -}, function(){ - var O = this._t - , index = this._i - , point; - if(index >= O.length)return {value: undefined, done: true}; - point = $at(O, index); - this._i += point.length; - return {value: point, done: false}; -}); -},{"./_iter-define":40,"./_string-at":60}],75:[function(_dereq_,module,exports){ -var $iterators = _dereq_('./es6.array.iterator') - , redefine = _dereq_('./_redefine') - , global = _dereq_('./_global') - , hide = _dereq_('./_hide') - , Iterators = _dereq_('./_iterators') - , wks = _dereq_('./_wks') - , ITERATOR = wks('iterator') - , TO_STRING_TAG = wks('toStringTag') - , ArrayValues = Iterators.Array; + y = (y | (y << 8)) & 0x00FF00FF; + y = (y | (y << 4)) & 0x0F0F0F0F; + y = (y | (y << 2)) & 0x33333333; + y = (y | (y << 1)) & 0x55555555; -for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){ - var NAME = collections[i] - , Collection = global[NAME] - , proto = Collection && Collection.prototype - , key; - if(proto){ - if(!proto[ITERATOR])hide(proto, ITERATOR, ArrayValues); - if(!proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME); - Iterators[NAME] = ArrayValues; - for(key in $iterators)if(!proto[key])redefine(proto, key, $iterators[key], true); - } + return x | (y << 1); } -},{"./_global":29,"./_hide":31,"./_iterators":43,"./_redefine":54,"./_wks":69,"./es6.array.iterator":71}],76:[function(_dereq_,module,exports){ -// (c) Dean McNamee , 2012. -// -// https://github.com/deanm/css-color-parser-js -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -// http://www.w3.org/TR/css3-color/ -var kCSSColorTable = { - "transparent": [0,0,0,0], "aliceblue": [240,248,255,1], - "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1], - "aquamarine": [127,255,212,1], "azure": [240,255,255,1], - "beige": [245,245,220,1], "bisque": [255,228,196,1], - "black": [0,0,0,1], "blanchedalmond": [255,235,205,1], - "blue": [0,0,255,1], "blueviolet": [138,43,226,1], - "brown": [165,42,42,1], "burlywood": [222,184,135,1], - "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1], - "chocolate": [210,105,30,1], "coral": [255,127,80,1], - "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1], - "crimson": [220,20,60,1], "cyan": [0,255,255,1], - "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1], - "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1], - "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1], - "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1], - "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1], - "darkorchid": [153,50,204,1], "darkred": [139,0,0,1], - "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1], - "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1], - "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1], - "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1], - "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1], - "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1], - "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1], - "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1], - "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1], - "gold": [255,215,0,1], "goldenrod": [218,165,32,1], - "gray": [128,128,128,1], "green": [0,128,0,1], - "greenyellow": [173,255,47,1], "grey": [128,128,128,1], - "honeydew": [240,255,240,1], "hotpink": [255,105,180,1], - "indianred": [205,92,92,1], "indigo": [75,0,130,1], - "ivory": [255,255,240,1], "khaki": [240,230,140,1], - "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1], - "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1], - "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1], - "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1], - "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1], - "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1], - "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1], - "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1], - "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1], - "lightyellow": [255,255,224,1], "lime": [0,255,0,1], - "limegreen": [50,205,50,1], "linen": [250,240,230,1], - "magenta": [255,0,255,1], "maroon": [128,0,0,1], - "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1], - "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1], - "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1], - "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1], - "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1], - "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1], - "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1], - "navy": [0,0,128,1], "oldlace": [253,245,230,1], - "olive": [128,128,0,1], "olivedrab": [107,142,35,1], - "orange": [255,165,0,1], "orangered": [255,69,0,1], - "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1], - "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1], - "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1], - "peachpuff": [255,218,185,1], "peru": [205,133,63,1], - "pink": [255,192,203,1], "plum": [221,160,221,1], - "powderblue": [176,224,230,1], "purple": [128,0,128,1], - "rebeccapurple": [102,51,153,1], - "red": [255,0,0,1], "rosybrown": [188,143,143,1], - "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1], - "salmon": [250,128,114,1], "sandybrown": [244,164,96,1], - "seagreen": [46,139,87,1], "seashell": [255,245,238,1], - "sienna": [160,82,45,1], "silver": [192,192,192,1], - "skyblue": [135,206,235,1], "slateblue": [106,90,205,1], - "slategray": [112,128,144,1], "slategrey": [112,128,144,1], - "snow": [255,250,250,1], "springgreen": [0,255,127,1], - "steelblue": [70,130,180,1], "tan": [210,180,140,1], - "teal": [0,128,128,1], "thistle": [216,191,216,1], - "tomato": [255,99,71,1], "turquoise": [64,224,208,1], - "violet": [238,130,238,1], "wheat": [245,222,179,1], - "white": [255,255,255,1], "whitesmoke": [245,245,245,1], - "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]} +// find the leftmost node of a polygon ring +function getLeftmost(start) { + var p = start, + leftmost = start; + do { + if (p.x < leftmost.x) leftmost = p; + p = p.next; + } while (p !== start); -function clamp_css_byte(i) { // Clamp to integer 0 .. 255. - i = Math.round(i); // Seems to be what Chrome does (vs truncation). - return i < 0 ? 0 : i > 255 ? 255 : i; + return leftmost; } -function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0. - return f < 0 ? 0 : f > 1 ? 1 : f; +// check if a point lies within a convex triangle +function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { + return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && + (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && + (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; } -function parse_css_int(str) { // int or percentage. - if (str[str.length - 1] === '%') - return clamp_css_byte(parseFloat(str) / 100 * 255); - return clamp_css_byte(parseInt(str)); +// check if a diagonal between two polygon nodes is valid (lies in polygon interior) +function isValidDiagonal(a, b) { + return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && + locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b); } -function parse_css_float(str) { // float or percentage. - if (str[str.length - 1] === '%') - return clamp_css_float(parseFloat(str) / 100); - return clamp_css_float(parseFloat(str)); +// signed area of a triangle +function area(p, q, r) { + return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); } -function css_hue_to_rgb(m1, m2, h) { - if (h < 0) h += 1; - else if (h > 1) h -= 1; - - if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; - if (h * 2 < 1) return m2; - if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; - return m1; +// check if two points are equal +function equals(p1, p2) { + return p1.x === p2.x && p1.y === p2.y; } -function parseCSSColor(css_str) { - // Remove all whitespace, not compliant, but should just be more accepting. - var str = css_str.replace(/ /g, '').toLowerCase(); - - // Color keywords (and transparent) lookup. - if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup. - - // #abc and #abc123 syntax. - if (str[0] === '#') { - if (str.length === 4) { - var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. - if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN. - return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), - (iv & 0xf0) | ((iv & 0xf0) >> 4), - (iv & 0xf) | ((iv & 0xf) << 4), - 1]; - } else if (str.length === 7) { - var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. - if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN. - return [(iv & 0xff0000) >> 16, - (iv & 0xff00) >> 8, - iv & 0xff, - 1]; - } - - return null; - } +// check if two segments intersect +function intersects(p1, q1, p2, q2) { + if ((equals(p1, q1) && equals(p2, q2)) || + (equals(p1, q2) && equals(p2, q1))) return true; + return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 && + area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0; +} - var op = str.indexOf('('), ep = str.indexOf(')'); - if (op !== -1 && ep + 1 === str.length) { - var fname = str.substr(0, op); - var params = str.substr(op+1, ep-(op+1)).split(','); - var alpha = 1; // To allow case fallthrough. - switch (fname) { - case 'rgba': - if (params.length !== 4) return null; - alpha = parse_css_float(params.pop()); - // Fall through. - case 'rgb': - if (params.length !== 3) return null; - return [parse_css_int(params[0]), - parse_css_int(params[1]), - parse_css_int(params[2]), - alpha]; - case 'hsla': - if (params.length !== 4) return null; - alpha = parse_css_float(params.pop()); - // Fall through. - case 'hsl': - if (params.length !== 3) return null; - var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1 - // NOTE(deanm): According to the CSS spec s/l should only be - // percentages, but we don't bother and let float or percentage. - var s = parse_css_float(params[1]); - var l = parse_css_float(params[2]); - var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; - var m1 = l * 2 - m2; - return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255), - clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), - clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255), - alpha]; - default: - return null; - } - } +// check if a polygon diagonal intersects any polygon segments +function intersectsPolygon(a, b) { + var p = a; + do { + if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && + intersects(p, p.next, a, b)) return true; + p = p.next; + } while (p !== a); - return null; + return false; } -try { exports.parseCSSColor = parseCSSColor } catch(e) { } +// check if a polygon diagonal is locally inside the polygon +function locallyInside(a, b) { + return area(a.prev, a, a.next) < 0 ? + area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : + area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; +} -},{}],77:[function(_dereq_,module,exports){ -'use strict'; +// check if the middle point of a polygon diagonal is inside the polygon +function middleInside(a, b) { + var p = a, + inside = false, + px = (a.x + b.x) / 2, + py = (a.y + b.y) / 2; + do { + if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) + inside = !inside; + p = p.next; + } while (p !== a); -module.exports = earcut; + return inside; +} -function earcut(data, holeIndices, dim) { +// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; +// if one belongs to the outer ring and another to a hole, it merges it into a single ring +function splitPolygon(a, b) { + var a2 = new Node(a.i, a.x, a.y), + b2 = new Node(b.i, b.x, b.y), + an = a.next, + bp = b.prev; - dim = dim || 2; + a.next = b; + b.prev = a; - var hasHoles = holeIndices && holeIndices.length, - outerLen = hasHoles ? holeIndices[0] * dim : data.length, - outerNode = linkedList(data, 0, outerLen, dim, true), - triangles = []; + a2.next = an; + an.prev = a2; - if (!outerNode) return triangles; + b2.next = a2; + a2.prev = b2; - var minX, minY, maxX, maxY, x, y, size; + bp.next = b2; + b2.prev = bp; - if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); + return b2; +} - // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox - if (data.length > 80 * dim) { - minX = maxX = data[0]; - minY = maxY = data[1]; +// create a node and optionally link it with previous one (in a circular doubly linked list) +function insertNode(i, x, y, last) { + var p = new Node(i, x, y); - for (var i = dim; i < outerLen; i += dim) { - x = data[i]; - y = data[i + 1]; - if (x < minX) minX = x; - if (y < minY) minY = y; - if (x > maxX) maxX = x; - if (y > maxY) maxY = y; - } + if (!last) { + p.prev = p; + p.next = p; - // minX, minY and size are later used to transform coords into integers for z-order calculation - size = Math.max(maxX - minX, maxY - minY); + } else { + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; } + return p; +} - earcutLinked(outerNode, triangles, dim, minX, minY, size); +function removeNode(p) { + p.next.prev = p.prev; + p.prev.next = p.next; - return triangles; + if (p.prevZ) p.prevZ.nextZ = p.nextZ; + if (p.nextZ) p.nextZ.prevZ = p.prevZ; } -// create a circular doubly linked list from polygon points in the specified winding order -function linkedList(data, start, end, dim, clockwise) { - var i, last; +function Node(i, x, y) { + // vertice index in coordinates array + this.i = i; - if (clockwise === (signedArea(data, start, end, dim) > 0)) { - for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last); - } else { - for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last); - } + // vertex coordinates + this.x = x; + this.y = y; - if (last && equals(last, last.next)) { - removeNode(last); - last = last.next; - } + // previous and next vertice nodes in a polygon ring + this.prev = null; + this.next = null; - return last; -} + // z-order curve value + this.z = null; -// eliminate colinear or duplicate points -function filterPoints(start, end) { - if (!start) return start; - if (!end) end = start; + // previous and next nodes in z-order + this.prevZ = null; + this.nextZ = null; - var p = start, - again; - do { - again = false; + // indicates whether this is a steiner point + this.steiner = false; +} - if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { - removeNode(p); - p = end = p.prev; - if (p === p.next) return null; - again = true; +// return a percentage difference between the polygon area and its triangulation area; +// used to verify correctness of triangulation +earcut.deviation = function (data, holeIndices, dim, triangles) { + var hasHoles = holeIndices && holeIndices.length; + var outerLen = hasHoles ? holeIndices[0] * dim : data.length; - } else { - p = p.next; + var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim)); + if (hasHoles) { + for (var i = 0, len = holeIndices.length; i < len; i++) { + var start = holeIndices[i] * dim; + var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + polygonArea -= Math.abs(signedArea(data, start, end, dim)); } - } while (again || p !== end); + } - return end; -} + var trianglesArea = 0; + for (i = 0; i < triangles.length; i += 3) { + var a = triangles[i] * dim; + var b = triangles[i + 1] * dim; + var c = triangles[i + 2] * dim; + trianglesArea += Math.abs( + (data[a] - data[c]) * (data[b + 1] - data[a + 1]) - + (data[a] - data[b]) * (data[c + 1] - data[a + 1])); + } -// main ear slicing loop which triangulates a polygon (given as a linked list) -function earcutLinked(ear, triangles, dim, minX, minY, size, pass) { - if (!ear) return; + return polygonArea === 0 && trianglesArea === 0 ? 0 : + Math.abs((trianglesArea - polygonArea) / polygonArea); +}; - // interlink polygon nodes in z-order - if (!pass && size) indexCurve(ear, minX, minY, size); +function signedArea(data, start, end, dim) { + var sum = 0; + for (var i = start, j = end - dim; i < end; i += dim) { + sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); + j = i; + } + return sum; +} - var stop = ear, - prev, next; +// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts +earcut.flatten = function (data) { + var dim = data[0][0].length, + result = {vertices: [], holes: [], dimensions: dim}, + holeIndex = 0; - // iterate through ears, slicing them one by one - while (ear.prev !== ear.next) { - prev = ear.prev; - next = ear.next; + for (var i = 0; i < data.length; i++) { + for (var j = 0; j < data[i].length; j++) { + for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]); + } + if (i > 0) { + holeIndex += data[i - 1].length; + result.holes.push(holeIndex); + } + } + return result; +}; - if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) { - // cut off the triangle - triangles.push(prev.i / dim); - triangles.push(ear.i / dim); - triangles.push(next.i / dim); +},{}],73:[function(_dereq_,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - removeNode(ear); +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; - // skipping the next vertice leads to less sliver triangles - ear = next.next; - stop = next.next; +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; - continue; - } +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; - ear = next; +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; - // if we looped through the whole remaining polygon and can't find any more ears - if (ear === stop) { - // try filtering points and slicing again - if (!pass) { - earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1); +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; - // if this didn't work, try curing all small self-intersections locally - } else if (pass === 1) { - ear = cureLocalIntersections(ear, triangles, dim); - earcutLinked(ear, triangles, dim, minX, minY, size, 2); +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; - // as a last resort, try splitting the remaining polygon into two - } else if (pass === 2) { - splitEarcut(ear, triangles, dim, minX, minY, size); - } + if (!this._events) + this._events = {}; - break; - } + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); + err.context = er; + throw err; + } } -} - -// check whether a polygon node forms a valid ear with adjacent nodes -function isEar(ear) { - var a = ear.prev, - b = ear, - c = ear.next; + } - if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + handler = this._events[type]; - // now make sure we don't have other points inside the potential ear - var p = ear.next.next; + if (isUndefined(handler)) + return false; - while (p !== ear.prev) { - if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && - area(p.prev, p, p.next) >= 0) return false; - p = p.next; + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + args = Array.prototype.slice.call(arguments, 1); + handler.apply(this, args); } + } else if (isObject(handler)) { + args = Array.prototype.slice.call(arguments, 1); + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } - return true; -} + return true; +}; -function isEarHashed(ear, minX, minY, size) { - var a = ear.prev, - b = ear, - c = ear.next; +EventEmitter.prototype.addListener = function(type, listener) { + var m; - if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + if (!isFunction(listener)) + throw TypeError('listener must be a function'); - // triangle bbox; min & max are calculated like this for speed - var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x), - minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y), - maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x), - maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y); + if (!this._events) + this._events = {}; - // z-order range for the current triangle bbox; - var minZ = zOrder(minTX, minTY, minX, minY, size), - maxZ = zOrder(maxTX, maxTY, minX, minY, size); + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); - // first look for points inside the triangle in increasing z-order - var p = ear.nextZ; + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; - while (p && p.z <= maxZ) { - if (p !== ear.prev && p !== ear.next && - pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && - area(p.prev, p, p.next) >= 0) return false; - p = p.nextZ; + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; } - // then look for points in decreasing z-order - p = ear.prevZ; - - while (p && p.z >= minZ) { - if (p !== ear.prev && p !== ear.next && - pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && - area(p.prev, p, p.next) >= 0) return false; - p = p.prevZ; + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } } + } - return true; -} + return this; +}; -// go through all polygon nodes and cure small local self-intersections -function cureLocalIntersections(start, triangles, dim) { - var p = start; - do { - var a = p.prev, - b = p.next.next; +EventEmitter.prototype.on = EventEmitter.prototype.addListener; - if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); - triangles.push(a.i / dim); - triangles.push(p.i / dim); - triangles.push(b.i / dim); + var fired = false; - // remove two nodes involved - removeNode(p); - removeNode(p.next); + function g() { + this.removeListener(type, g); - p = start = b; - } - p = p.next; - } while (p !== start); + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } - return p; -} + g.listener = listener; + this.on(type, g); -// try splitting polygon into two and triangulate them independently -function splitEarcut(start, triangles, dim, minX, minY, size) { - // look for a valid diagonal that divides the polygon into two - var a = start; - do { - var b = a.next.next; - while (b !== a.prev) { - if (a.i !== b.i && isValidDiagonal(a, b)) { - // split the polygon in two by the diagonal - var c = splitPolygon(a, b); + return this; +}; - // filter colinear points around the cuts - a = filterPoints(a, a.next); - c = filterPoints(c, c.next); +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; - // run earcut on each half - earcutLinked(a, triangles, dim, minX, minY, size); - earcutLinked(c, triangles, dim, minX, minY, size); - return; - } - b = b.next; - } - a = a.next; - } while (a !== start); -} + if (!isFunction(listener)) + throw TypeError('listener must be a function'); -// link every hole into the outer loop, producing a single-ring polygon without holes -function eliminateHoles(data, holeIndices, outerNode, dim) { - var queue = [], - i, len, start, end, list; + if (!this._events || !this._events[type]) + return this; - for (i = 0, len = holeIndices.length; i < len; i++) { - start = holeIndices[i] * dim; - end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; - list = linkedList(data, start, end, dim, false); - if (list === list.next) list.steiner = true; - queue.push(getLeftmost(list)); - } + list = this._events[type]; + length = list.length; + position = -1; - queue.sort(compareX); + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); - // process holes from left to right - for (i = 0; i < queue.length; i++) { - eliminateHole(queue[i], outerNode); - outerNode = filterPoints(outerNode, outerNode.next); + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } } - return outerNode; -} - -function compareX(a, b) { - return a.x - b.x; -} + if (position < 0) + return this; -// find a bridge between vertices that connects hole with an outer ring and and link it -function eliminateHole(hole, outerNode) { - outerNode = findHoleBridge(hole, outerNode); - if (outerNode) { - var b = splitPolygon(outerNode, hole); - filterPoints(b, b.next); + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); } -} - -// David Eberly's algorithm for finding a bridge between hole and outer polygon -function findHoleBridge(hole, outerNode) { - var p = outerNode, - hx = hole.x, - hy = hole.y, - qx = -Infinity, - m; - - // find a segment intersected by a ray from the hole's leftmost point to the left; - // segment's endpoint with lesser x will be potential connection point - do { - if (hy <= p.y && hy >= p.next.y) { - var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); - if (x <= hx && x > qx) { - qx = x; - if (x === hx) { - if (hy === p.y) return p; - if (hy === p.next.y) return p.next; - } - m = p.x < p.next.x ? p : p.next; - } - } - p = p.next; - } while (p !== outerNode); - if (!m) return null; - - if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint - - // look for points inside the triangle of hole point, segment intersection and endpoint; - // if there are no points found, we have a valid connection; - // otherwise choose the point of the minimum angle with the ray as connection point - - var stop = m, - mx = m.x, - my = m.y, - tanMin = Infinity, - tan; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } - p = m.next; + return this; +}; - while (p !== stop) { - if (hx >= p.x && p.x >= mx && - pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; - tan = Math.abs(hy - p.y) / (hx - p.x); // tangential + if (!this._events) + return this; - if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) { - m = p; - tanMin = tan; - } - } + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } - p = p.next; + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } - return m; -} - -// interlink polygon nodes in z-order -function indexCurve(start, minX, minY, size) { - var p = start; - do { - if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size); - p.prevZ = p.prev; - p.nextZ = p.next; - p = p.next; - } while (p !== start); - - p.prevZ.nextZ = null; - p.prevZ = null; - - sortLinked(p); -} - -// Simon Tatham's linked list merge sort algorithm -// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html -function sortLinked(list) { - var i, p, q, e, tail, numMerges, pSize, qSize, - inSize = 1; - - do { - p = list; - list = null; - tail = null; - numMerges = 0; - - while (p) { - numMerges++; - q = p; - pSize = 0; - for (i = 0; i < inSize; i++) { - pSize++; - q = q.nextZ; - if (!q) break; - } - - qSize = inSize; - - while (pSize > 0 || (qSize > 0 && q)) { - - if (pSize === 0) { - e = q; - q = q.nextZ; - qSize--; - } else if (qSize === 0 || !q) { - e = p; - p = p.nextZ; - pSize--; - } else if (p.z <= q.z) { - e = p; - p = p.nextZ; - pSize--; - } else { - e = q; - q = q.nextZ; - qSize--; - } - - if (tail) tail.nextZ = e; - else list = e; - - e.prevZ = tail; - tail = e; - } - - p = q; - } - - tail.nextZ = null; - inSize *= 2; - - } while (numMerges > 1); - - return list; -} - -// z-order of a point given coords and size of the data bounding box -function zOrder(x, y, minX, minY, size) { - // coords are transformed into non-negative 15-bit integer range - x = 32767 * (x - minX) / size; - y = 32767 * (y - minY) / size; - - x = (x | (x << 8)) & 0x00FF00FF; - x = (x | (x << 4)) & 0x0F0F0F0F; - x = (x | (x << 2)) & 0x33333333; - x = (x | (x << 1)) & 0x55555555; - - y = (y | (y << 8)) & 0x00FF00FF; - y = (y | (y << 4)) & 0x0F0F0F0F; - y = (y | (y << 2)) & 0x33333333; - y = (y | (y << 1)) & 0x55555555; - - return x | (y << 1); -} - -// find the leftmost node of a polygon ring -function getLeftmost(start) { - var p = start, - leftmost = start; - do { - if (p.x < leftmost.x) leftmost = p; - p = p.next; - } while (p !== start); - - return leftmost; -} - -// check if a point lies within a convex triangle -function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { - return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && - (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && - (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; -} - -// check if a diagonal between two polygon nodes is valid (lies in polygon interior) -function isValidDiagonal(a, b) { - return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && - locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b); -} - -// signed area of a triangle -function area(p, q, r) { - return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); -} - -// check if two points are equal -function equals(p1, p2) { - return p1.x === p2.x && p1.y === p2.y; -} - -// check if two segments intersect -function intersects(p1, q1, p2, q2) { - if ((equals(p1, q1) && equals(p2, q2)) || - (equals(p1, q2) && equals(p2, q1))) return true; - return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 && - area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0; -} - -// check if a polygon diagonal intersects any polygon segments -function intersectsPolygon(a, b) { - var p = a; - do { - if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && - intersects(p, p.next, a, b)) return true; - p = p.next; - } while (p !== a); - - return false; -} - -// check if a polygon diagonal is locally inside the polygon -function locallyInside(a, b) { - return area(a.prev, a, a.next) < 0 ? - area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : - area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; -} - -// check if the middle point of a polygon diagonal is inside the polygon -function middleInside(a, b) { - var p = a, - inside = false, - px = (a.x + b.x) / 2, - py = (a.y + b.y) / 2; - do { - if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) - inside = !inside; - p = p.next; - } while (p !== a); - - return inside; -} - -// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; -// if one belongs to the outer ring and another to a hole, it merges it into a single ring -function splitPolygon(a, b) { - var a2 = new Node(a.i, a.x, a.y), - b2 = new Node(b.i, b.x, b.y), - an = a.next, - bp = b.prev; - - a.next = b; - b.prev = a; + listeners = this._events[type]; - a2.next = an; - an.prev = a2; + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; - b2.next = a2; - a2.prev = b2; + return this; +}; - bp.next = b2; - b2.prev = bp; +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; - return b2; -} +EventEmitter.prototype.listenerCount = function(type) { + if (this._events) { + var evlistener = this._events[type]; -// create a node and optionally link it with previous one (in a circular doubly linked list) -function insertNode(i, x, y, last) { - var p = new Node(i, x, y); + if (isFunction(evlistener)) + return 1; + else if (evlistener) + return evlistener.length; + } + return 0; +}; - if (!last) { - p.prev = p; - p.next = p; +EventEmitter.listenerCount = function(emitter, type) { + return emitter.listenerCount(type); +}; - } else { - p.next = last.next; - p.prev = last; - last.next.prev = p; - last.next = p; - } - return p; +function isFunction(arg) { + return typeof arg === 'function'; } -function removeNode(p) { - p.next.prev = p.prev; - p.prev.next = p.next; - - if (p.prevZ) p.prevZ.nextZ = p.nextZ; - if (p.nextZ) p.nextZ.prevZ = p.prevZ; +function isNumber(arg) { + return typeof arg === 'number'; } -function Node(i, x, y) { - // vertice index in coordinates array - this.i = i; - - // vertex coordinates - this.x = x; - this.y = y; - - // previous and next vertice nodes in a polygon ring - this.prev = null; - this.next = null; - - // z-order curve value - this.z = null; - - // previous and next nodes in z-order - this.prevZ = null; - this.nextZ = null; - - // indicates whether this is a steiner point - this.steiner = false; +function isObject(arg) { + return typeof arg === 'object' && arg !== null; } -// return a percentage difference between the polygon area and its triangulation area; -// used to verify correctness of triangulation -earcut.deviation = function (data, holeIndices, dim, triangles) { - var hasHoles = holeIndices && holeIndices.length; - var outerLen = hasHoles ? holeIndices[0] * dim : data.length; - - var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim)); - if (hasHoles) { - for (var i = 0, len = holeIndices.length; i < len; i++) { - var start = holeIndices[i] * dim; - var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; - polygonArea -= Math.abs(signedArea(data, start, end, dim)); - } - } - - var trianglesArea = 0; - for (i = 0; i < triangles.length; i += 3) { - var a = triangles[i] * dim; - var b = triangles[i + 1] * dim; - var c = triangles[i + 2] * dim; - trianglesArea += Math.abs( - (data[a] - data[c]) * (data[b + 1] - data[a + 1]) - - (data[a] - data[b]) * (data[c + 1] - data[a + 1])); - } - - return polygonArea === 0 && trianglesArea === 0 ? 0 : - Math.abs((trianglesArea - polygonArea) / polygonArea); -}; - -function signedArea(data, start, end, dim) { - var sum = 0; - for (var i = start, j = end - dim; i < end; i += dim) { - sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); - j = i; - } - return sum; +function isUndefined(arg) { + return arg === void 0; } -// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts -earcut.flatten = function (data) { - var dim = data[0][0].length, - result = {vertices: [], holes: [], dimensions: dim}, - holeIndex = 0; - - for (var i = 0; i < data.length; i++) { - for (var j = 0; j < data[i].length; j++) { - for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]); - } - if (i > 0) { - holeIndex += data[i - 1].length; - result.holes.push(holeIndex); - } - } - return result; -}; - -},{}],78:[function(_dereq_,module,exports){ +},{}],74:[function(_dereq_,module,exports){ (function(){var k=!!document.addEventListener;function l(a,b){k?a.addEventListener("scroll",b,!1):a.attachEvent("scroll",b)}function v(a){document.body?a():k?document.addEventListener("DOMContentLoaded",a):document.attachEvent("onreadystatechange",function(){"interactive"!=document.readyState&&"complete"!=document.readyState||a()})};function w(a){this.a=document.createElement("div");this.a.setAttribute("aria-hidden","true");this.a.appendChild(document.createTextNode(a));this.b=document.createElement("span");this.c=document.createElement("span");this.h=document.createElement("span");this.f=document.createElement("span");this.g=-1;this.b.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.c.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;"; this.f.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.h.style.cssText="display:inline-block;width:200%;height:200%;font-size:16px;max-width:none;";this.b.appendChild(this.h);this.c.appendChild(this.f);this.a.appendChild(this.b);this.a.appendChild(this.c)} function y(a,b){a.a.style.cssText="max-width:none;min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;left:-999px;white-space:nowrap;font:"+b+";"}function z(a){var b=a.a.offsetWidth,c=b+100;a.f.style.width=c+"px";a.c.scrollLeft=c;a.b.scrollLeft=a.b.scrollWidth+100;return a.g!==b?(a.g=b,!0):!1}function A(a,b){function c(){var a=m;z(a)&&null!==a.a.parentNode&&b(a.g)}var m=a;l(a.b,c);l(a.c,c);z(a)};function B(a,b){var c=b||{};this.family=a;this.style=c.style||"normal";this.weight=c.weight||"normal";this.stretch=c.stretch||"normal"}var C=null,D=null,H=!!window.FontFace;function I(){if(null===D){var a=document.createElement("div");try{a.style.font="condensed 100px sans-serif"}catch(b){}D=""!==a.style.font}return D}function J(a,b){return[a.style,a.weight,I()?a.stretch:"","100px",b].join(" ")} @@ -5222,7 +4709,7 @@ h)(b=f!=g&&f!=h&&g!=h)||(null===C&&(b=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec h=p.a.offsetWidth,q();G=setTimeout(F,50)}}var e=new w(m),n=new w(m),p=new w(m),f=-1,g=-1,h=-1,r=-1,t=-1,u=-1,d=document.createElement("div"),G=0;d.dir="ltr";y(e,J(c,"sans-serif"));y(n,J(c,"serif"));y(p,J(c,"monospace"));d.appendChild(e.a);d.appendChild(n.a);d.appendChild(p.a);document.body.appendChild(d);r=e.a.offsetWidth;t=n.a.offsetWidth;u=p.a.offsetWidth;F();A(e,function(a){f=a;q()});y(e,J(c,'"'+c.family+'",sans-serif'));A(n,function(a){g=a;q()});y(n,J(c,'"'+c.family+'",serif'));A(p,function(a){h= a;q()});y(p,J(c,'"'+c.family+'",monospace'))})})};window.FontFaceObserver=B;window.FontFaceObserver.prototype.check=window.FontFaceObserver.prototype.load=B.prototype.load;"undefined"!==typeof module&&(module.exports=window.FontFaceObserver);}()); -},{}],79:[function(_dereq_,module,exports){ +},{}],75:[function(_dereq_,module,exports){ 'use strict'; module.exports = clip; @@ -5375,7 +4862,7 @@ function newSlice(slices, slice, area, dist) { return []; } -},{}],80:[function(_dereq_,module,exports){ +},{}],76:[function(_dereq_,module,exports){ 'use strict'; module.exports = convert; @@ -5521,7 +5008,7 @@ function calcRingBBox(min, max, points) { } } -},{"./simplify":82}],81:[function(_dereq_,module,exports){ +},{"./simplify":78}],77:[function(_dereq_,module,exports){ 'use strict'; module.exports = geojsonvt; @@ -5788,7 +5275,7 @@ function isClippedSquare(tile, extent, buffer) { return true; } -},{"./clip":79,"./convert":80,"./tile":83,"./wrap":84}],82:[function(_dereq_,module,exports){ +},{"./clip":75,"./convert":76,"./tile":79,"./wrap":80}],78:[function(_dereq_,module,exports){ 'use strict'; module.exports = simplify; @@ -5864,7 +5351,7 @@ function getSqSegDist(p, a, b) { return dx * dx + dy * dy; } -},{}],83:[function(_dereq_,module,exports){ +},{}],79:[function(_dereq_,module,exports){ 'use strict'; module.exports = createTile; @@ -5951,7 +5438,7 @@ function addFeature(tile, feature, tolerance, noSimplify) { } } -},{}],84:[function(_dereq_,module,exports){ +},{}],80:[function(_dereq_,module,exports){ 'use strict'; var clip = _dereq_('./clip'); @@ -6014,7 +5501,7 @@ function shiftCoords(points, offset) { return newPoints; } -},{"./clip":79}],85:[function(_dereq_,module,exports){ +},{"./clip":75}],81:[function(_dereq_,module,exports){ module.exports = invert /** @@ -6053,7 +5540,7 @@ function invert(out, a) { return out } -},{}],86:[function(_dereq_,module,exports){ +},{}],82:[function(_dereq_,module,exports){ module.exports = normalFromMat4 /** @@ -6110,7 +5597,7 @@ function normalFromMat4(out, a) { return out } -},{}],87:[function(_dereq_,module,exports){ +},{}],83:[function(_dereq_,module,exports){ module.exports = copy; /** @@ -6139,7 +5626,7 @@ function copy(out, a) { out[15] = a[15]; return out; }; -},{}],88:[function(_dereq_,module,exports){ +},{}],84:[function(_dereq_,module,exports){ module.exports = identity; /** @@ -6167,7 +5654,7 @@ function identity(out) { out[15] = 1; return out; }; -},{}],89:[function(_dereq_,module,exports){ +},{}],85:[function(_dereq_,module,exports){ var identity = _dereq_('./identity'); module.exports = lookAt; @@ -6258,7 +5745,7 @@ function lookAt(out, eye, center, up) { return out; }; -},{"./identity":88}],90:[function(_dereq_,module,exports){ +},{"./identity":84}],86:[function(_dereq_,module,exports){ module.exports = multiply; /** @@ -6301,7 +5788,7 @@ function multiply(out, a, b) { out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33; return out; }; -},{}],91:[function(_dereq_,module,exports){ +},{}],87:[function(_dereq_,module,exports){ module.exports = perspective; /** @@ -6335,7 +5822,7 @@ function perspective(out, fovy, aspect, near, far) { out[15] = 0; return out; }; -},{}],92:[function(_dereq_,module,exports){ +},{}],88:[function(_dereq_,module,exports){ module.exports = scale; /** @@ -6367,7 +5854,7 @@ function scale(out, a, v) { out[15] = a[15]; return out; }; -},{}],93:[function(_dereq_,module,exports){ +},{}],89:[function(_dereq_,module,exports){ module.exports = translate; /** @@ -6406,7 +5893,7 @@ function translate(out, a, v) { return out; }; -},{}],94:[function(_dereq_,module,exports){ +},{}],90:[function(_dereq_,module,exports){ module.exports = parseErrors function parseErrors(log) { @@ -6434,6 +5921,147 @@ function parseErrors(log) { return logs } +},{}],91:[function(_dereq_,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],92:[function(_dereq_,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],93:[function(_dereq_,module,exports){ +/*! + * Determine if an object is a Buffer + * + * @author Feross Aboukhadijeh + * @license MIT + */ + +// The _isBuffer check is for Safari 5-7 support, because it's missing +// Object.prototype.constructor. Remove this eventually +module.exports = function (obj) { + return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) +} + +function isBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) +} + +// For Node v0.10 support. Remove this eventually. +function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) +} + +},{}],94:[function(_dereq_,module,exports){ +var toString = {}.toString; + +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; + },{}],95:[function(_dereq_,module,exports){ 'use strict'; @@ -8680,7 +8308,7 @@ module.exports = new Type('tag:yaml.org,2002:binary', { represent: representYamlBinary }); -},{"../type":107,"buffer":1}],109:[function(_dereq_,module,exports){ +},{"../type":107,"buffer":4}],109:[function(_dereq_,module,exports){ 'use strict'; var Type = _dereq_('../type'); @@ -9822,7 +9450,7 @@ exports.uncompressWorker = function () { return new FlateWorker("Inflate", {}); }; -},{"./stream/GenericWorker":148,"./utils":152,"pako":158}],131:[function(_dereq_,module,exports){ +},{"./stream/GenericWorker":148,"./utils":152,"pako":156}],131:[function(_dereq_,module,exports){ 'use strict'; /** @@ -10076,7 +9704,7 @@ NodejsStreamOutputAdapter.prototype._read = function() { module.exports = NodejsStreamOutputAdapter; -},{"readable-stream":185,"util":11}],135:[function(_dereq_,module,exports){ +},{"readable-stream":182,"util":189}],135:[function(_dereq_,module,exports){ (function (Buffer){ 'use strict'; @@ -10115,7 +9743,7 @@ module.exports = { }).call(this,_dereq_("buffer").Buffer) -},{"buffer":2}],136:[function(_dereq_,module,exports){ +},{"buffer":5}],136:[function(_dereq_,module,exports){ 'use strict'; // var utf8 = require('./utf8'); var utils = _dereq_('./utils'); @@ -11484,7 +11112,7 @@ module.exports = StreamHelper; }).call(this,_dereq_("buffer").Buffer) -},{"../base64":124,"../external":129,"../nodejs/NodejsStreamOutputAdapter":134,"../utils":152,"./ConvertWorker":144,"./GenericWorker":148,"buffer":2}],150:[function(_dereq_,module,exports){ +},{"../base64":124,"../external":129,"../nodejs/NodejsStreamOutputAdapter":134,"../utils":152,"./ConvertWorker":144,"./GenericWorker":148,"buffer":5}],150:[function(_dereq_,module,exports){ (function (Buffer){ 'use strict'; @@ -11523,7 +11151,7 @@ exports.nodestream = !!_dereq_("./nodejs/NodejsStreamOutputAdapter").prototype; }).call(this,_dereq_("buffer").Buffer) -},{"./nodejs/NodejsStreamOutputAdapter":134,"buffer":2}],151:[function(_dereq_,module,exports){ +},{"./nodejs/NodejsStreamOutputAdapter":134,"buffer":5}],151:[function(_dereq_,module,exports){ 'use strict'; var utils = _dereq_('./utils'); @@ -12267,7 +11895,7 @@ exports.prepareContent = function(name, inputData, isBinary, isOptimizedBinarySt }); }; -},{"./base64":124,"./external":129,"./nodejsUtils":135,"./support":150,"asap":156}],153:[function(_dereq_,module,exports){ +},{"./base64":124,"./external":129,"./nodejsUtils":135,"./support":150,"asap":1}],153:[function(_dereq_,module,exports){ 'use strict'; var readerFor = _dereq_('./reader/readerFor'); var utils = _dereq_('./utils'); @@ -12952,302 +12580,6 @@ for(var i = 0; i < removedMethods.length; i++) { module.exports = ZipObject; },{"./compressedObject":125,"./stream/DataWorker":147,"./stream/GenericWorker":148,"./stream/StreamHelper":149,"./utf8":151}],156:[function(_dereq_,module,exports){ -"use strict"; - -// rawAsap provides everything we need except exception management. -var rawAsap = _dereq_("./raw"); -// RawTasks are recycled to reduce GC churn. -var freeTasks = []; -// We queue errors to ensure they are thrown in right order (FIFO). -// Array-as-queue is good enough here, since we are just dealing with exceptions. -var pendingErrors = []; -var requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError); - -function throwFirstError() { - if (pendingErrors.length) { - throw pendingErrors.shift(); - } -} - -/** - * Calls a task as soon as possible after returning, in its own event, with priority - * over other events like animation, reflow, and repaint. An error thrown from an - * event will not interrupt, nor even substantially slow down the processing of - * other events, but will be rather postponed to a lower priority event. - * @param {{call}} task A callable object, typically a function that takes no - * arguments. - */ -module.exports = asap; -function asap(task) { - var rawTask; - if (freeTasks.length) { - rawTask = freeTasks.pop(); - } else { - rawTask = new RawTask(); - } - rawTask.task = task; - rawAsap(rawTask); -} - -// We wrap tasks with recyclable task objects. A task object implements -// `call`, just like a function. -function RawTask() { - this.task = null; -} - -// The sole purpose of wrapping the task is to catch the exception and recycle -// the task object after its single use. -RawTask.prototype.call = function () { - try { - this.task.call(); - } catch (error) { - if (asap.onerror) { - // This hook exists purely for testing purposes. - // Its name will be periodically randomized to break any code that - // depends on its existence. - asap.onerror(error); - } else { - // In a web browser, exceptions are not fatal. However, to avoid - // slowing down the queue of pending tasks, we rethrow the error in a - // lower priority turn. - pendingErrors.push(error); - requestErrorThrow(); - } - } finally { - this.task = null; - freeTasks[freeTasks.length] = this; - } -}; - -},{"./raw":157}],157:[function(_dereq_,module,exports){ -(function (global){ -"use strict"; - -// Use the fastest means possible to execute a task in its own turn, with -// priority over other events including IO, animation, reflow, and redraw -// events in browsers. -// -// An exception thrown by a task will permanently interrupt the processing of -// subsequent tasks. The higher level `asap` function ensures that if an -// exception is thrown by a task, that the task queue will continue flushing as -// soon as possible, but if you use `rawAsap` directly, you are responsible to -// either ensure that no exceptions are thrown from your task, or to manually -// call `rawAsap.requestFlush` if an exception is thrown. -module.exports = rawAsap; -function rawAsap(task) { - if (!queue.length) { - requestFlush(); - flushing = true; - } - // Equivalent to push, but avoids a function call. - queue[queue.length] = task; -} - -var queue = []; -// Once a flush has been requested, no further calls to `requestFlush` are -// necessary until the next `flush` completes. -var flushing = false; -// `requestFlush` is an implementation-specific method that attempts to kick -// off a `flush` event as quickly as possible. `flush` will attempt to exhaust -// the event queue before yielding to the browser's own event loop. -var requestFlush; -// The position of the next task to execute in the task queue. This is -// preserved between calls to `flush` so that it can be resumed if -// a task throws an exception. -var index = 0; -// If a task schedules additional tasks recursively, the task queue can grow -// unbounded. To prevent memory exhaustion, the task queue will periodically -// truncate already-completed tasks. -var capacity = 1024; - -// The flush function processes all tasks that have been scheduled with -// `rawAsap` unless and until one of those tasks throws an exception. -// If a task throws an exception, `flush` ensures that its state will remain -// consistent and will resume where it left off when called again. -// However, `flush` does not make any arrangements to be called again if an -// exception is thrown. -function flush() { - while (index < queue.length) { - var currentIndex = index; - // Advance the index before calling the task. This ensures that we will - // begin flushing on the next task the task throws an error. - index = index + 1; - queue[currentIndex].call(); - // Prevent leaking memory for long chains of recursive calls to `asap`. - // If we call `asap` within tasks scheduled by `asap`, the queue will - // grow, but to avoid an O(n) walk for every task we execute, we don't - // shift tasks off the queue after they have been executed. - // Instead, we periodically shift 1024 tasks off the queue. - if (index > capacity) { - // Manually shift all values starting at the index back to the - // beginning of the queue. - for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) { - queue[scan] = queue[scan + index]; - } - queue.length -= index; - index = 0; - } - } - queue.length = 0; - index = 0; - flushing = false; -} - -// `requestFlush` is implemented using a strategy based on data collected from -// every available SauceLabs Selenium web driver worker at time of writing. -// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593 - -// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that -// have WebKitMutationObserver but not un-prefixed MutationObserver. -// Must use `global` or `self` instead of `window` to work in both frames and web -// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop. - -/* globals self */ -var scope = typeof global !== "undefined" ? global : self; -var BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver; - -// MutationObservers are desirable because they have high priority and work -// reliably everywhere they are implemented. -// They are implemented in all modern browsers. -// -// - Android 4-4.3 -// - Chrome 26-34 -// - Firefox 14-29 -// - Internet Explorer 11 -// - iPad Safari 6-7.1 -// - iPhone Safari 7-7.1 -// - Safari 6-7 -if (typeof BrowserMutationObserver === "function") { - requestFlush = makeRequestCallFromMutationObserver(flush); - -// MessageChannels are desirable because they give direct access to the HTML -// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera -// 11-12, and in web workers in many engines. -// Although message channels yield to any queued rendering and IO tasks, they -// would be better than imposing the 4ms delay of timers. -// However, they do not work reliably in Internet Explorer or Safari. - -// Internet Explorer 10 is the only browser that has setImmediate but does -// not have MutationObservers. -// Although setImmediate yields to the browser's renderer, it would be -// preferrable to falling back to setTimeout since it does not have -// the minimum 4ms penalty. -// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and -// Desktop to a lesser extent) that renders both setImmediate and -// MessageChannel useless for the purposes of ASAP. -// https://github.com/kriskowal/q/issues/396 - -// Timers are implemented universally. -// We fall back to timers in workers in most engines, and in foreground -// contexts in the following browsers. -// However, note that even this simple case requires nuances to operate in a -// broad spectrum of browsers. -// -// - Firefox 3-13 -// - Internet Explorer 6-9 -// - iPad Safari 4.3 -// - Lynx 2.8.7 -} else { - requestFlush = makeRequestCallFromTimer(flush); -} - -// `requestFlush` requests that the high priority event queue be flushed as -// soon as possible. -// This is useful to prevent an error thrown in a task from stalling the event -// queue if the exception handled by Node.js’s -// `process.on("uncaughtException")` or by a domain. -rawAsap.requestFlush = requestFlush; - -// To request a high priority event, we induce a mutation observer by toggling -// the text of a text node between "1" and "-1". -function makeRequestCallFromMutationObserver(callback) { - var toggle = 1; - var observer = new BrowserMutationObserver(callback); - var node = document.createTextNode(""); - observer.observe(node, {characterData: true}); - return function requestCall() { - toggle = -toggle; - node.data = toggle; - }; -} - -// The message channel technique was discovered by Malte Ubl and was the -// original foundation for this library. -// http://www.nonblocking.io/2011/06/windownexttick.html - -// Safari 6.0.5 (at least) intermittently fails to create message ports on a -// page's first load. Thankfully, this version of Safari supports -// MutationObservers, so we don't need to fall back in that case. - -// function makeRequestCallFromMessageChannel(callback) { -// var channel = new MessageChannel(); -// channel.port1.onmessage = callback; -// return function requestCall() { -// channel.port2.postMessage(0); -// }; -// } - -// For reasons explained above, we are also unable to use `setImmediate` -// under any circumstances. -// Even if we were, there is another bug in Internet Explorer 10. -// It is not sufficient to assign `setImmediate` to `requestFlush` because -// `setImmediate` must be called *by name* and therefore must be wrapped in a -// closure. -// Never forget. - -// function makeRequestCallFromSetImmediate(callback) { -// return function requestCall() { -// setImmediate(callback); -// }; -// } - -// Safari 6.0 has a problem where timers will get lost while the user is -// scrolling. This problem does not impact ASAP because Safari 6.0 supports -// mutation observers, so that implementation is used instead. -// However, if we ever elect to use timers in Safari, the prevalent work-around -// is to add a scroll event listener that calls for a flush. - -// `setTimeout` does not call the passed callback if the delay is less than -// approximately 7 in web workers in Firefox 8 through 18, and sometimes not -// even then. - -function makeRequestCallFromTimer(callback) { - return function requestCall() { - // We dispatch a timeout with a specified delay of 0 for engines that - // can reliably accommodate that request. This will usually be snapped - // to a 4 milisecond delay, but once we're flushing, there's no delay - // between events. - var timeoutHandle = setTimeout(handleTimer, 0); - // However, since this timer gets frequently dropped in Firefox - // workers, we enlist an interval handle that will try to fire - // an event 20 times per second until it succeeds. - var intervalHandle = setInterval(handleTimer, 50); - - function handleTimer() { - // Whichever timer succeeds will cancel both timers and - // execute the callback. - clearTimeout(timeoutHandle); - clearInterval(intervalHandle); - callback(); - } - }; -} - -// This is for `asap.js` only. -// Its name will be periodically randomized to break any code that depends on -// its existence. -rawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer; - -// ASAP was originally a nextTick shim included in Q. This was factored out -// into this ASAP package. It was later adapted to RSVP which made further -// amendments. These decisions, particularly to marginalize MessageChannel and -// to capture the MutationObserver implementation in a closure, were integrated -// back into ASAP proper. -// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],158:[function(_dereq_,module,exports){ // Top level file is just a mixin of submodules & constants 'use strict'; @@ -13263,7 +12595,7 @@ assign(pako, deflate, inflate, constants); module.exports = pako; -},{"./lib/deflate":159,"./lib/inflate":160,"./lib/utils/common":161,"./lib/zlib/constants":164}],159:[function(_dereq_,module,exports){ +},{"./lib/deflate":157,"./lib/inflate":158,"./lib/utils/common":159,"./lib/zlib/constants":162}],157:[function(_dereq_,module,exports){ 'use strict'; @@ -13665,7 +12997,7 @@ exports.deflate = deflate; exports.deflateRaw = deflateRaw; exports.gzip = gzip; -},{"./utils/common":161,"./utils/strings":162,"./zlib/deflate":166,"./zlib/messages":171,"./zlib/zstream":173}],160:[function(_dereq_,module,exports){ +},{"./utils/common":159,"./utils/strings":160,"./zlib/deflate":164,"./zlib/messages":169,"./zlib/zstream":171}],158:[function(_dereq_,module,exports){ 'use strict'; @@ -14085,7 +13417,7 @@ exports.inflate = inflate; exports.inflateRaw = inflateRaw; exports.ungzip = inflate; -},{"./utils/common":161,"./utils/strings":162,"./zlib/constants":164,"./zlib/gzheader":167,"./zlib/inflate":169,"./zlib/messages":171,"./zlib/zstream":173}],161:[function(_dereq_,module,exports){ +},{"./utils/common":159,"./utils/strings":160,"./zlib/constants":162,"./zlib/gzheader":165,"./zlib/inflate":167,"./zlib/messages":169,"./zlib/zstream":171}],159:[function(_dereq_,module,exports){ 'use strict'; @@ -14189,7 +13521,7 @@ exports.setTyped = function (on) { exports.setTyped(TYPED_OK); -},{}],162:[function(_dereq_,module,exports){ +},{}],160:[function(_dereq_,module,exports){ // String encode/decode helpers 'use strict'; @@ -14376,7 +13708,7 @@ exports.utf8border = function (buf, max) { return (pos + _utf8len[buf[pos]] > max) ? pos : max; }; -},{"./common":161}],163:[function(_dereq_,module,exports){ +},{"./common":159}],161:[function(_dereq_,module,exports){ 'use strict'; // Note: adler32 takes 12% for level 0 and 2% for level 6. @@ -14410,7 +13742,7 @@ function adler32(adler, buf, len, pos) { module.exports = adler32; -},{}],164:[function(_dereq_,module,exports){ +},{}],162:[function(_dereq_,module,exports){ 'use strict'; @@ -14462,7 +13794,7 @@ module.exports = { //Z_NULL: null // Use -1 or null inline, depending on var type }; -},{}],165:[function(_dereq_,module,exports){ +},{}],163:[function(_dereq_,module,exports){ 'use strict'; // Note: we can't get significant speed boost here. @@ -14505,7 +13837,7 @@ function crc32(crc, buf, len, pos) { module.exports = crc32; -},{}],166:[function(_dereq_,module,exports){ +},{}],164:[function(_dereq_,module,exports){ 'use strict'; var utils = _dereq_('../utils/common'); @@ -16362,7 +15694,7 @@ exports.deflatePrime = deflatePrime; exports.deflateTune = deflateTune; */ -},{"../utils/common":161,"./adler32":163,"./crc32":165,"./messages":171,"./trees":172}],167:[function(_dereq_,module,exports){ +},{"../utils/common":159,"./adler32":161,"./crc32":163,"./messages":169,"./trees":170}],165:[function(_dereq_,module,exports){ 'use strict'; @@ -16404,7 +15736,7 @@ function GZheader() { module.exports = GZheader; -},{}],168:[function(_dereq_,module,exports){ +},{}],166:[function(_dereq_,module,exports){ 'use strict'; // See state defs from inflate.js @@ -16732,7 +16064,7 @@ module.exports = function inflate_fast(strm, start) { return; }; -},{}],169:[function(_dereq_,module,exports){ +},{}],167:[function(_dereq_,module,exports){ 'use strict'; @@ -18146,1712 +17478,2664 @@ function inflate(strm, flush) { // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + + if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && + (state.mode < CHECK || flush !== Z_FINISH))) { + if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { + state.mode = MEM; + return Z_MEM_ERROR; + } + } + _in -= strm.avail_in; + _out -= strm.avail_out; + strm.total_in += _in; + strm.total_out += _out; + state.total += _out; + if (state.wrap && _out) { + strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ + (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out)); + } + strm.data_type = state.bits + (state.last ? 64 : 0) + + (state.mode === TYPE ? 128 : 0) + + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); + if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) { + ret = Z_BUF_ERROR; + } + return ret; +} + +function inflateEnd(strm) { + + if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { + return Z_STREAM_ERROR; + } + + var state = strm.state; + if (state.window) { + state.window = null; + } + strm.state = null; + return Z_OK; +} + +function inflateGetHeader(strm, head) { + var state; + + /* check state */ + if (!strm || !strm.state) { return Z_STREAM_ERROR; } + state = strm.state; + if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; } + + /* save header structure */ + state.head = head; + head.done = false; + return Z_OK; +} + +function inflateSetDictionary(strm, dictionary) { + var dictLength = dictionary.length; + + var state; + var dictid; + var ret; + + /* check state */ + if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; } + state = strm.state; + + if (state.wrap !== 0 && state.mode !== DICT) { + return Z_STREAM_ERROR; + } + + /* check for correct dictionary identifier */ + if (state.mode === DICT) { + dictid = 1; /* adler32(0, null, 0)*/ + /* dictid = adler32(dictid, dictionary, dictLength); */ + dictid = adler32(dictid, dictionary, dictLength, 0); + if (dictid !== state.check) { + return Z_DATA_ERROR; + } + } + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary, dictLength, dictLength); + if (ret) { + state.mode = MEM; + return Z_MEM_ERROR; + } + state.havedict = 1; + // Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +exports.inflateReset = inflateReset; +exports.inflateReset2 = inflateReset2; +exports.inflateResetKeep = inflateResetKeep; +exports.inflateInit = inflateInit; +exports.inflateInit2 = inflateInit2; +exports.inflate = inflate; +exports.inflateEnd = inflateEnd; +exports.inflateGetHeader = inflateGetHeader; +exports.inflateSetDictionary = inflateSetDictionary; +exports.inflateInfo = 'pako inflate (from Nodeca project)'; + +/* Not implemented +exports.inflateCopy = inflateCopy; +exports.inflateGetDictionary = inflateGetDictionary; +exports.inflateMark = inflateMark; +exports.inflatePrime = inflatePrime; +exports.inflateSync = inflateSync; +exports.inflateSyncPoint = inflateSyncPoint; +exports.inflateUndermine = inflateUndermine; +*/ + +},{"../utils/common":159,"./adler32":161,"./crc32":163,"./inffast":166,"./inftrees":168}],168:[function(_dereq_,module,exports){ +'use strict'; + + +var utils = _dereq_('../utils/common'); + +var MAXBITS = 15; +var ENOUGH_LENS = 852; +var ENOUGH_DISTS = 592; +//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); + +var CODES = 0; +var LENS = 1; +var DISTS = 2; + +var lbase = [ /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 +]; + +var lext = [ /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 +]; + +var dbase = [ /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0 +]; + +var dext = [ /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64 +]; + +module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) +{ + var bits = opts.bits; + //here = opts.here; /* table entry for duplication */ + + var len = 0; /* a code's length in bits */ + var sym = 0; /* index of code symbols */ + var min = 0, max = 0; /* minimum and maximum code lengths */ + var root = 0; /* number of index bits for root table */ + var curr = 0; /* number of index bits for current table */ + var drop = 0; /* code bits to drop for sub-table */ + var left = 0; /* number of prefix codes available */ + var used = 0; /* code entries in table used */ + var huff = 0; /* Huffman code */ + var incr; /* for incrementing code, index */ + var fill; /* index for replicating entries */ + var low; /* low bits for current root entry */ + var mask; /* mask for low root bits */ + var next; /* next available space in table */ + var base = null; /* base value table to use */ + var base_index = 0; +// var shoextra; /* extra bits table to use */ + var end; /* use base and extra for symbol > end */ + var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ + var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ + var extra = null; + var extra_index = 0; + + var here_bits, here_op, here_val; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) { + count[len] = 0; + } + for (sym = 0; sym < codes; sym++) { + count[lens[lens_index + sym]]++; + } + + /* bound code lengths, force root to be within code lengths */ + root = bits; + for (max = MAXBITS; max >= 1; max--) { + if (count[max] !== 0) { break; } + } + if (root > max) { + root = max; + } + if (max === 0) { /* no symbols to code at all */ + //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ + //table.bits[opts.table_index] = 1; //here.bits = (var char)1; + //table.val[opts.table_index++] = 0; //here.val = (var short)0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; + + + //table.op[opts.table_index] = 64; + //table.bits[opts.table_index] = 1; + //table.val[opts.table_index++] = 0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; + + opts.bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) { + if (count[min] !== 0) { break; } + } + if (root < min) { + root = min; + } + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) { + return -1; + } /* over-subscribed */ + } + if (left > 0 && (type === CODES || max !== 1)) { + return -1; /* incomplete set */ + } + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) { + offs[len + 1] = offs[len] + count[len]; + } + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) { + if (lens[lens_index + sym] !== 0) { + work[offs[lens[lens_index + sym]]++] = sym; + } + } + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + // poor man optimization - use if-else instead of switch, + // to avoid deopts in old v8 + if (type === CODES) { + base = extra = work; /* dummy value--not used */ + end = 19; + + } else if (type === LENS) { + base = lbase; + base_index -= 257; + extra = lext; + extra_index -= 257; + end = 256; + + } else { /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize opts for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = table_index; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = -1; /* trigger new sub-table when len > root */ + used = 1 << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type === LENS && used > ENOUGH_LENS) || + (type === DISTS && used > ENOUGH_DISTS)) { + return 1; + } + + var i = 0; + /* process all codes and make table entries */ + for (;;) { + i++; + /* create table entry */ + here_bits = len - drop; + if (work[sym] < end) { + here_op = 0; + here_val = work[sym]; + } + else if (work[sym] > end) { + here_op = extra[extra_index + work[sym]]; + here_val = base[base_index + work[sym]]; + } + else { + here_op = 32 + 64; /* end of block */ + here_val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1 << (len - drop); + fill = 1 << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; + } while (fill !== 0); + + /* backwards increment the len-bit code huff */ + incr = 1 << (len - 1); + while (huff & incr) { + incr >>= 1; + } + if (incr !== 0) { + huff &= incr - 1; + huff += incr; + } else { + huff = 0; + } + + /* go to next symbol, update count, len */ + sym++; + if (--count[len] === 0) { + if (len === max) { break; } + len = lens[lens_index + work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) !== low) { + /* if first time, transition to sub-tables */ + if (drop === 0) { + drop = root; + } + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = 1 << curr; + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) { break; } + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1 << curr; + if ((type === LENS && used > ENOUGH_LENS) || + (type === DISTS && used > ENOUGH_DISTS)) { + return 1; + } + + /* point entry in root table to sub-table */ + low = huff & mask; + /*table.op[low] = curr; + table.bits[low] = root; + table.val[low] = next - opts.table_index;*/ + table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff !== 0) { + //table.op[next + huff] = 64; /* invalid code marker */ + //table.bits[next + huff] = len - drop; + //table.val[next + huff] = 0; + table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; + } + + /* set return parameters */ + //opts.table_index += used; + opts.bits = root; + return 0; +}; + +},{"../utils/common":159}],169:[function(_dereq_,module,exports){ +'use strict'; + +module.exports = { + 2: 'need dictionary', /* Z_NEED_DICT 2 */ + 1: 'stream end', /* Z_STREAM_END 1 */ + 0: '', /* Z_OK 0 */ + '-1': 'file error', /* Z_ERRNO (-1) */ + '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ + '-3': 'data error', /* Z_DATA_ERROR (-3) */ + '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ + '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ + '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ +}; + +},{}],170:[function(_dereq_,module,exports){ +'use strict'; + + +var utils = _dereq_('../utils/common'); + +/* Public constants ==========================================================*/ +/* ===========================================================================*/ + + +//var Z_FILTERED = 1; +//var Z_HUFFMAN_ONLY = 2; +//var Z_RLE = 3; +var Z_FIXED = 4; +//var Z_DEFAULT_STRATEGY = 0; + +/* Possible values of the data_type field (though see inflate()) */ +var Z_BINARY = 0; +var Z_TEXT = 1; +//var Z_ASCII = 1; // = Z_TEXT +var Z_UNKNOWN = 2; + +/*============================================================================*/ + + +function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } + +// From zutil.h + +var STORED_BLOCK = 0; +var STATIC_TREES = 1; +var DYN_TREES = 2; +/* The three kinds of block type */ + +var MIN_MATCH = 3; +var MAX_MATCH = 258; +/* The minimum and maximum match lengths */ + +// From deflate.h +/* =========================================================================== + * Internal compression state. + */ + +var LENGTH_CODES = 29; +/* number of length codes, not counting the special END_BLOCK code */ + +var LITERALS = 256; +/* number of literal bytes 0..255 */ + +var L_CODES = LITERALS + 1 + LENGTH_CODES; +/* number of Literal or Length codes, including the END_BLOCK code */ + +var D_CODES = 30; +/* number of distance codes */ + +var BL_CODES = 19; +/* number of codes used to transfer the bit lengths */ + +var HEAP_SIZE = 2 * L_CODES + 1; +/* maximum heap size */ + +var MAX_BITS = 15; +/* All codes must not exceed MAX_BITS bits */ + +var Buf_size = 16; +/* size of bit buffer in bi_buf */ + + +/* =========================================================================== + * Constants + */ + +var MAX_BL_BITS = 7; +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +var END_BLOCK = 256; +/* end of block literal code */ + +var REP_3_6 = 16; +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +var REPZ_3_10 = 17; +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +var REPZ_11_138 = 18; +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +/* eslint-disable comma-spacing,array-bracket-spacing */ +var extra_lbits = /* extra bits for each length code */ + [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; + +var extra_dbits = /* extra bits for each distance code */ + [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; + +var extra_blbits = /* extra bits for each bit length code */ + [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; + +var bl_order = + [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; +/* eslint-enable comma-spacing,array-bracket-spacing */ + +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +// We pre-fill arrays with 0 to avoid uninitialized gaps + +var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ + +// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1 +var static_ltree = new Array((L_CODES + 2) * 2); +zero(static_ltree); +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +var static_dtree = new Array(D_CODES * 2); +zero(static_dtree); +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +var _dist_code = new Array(DIST_CODE_LEN); +zero(_dist_code); +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); +zero(_length_code); +/* length code for each normalized match length (0 == MIN_MATCH) */ + +var base_length = new Array(LENGTH_CODES); +zero(base_length); +/* First normalized length for each code (0 = MIN_MATCH) */ + +var base_dist = new Array(D_CODES); +zero(base_dist); +/* First normalized distance for each code (0 = distance of 1) */ + + +function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- + this.static_tree = static_tree; /* static tree or NULL */ + this.extra_bits = extra_bits; /* extra bits for each code or NULL */ + this.extra_base = extra_base; /* base index for extra_bits */ + this.elems = elems; /* max number of elements in the tree */ + this.max_length = max_length; /* max bit length for the codes */ - if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && - (state.mode < CHECK || flush !== Z_FINISH))) { - if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { - state.mode = MEM; - return Z_MEM_ERROR; - } - } - _in -= strm.avail_in; - _out -= strm.avail_out; - strm.total_in += _in; - strm.total_out += _out; - state.total += _out; - if (state.wrap && _out) { - strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ - (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out)); - } - strm.data_type = state.bits + (state.last ? 64 : 0) + - (state.mode === TYPE ? 128 : 0) + - (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); - if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) { - ret = Z_BUF_ERROR; - } - return ret; + // show if `static_tree` has data or dummy - needed for monomorphic objects + this.has_stree = static_tree && static_tree.length; } -function inflateEnd(strm) { - if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { - return Z_STREAM_ERROR; - } +var static_l_desc; +var static_d_desc; +var static_bl_desc; - var state = strm.state; - if (state.window) { - state.window = null; - } - strm.state = null; - return Z_OK; + +function TreeDesc(dyn_tree, stat_desc) { + this.dyn_tree = dyn_tree; /* the dynamic tree */ + this.max_code = 0; /* largest code with non zero frequency */ + this.stat_desc = stat_desc; /* the corresponding static tree */ } -function inflateGetHeader(strm, head) { - var state; - /* check state */ - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; - if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; } - /* save header structure */ - state.head = head; - head.done = false; - return Z_OK; +function d_code(dist) { + return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; } -function inflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; - var state; - var dictid; - var ret; +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +function put_short(s, w) { +// put_byte(s, (uch)((w) & 0xff)); +// put_byte(s, (uch)((ush)(w) >> 8)); + s.pending_buf[s.pending++] = (w) & 0xff; + s.pending_buf[s.pending++] = (w >>> 8) & 0xff; +} - /* check state */ - if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; } - state = strm.state; - if (state.wrap !== 0 && state.mode !== DICT) { - return Z_STREAM_ERROR; +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +function send_bits(s, value, length) { + if (s.bi_valid > (Buf_size - length)) { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + put_short(s, s.bi_buf); + s.bi_buf = value >> (Buf_size - s.bi_valid); + s.bi_valid += length - Buf_size; + } else { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + s.bi_valid += length; } +} - /* check for correct dictionary identifier */ - if (state.mode === DICT) { - dictid = 1; /* adler32(0, null, 0)*/ - /* dictid = adler32(dictid, dictionary, dictLength); */ - dictid = adler32(dictid, dictionary, dictLength, 0); - if (dictid !== state.check) { - return Z_DATA_ERROR; - } - } - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary, dictLength, dictLength); - if (ret) { - state.mode = MEM; - return Z_MEM_ERROR; - } - state.havedict = 1; - // Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; + +function send_code(s, c, tree) { + send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); } -exports.inflateReset = inflateReset; -exports.inflateReset2 = inflateReset2; -exports.inflateResetKeep = inflateResetKeep; -exports.inflateInit = inflateInit; -exports.inflateInit2 = inflateInit2; -exports.inflate = inflate; -exports.inflateEnd = inflateEnd; -exports.inflateGetHeader = inflateGetHeader; -exports.inflateSetDictionary = inflateSetDictionary; -exports.inflateInfo = 'pako inflate (from Nodeca project)'; -/* Not implemented -exports.inflateCopy = inflateCopy; -exports.inflateGetDictionary = inflateGetDictionary; -exports.inflateMark = inflateMark; -exports.inflatePrime = inflatePrime; -exports.inflateSync = inflateSync; -exports.inflateSyncPoint = inflateSyncPoint; -exports.inflateUndermine = inflateUndermine; -*/ +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +function bi_reverse(code, len) { + var res = 0; + do { + res |= code & 1; + code >>>= 1; + res <<= 1; + } while (--len > 0); + return res >>> 1; +} -},{"../utils/common":161,"./adler32":163,"./crc32":165,"./inffast":168,"./inftrees":170}],170:[function(_dereq_,module,exports){ -'use strict'; +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +function bi_flush(s) { + if (s.bi_valid === 16) { + put_short(s, s.bi_buf); + s.bi_buf = 0; + s.bi_valid = 0; -var utils = _dereq_('../utils/common'); + } else if (s.bi_valid >= 8) { + s.pending_buf[s.pending++] = s.bi_buf & 0xff; + s.bi_buf >>= 8; + s.bi_valid -= 8; + } +} -var MAXBITS = 15; -var ENOUGH_LENS = 852; -var ENOUGH_DISTS = 592; -//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); -var CODES = 0; -var LENS = 1; -var DISTS = 2; +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +function gen_bitlen(s, desc) +// deflate_state *s; +// tree_desc *desc; /* the tree descriptor */ +{ + var tree = desc.dyn_tree; + var max_code = desc.max_code; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var extra = desc.stat_desc.extra_bits; + var base = desc.stat_desc.extra_base; + var max_length = desc.stat_desc.max_length; + var h; /* heap index */ + var n, m; /* iterate over the tree elements */ + var bits; /* bit length */ + var xbits; /* extra bits */ + var f; /* frequency */ + var overflow = 0; /* number of elements with bit length too large */ -var lbase = [ /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 -]; + for (bits = 0; bits <= MAX_BITS; bits++) { + s.bl_count[bits] = 0; + } -var lext = [ /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 -]; + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ -var dbase = [ /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0 -]; + for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { + n = s.heap[h]; + bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n * 2 + 1]/*.Len*/ = bits; + /* We overwrite tree[n].Dad which is no longer needed */ -var dext = [ /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64 -]; + if (n > max_code) { continue; } /* not a leaf node */ -module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) -{ - var bits = opts.bits; - //here = opts.here; /* table entry for duplication */ + s.bl_count[bits]++; + xbits = 0; + if (n >= base) { + xbits = extra[n - base]; + } + f = tree[n * 2]/*.Freq*/; + s.opt_len += f * (bits + xbits); + if (has_stree) { + s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); + } + } + if (overflow === 0) { return; } - var len = 0; /* a code's length in bits */ - var sym = 0; /* index of code symbols */ - var min = 0, max = 0; /* minimum and maximum code lengths */ - var root = 0; /* number of index bits for root table */ - var curr = 0; /* number of index bits for current table */ - var drop = 0; /* code bits to drop for sub-table */ - var left = 0; /* number of prefix codes available */ - var used = 0; /* code entries in table used */ - var huff = 0; /* Huffman code */ - var incr; /* for incrementing code, index */ - var fill; /* index for replicating entries */ - var low; /* low bits for current root entry */ - var mask; /* mask for low root bits */ - var next; /* next available space in table */ - var base = null; /* base value table to use */ - var base_index = 0; -// var shoextra; /* extra bits table to use */ - var end; /* use base and extra for symbol > end */ - var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ - var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ - var extra = null; - var extra_index = 0; + // Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ - var here_bits, here_op, here_val; + /* Find the first bit length which could increase: */ + do { + bits = max_length - 1; + while (s.bl_count[bits] === 0) { bits--; } + s.bl_count[bits]--; /* move one leaf down the tree */ + s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ + s.bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits !== 0; bits--) { + n = s.bl_count[bits]; + while (n !== 0) { + m = s.heap[--h]; + if (m > max_code) { continue; } + if (tree[m * 2 + 1]/*.Len*/ !== bits) { + // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; + tree[m * 2 + 1]/*.Len*/ = bits; + } + n--; + } + } +} - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +function gen_codes(tree, max_code, bl_count) +// ct_data *tree; /* the tree to decorate */ +// int max_code; /* largest code with non zero frequency */ +// ushf *bl_count; /* number of codes at each bit length */ +{ + var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */ + var code = 0; /* running code value */ + var bits; /* bit index */ + var n; /* code index */ - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. + /* The distribution counts are first used to generate the code values + * without bit reversal. */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) { - count[len] = 0; - } - for (sym = 0; sym < codes; sym++) { - count[lens[lens_index + sym]]++; + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits - 1]) << 1; } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + //Assert (code + bl_count[MAX_BITS]-1 == (1<= 1; max--) { - if (count[max] !== 0) { break; } - } - if (root > max) { - root = max; + for (n = 0; n <= max_code; n++) { + var len = tree[n * 2 + 1]/*.Len*/; + if (len === 0) { continue; } + /* Now reverse the bits */ + tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len); + + //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", + // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); } - if (max === 0) { /* no symbols to code at all */ - //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ - //table.bits[opts.table_index] = 1; //here.bits = (var char)1; - //table.val[opts.table_index++] = 0; //here.val = (var short)0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; +} - //table.op[opts.table_index] = 64; - //table.bits[opts.table_index] = 1; - //table.val[opts.table_index++] = 0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +function tr_static_init() { + var n; /* iterates over tree elements */ + var bits; /* bit counter */ + var length; /* length value */ + var code; /* code value */ + var dist; /* distance index */ + var bl_count = new Array(MAX_BITS + 1); + /* number of codes at each bit length for an optimal tree */ - opts.bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) { - if (count[min] !== 0) { break; } - } - if (root < min) { - root = min; + // do check in _tr_init() + //if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ +/*#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif*/ + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES - 1; code++) { + base_length[code] = length; + for (n = 0; n < (1 << extra_lbits[code]); n++) { + _length_code[length++] = code; + } } + //Assert (length == 256, "tr_static_init: length != 256"); + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + _length_code[length - 1] = code; - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) { - return -1; - } /* over-subscribed */ + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1 << extra_dbits[code]); n++) { + _dist_code[dist++] = code; + } } - if (left > 0 && (type === CODES || max !== 1)) { - return -1; /* incomplete set */ + //Assert (dist == 256, "tr_static_init: dist != 256"); + dist >>= 7; /* from now on, all distances are divided by 128 */ + for (; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { + _dist_code[256 + dist++] = code; + } } + //Assert (dist == 256, "tr_static_init: 256+dist != 512"); - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) { - offs[len + 1] = offs[len] + count[len]; + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) { + bl_count[bits] = 0; } - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) { - if (lens[lens_index + sym] !== 0) { - work[offs[lens[lens_index + sym]]++] = sym; - } + n = 0; + while (n <= 143) { + static_ltree[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + while (n <= 255) { + static_ltree[n * 2 + 1]/*.Len*/ = 9; + n++; + bl_count[9]++; + } + while (n <= 279) { + static_ltree[n * 2 + 1]/*.Len*/ = 7; + n++; + bl_count[7]++; + } + while (n <= 287) { + static_ltree[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes(static_ltree, L_CODES + 1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n * 2 + 1]/*.Len*/ = 5; + static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); } - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. + // Now data ready and we can init static trees + static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); + static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); + static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. + //static_init_done = true; +} - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. +/* =========================================================================== + * Initialize a new block. + */ +function init_block(s) { + var n; /* iterates over tree elements */ - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } - /* set up for code type */ - // poor man optimization - use if-else instead of switch, - // to avoid deopts in old v8 - if (type === CODES) { - base = extra = work; /* dummy value--not used */ - end = 19; + s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; + s.opt_len = s.static_len = 0; + s.last_lit = s.matches = 0; +} - } else if (type === LENS) { - base = lbase; - base_index -= 257; - extra = lext; - extra_index -= 257; - end = 256; - } else { /* DISTS */ - base = dbase; - extra = dext; - end = -1; +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +function bi_windup(s) +{ + if (s.bi_valid > 8) { + put_short(s, s.bi_buf); + } else if (s.bi_valid > 0) { + //put_byte(s, (Byte)s->bi_buf); + s.pending_buf[s.pending++] = s.bi_buf; } + s.bi_buf = 0; + s.bi_valid = 0; +} - /* initialize opts for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = table_index; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = -1; /* trigger new sub-table when len > root */ - used = 1 << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +function copy_block(s, buf, len, header) +//DeflateState *s; +//charf *buf; /* the input data */ +//unsigned len; /* its length */ +//int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ - /* check available table space */ - if ((type === LENS && used > ENOUGH_LENS) || - (type === DISTS && used > ENOUGH_DISTS)) { - return 1; + if (header) { + put_short(s, len); + put_short(s, ~len); } +// while (len--) { +// put_byte(s, *buf++); +// } + utils.arraySet(s.pending_buf, s.window, buf, len, s.pending); + s.pending += len; +} - var i = 0; - /* process all codes and make table entries */ - for (;;) { - i++; - /* create table entry */ - here_bits = len - drop; - if (work[sym] < end) { - here_op = 0; - here_val = work[sym]; - } - else if (work[sym] > end) { - here_op = extra[extra_index + work[sym]]; - here_val = base[base_index + work[sym]]; - } - else { - here_op = 32 + 64; /* end of block */ - here_val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1 << (len - drop); - fill = 1 << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; - } while (fill !== 0); +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +function smaller(tree, n, m, depth) { + var _n2 = n * 2; + var _m2 = m * 2; + return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || + (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); +} - /* backwards increment the len-bit code huff */ - incr = 1 << (len - 1); - while (huff & incr) { - incr >>= 1; - } - if (incr !== 0) { - huff &= incr - 1; - huff += incr; - } else { - huff = 0; +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +function pqdownheap(s, tree, k) +// deflate_state *s; +// ct_data *tree; /* the tree to restore */ +// int k; /* node to move down */ +{ + var v = s.heap[k]; + var j = k << 1; /* left son of k */ + while (j <= s.heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s.heap_len && + smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { + j++; } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s.heap[j], s.depth)) { break; } - /* go to next symbol, update count, len */ - sym++; - if (--count[len] === 0) { - if (len === max) { break; } - len = lens[lens_index + work[sym]]; - } + /* Exchange v with the smallest son */ + s.heap[k] = s.heap[j]; + k = j; - /* create new sub-table if needed */ - if (len > root && (huff & mask) !== low) { - /* if first time, transition to sub-tables */ - if (drop === 0) { - drop = root; - } + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s.heap[k] = v; +} - /* increment past last table */ - next += min; /* here min is 1 << curr */ - /* determine length of next table */ - curr = len - drop; - left = 1 << curr; - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) { break; } - curr++; - left <<= 1; - } +// inlined manually +// var SMALLEST = 1; - /* check for enough space */ - used += 1 << curr; - if ((type === LENS && used > ENOUGH_LENS) || - (type === DISTS && used > ENOUGH_DISTS)) { - return 1; - } +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +function compress_block(s, ltree, dtree) +// deflate_state *s; +// const ct_data *ltree; /* literal tree */ +// const ct_data *dtree; /* distance tree */ +{ + var dist; /* distance of matched string */ + var lc; /* match length or unmatched char (if dist == 0) */ + var lx = 0; /* running index in l_buf */ + var code; /* the code to send */ + var extra; /* number of extra bits to send */ - /* point entry in root table to sub-table */ - low = huff & mask; - /*table.op[low] = curr; - table.bits[low] = root; - table.val[low] = next - opts.table_index;*/ - table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; - } - } + if (s.last_lit !== 0) { + do { + dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]); + lc = s.pending_buf[s.l_buf + lx]; + lx++; - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff !== 0) { - //table.op[next + huff] = 64; /* invalid code marker */ - //table.bits[next + huff] = len - drop; - //table.val[next + huff] = 0; - table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; - } + if (dist === 0) { + send_code(s, lc, ltree); /* send a literal byte */ + //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code + LITERALS + 1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra !== 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + //Assert (code < D_CODES, "bad d_code"); - /* set return parameters */ - //opts.table_index += used; - opts.bits = root; - return 0; -}; + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra !== 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ -},{"../utils/common":161}],171:[function(_dereq_,module,exports){ -'use strict'; + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + // "pendingBuf overflow"); -module.exports = { - 2: 'need dictionary', /* Z_NEED_DICT 2 */ - 1: 'stream end', /* Z_STREAM_END 1 */ - 0: '', /* Z_OK 0 */ - '-1': 'file error', /* Z_ERRNO (-1) */ - '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ -}; + } while (lx < s.last_lit); + } -},{}],172:[function(_dereq_,module,exports){ -'use strict'; + send_code(s, END_BLOCK, ltree); +} -var utils = _dereq_('../utils/common'); +/* =========================================================================== + * Construct one Huffman tree and assigns the code bit strings and lengths. + * Update the total bit length for the current block. + * IN assertion: the field freq is set for all tree elements. + * OUT assertions: the fields len and code are set to the optimal bit length + * and corresponding code. The length opt_len is updated; static_len is + * also updated if stree is not null. The field max_code is set. + */ +function build_tree(s, desc) +// deflate_state *s; +// tree_desc *desc; /* the tree descriptor */ +{ + var tree = desc.dyn_tree; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var elems = desc.stat_desc.elems; + var n, m; /* iterate over heap elements */ + var max_code = -1; /* largest code with non zero frequency */ + var node; /* new node being created */ -/* Public constants ==========================================================*/ -/* ===========================================================================*/ + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s.heap_len = 0; + s.heap_max = HEAP_SIZE; + for (n = 0; n < elems; n++) { + if (tree[n * 2]/*.Freq*/ !== 0) { + s.heap[++s.heap_len] = max_code = n; + s.depth[n] = 0; -//var Z_FILTERED = 1; -//var Z_HUFFMAN_ONLY = 2; -//var Z_RLE = 3; -var Z_FIXED = 4; -//var Z_DEFAULT_STRATEGY = 0; + } else { + tree[n * 2 + 1]/*.Len*/ = 0; + } + } -/* Possible values of the data_type field (though see inflate()) */ -var Z_BINARY = 0; -var Z_TEXT = 1; -//var Z_ASCII = 1; // = Z_TEXT -var Z_UNKNOWN = 2; + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s.heap_len < 2) { + node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); + tree[node * 2]/*.Freq*/ = 1; + s.depth[node] = 0; + s.opt_len--; -/*============================================================================*/ + if (has_stree) { + s.static_len -= stree[node * 2 + 1]/*.Len*/; + } + /* node is 0 or 1 so it does not have extra bits */ + } + desc.max_code = max_code; + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } -function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + //pqremove(s, tree, n); /* n = node of least frequency */ + /*** pqremove ***/ + n = s.heap[1/*SMALLEST*/]; + s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; + pqdownheap(s, tree, 1/*SMALLEST*/); + /***/ -// From zutil.h + m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ -var STORED_BLOCK = 0; -var STATIC_TREES = 1; -var DYN_TREES = 2; -/* The three kinds of block type */ + s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ + s.heap[--s.heap_max] = m; -var MIN_MATCH = 3; -var MAX_MATCH = 258; -/* The minimum and maximum match lengths */ + /* Create a new node father of n and m */ + tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; + s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; + tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; -// From deflate.h -/* =========================================================================== - * Internal compression state. - */ + /* and insert the new node in the heap */ + s.heap[1/*SMALLEST*/] = node++; + pqdownheap(s, tree, 1/*SMALLEST*/); -var LENGTH_CODES = 29; -/* number of length codes, not counting the special END_BLOCK code */ + } while (s.heap_len >= 2); -var LITERALS = 256; -/* number of literal bytes 0..255 */ + s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; -var L_CODES = LITERALS + 1 + LENGTH_CODES; -/* number of Literal or Length codes, including the END_BLOCK code */ + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, desc); -var D_CODES = 30; -/* number of distance codes */ + /* The field len is now set, we can generate the bit codes */ + gen_codes(tree, max_code, s.bl_count); +} -var BL_CODES = 19; -/* number of codes used to transfer the bit lengths */ -var HEAP_SIZE = 2 * L_CODES + 1; -/* maximum heap size */ +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +function scan_tree(s, tree, max_code) +// deflate_state *s; +// ct_data *tree; /* the tree to be scanned */ +// int max_code; /* and its largest code of non zero frequency */ +{ + var n; /* iterates over all tree elements */ + var prevlen = -1; /* last emitted length */ + var curlen; /* length of current code */ -var MAX_BITS = 15; -/* All codes must not exceed MAX_BITS bits */ + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ -var Buf_size = 16; -/* size of bit buffer in bi_buf */ + var count = 0; /* repeat count of the current code */ + var max_count = 7; /* max repeat count */ + var min_count = 4; /* min repeat count */ + + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; -/* =========================================================================== - * Constants - */ + if (++count < max_count && curlen === nextlen) { + continue; -var MAX_BL_BITS = 7; -/* Bit length codes must not exceed MAX_BL_BITS bits */ + } else if (count < min_count) { + s.bl_tree[curlen * 2]/*.Freq*/ += count; -var END_BLOCK = 256; -/* end of block literal code */ + } else if (curlen !== 0) { -var REP_3_6 = 16; -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } + s.bl_tree[REP_3_6 * 2]/*.Freq*/++; -var REPZ_3_10 = 17; -/* repeat a zero length 3-10 times (3 bits of repeat count) */ + } else if (count <= 10) { + s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; -var REPZ_11_138 = 18; -/* repeat a zero length 11-138 times (7 bits of repeat count) */ + } else { + s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; + } -/* eslint-disable comma-spacing,array-bracket-spacing */ -var extra_lbits = /* extra bits for each length code */ - [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; + count = 0; + prevlen = curlen; -var extra_dbits = /* extra bits for each distance code */ - [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; + if (nextlen === 0) { + max_count = 138; + min_count = 3; -var extra_blbits = /* extra bits for each bit length code */ - [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; -var bl_order = - [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; -/* eslint-enable comma-spacing,array-bracket-spacing */ + } else { + max_count = 7; + min_count = 4; + } + } +} -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ /* =========================================================================== - * Local data. These are initialized only once. + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. */ +function send_tree(s, tree, max_code) +// deflate_state *s; +// ct_data *tree; /* the tree to be scanned */ +// int max_code; /* and its largest code of non zero frequency */ +{ + var n; /* iterates over all tree elements */ + var prevlen = -1; /* last emitted length */ + var curlen; /* length of current code */ -// We pre-fill arrays with 0 to avoid uninitialized gaps + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ -var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ + var count = 0; /* repeat count of the current code */ + var max_count = 7; /* max repeat count */ + var min_count = 4; /* min repeat count */ -// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1 -var static_ltree = new Array((L_CODES + 2) * 2); -zero(static_ltree); -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } -var static_dtree = new Array(D_CODES * 2); -zero(static_dtree); -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; -var _dist_code = new Array(DIST_CODE_LEN); -zero(_dist_code); -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ + if (++count < max_count && curlen === nextlen) { + continue; -var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); -zero(_length_code); -/* length code for each normalized match length (0 == MIN_MATCH) */ + } else if (count < min_count) { + do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); -var base_length = new Array(LENGTH_CODES); -zero(base_length); -/* First normalized length for each code (0 = MIN_MATCH) */ + } else if (curlen !== 0) { + if (curlen !== prevlen) { + send_code(s, curlen, s.bl_tree); + count--; + } + //Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s.bl_tree); + send_bits(s, count - 3, 2); -var base_dist = new Array(D_CODES); -zero(base_dist); -/* First normalized distance for each code (0 = distance of 1) */ + } else if (count <= 10) { + send_code(s, REPZ_3_10, s.bl_tree); + send_bits(s, count - 3, 3); + } else { + send_code(s, REPZ_11_138, s.bl_tree); + send_bits(s, count - 11, 7); + } -function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { + count = 0; + prevlen = curlen; + if (nextlen === 0) { + max_count = 138; + min_count = 3; - this.static_tree = static_tree; /* static tree or NULL */ - this.extra_bits = extra_bits; /* extra bits for each code or NULL */ - this.extra_base = extra_base; /* base index for extra_bits */ - this.elems = elems; /* max number of elements in the tree */ - this.max_length = max_length; /* max bit length for the codes */ + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; - // show if `static_tree` has data or dummy - needed for monomorphic objects - this.has_stree = static_tree && static_tree.length; + } else { + max_count = 7; + min_count = 4; + } + } } -var static_l_desc; -var static_d_desc; -var static_bl_desc; +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +function build_bl_tree(s) { + var max_blindex; /* index of last bit length code of non zero freq */ + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, s.dyn_ltree, s.l_desc.max_code); + scan_tree(s, s.dyn_dtree, s.d_desc.max_code); -function TreeDesc(dyn_tree, stat_desc) { - this.dyn_tree = dyn_tree; /* the dynamic tree */ - this.max_code = 0; /* largest code with non zero frequency */ - this.stat_desc = stat_desc; /* the corresponding static tree */ + /* Build the bit length tree: */ + build_tree(s, s.bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { + if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { + break; + } + } + /* Update opt_len to include the bit length tree and counts */ + s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + // s->opt_len, s->static_len)); + + return max_blindex; } +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +function send_all_trees(s, lcodes, dcodes, blcodes) +// deflate_state *s; +// int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + var rank; /* index in bl_order */ + + //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + // "too many codes"); + //Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes - 1, 5); + send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); + } + //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ + //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); -function d_code(dist) { - return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; + send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ + //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } /* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. */ -function put_short(s, w) { -// put_byte(s, (uch)((w) & 0xff)); -// put_byte(s, (uch)((ush)(w) >> 8)); - s.pending_buf[s.pending++] = (w) & 0xff; - s.pending_buf[s.pending++] = (w >>> 8) & 0xff; +function detect_data_type(s) { + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + var black_mask = 0xf3ffc07f; + var n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>>= 1) { + if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { + return Z_BINARY; + } + } + + /* Check for textual ("white-listed") bytes. */ + if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || + s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { + return Z_TEXT; + } + for (n = 32; n < LITERALS; n++) { + if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { + return Z_TEXT; + } + } + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; } +var static_init_done = false; + /* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. + * Initialize the tree data structures for a new zlib stream. */ -function send_bits(s, value, length) { - if (s.bi_valid > (Buf_size - length)) { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - put_short(s, s.bi_buf); - s.bi_buf = value >> (Buf_size - s.bi_valid); - s.bi_valid += length - Buf_size; - } else { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - s.bi_valid += length; +function _tr_init(s) +{ + + if (!static_init_done) { + tr_static_init(); + static_init_done = true; } -} + s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); + s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); + s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); + + s.bi_buf = 0; + s.bi_valid = 0; -function send_code(s, c, tree) { - send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); + /* Initialize the first block of the first file: */ + init_block(s); } /* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 + * Send a stored block */ -function bi_reverse(code, len) { - var res = 0; - do { - res |= code & 1; - code >>>= 1; - res <<= 1; - } while (--len > 0); - return res >>> 1; +function _tr_stored_block(s, buf, stored_len, last) +//DeflateState *s; +//charf *buf; /* input block */ +//ulg stored_len; /* length of input block */ +//int last; /* one if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ + copy_block(s, buf, stored_len, true); /* with header */ } /* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. */ -function bi_flush(s) { - if (s.bi_valid === 16) { - put_short(s, s.bi_buf); - s.bi_buf = 0; - s.bi_valid = 0; - - } else if (s.bi_valid >= 8) { - s.pending_buf[s.pending++] = s.bi_buf & 0xff; - s.bi_buf >>= 8; - s.bi_valid -= 8; - } +function _tr_align(s) { + send_bits(s, STATIC_TREES << 1, 3); + send_code(s, END_BLOCK, static_ltree); + bi_flush(s); } /* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. */ -function gen_bitlen(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ +function _tr_flush_block(s, buf, stored_len, last) +//DeflateState *s; +//charf *buf; /* input block, or NULL if too old */ +//ulg stored_len; /* length of input block */ +//int last; /* one if this is the last block for a file */ { - var tree = desc.dyn_tree; - var max_code = desc.max_code; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var extra = desc.stat_desc.extra_bits; - var base = desc.stat_desc.extra_base; - var max_length = desc.stat_desc.max_length; - var h; /* heap index */ - var n, m; /* iterate over the tree elements */ - var bits; /* bit length */ - var xbits; /* extra bits */ - var f; /* frequency */ - var overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) { - s.bl_count[bits] = 0; - } + var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + var max_blindex = 0; /* index of last bit length code of non zero freq */ - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ + /* Build the Huffman trees unless a stored block is forced */ + if (s.level > 0) { - for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; - if (bits > max_length) { - bits = max_length; - overflow++; + /* Check if the file is binary or text */ + if (s.strm.data_type === Z_UNKNOWN) { + s.strm.data_type = detect_data_type(s); } - tree[n * 2 + 1]/*.Len*/ = bits; - /* We overwrite tree[n].Dad which is no longer needed */ - if (n > max_code) { continue; } /* not a leaf node */ + /* Construct the literal and distance trees */ + build_tree(s, s.l_desc); + // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); - s.bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n - base]; - } - f = tree[n * 2]/*.Freq*/; - s.opt_len += f * (bits + xbits); - if (has_stree) { - s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); - } + build_tree(s, s.d_desc); + // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s.opt_len + 3 + 7) >>> 3; + static_lenb = (s.static_len + 3 + 7) >>> 3; + + // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + // s->last_lit)); + + if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } + + } else { + // Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } - if (overflow === 0) { return; } - // Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ + if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { + /* 4: two words for the lengths */ - /* Find the first bit length which could increase: */ - do { - bits = max_length - 1; - while (s.bl_count[bits] === 0) { bits--; } - s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ - s.bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. */ - overflow -= 2; - } while (overflow > 0); + _tr_stored_block(s, buf, stored_len, last); - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) + } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { + + send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); + compress_block(s, static_ltree, static_dtree); + + } else { + send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); + send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); + compress_block(s, s.dyn_ltree, s.dyn_dtree); + } + // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. */ - for (bits = max_length; bits !== 0; bits--) { - n = s.bl_count[bits]; - while (n !== 0) { - m = s.heap[--h]; - if (m > max_code) { continue; } - if (tree[m * 2 + 1]/*.Len*/ !== bits) { - // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; - tree[m * 2 + 1]/*.Len*/ = bits; - } - n--; - } + init_block(s); + + if (last) { + bi_windup(s); } + // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + // s->compressed_len-7*last)); } - /* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. */ -function gen_codes(tree, max_code, bl_count) -// ct_data *tree; /* the tree to decorate */ -// int max_code; /* largest code with non zero frequency */ -// ushf *bl_count; /* number of codes at each bit length */ +function _tr_tally(s, dist, lc) +// deflate_state *s; +// unsigned dist; /* distance of matched string */ +// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ { - var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */ - var code = 0; /* running code value */ - var bits; /* bit index */ - var n; /* code index */ + //var out_length, in_length, dcode; - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits - 1]) << 1; + s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; + s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; + + s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; + s.last_lit++; + + if (dist === 0) { + /* lc is the unmatched char */ + s.dyn_ltree[lc * 2]/*.Freq*/++; + } else { + s.matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + //Assert((ush)dist < (ush)MAX_DIST(s) && + // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++; + s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. + +// (!) This block is disabled in zlib defailts, +// don't enable it for binary compatibility + +//#ifdef TRUNCATE_BLOCK +// /* Try to guess if it is profitable to stop the current block here */ +// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { +// /* Compute an upper bound for the compressed length */ +// out_length = s.last_lit*8; +// in_length = s.strstart - s.block_start; +// +// for (dcode = 0; dcode < D_CODES; dcode++) { +// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); +// } +// out_length >>>= 3; +// //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", +// // s->last_lit, in_length, out_length, +// // 100L - out_length*100L/in_length)); +// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { +// return true; +// } +// } +//#endif + + return (s.last_lit === s.lit_bufsize - 1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. */ - //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES - 1; code++) { - base_length[code] = length; - for (n = 0; n < (1 << extra_lbits[code]); n++) { - _length_code[length++] = code; - } - } - //Assert (length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length - 1] = code; +var ieee754 = _dereq_('ieee754'); - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1 << extra_dbits[code]); n++) { - _dist_code[dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for (; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { - _dist_code[256 + dist++] = code; +var BufferMethods; + +function Buffer(length) { + var arr; + if (length && length.length) { + arr = length; + length = arr.length; } - } - //Assert (dist == 256, "tr_static_init: 256+dist != 512"); + var buf = new Uint8Array(length || 0); + if (arr) buf.set(arr); - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) { - bl_count[bits] = 0; - } + buf.readUInt32LE = BufferMethods.readUInt32LE; + buf.writeUInt32LE = BufferMethods.writeUInt32LE; + buf.readInt32LE = BufferMethods.readInt32LE; + buf.writeInt32LE = BufferMethods.writeInt32LE; + buf.readFloatLE = BufferMethods.readFloatLE; + buf.writeFloatLE = BufferMethods.writeFloatLE; + buf.readDoubleLE = BufferMethods.readDoubleLE; + buf.writeDoubleLE = BufferMethods.writeDoubleLE; + buf.toString = BufferMethods.toString; + buf.write = BufferMethods.write; + buf.slice = BufferMethods.slice; + buf.copy = BufferMethods.copy; - n = 0; - while (n <= 143) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - while (n <= 255) { - static_ltree[n * 2 + 1]/*.Len*/ = 9; - n++; - bl_count[9]++; - } - while (n <= 279) { - static_ltree[n * 2 + 1]/*.Len*/ = 7; - n++; - bl_count[7]++; - } - while (n <= 287) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes(static_ltree, L_CODES + 1, bl_count); + buf._isBuffer = true; + return buf; +} - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n * 2 + 1]/*.Len*/ = 5; - static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); - } +var lastStr, lastStrEncoded; - // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); - static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); - static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); +BufferMethods = { + readUInt32LE: function(pos) { + return ((this[pos]) | + (this[pos + 1] << 8) | + (this[pos + 2] << 16)) + + (this[pos + 3] * 0x1000000); + }, - //static_init_done = true; -} + writeUInt32LE: function(val, pos) { + this[pos] = val; + this[pos + 1] = (val >>> 8); + this[pos + 2] = (val >>> 16); + this[pos + 3] = (val >>> 24); + }, + readInt32LE: function(pos) { + return ((this[pos]) | + (this[pos + 1] << 8) | + (this[pos + 2] << 16)) + + (this[pos + 3] << 24); + }, -/* =========================================================================== - * Initialize a new block. - */ -function init_block(s) { - var n; /* iterates over tree elements */ + readFloatLE: function(pos) { return ieee754.read(this, pos, true, 23, 4); }, + readDoubleLE: function(pos) { return ieee754.read(this, pos, true, 52, 8); }, - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } + writeFloatLE: function(val, pos) { return ieee754.write(this, val, pos, true, 23, 4); }, + writeDoubleLE: function(val, pos) { return ieee754.write(this, val, pos, true, 52, 8); }, - s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; - s.opt_len = s.static_len = 0; - s.last_lit = s.matches = 0; -} + toString: function(encoding, start, end) { + var str = '', + tmp = ''; + start = start || 0; + end = Math.min(this.length, end || this.length); -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -function bi_windup(s) -{ - if (s.bi_valid > 8) { - put_short(s, s.bi_buf); - } else if (s.bi_valid > 0) { - //put_byte(s, (Byte)s->bi_buf); - s.pending_buf[s.pending++] = s.bi_buf; - } - s.bi_buf = 0; - s.bi_valid = 0; -} + for (var i = start; i < end; i++) { + var ch = this[i]; + if (ch <= 0x7F) { + str += decodeURIComponent(tmp) + String.fromCharCode(ch); + tmp = ''; + } else { + tmp += '%' + ch.toString(16); + } + } -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -function copy_block(s, buf, len, header) -//DeflateState *s; -//charf *buf; /* the input data */ -//unsigned len; /* its length */ -//int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ + str += decodeURIComponent(tmp); - if (header) { - put_short(s, len); - put_short(s, ~len); - } -// while (len--) { -// put_byte(s, *buf++); -// } - utils.arraySet(s.pending_buf, s.window, buf, len, s.pending); - s.pending += len; -} + return str; + }, -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -function smaller(tree, n, m, depth) { - var _n2 = n * 2; - var _m2 = m * 2; - return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || - (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); -} + write: function(str, pos) { + var bytes = str === lastStr ? lastStrEncoded : encodeString(str); + for (var i = 0; i < bytes.length; i++) { + this[pos + i] = bytes[i]; + } + }, -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -function pqdownheap(s, tree, k) -// deflate_state *s; -// ct_data *tree; /* the tree to restore */ -// int k; /* node to move down */ -{ - var v = s.heap[k]; - var j = k << 1; /* left son of k */ - while (j <= s.heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s.heap_len && - smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { - j++; + slice: function(start, end) { + return this.subarray(start, end); + }, + + copy: function(buf, pos) { + pos = pos || 0; + for (var i = 0; i < this.length; i++) { + buf[pos + i] = this[i]; + } } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s.heap[j], s.depth)) { break; } +}; - /* Exchange v with the smallest son */ - s.heap[k] = s.heap[j]; - k = j; +BufferMethods.writeInt32LE = BufferMethods.writeUInt32LE; - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s.heap[k] = v; -} +Buffer.byteLength = function(str) { + lastStr = str; + lastStrEncoded = encodeString(str); + return lastStrEncoded.length; +}; +Buffer.isBuffer = function(buf) { + return !!(buf && buf._isBuffer); +}; -// inlined manually -// var SMALLEST = 1; +function encodeString(str) { + var length = str.length, + bytes = []; -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -function compress_block(s, ltree, dtree) -// deflate_state *s; -// const ct_data *ltree; /* literal tree */ -// const ct_data *dtree; /* distance tree */ -{ - var dist; /* distance of matched string */ - var lc; /* match length or unmatched char (if dist == 0) */ - var lx = 0; /* running index in l_buf */ - var code; /* the code to send */ - var extra; /* number of extra bits to send */ + for (var i = 0, c, lead; i < length; i++) { + c = str.charCodeAt(i); // code point - if (s.last_lit !== 0) { - do { - dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]); - lc = s.pending_buf[s.l_buf + lx]; - lx++; + if (c > 0xD7FF && c < 0xE000) { - if (dist === 0) { - send_code(s, lc, ltree); /* send a literal byte */ - //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS + 1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra !== 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - //Assert (code < D_CODES, "bad d_code"); + if (lead) { + if (c < 0xDC00) { + bytes.push(0xEF, 0xBF, 0xBD); + lead = c; + continue; - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra !== 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ + } else { + c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; + lead = null; + } + + } else { + if (c > 0xDBFF || (i + 1 === length)) bytes.push(0xEF, 0xBF, 0xBD); + else lead = c; + + continue; + } + + } else if (lead) { + bytes.push(0xEF, 0xBF, 0xBD); + lead = null; } - } /* literal or match pair ? */ - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - // "pendingBuf overflow"); + if (c < 0x80) bytes.push(c); + else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80); + else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); + else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); + } + return bytes; +} - } while (lx < s.last_lit); - } +},{"ieee754":91}],173:[function(_dereq_,module,exports){ +(function (global){ +'use strict'; - send_code(s, END_BLOCK, ltree); +module.exports = Pbf; + +var Buffer = global.Buffer || _dereq_('./buffer'); + +function Pbf(buf) { + this.buf = !Buffer.isBuffer(buf) ? new Buffer(buf || 0) : buf; + this.pos = 0; + this.length = this.buf.length; } +Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum +Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 +Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields +Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 -/* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ -function build_tree(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ -{ - var tree = desc.dyn_tree; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var elems = desc.stat_desc.elems; - var n, m; /* iterate over heap elements */ - var max_code = -1; /* largest code with non zero frequency */ - var node; /* new node being created */ +var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), + SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32, + POW_2_63 = Math.pow(2, 63); - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s.heap_len = 0; - s.heap_max = HEAP_SIZE; +Pbf.prototype = { - for (n = 0; n < elems; n++) { - if (tree[n * 2]/*.Freq*/ !== 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; + destroy: function() { + this.buf = null; + }, - } else { - tree[n * 2 + 1]/*.Len*/ = 0; - } - } + // === READING ================================================================= - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); - tree[node * 2]/*.Freq*/ = 1; - s.depth[node] = 0; - s.opt_len--; + readFields: function(readField, result, end) { + end = end || this.length; - if (has_stree) { - s.static_len -= stree[node * 2 + 1]/*.Len*/; - } - /* node is 0 or 1 so it does not have extra bits */ - } - desc.max_code = max_code; + while (this.pos < end) { + var val = this.readVarint(), + tag = val >> 3, + startPos = this.pos; - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } + readField(tag, result, this); - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - //pqremove(s, tree, n); /* n = node of least frequency */ - /*** pqremove ***/ - n = s.heap[1/*SMALLEST*/]; - s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; - pqdownheap(s, tree, 1/*SMALLEST*/); - /***/ + if (this.pos === startPos) this.skip(val); + } + return result; + }, - m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ + readMessage: function(readField, result) { + return this.readFields(readField, result, this.readVarint() + this.pos); + }, - s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ - s.heap[--s.heap_max] = m; + readFixed32: function() { + var val = this.buf.readUInt32LE(this.pos); + this.pos += 4; + return val; + }, - /* Create a new node father of n and m */ - tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; - s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; + readSFixed32: function() { + var val = this.buf.readInt32LE(this.pos); + this.pos += 4; + return val; + }, - /* and insert the new node in the heap */ - s.heap[1/*SMALLEST*/] = node++; - pqdownheap(s, tree, 1/*SMALLEST*/); + // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) + + readFixed64: function() { + var val = this.buf.readUInt32LE(this.pos) + this.buf.readUInt32LE(this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + + readSFixed64: function() { + var val = this.buf.readUInt32LE(this.pos) + this.buf.readInt32LE(this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, - } while (s.heap_len >= 2); + readFloat: function() { + var val = this.buf.readFloatLE(this.pos); + this.pos += 4; + return val; + }, - s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; + readDouble: function() { + var val = this.buf.readDoubleLE(this.pos); + this.pos += 8; + return val; + }, - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, desc); + readVarint: function() { + var buf = this.buf, + val, b, b0, b1, b2, b3; - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, s.bl_count); -} + b0 = buf[this.pos++]; if (b0 < 0x80) return b0; b0 = b0 & 0x7f; + b1 = buf[this.pos++]; if (b1 < 0x80) return b0 | b1 << 7; b1 = (b1 & 0x7f) << 7; + b2 = buf[this.pos++]; if (b2 < 0x80) return b0 | b1 | b2 << 14; b2 = (b2 & 0x7f) << 14; + b3 = buf[this.pos++]; if (b3 < 0x80) return b0 | b1 | b2 | b3 << 21; + val = b0 | b1 | b2 | (b3 & 0x7f) << 21; -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -function scan_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ + b = buf[this.pos++]; val += (b & 0x7f) * 0x10000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x800000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x40000000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x2000000000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x100000000000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x8000000000000000; if (b < 0x80) return val; - var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + throw new Error('Expected varint not more than 10 bytes'); + }, - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ + readVarint64: function() { + var startPos = this.pos, + val = this.readVarint(); - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ + if (val < POW_2_63) return val; - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + var pos = this.pos - 2; + while (this.buf[pos] === 0xff) pos--; + if (pos < startPos) pos = startPos; - if (++count < max_count && curlen === nextlen) { - continue; + val = 0; + for (var i = 0; i < pos - startPos + 1; i++) { + var b = ~this.buf[startPos + i] & 0x7f; + val += i < 4 ? b << i * 7 : b * Math.pow(2, i * 7); + } - } else if (count < min_count) { - s.bl_tree[curlen * 2]/*.Freq*/ += count; + return -val - 1; + }, - } else if (curlen !== 0) { + readSVarint: function() { + var num = this.readVarint(); + return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding + }, - if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } - s.bl_tree[REP_3_6 * 2]/*.Freq*/++; + readBoolean: function() { + return Boolean(this.readVarint()); + }, - } else if (count <= 10) { - s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; + readString: function() { + var end = this.readVarint() + this.pos, + str = this.buf.toString('utf8', this.pos, end); + this.pos = end; + return str; + }, - } else { - s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; - } + readBytes: function() { + var end = this.readVarint() + this.pos, + buffer = this.buf.slice(this.pos, end); + this.pos = end; + return buffer; + }, - count = 0; - prevlen = curlen; + // verbose for performance reasons; doesn't affect gzipped size - if (nextlen === 0) { - max_count = 138; - min_count = 3; + readPackedVarint: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readVarint()); + return arr; + }, + readPackedSVarint: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSVarint()); + return arr; + }, + readPackedBoolean: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readBoolean()); + return arr; + }, + readPackedFloat: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFloat()); + return arr; + }, + readPackedDouble: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readDouble()); + return arr; + }, + readPackedFixed32: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFixed32()); + return arr; + }, + readPackedSFixed32: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSFixed32()); + return arr; + }, + readPackedFixed64: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFixed64()); + return arr; + }, + readPackedSFixed64: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSFixed64()); + return arr; + }, - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; + skip: function(val) { + var type = val & 0x7; + if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} + else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos; + else if (type === Pbf.Fixed32) this.pos += 4; + else if (type === Pbf.Fixed64) this.pos += 8; + else throw new Error('Unimplemented type: ' + type); + }, - } else { - max_count = 7; - min_count = 4; - } - } -} + // === WRITING ================================================================= + writeTag: function(tag, type) { + this.writeVarint((tag << 3) | type); + }, -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -function send_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ + realloc: function(min) { + var length = this.length || 16; - var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + while (length < this.pos + min) length *= 2; - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ + if (length !== this.length) { + var buf = new Buffer(length); + this.buf.copy(buf); + this.buf = buf; + this.length = length; + } + }, - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } + finish: function() { + this.length = this.pos; + this.pos = 0; + return this.buf.slice(0, this.length); + }, - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + writeFixed32: function(val) { + this.realloc(4); + this.buf.writeUInt32LE(val, this.pos); + this.pos += 4; + }, - if (++count < max_count && curlen === nextlen) { - continue; + writeSFixed32: function(val) { + this.realloc(4); + this.buf.writeInt32LE(val, this.pos); + this.pos += 4; + }, - } else if (count < min_count) { - do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); + writeFixed64: function(val) { + this.realloc(8); + this.buf.writeInt32LE(val & -1, this.pos); + this.buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, - } else if (curlen !== 0) { - if (curlen !== prevlen) { - send_code(s, curlen, s.bl_tree); - count--; - } - //Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count - 3, 2); + writeSFixed64: function(val) { + this.realloc(8); + this.buf.writeInt32LE(val & -1, this.pos); + this.buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, - } else if (count <= 10) { - send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count - 3, 3); + writeVarint: function(val) { + val = +val; - } else { - send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count - 11, 7); - } + if (val <= 0x7f) { + this.realloc(1); + this.buf[this.pos++] = val; - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; + } else if (val <= 0x3fff) { + this.realloc(2); + this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 7) & 0x7f); - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; + } else if (val <= 0x1fffff) { + this.realloc(3); + this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 14) & 0x7f); - } else { - max_count = 7; - min_count = 4; - } - } -} + } else if (val <= 0xfffffff) { + this.realloc(4); + this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 14) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 21) & 0x7f); + } else { + var pos = this.pos; + while (val >= 0x80) { + this.realloc(1); + this.buf[this.pos++] = (val & 0xff) | 0x80; + val /= 0x80; + } + this.realloc(1); + this.buf[this.pos++] = val | 0; + if (this.pos - pos > 10) throw new Error('Given varint doesn\'t fit into 10 bytes'); + } + }, -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -function build_bl_tree(s) { - var max_blindex; /* index of last bit length code of non zero freq */ + writeSVarint: function(val) { + this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); + }, - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, s.dyn_ltree, s.l_desc.max_code); - scan_tree(s, s.dyn_dtree, s.d_desc.max_code); + writeBoolean: function(val) { + this.writeVarint(Boolean(val)); + }, - /* Build the bit length tree: */ - build_tree(s, s.bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ + writeString: function(str) { + str = String(str); + var bytes = Buffer.byteLength(str); + this.writeVarint(bytes); + this.realloc(bytes); + this.buf.write(str, this.pos); + this.pos += bytes; + }, - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { - break; - } - } - /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // s->opt_len, s->static_len)); + writeFloat: function(val) { + this.realloc(4); + this.buf.writeFloatLE(val, this.pos); + this.pos += 4; + }, - return max_blindex; -} + writeDouble: function(val) { + this.realloc(8); + this.buf.writeDoubleLE(val, this.pos); + this.pos += 8; + }, + writeBytes: function(buffer) { + var len = buffer.length; + this.writeVarint(len); + this.realloc(len); + for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i]; + }, -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -function send_all_trees(s, lcodes, dcodes, blcodes) -// deflate_state *s; -// int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - var rank; /* index in bl_order */ + writeMessage: function(tag, fn, obj) { + this.writeTag(tag, Pbf.Bytes); - //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes - 1, 5); - send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); - } - //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + this.pos++; // reserve 1 byte for short message length - send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ - //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + // write the message directly to the buffer and see how much was written + var startPos = this.pos; + fn(obj, this); + var len = this.pos - startPos; - send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ - //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} + var varintLen = + len <= 0x7f ? 1 : + len <= 0x3fff ? 2 : + len <= 0x1fffff ? 3 : + len <= 0xfffffff ? 4 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); + // if 1 byte isn't enough for encoding message length, shift the data to the right + if (varintLen > 1) { + this.realloc(varintLen - 1); + for (var i = this.pos - 1; i >= startPos; i--) this.buf[i + varintLen - 1] = this.buf[i]; + } -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -function detect_data_type(s) { - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - var black_mask = 0xf3ffc07f; - var n; + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>>= 1) { - if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { - return Z_BINARY; - } - } + writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); }, + writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); }, + writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); }, + writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); }, + writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); }, + writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); }, + writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); }, + writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); }, + writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); }, - /* Check for textual ("white-listed") bytes. */ - if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || - s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - for (n = 32; n < LITERALS; n++) { - if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { - return Z_TEXT; + writeBytesField: function(tag, buffer) { + this.writeTag(tag, Pbf.Bytes); + this.writeBytes(buffer); + }, + writeFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFixed32(val); + }, + writeSFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeSFixed32(val); + }, + writeFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeFixed64(val); + }, + writeSFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeSFixed64(val); + }, + writeVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeVarint(val); + }, + writeSVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeSVarint(val); + }, + writeStringField: function(tag, str) { + this.writeTag(tag, Pbf.Bytes); + this.writeString(str); + }, + writeFloatField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFloat(val); + }, + writeDoubleField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeDouble(val); + }, + writeBooleanField: function(tag, val) { + this.writeVarintField(tag, Boolean(val)); } - } +}; - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} +function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); } +function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); } +function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); } +function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); } +function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); } +function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); } +function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); } +function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); } +function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); } +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -var static_init_done = false; +},{"./buffer":172}],174:[function(_dereq_,module,exports){ +'use strict'; -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -function _tr_init(s) -{ +module.exports = Point; - if (!static_init_done) { - tr_static_init(); - static_init_done = true; - } +function Point(x, y) { + this.x = x; + this.y = y; +} - s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); - s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); - s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); +Point.prototype = { + clone: function() { return new Point(this.x, this.y); }, - s.bi_buf = 0; - s.bi_valid = 0; + add: function(p) { return this.clone()._add(p); }, + sub: function(p) { return this.clone()._sub(p); }, + mult: function(k) { return this.clone()._mult(k); }, + div: function(k) { return this.clone()._div(k); }, + rotate: function(a) { return this.clone()._rotate(a); }, + matMult: function(m) { return this.clone()._matMult(m); }, + unit: function() { return this.clone()._unit(); }, + perp: function() { return this.clone()._perp(); }, + round: function() { return this.clone()._round(); }, - /* Initialize the first block of the first file: */ - init_block(s); -} + mag: function() { + return Math.sqrt(this.x * this.x + this.y * this.y); + }, + equals: function(p) { + return this.x === p.x && + this.y === p.y; + }, -/* =========================================================================== - * Send a stored block - */ -function _tr_stored_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ - copy_block(s, buf, stored_len, true); /* with header */ -} + dist: function(p) { + return Math.sqrt(this.distSqr(p)); + }, + distSqr: function(p) { + var dx = p.x - this.x, + dy = p.y - this.y; + return dx * dx + dy * dy; + }, -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ -function _tr_align(s) { - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); - bi_flush(s); -} + angle: function() { + return Math.atan2(this.y, this.x); + }, + angleTo: function(b) { + return Math.atan2(this.y - b.y, this.x - b.x); + }, -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -function _tr_flush_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block, or NULL if too old */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - var max_blindex = 0; /* index of last bit length code of non zero freq */ + angleWith: function(b) { + return this.angleWithSep(b.x, b.y); + }, - /* Build the Huffman trees unless a stored block is forced */ - if (s.level > 0) { + // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ. + angleWithSep: function(x, y) { + return Math.atan2( + this.x * y - this.y * x, + this.x * x + this.y * y); + }, - /* Check if the file is binary or text */ - if (s.strm.data_type === Z_UNKNOWN) { - s.strm.data_type = detect_data_type(s); - } + _matMult: function(m) { + var x = m[0] * this.x + m[1] * this.y, + y = m[2] * this.x + m[3] * this.y; + this.x = x; + this.y = y; + return this; + }, - /* Construct the literal and distance trees */ - build_tree(s, s.l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); + _add: function(p) { + this.x += p.x; + this.y += p.y; + return this; + }, - build_tree(s, s.d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ + _sub: function(p) { + this.x -= p.x; + this.y -= p.y; + return this; + }, - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); + _mult: function(k) { + this.x *= k; + this.y *= k; + return this; + }, - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s.opt_len + 3 + 7) >>> 3; - static_lenb = (s.static_len + 3 + 7) >>> 3; + _div: function(k) { + this.x /= k; + this.y /= k; + return this; + }, - // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - // s->last_lit)); + _unit: function() { + this._div(this.mag()); + return this; + }, - if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } + _perp: function() { + var y = this.y; + this.y = this.x; + this.x = -y; + return this; + }, - } else { - // Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } + _rotate: function(angle) { + var cos = Math.cos(angle), + sin = Math.sin(angle), + x = cos * this.x - sin * this.y, + y = sin * this.x + cos * this.y; + this.x = x; + this.y = y; + return this; + }, - if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { - /* 4: two words for the lengths */ + _round: function() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + } +}; - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, last); +// constructs Point from an array if necessary +Point.convert = function (a) { + if (a instanceof Point) { + return a; + } + if (Array.isArray(a)) { + return new Point(a[0], a[1]); + } + return a; +}; - } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { +},{}],175:[function(_dereq_,module,exports){ +(function (process){ +'use strict'; - send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); - compress_block(s, static_ltree, static_dtree); +if (!process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = nextTick; +} else { + module.exports = process.nextTick; +} - } else { - send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); - compress_block(s, s.dyn_ltree, s.dyn_dtree); +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); } - // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (last) { - bi_windup(s); + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); } - // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - // s->compressed_len-7*last)); } -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -function _tr_tally(s, dist, lc) -// deflate_state *s; -// unsigned dist; /* distance of matched string */ -// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - //var out_length, in_length, dcode; +}).call(this,_dereq_('_process')) - s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; - s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; +},{"_process":176}],176:[function(_dereq_,module,exports){ +// shim for using process in browser +var process = module.exports = {}; - s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; - s.last_lit++; +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. - if (dist === 0) { - /* lc is the unmatched char */ - s.dyn_ltree[lc * 2]/*.Freq*/++; - } else { - s.matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - //Assert((ush)dist < (ush)MAX_DIST(s) && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); +var cachedSetTimeout; +var cachedClearTimeout; - s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++; - s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; - } +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } -// (!) This block is disabled in zlib defailts, -// don't enable it for binary compatibility -//#ifdef TRUNCATE_BLOCK -// /* Try to guess if it is profitable to stop the current block here */ -// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { -// /* Compute an upper bound for the compressed length */ -// out_length = s.last_lit*8; -// in_length = s.strstart - s.block_start; -// -// for (dcode = 0; dcode < D_CODES; dcode++) { -// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); -// } -// out_length >>>= 3; -// //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", -// // s->last_lit, in_length, out_length, -// // 100L - out_length*100L/in_length)); -// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { -// return true; -// } -// } -//#endif - return (s.last_lit === s.lit_bufsize - 1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ } +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; -exports._tr_init = _tr_init; -exports._tr_stored_block = _tr_stored_block; -exports._tr_flush_block = _tr_flush_block; -exports._tr_tally = _tr_tally; -exports._tr_align = _tr_align; +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} -},{"../utils/common":161}],173:[function(_dereq_,module,exports){ -'use strict'; +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} -function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = ''/*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2/*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; } +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; -module.exports = ZStream; +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; -},{}],174:[function(_dereq_,module,exports){ +},{}],177:[function(_dereq_,module,exports){ // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from @@ -19927,7 +20211,7 @@ function forEach(xs, f) { f(xs[i], i); } } -},{"./_stream_readable":176,"./_stream_writable":178,"core-util-is":179,"inherits":180,"process-nextick-args":182}],175:[function(_dereq_,module,exports){ +},{"./_stream_readable":179,"./_stream_writable":181,"core-util-is":70,"inherits":92,"process-nextick-args":175}],178:[function(_dereq_,module,exports){ // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. @@ -19954,7 +20238,7 @@ function PassThrough(options) { PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; -},{"./_stream_transform":177,"core-util-is":179,"inherits":180}],176:[function(_dereq_,module,exports){ +},{"./_stream_transform":180,"core-util-is":70,"inherits":92}],179:[function(_dereq_,module,exports){ (function (process){ 'use strict'; @@ -20838,7 +21122,7 @@ function indexOf(xs, x) { } }).call(this,_dereq_('_process')) -},{"./_stream_duplex":174,"_process":8,"buffer":2,"core-util-is":179,"events":6,"inherits":180,"isarray":181,"process-nextick-args":182,"string_decoder/":183,"util":1}],177:[function(_dereq_,module,exports){ +},{"./_stream_duplex":177,"_process":176,"buffer":5,"core-util-is":70,"events":73,"inherits":92,"isarray":94,"process-nextick-args":175,"string_decoder/":183,"util":4}],180:[function(_dereq_,module,exports){ // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where @@ -21019,7 +21303,7 @@ function done(stream, er) { return stream.push(null); } -},{"./_stream_duplex":174,"core-util-is":179,"inherits":180}],178:[function(_dereq_,module,exports){ +},{"./_stream_duplex":177,"core-util-is":70,"inherits":92}],181:[function(_dereq_,module,exports){ (function (process){ // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all @@ -21539,171 +21823,21 @@ function CorkedRequest(state) { } }).call(this,_dereq_('_process')) -},{"./_stream_duplex":174,"_process":8,"buffer":2,"core-util-is":179,"events":6,"inherits":180,"process-nextick-args":182,"util-deprecate":184}],179:[function(_dereq_,module,exports){ -(function (Buffer){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. - -function isArray(arg) { - if (Array.isArray) { - return Array.isArray(arg); - } - return objectToString(arg) === '[object Array]'; -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = Buffer.isBuffer; - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - -}).call(this,{"isBuffer":_dereq_("../../../../../../browserify/node_modules/insert-module-globals/node_modules/is-buffer/index.js")}) - -},{"../../../../../../browserify/node_modules/insert-module-globals/node_modules/is-buffer/index.js":7}],180:[function(_dereq_,module,exports){ -arguments[4][9][0].apply(exports,arguments) -},{"dup":9}],181:[function(_dereq_,module,exports){ -arguments[4][5][0].apply(exports,arguments) -},{"dup":5}],182:[function(_dereq_,module,exports){ -(function (process){ -'use strict'; - -if (!process.version || - process.version.indexOf('v0.') === 0 || - process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { - module.exports = nextTick; -} else { - module.exports = process.nextTick; -} - -function nextTick(fn, arg1, arg2, arg3) { - if (typeof fn !== 'function') { - throw new TypeError('"callback" argument must be a function'); - } - var len = arguments.length; - var args, i; - switch (len) { - case 0: - case 1: - return process.nextTick(fn); - case 2: - return process.nextTick(function afterTickOne() { - fn.call(null, arg1); - }); - case 3: - return process.nextTick(function afterTickTwo() { - fn.call(null, arg1, arg2); - }); - case 4: - return process.nextTick(function afterTickThree() { - fn.call(null, arg1, arg2, arg3); - }); - default: - args = new Array(len - 1); - i = 0; - while (i < args.length) { - args[i++] = arguments[i]; - } - return process.nextTick(function afterTick() { - fn.apply(null, args); - }); - } -} - -}).call(this,_dereq_('_process')) +},{"./_stream_duplex":177,"_process":176,"buffer":5,"core-util-is":70,"events":73,"inherits":92,"process-nextick-args":175,"util-deprecate":186}],182:[function(_dereq_,module,exports){ +var Stream = (function (){ + try { + return _dereq_('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify + } catch(_){} +}()); +exports = module.exports = _dereq_('./lib/_stream_readable.js'); +exports.Stream = Stream || exports; +exports.Readable = exports; +exports.Writable = _dereq_('./lib/_stream_writable.js'); +exports.Duplex = _dereq_('./lib/_stream_duplex.js'); +exports.Transform = _dereq_('./lib/_stream_transform.js'); +exports.PassThrough = _dereq_('./lib/_stream_passthrough.js'); -},{"_process":8}],183:[function(_dereq_,module,exports){ +},{"./lib/_stream_duplex.js":177,"./lib/_stream_passthrough.js":178,"./lib/_stream_readable.js":179,"./lib/_stream_transform.js":180,"./lib/_stream_writable.js":181}],183:[function(_dereq_,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -21826,107 +21960,298 @@ StringDecoder.prototype.write = function(buffer) { } this.charReceived = this.charLength = 0; - // if there are no more bytes in this buffer, just emit our char - if (buffer.length === 0) { - return charStr; + // if there are no more bytes in this buffer, just emit our char + if (buffer.length === 0) { + return charStr; + } + break; + } + + // determine and set charLength / charReceived + this.detectIncompleteChar(buffer); + + var end = buffer.length; + if (this.charLength) { + // buffer the incomplete character bytes we got + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; + } + + charStr += buffer.toString(this.encoding, 0, end); + + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } + + // or just emit the charStr + return charStr; +}; + +// detectIncompleteChar determines if there is an incomplete UTF-8 character at +// the end of the given buffer. If so, it sets this.charLength to the byte +// length that character, and sets this.charReceived to the number of bytes +// that are available for this character. +StringDecoder.prototype.detectIncompleteChar = function(buffer) { + // determine how many bytes we have to check at the end of this buffer + var i = (buffer.length >= 3) ? 3 : buffer.length; + + // Figure out if one of the last i bytes of our buffer announces an + // incomplete char. + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; + + // See http://en.wikipedia.org/wiki/UTF-8#Description + + // 110XXXXX + if (i == 1 && c >> 5 == 0x06) { + this.charLength = 2; + break; + } + + // 1110XXXX + if (i <= 2 && c >> 4 == 0x0E) { + this.charLength = 3; + break; + } + + // 11110XXX + if (i <= 3 && c >> 3 == 0x1E) { + this.charLength = 4; + break; + } + } + this.charReceived = i; +}; + +StringDecoder.prototype.end = function(buffer) { + var res = ''; + if (buffer && buffer.length) + res = this.write(buffer); + + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); + } + + return res; +}; + +function passThroughWrite(buffer) { + return buffer.toString(this.encoding); +} + +function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; +} + +function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; +} + +},{"buffer":5}],184:[function(_dereq_,module,exports){ +/*! + * strip-comments + * + * Copyright (c) 2014 Jon Schlinkert, contributors. + * Licensed under the MIT license. + */ + +'use stric'; + +var reBlock = '\\/\\*'; +var reBlockIgnore = '\\/\\*(?!\\*?\\!)'; +var reBlockEnd = '(.|[\\r\\n]|\\n)*?\\*\\/\\n?\\n?'; +var reLine = /(^|[^\S\n])(?:\/\/)([\s\S]+?)$/gm; +var reLineIgnore = /(^|[^\S\n])(?:\/\/[^!])([\s\S]+?)$/gm; + + +/** + * Strip all comments + * + * {%= docs("strip") %} + * + * @param {String} `str` file contents or string to strip. + * @param {Object} `opts` options are passed to `.block`, and `.line` + * @return {String} String without comments. + * @api public + */ + +var strip = module.exports = function(str, opts) { + return str ? strip.block(strip.line(str, opts), opts) : ''; +}; + + +/** + * Strip only block comments, optionally leaving protected comments + * (e.g. `/*!`) intact. + * + * {%= docs("block") %} + * + * @param {String} `str` file content or string to strip to + * @param {Object} `opts` if `safe:true`, strip only comments that do not start with `/*!` or `/**!` + * @return {String} String without block comments. + * @api public + */ + +strip.block = function(str, opts) { + opts = opts || {}; + var re = new RegExp(reBlock + reBlockEnd, 'gm'); + if(opts.safe) { + re = new RegExp(reBlockIgnore + reBlockEnd, 'gm'); + } + return str ? str.replace(re, '') : ''; +}; + + +/** + * Strip only line comments + * + * {%= docs("line") %} + * + * @param {String} `str` file content or string to strip to + * @param {Object} `opts` if `safe:true`, strip all that not starts with `//!` + * @return {String} String without line comments. + * @api public + */ + +strip.line = function(str, opts) { + opts = opts || {}; + var re = reLine; + if(opts.safe) { + re = reLineIgnore; + } + return str ? str.replace(re, '') : ''; +}; + +},{}],185:[function(_dereq_,module,exports){ +// https://github.com/topojson/topojson-client Version 2.1.0. Copyright 2016 Mike Bostock. +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.topojson = global.topojson || {}))); +}(this, (function (exports) { 'use strict'; + +var reverse = function(array, n) { + var t, j = array.length, i = j - n; + while (i < --j) t = array[i], array[i++] = array[j], array[j] = t; +}; + +var identity = function(x) { + return x; +}; + +var transform = function(topology) { + if ((transform = topology.transform) == null) return identity; + var transform, + x0, + y0, + kx = transform.scale[0], + ky = transform.scale[1], + dx = transform.translate[0], + dy = transform.translate[1]; + return function(point, i) { + if (!i) x0 = y0 = 0; + point[0] = (x0 += point[0]) * kx + dx; + point[1] = (y0 += point[1]) * ky + dy; + return point; + }; +}; + +var feature = function(topology, o) { + return o.type === "GeometryCollection" + ? {type: "FeatureCollection", features: o.geometries.map(function(o) { return feature$1(topology, o); })} + : feature$1(topology, o); +}; + +function feature$1(topology, o) { + var id = o.id, + bbox = o.bbox, + properties = o.properties == null ? {} : o.properties, + geometry = object(topology, o); + return id == null && bbox == null ? {type: "Feature", properties: properties, geometry: geometry} + : bbox == null ? {type: "Feature", id: id, properties: properties, geometry: geometry} + : {type: "Feature", id: id, bbox: bbox, properties: properties, geometry: geometry}; +} + +function object(topology, o) { + var transformPoint = transform(topology), + arcs = topology.arcs; + + function arc(i, points) { + if (points.length) points.pop(); + for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length; k < n; ++k) { + points.push(transformPoint(a[k].slice(), k)); } - break; + if (i < 0) reverse(points, n); } - // determine and set charLength / charReceived - this.detectIncompleteChar(buffer); - - var end = buffer.length; - if (this.charLength) { - // buffer the incomplete character bytes we got - buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); - end -= this.charReceived; + function point(p) { + return transformPoint(p.slice()); } - charStr += buffer.toString(this.encoding, 0, end); - - var end = charStr.length - 1; - var charCode = charStr.charCodeAt(end); - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - var size = this.surrogateSize; - this.charLength += size; - this.charReceived += size; - this.charBuffer.copy(this.charBuffer, size, 0, size); - buffer.copy(this.charBuffer, 0, 0, size); - return charStr.substring(0, end); + function line(arcs) { + var points = []; + for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points); + if (points.length < 2) points.push(points[0].slice()); + return points; } - // or just emit the charStr - return charStr; -}; - -// detectIncompleteChar determines if there is an incomplete UTF-8 character at -// the end of the given buffer. If so, it sets this.charLength to the byte -// length that character, and sets this.charReceived to the number of bytes -// that are available for this character. -StringDecoder.prototype.detectIncompleteChar = function(buffer) { - // determine how many bytes we have to check at the end of this buffer - var i = (buffer.length >= 3) ? 3 : buffer.length; - - // Figure out if one of the last i bytes of our buffer announces an - // incomplete char. - for (; i > 0; i--) { - var c = buffer[buffer.length - i]; - - // See http://en.wikipedia.org/wiki/UTF-8#Description - - // 110XXXXX - if (i == 1 && c >> 5 == 0x06) { - this.charLength = 2; - break; - } + function ring(arcs) { + var points = line(arcs); + while (points.length < 4) points.push(points[0].slice()); + return points; + } - // 1110XXXX - if (i <= 2 && c >> 4 == 0x0E) { - this.charLength = 3; - break; - } + function polygon(arcs) { + return arcs.map(ring); + } - // 11110XXX - if (i <= 3 && c >> 3 == 0x1E) { - this.charLength = 4; - break; + function geometry(o) { + var type = o.type, coordinates; + switch (type) { + case "GeometryCollection": return {type: type, geometries: o.geometries.map(geometry)}; + case "Point": coordinates = point(o.coordinates); break; + case "MultiPoint": coordinates = o.coordinates.map(point); break; + case "LineString": coordinates = line(o.arcs); break; + case "MultiLineString": coordinates = o.arcs.map(line); break; + case "Polygon": coordinates = polygon(o.arcs); break; + case "MultiPolygon": coordinates = o.arcs.map(polygon); break; + default: return null; } + return {type: type, coordinates: coordinates}; } - this.charReceived = i; -}; -StringDecoder.prototype.end = function(buffer) { - var res = ''; - if (buffer && buffer.length) - res = this.write(buffer); + return geometry(o); +} - if (this.charReceived) { - var cr = this.charReceived; - var buf = this.charBuffer; - var enc = this.encoding; - res += buf.slice(0, cr).toString(enc); - } +// export {default as bbox} from "./src/bbox"; - return res; -}; +// export {default as mesh, meshArcs} from "./src/mesh"; +// export {default as merge, mergeArcs} from "./src/merge"; +// export {default as neighbors} from "./src/neighbors"; +// export {default as quantize} from "./src/quantize"; +// export {default as transform} from "./src/transform"; +// export {default as untransform} from "./src/untransform"; -function passThroughWrite(buffer) { - return buffer.toString(this.encoding); -} +exports.feature = feature; -function utf16DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 2; - this.charLength = this.charReceived ? 2 : 0; -} +Object.defineProperty(exports, '__esModule', { value: true }); -function base64DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 3; - this.charLength = this.charReceived ? 3 : 0; -} +}))); -},{"buffer":2}],184:[function(_dereq_,module,exports){ +},{}],186:[function(_dereq_,module,exports){ (function (global){ /** @@ -21998,808 +22323,612 @@ function config (name) { }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],185:[function(_dereq_,module,exports){ -var Stream = (function (){ - try { - return _dereq_('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify - } catch(_){} -}()); -exports = module.exports = _dereq_('./lib/_stream_readable.js'); -exports.Stream = Stream || exports; -exports.Readable = exports; -exports.Writable = _dereq_('./lib/_stream_writable.js'); -exports.Duplex = _dereq_('./lib/_stream_duplex.js'); -exports.Transform = _dereq_('./lib/_stream_transform.js'); -exports.PassThrough = _dereq_('./lib/_stream_passthrough.js'); - -},{"./lib/_stream_duplex.js":174,"./lib/_stream_passthrough.js":175,"./lib/_stream_readable.js":176,"./lib/_stream_transform.js":177,"./lib/_stream_writable.js":178}],186:[function(_dereq_,module,exports){ -'use strict'; - -// lightweight Buffer shim for pbf browser build -// based on code from github.com/feross/buffer (MIT-licensed) - -module.exports = Buffer; - -var ieee754 = _dereq_('ieee754'); - -var BufferMethods; - -function Buffer(length) { - var arr; - if (length && length.length) { - arr = length; - length = arr.length; - } - var buf = new Uint8Array(length || 0); - if (arr) buf.set(arr); - - buf.readUInt32LE = BufferMethods.readUInt32LE; - buf.writeUInt32LE = BufferMethods.writeUInt32LE; - buf.readInt32LE = BufferMethods.readInt32LE; - buf.writeInt32LE = BufferMethods.writeInt32LE; - buf.readFloatLE = BufferMethods.readFloatLE; - buf.writeFloatLE = BufferMethods.writeFloatLE; - buf.readDoubleLE = BufferMethods.readDoubleLE; - buf.writeDoubleLE = BufferMethods.writeDoubleLE; - buf.toString = BufferMethods.toString; - buf.write = BufferMethods.write; - buf.slice = BufferMethods.slice; - buf.copy = BufferMethods.copy; - - buf._isBuffer = true; - return buf; +},{}],187:[function(_dereq_,module,exports){ +arguments[4][92][0].apply(exports,arguments) +},{"dup":92}],188:[function(_dereq_,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; } +},{}],189:[function(_dereq_,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. -var lastStr, lastStrEncoded; - -BufferMethods = { - readUInt32LE: function(pos) { - return ((this[pos]) | - (this[pos + 1] << 8) | - (this[pos + 2] << 16)) + - (this[pos + 3] * 0x1000000); - }, - - writeUInt32LE: function(val, pos) { - this[pos] = val; - this[pos + 1] = (val >>> 8); - this[pos + 2] = (val >>> 16); - this[pos + 3] = (val >>> 24); - }, - - readInt32LE: function(pos) { - return ((this[pos]) | - (this[pos + 1] << 8) | - (this[pos + 2] << 16)) + - (this[pos + 3] << 24); - }, - - readFloatLE: function(pos) { return ieee754.read(this, pos, true, 23, 4); }, - readDoubleLE: function(pos) { return ieee754.read(this, pos, true, 52, 8); }, - - writeFloatLE: function(val, pos) { return ieee754.write(this, val, pos, true, 23, 4); }, - writeDoubleLE: function(val, pos) { return ieee754.write(this, val, pos, true, 52, 8); }, - - toString: function(encoding, start, end) { - var str = '', - tmp = ''; - - start = start || 0; - end = Math.min(this.length, end || this.length); - - for (var i = start; i < end; i++) { - var ch = this[i]; - if (ch <= 0x7F) { - str += decodeURIComponent(tmp) + String.fromCharCode(ch); - tmp = ''; - } else { - tmp += '%' + ch.toString(16); - } - } - - str += decodeURIComponent(tmp); - - return str; - }, - - write: function(str, pos) { - var bytes = str === lastStr ? lastStrEncoded : encodeString(str); - for (var i = 0; i < bytes.length; i++) { - this[pos + i] = bytes[i]; - } - }, - - slice: function(start, end) { - return this.subarray(start, end); - }, +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } - copy: function(buf, pos) { - pos = pos || 0; - for (var i = 0; i < this.length; i++) { - buf[pos + i] = this[i]; + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; } + default: + return x; } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; }; -BufferMethods.writeInt32LE = BufferMethods.writeUInt32LE; - -Buffer.byteLength = function(str) { - lastStr = str; - lastStrEncoded = encodeString(str); - return lastStrEncoded.length; -}; - -Buffer.isBuffer = function(buf) { - return !!(buf && buf._isBuffer); -}; - -function encodeString(str) { - var length = str.length, - bytes = []; - - for (var i = 0, c, lead; i < length; i++) { - c = str.charCodeAt(i); // code point - - if (c > 0xD7FF && c < 0xE000) { - - if (lead) { - if (c < 0xDC00) { - bytes.push(0xEF, 0xBF, 0xBD); - lead = c; - continue; - - } else { - c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; - lead = null; - } - - } else { - if (c > 0xDBFF || (i + 1 === length)) bytes.push(0xEF, 0xBF, 0xBD); - else lead = c; - continue; - } +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } - } else if (lead) { - bytes.push(0xEF, 0xBF, 0xBD); - lead = null; - } + if (process.noDeprecation === true) { + return fn; + } - if (c < 0x80) bytes.push(c); - else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80); - else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); - else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; } - return bytes; -} - -},{"ieee754":188}],187:[function(_dereq_,module,exports){ -(function (global){ -'use strict'; - -module.exports = Pbf; - -var Buffer = global.Buffer || _dereq_('./buffer'); - -function Pbf(buf) { - this.buf = !Buffer.isBuffer(buf) ? new Buffer(buf || 0) : buf; - this.pos = 0; - this.length = this.buf.length; -} - -Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum -Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 -Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields -Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 - -var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), - SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32, - POW_2_63 = Math.pow(2, 63); - -Pbf.prototype = { - - destroy: function() { - this.buf = null; - }, - - // === READING ================================================================= - - readFields: function(readField, result, end) { - end = end || this.length; - - while (this.pos < end) { - var val = this.readVarint(), - tag = val >> 3, - startPos = this.pos; - - readField(tag, result, this); - - if (this.pos === startPos) this.skip(val); - } - return result; - }, - - readMessage: function(readField, result) { - return this.readFields(readField, result, this.readVarint() + this.pos); - }, - - readFixed32: function() { - var val = this.buf.readUInt32LE(this.pos); - this.pos += 4; - return val; - }, - - readSFixed32: function() { - var val = this.buf.readInt32LE(this.pos); - this.pos += 4; - return val; - }, - - // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) - - readFixed64: function() { - var val = this.buf.readUInt32LE(this.pos) + this.buf.readUInt32LE(this.pos + 4) * SHIFT_LEFT_32; - this.pos += 8; - return val; - }, - - readSFixed64: function() { - var val = this.buf.readUInt32LE(this.pos) + this.buf.readInt32LE(this.pos + 4) * SHIFT_LEFT_32; - this.pos += 8; - return val; - }, - - readFloat: function() { - var val = this.buf.readFloatLE(this.pos); - this.pos += 4; - return val; - }, - - readDouble: function() { - var val = this.buf.readDoubleLE(this.pos); - this.pos += 8; - return val; - }, + return fn.apply(this, arguments); + } - readVarint: function() { - var buf = this.buf, - val, b, b0, b1, b2, b3; + return deprecated; +}; - b0 = buf[this.pos++]; if (b0 < 0x80) return b0; b0 = b0 & 0x7f; - b1 = buf[this.pos++]; if (b1 < 0x80) return b0 | b1 << 7; b1 = (b1 & 0x7f) << 7; - b2 = buf[this.pos++]; if (b2 < 0x80) return b0 | b1 | b2 << 14; b2 = (b2 & 0x7f) << 14; - b3 = buf[this.pos++]; if (b3 < 0x80) return b0 | b1 | b2 | b3 << 21; - val = b0 | b1 | b2 | (b3 & 0x7f) << 21; +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; - b = buf[this.pos++]; val += (b & 0x7f) * 0x10000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x800000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x40000000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x2000000000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x100000000000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x8000000000000000; if (b < 0x80) return val; - throw new Error('Expected varint not more than 10 bytes'); - }, +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; - readVarint64: function() { - var startPos = this.pos, - val = this.readVarint(); - if (val < POW_2_63) return val; +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; - var pos = this.pos - 2; - while (this.buf[pos] === 0xff) pos--; - if (pos < startPos) pos = startPos; +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; - val = 0; - for (var i = 0; i < pos - startPos + 1; i++) { - var b = ~this.buf[startPos + i] & 0x7f; - val += i < 4 ? b << i * 7 : b * Math.pow(2, i * 7); - } - return -val - 1; - }, +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; - readSVarint: function() { - var num = this.readVarint(); - return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding - }, + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} - readBoolean: function() { - return Boolean(this.readVarint()); - }, - readString: function() { - var end = this.readVarint() + this.pos, - str = this.buf.toString('utf8', this.pos, end); - this.pos = end; - return str; - }, +function stylizeNoColor(str, styleType) { + return str; +} - readBytes: function() { - var end = this.readVarint() + this.pos, - buffer = this.buf.slice(this.pos, end); - this.pos = end; - return buffer; - }, - // verbose for performance reasons; doesn't affect gzipped size +function arrayToHash(array) { + var hash = {}; - readPackedVarint: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readVarint()); - return arr; - }, - readPackedSVarint: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readSVarint()); - return arr; - }, - readPackedBoolean: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readBoolean()); - return arr; - }, - readPackedFloat: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readFloat()); - return arr; - }, - readPackedDouble: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readDouble()); - return arr; - }, - readPackedFixed32: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readFixed32()); - return arr; - }, - readPackedSFixed32: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readSFixed32()); - return arr; - }, - readPackedFixed64: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readFixed64()); - return arr; - }, - readPackedSFixed64: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readSFixed64()); - return arr; - }, + array.forEach(function(val, idx) { + hash[val] = true; + }); - skip: function(val) { - var type = val & 0x7; - if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} - else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos; - else if (type === Pbf.Fixed32) this.pos += 4; - else if (type === Pbf.Fixed64) this.pos += 8; - else throw new Error('Unimplemented type: ' + type); - }, + return hash; +} - // === WRITING ================================================================= - writeTag: function(tag, type) { - this.writeVarint((tag << 3) | type); - }, +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } - realloc: function(min) { - var length = this.length || 16; + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } - while (length < this.pos + min) length *= 2; + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); - if (length !== this.length) { - var buf = new Buffer(length); - this.buf.copy(buf); - this.buf = buf; - this.length = length; - } - }, + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } - finish: function() { - this.length = this.pos; - this.pos = 0; - return this.buf.slice(0, this.length); - }, + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } - writeFixed32: function(val) { - this.realloc(4); - this.buf.writeUInt32LE(val, this.pos); - this.pos += 4; - }, + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } - writeSFixed32: function(val) { - this.realloc(4); - this.buf.writeInt32LE(val, this.pos); - this.pos += 4; - }, + var base = '', array = false, braces = ['{', '}']; - writeFixed64: function(val) { - this.realloc(8); - this.buf.writeInt32LE(val & -1, this.pos); - this.buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); - this.pos += 8; - }, + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } - writeSFixed64: function(val) { - this.realloc(8); - this.buf.writeInt32LE(val & -1, this.pos); - this.buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); - this.pos += 8; - }, + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } - writeVarint: function(val) { - val = +val; + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } - if (val <= 0x7f) { - this.realloc(1); - this.buf[this.pos++] = val; + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } - } else if (val <= 0x3fff) { - this.realloc(2); - this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 7) & 0x7f); + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } - } else if (val <= 0x1fffff) { - this.realloc(3); - this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 14) & 0x7f); + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } - } else if (val <= 0xfffffff) { - this.realloc(4); - this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 14) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 21) & 0x7f); + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } - } else { - var pos = this.pos; - while (val >= 0x80) { - this.realloc(1); - this.buf[this.pos++] = (val & 0xff) | 0x80; - val /= 0x80; - } - this.realloc(1); - this.buf[this.pos++] = val | 0; - if (this.pos - pos > 10) throw new Error('Given varint doesn\'t fit into 10 bytes'); - } - }, + ctx.seen.push(value); - writeSVarint: function(val) { - this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); - }, + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } - writeBoolean: function(val) { - this.writeVarint(Boolean(val)); - }, + ctx.seen.pop(); - writeString: function(str) { - str = String(str); - var bytes = Buffer.byteLength(str); - this.writeVarint(bytes); - this.realloc(bytes); - this.buf.write(str, this.pos); - this.pos += bytes; - }, + return reduceToSingleString(output, base, braces); +} - writeFloat: function(val) { - this.realloc(4); - this.buf.writeFloatLE(val, this.pos); - this.pos += 4; - }, - writeDouble: function(val) { - this.realloc(8); - this.buf.writeDoubleLE(val, this.pos); - this.pos += 8; - }, +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} - writeBytes: function(buffer) { - var len = buffer.length; - this.writeVarint(len); - this.realloc(len); - for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i]; - }, - writeMessage: function(tag, fn, obj) { - this.writeTag(tag, Pbf.Bytes); +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} - this.pos++; // reserve 1 byte for short message length - // write the message directly to the buffer and see how much was written - var startPos = this.pos; - fn(obj, this); - var len = this.pos - startPos; +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} - var varintLen = - len <= 0x7f ? 1 : - len <= 0x3fff ? 2 : - len <= 0x1fffff ? 3 : - len <= 0xfffffff ? 4 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); - // if 1 byte isn't enough for encoding message length, shift the data to the right - if (varintLen > 1) { - this.realloc(varintLen - 1); - for (var i = this.pos - 1; i >= startPos; i--) this.buf[i + varintLen - 1] = this.buf[i]; +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); } - - // finally, write the message length in the reserved place and restore the position - this.pos = startPos - 1; - this.writeVarint(len); - this.pos += len; - }, - - writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); }, - writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); }, - writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); }, - writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); }, - writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); }, - writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); }, - writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); }, - writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); }, - writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); }, - - writeBytesField: function(tag, buffer) { - this.writeTag(tag, Pbf.Bytes); - this.writeBytes(buffer); - }, - writeFixed32Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed32); - this.writeFixed32(val); - }, - writeSFixed32Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed32); - this.writeSFixed32(val); - }, - writeFixed64Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed64); - this.writeFixed64(val); - }, - writeSFixed64Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed64); - this.writeSFixed64(val); - }, - writeVarintField: function(tag, val) { - this.writeTag(tag, Pbf.Varint); - this.writeVarint(val); - }, - writeSVarintField: function(tag, val) { - this.writeTag(tag, Pbf.Varint); - this.writeSVarint(val); - }, - writeStringField: function(tag, str) { - this.writeTag(tag, Pbf.Bytes); - this.writeString(str); - }, - writeFloatField: function(tag, val) { - this.writeTag(tag, Pbf.Fixed32); - this.writeFloat(val); - }, - writeDoubleField: function(tag, val) { - this.writeTag(tag, Pbf.Fixed64); - this.writeDouble(val); - }, - writeBooleanField: function(tag, val) { - this.writeVarintField(tag, Boolean(val)); + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); } -}; - -function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); } -function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); } -function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); } -function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); } -function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); } -function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); } -function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); } -function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); } -function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); } + } -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + return name + ': ' + str; +} -},{"./buffer":186}],188:[function(_dereq_,module,exports){ -arguments[4][4][0].apply(exports,arguments) -},{"dup":4}],189:[function(_dereq_,module,exports){ -/*! - * strip-comments - * - * Copyright (c) 2014 Jon Schlinkert, contributors. - * Licensed under the MIT license. - */ -'use stric'; +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); -var reBlock = '\\/\\*'; -var reBlockIgnore = '\\/\\*(?!\\*?\\!)'; -var reBlockEnd = '(.|[\\r\\n]|\\n)*?\\*\\/\\n?\\n?'; -var reLine = /(^|[^\S\n])(?:\/\/)([\s\S]+?)$/gm; -var reLineIgnore = /(^|[^\S\n])(?:\/\/[^!])([\s\S]+?)$/gm; + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} -/** - * Strip all comments - * - * {%= docs("strip") %} - * - * @param {String} `str` file contents or string to strip. - * @param {Object} `opts` options are passed to `.block`, and `.line` - * @return {String} String without comments. - * @api public - */ -var strip = module.exports = function(str, opts) { - return str ? strip.block(strip.line(str, opts), opts) : ''; -}; +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; -/** - * Strip only block comments, optionally leaving protected comments - * (e.g. `/*!`) intact. - * - * {%= docs("block") %} - * - * @param {String} `str` file content or string to strip to - * @param {Object} `opts` if `safe:true`, strip only comments that do not start with `/*!` or `/**!` - * @return {String} String without block comments. - * @api public - */ +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; -strip.block = function(str, opts) { - opts = opts || {}; - var re = new RegExp(reBlock + reBlockEnd, 'gm'); - if(opts.safe) { - re = new RegExp(reBlockIgnore + reBlockEnd, 'gm'); - } - return str ? str.replace(re, '') : ''; -}; +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; -/** - * Strip only line comments - * - * {%= docs("line") %} - * - * @param {String} `str` file content or string to strip to - * @param {Object} `opts` if `safe:true`, strip all that not starts with `//!` - * @return {String} String without line comments. - * @api public - */ +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; -strip.line = function(str, opts) { - opts = opts || {}; - var re = reLine; - if(opts.safe) { - re = reLineIgnore; - } - return str ? str.replace(re, '') : ''; -}; +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; -},{}],190:[function(_dereq_,module,exports){ -// https://github.com/topojson/topojson-client Version 2.1.0. Copyright 2016 Mike Bostock. -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (factory((global.topojson = global.topojson || {}))); -}(this, (function (exports) { 'use strict'; +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; -var reverse = function(array, n) { - var t, j = array.length, i = j - n; - while (i < --j) t = array[i], array[i++] = array[j], array[j] = t; -}; +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; -var identity = function(x) { - return x; -}; +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; -var transform = function(topology) { - if ((transform = topology.transform) == null) return identity; - var transform, - x0, - y0, - kx = transform.scale[0], - ky = transform.scale[1], - dx = transform.translate[0], - dy = transform.translate[1]; - return function(point, i) { - if (!i) x0 = y0 = 0; - point[0] = (x0 += point[0]) * kx + dx; - point[1] = (y0 += point[1]) * ky + dy; - return point; - }; -}; +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; -var feature = function(topology, o) { - return o.type === "GeometryCollection" - ? {type: "FeatureCollection", features: o.geometries.map(function(o) { return feature$1(topology, o); })} - : feature$1(topology, o); -}; +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; -function feature$1(topology, o) { - var id = o.id, - bbox = o.bbox, - properties = o.properties == null ? {} : o.properties, - geometry = object(topology, o); - return id == null && bbox == null ? {type: "Feature", properties: properties, geometry: geometry} - : bbox == null ? {type: "Feature", id: id, properties: properties, geometry: geometry} - : {type: "Feature", id: id, bbox: bbox, properties: properties, geometry: geometry}; +function isFunction(arg) { + return typeof arg === 'function'; } +exports.isFunction = isFunction; -function object(topology, o) { - var transformPoint = transform(topology), - arcs = topology.arcs; +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; - function arc(i, points) { - if (points.length) points.pop(); - for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length; k < n; ++k) { - points.push(transformPoint(a[k].slice(), k)); - } - if (i < 0) reverse(points, n); - } +exports.isBuffer = _dereq_('./support/isBuffer'); - function point(p) { - return transformPoint(p.slice()); - } +function objectToString(o) { + return Object.prototype.toString.call(o); +} - function line(arcs) { - var points = []; - for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points); - if (points.length < 2) points.push(points[0].slice()); - return points; - } - function ring(arcs) { - var points = line(arcs); - while (points.length < 4) points.push(points[0].slice()); - return points; - } +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} - function polygon(arcs) { - return arcs.map(ring); - } - function geometry(o) { - var type = o.type, coordinates; - switch (type) { - case "GeometryCollection": return {type: type, geometries: o.geometries.map(geometry)}; - case "Point": coordinates = point(o.coordinates); break; - case "MultiPoint": coordinates = o.coordinates.map(point); break; - case "LineString": coordinates = line(o.arcs); break; - case "MultiLineString": coordinates = o.arcs.map(line); break; - case "Polygon": coordinates = polygon(o.arcs); break; - case "MultiPolygon": coordinates = o.arcs.map(polygon); break; - default: return null; - } - return {type: type, coordinates: coordinates}; - } +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; - return geometry(o); +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); } -// export {default as bbox} from "./src/bbox"; -// export {default as mesh, meshArcs} from "./src/mesh"; -// export {default as merge, mergeArcs} from "./src/merge"; -// export {default as neighbors} from "./src/neighbors"; -// export {default as quantize} from "./src/quantize"; -// export {default as transform} from "./src/transform"; -// export {default as untransform} from "./src/untransform"; +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; -exports.feature = feature; -Object.defineProperty(exports, '__esModule', { value: true }); +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = _dereq_('inherits'); -}))); +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +}).call(this,_dereq_('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],191:[function(_dereq_,module,exports){ +},{"./support/isBuffer":188,"_process":176,"inherits":187}],190:[function(_dereq_,module,exports){ module.exports.VectorTile = _dereq_('./lib/vectortile.js'); module.exports.VectorTileFeature = _dereq_('./lib/vectortilefeature.js'); module.exports.VectorTileLayer = _dereq_('./lib/vectortilelayer.js'); -},{"./lib/vectortile.js":192,"./lib/vectortilefeature.js":193,"./lib/vectortilelayer.js":194}],192:[function(_dereq_,module,exports){ +},{"./lib/vectortile.js":191,"./lib/vectortilefeature.js":192,"./lib/vectortilelayer.js":193}],191:[function(_dereq_,module,exports){ 'use strict'; var VectorTileLayer = _dereq_('./vectortilelayer'); @@ -22818,7 +22947,7 @@ function readTile(tag, layers, pbf) { } -},{"./vectortilelayer":194}],193:[function(_dereq_,module,exports){ +},{"./vectortilelayer":193}],192:[function(_dereq_,module,exports){ 'use strict'; var Point = _dereq_('point-geometry'); @@ -22982,7 +23111,7 @@ VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { }; }; -},{"point-geometry":195}],194:[function(_dereq_,module,exports){ +},{"point-geometry":174}],193:[function(_dereq_,module,exports){ 'use strict'; var VectorTileFeature = _dereq_('./vectortilefeature.js'); @@ -23045,140 +23174,7 @@ VectorTileLayer.prototype.feature = function(i) { return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values); }; -},{"./vectortilefeature.js":193}],195:[function(_dereq_,module,exports){ -'use strict'; - -module.exports = Point; - -function Point(x, y) { - this.x = x; - this.y = y; -} - -Point.prototype = { - clone: function() { return new Point(this.x, this.y); }, - - add: function(p) { return this.clone()._add(p); }, - sub: function(p) { return this.clone()._sub(p); }, - mult: function(k) { return this.clone()._mult(k); }, - div: function(k) { return this.clone()._div(k); }, - rotate: function(a) { return this.clone()._rotate(a); }, - matMult: function(m) { return this.clone()._matMult(m); }, - unit: function() { return this.clone()._unit(); }, - perp: function() { return this.clone()._perp(); }, - round: function() { return this.clone()._round(); }, - - mag: function() { - return Math.sqrt(this.x * this.x + this.y * this.y); - }, - - equals: function(p) { - return this.x === p.x && - this.y === p.y; - }, - - dist: function(p) { - return Math.sqrt(this.distSqr(p)); - }, - - distSqr: function(p) { - var dx = p.x - this.x, - dy = p.y - this.y; - return dx * dx + dy * dy; - }, - - angle: function() { - return Math.atan2(this.y, this.x); - }, - - angleTo: function(b) { - return Math.atan2(this.y - b.y, this.x - b.x); - }, - - angleWith: function(b) { - return this.angleWithSep(b.x, b.y); - }, - - // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ. - angleWithSep: function(x, y) { - return Math.atan2( - this.x * y - this.y * x, - this.x * x + this.y * y); - }, - - _matMult: function(m) { - var x = m[0] * this.x + m[1] * this.y, - y = m[2] * this.x + m[3] * this.y; - this.x = x; - this.y = y; - return this; - }, - - _add: function(p) { - this.x += p.x; - this.y += p.y; - return this; - }, - - _sub: function(p) { - this.x -= p.x; - this.y -= p.y; - return this; - }, - - _mult: function(k) { - this.x *= k; - this.y *= k; - return this; - }, - - _div: function(k) { - this.x /= k; - this.y /= k; - return this; - }, - - _unit: function() { - this._div(this.mag()); - return this; - }, - - _perp: function() { - var y = this.y; - this.y = this.x; - this.x = -y; - return this; - }, - - _rotate: function(angle) { - var cos = Math.cos(angle), - sin = Math.sin(angle), - x = cos * this.x - sin * this.y, - y = sin * this.x + cos * this.y; - this.x = x; - this.y = y; - return this; - }, - - _round: function() { - this.x = Math.round(this.x); - this.y = Math.round(this.y); - return this; - } -}; - -// constructs Point from an array if necessary -Point.convert = function (a) { - if (a instanceof Point) { - return a; - } - if (Array.isArray(a)) { - return new Point(a[0], a[1]); - } - return a; -}; - -},{}],196:[function(_dereq_,module,exports){ +},{"./vectortilefeature.js":192}],194:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -23220,7 +23216,7 @@ function isCoordOutsideTile(coord, tolerance) { return coord[0] <= tile_min.x + tolerance || coord[0] >= tile_max.x - tolerance || coord[1] >= tile_min.y - tolerance || coord[1] <= tile_max.y + tolerance; } -},{"../geo":201}],197:[function(_dereq_,module,exports){ +},{"../geo":199}],195:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -23308,7 +23304,7 @@ function buildQuadsForPoints(points, vertex_data, vertex_template, _ref, _ref2) } } -},{"./common":196}],198:[function(_dereq_,module,exports){ +},{"./common":194}],196:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -23509,7 +23505,7 @@ function triangulatePolygon(data) { return (0, _earcut2.default)(data.vertices, data.holes, data.dimensions); } -},{"../geo":201,"../vector":268,"./common":196,"earcut":77}],199:[function(_dereq_,module,exports){ +},{"../geo":199,"../vector":266,"./common":194,"earcut":72}],197:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -24099,13 +24095,18 @@ function addCap(coord, v, normal, type, isBeginning, context) { } } +// For IE Math.log2 support +var log2 = Math.log2 || function (x) { + return Math.log(x) * Math.LOG2E; +}; + // Calculate number of triangles for a fan given an angle and line width function trianglesPerArc(angle, width) { if (angle < 0) { angle = -angle; } - var numTriangles = width > 2 * DEFAULT.MIN_FAN_WIDTH ? Math.log2(width / DEFAULT.MIN_FAN_WIDTH) : 1; + var numTriangles = width > 2 * DEFAULT.MIN_FAN_WIDTH ? log2(width / DEFAULT.MIN_FAN_WIDTH) : 1; return Math.ceil(angle / Math.PI * numTriangles); } @@ -24123,7 +24124,7 @@ function permuteLine(line, startIndex) { return newLine; } -},{"../geo":201,"../vector":268,"./common":196}],200:[function(_dereq_,module,exports){ +},{"../geo":199,"../vector":266,"./common":194}],198:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -24490,7 +24491,7 @@ var FlatCamera = function (_IsometricCamera) { return FlatCamera; }(IsometricCamera); -},{"./gl/shader_program":207,"./utils/gl-matrix":256,"./utils/utils":265}],201:[function(_dereq_,module,exports){ +},{"./gl/shader_program":205,"./utils/gl-matrix":254,"./utils/utils":263}],199:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -24771,7 +24772,7 @@ Geo.ringWinding = function (ring) { // return undefined on zero area polygon }; -},{}],202:[function(_dereq_,module,exports){ +},{}],200:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -24792,7 +24793,7 @@ gl.INT = 0x1404; gl.UNSIGNED_INT = 0x1405; gl.FLOAT = 0x1406; -},{}],203:[function(_dereq_,module,exports){ +},{}],201:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -24803,9 +24804,11 @@ Object.defineProperty(exports, "__esModule", { var Context; exports.default = Context = {}; + +var context_id = 0; + // Setup a WebGL context // If no canvas element is provided, one is created and added to the document body - Context.getContext = function getContext(canvas, options) { var fullscreen = false; if (canvas == null) { @@ -24822,6 +24825,7 @@ Context.getContext = function getContext(canvas, options) { if (!gl) { throw new Error("Couldn't create WebGL context."); } + gl._tangram_id = context_id++; if (!fullscreen) { Context.resize(gl, parseFloat(canvas.style.width), parseFloat(canvas.style.height), options.device_pixel_ratio); @@ -24845,7 +24849,7 @@ Context.resize = function (gl, width, height, device_pixel_ratio) { gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); }; -},{}],204:[function(_dereq_,module,exports){ +},{}],202:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -24875,7 +24879,7 @@ function getExtension(gl, name) { return exts[name]; } -},{}],205:[function(_dereq_,module,exports){ +},{}],203:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -25153,7 +25157,7 @@ GLSL.expandVec4 = function (v) { } }; -},{}],206:[function(_dereq_,module,exports){ +},{}],204:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -25256,7 +25260,7 @@ var RenderStateManager = function RenderStateManager(gl) { exports.default = RenderStateManager; -},{}],207:[function(_dereq_,module,exports){ +},{}],205:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -26022,7 +26026,7 @@ ShaderProgram.replaceBlock = function (key) { // update a program if one is passed in. Create one if not. Alert and don't update anything if the shaders don't compile. ShaderProgram.updateProgram = function (gl, program, vertex_shader_source, fragment_shader_source) { // Program with this exact vertex and fragment shader sources already cached? - var key = vertex_shader_source + '::' + fragment_shader_source; + var key = gl._tangram_id + '::' + vertex_shader_source + '::' + fragment_shader_source; if (ShaderProgram.programs_by_source[key]) { (0, _log2.default)('trace', 'Reusing identical source GL program object'); return ShaderProgram.programs_by_source[key]; @@ -26072,7 +26076,7 @@ ShaderProgram.updateProgram = function (gl, program, vertex_shader_source, fragm // Compile a vertex or fragment shader from provided source ShaderProgram.createShader = function (gl, source, stype) { // Program with identical vertex and fragment shader sources already cached? - var key = source; + var key = gl._tangram_id + '::' + source; if (ShaderProgram.shaders_by_source[key]) { (0, _log2.default)('trace', 'Reusing identical source GL shader object'); return ShaderProgram.shaders_by_source[key]; @@ -26094,7 +26098,7 @@ ShaderProgram.createShader = function (gl, source, stype) { return shader; }; -},{"../utils/log":257,"./extensions":204,"./glsl":205,"./texture":208,"gl-shader-errors":94,"strip-comments":189}],208:[function(_dereq_,module,exports){ +},{"../utils/log":255,"./extensions":202,"./glsl":203,"./texture":206,"gl-shader-errors":90,"strip-comments":184}],206:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -26636,7 +26640,7 @@ Texture.activeUnit = null; _worker_broker2.default.addTarget('Texture', Texture); (0, _subscribe2.default)(Texture); -},{"../utils/log":257,"../utils/subscribe":262,"../utils/utils":265,"../utils/worker_broker":267}],209:[function(_dereq_,module,exports){ +},{"../utils/log":255,"../utils/subscribe":260,"../utils/utils":263,"../utils/worker_broker":265}],207:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -26735,7 +26739,7 @@ exports.default = { } }; -},{"../utils/log":257,"./extensions":204}],210:[function(_dereq_,module,exports){ +},{"../utils/log":255,"./extensions":202}],208:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -26904,7 +26908,7 @@ var VBOMesh = function () { exports.default = VBOMesh; -},{"../utils/log":257,"./shader_program":207,"./vao":209}],211:[function(_dereq_,module,exports){ +},{"../utils/log":255,"./shader_program":205,"./vao":207}],209:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -27062,7 +27066,7 @@ exports.default = VertexData; VertexData.array_pool = []; // pool of currently available (previously used) buffers (uint8) -},{"../utils/log":257,"./constants":202,"./vertex_elements":212}],212:[function(_dereq_,module,exports){ +},{"../utils/log":255,"./constants":200,"./vertex_elements":210}],210:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -27139,7 +27143,7 @@ function createBuffer(array, overflown) { _worker_broker2.default.addTarget('VertexElements', VertexElements); -},{"../utils/worker_broker":267}],213:[function(_dereq_,module,exports){ +},{"../utils/worker_broker":265}],211:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -27281,7 +27285,7 @@ var VertexLayout = function () { exports.default = VertexLayout; VertexLayout.enabled_attribs = {}; -},{"./constants":202,"./vertex_data":211}],214:[function(_dereq_,module,exports){ +},{"./constants":200,"./vertex_data":209}],212:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -27457,7 +27461,7 @@ exports.default = Collision = { } }; -},{"../utils/log":257,"./repeat_group":221}],215:[function(_dereq_,module,exports){ +},{"../utils/log":255,"./repeat_group":219}],213:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -27491,7 +27495,7 @@ function boxIntersectsList(a, boxes, callback) { } } -},{}],216:[function(_dereq_,module,exports){ +},{}],214:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -27634,7 +27638,7 @@ exports.default = Label; Label.epsilon = 0.9999; // tolerance around collision boxes, prevent perfectly adjacent objects from colliding -},{"../utils/obb":260,"../utils/utils":265,"./intersect":215,"./point_anchor":219}],217:[function(_dereq_,module,exports){ +},{"../utils/obb":258,"../utils/utils":263,"./intersect":213,"./point_anchor":217}],215:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -28183,7 +28187,7 @@ function calcFitness(line_length, label_length) { return 1 - line_length / label_length; } -},{"../utils/obb":260,"../vector":268,"./label":216}],218:[function(_dereq_,module,exports){ +},{"../utils/obb":258,"../vector":266,"./label":214}],216:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -28232,12 +28236,9 @@ var LabelPoint = function (_Label) { _this.parent = _this.layout.parent; _this.update(); - if (_this.layout.anchor) { - _this.start_anchor_index = 1; - } - - var hasNext = _this.getNextFit(); - _this.throw_away = !hasNext; + _this.start_anchor_index = 1; + _this.degenerate = !_this.size[0] && !_this.size[1] && !_this.layout.buffer[0] && !_this.layout.buffer[1]; + _this.throw_away = !_this.getNextFit(); return _this; } @@ -28359,6 +28360,10 @@ var LabelPoint = function (_Label) { value: function discard(bboxes) { var exclude = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; + if (this.degenerate) { + return false; + } + if (_get(LabelPoint.prototype.__proto__ || Object.getPrototypeOf(LabelPoint.prototype), 'discard', this).call(this, bboxes, exclude)) { // If more than one anchor specified, try them in order if (Array.isArray(this.layout.anchor)) { @@ -28396,7 +28401,7 @@ LabelPoint.PLACEMENT = { CENTROID: 3 // place labels at center of polygons }; -},{"../geo":201,"../styles/style_parser":245,"../utils/obb":260,"./label":216,"./point_anchor":219}],219:[function(_dereq_,module,exports){ +},{"../geo":199,"../styles/style_parser":243,"../utils/obb":258,"./label":214,"./point_anchor":217}],217:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -28479,7 +28484,7 @@ exports.default = PointAnchor = { }; -},{}],220:[function(_dereq_,module,exports){ +},{}],218:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -28640,7 +28645,7 @@ function interpolateSegment(p, q, distance) { return [ratio * p[0] + (1 - ratio) * q[0], ratio * p[1] + (1 - ratio) * q[1]]; } -},{"../builders/common":196,"./label_point":218}],221:[function(_dereq_,module,exports){ +},{"../builders/common":194,"./label_point":216}],219:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -28765,7 +28770,7 @@ RepeatGroup.groups = {}; // will be allowed per group, e.g. set to tile size for one-label-per-tile RepeatGroup.max_repeat_dist = _geo2.default.tile_scale; -},{"../geo":201}],222:[function(_dereq_,module,exports){ +},{"../geo":199}],220:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -29012,13 +29017,20 @@ function extendLeaflet(options) { var enabled = map.scrollWheelZoom.enabled(); map.scrollWheelZoom.disable(); - map.scrollWheelZoom._onWheelScroll = function (e) { - var delta = L.DomEvent.getWheelDelta(e); - this._delta += delta; - this._lastMousePos = this._map.mouseEventToContainerPoint(e); - this._performZoom(); - L.DomEvent.stop(e); - }; + // Chrome and Safari have smoother scroll-zoom without actively throttling the mouse wheel, + // while FF and Edge/IE do better with throttling. + // TODO: may be related to syncing differences with requestAnimationFrame loop, investigate further + if (L.Browser.chrome || L.Browser.safari) { + map.scrollWheelZoom._onWheelScroll = function (e) { + var delta = L.DomEvent.getWheelDelta(e); + this._delta += delta; + this._lastMousePos = this._map.mouseEventToContainerPoint(e); + this._performZoom(); + L.DomEvent.stop(e); + }; + } else { + map.options.wheelDebounceTime = 20; // better default for FF and Edge/IE + } map.scrollWheelZoom._performZoom = function () { var map = this._map, @@ -29159,6 +29171,14 @@ function extendLeaflet(options) { if (!this._map || this._updating_tangram) { return; } + + // View changed? + var map_center = this._map.getCenter(); + var view_center = this.scene.view.center; + if (map_center.lng === view_center.lng && map_center.lat === view_center.lat && this._map.getZoom() === this.scene.view.zoom) { + return; + } + this._updating_tangram = true; this._map.setView([this.scene.view.center.lat, this.scene.view.center.lng], this.scene.view.zoom, { animate: false }); this.reverseTransform(); @@ -29253,7 +29273,7 @@ function extendLeaflet(options) { } } -},{"./geo":201,"./scene":226,"./utils/thread":263}],223:[function(_dereq_,module,exports){ +},{"./geo":199,"./scene":224,"./utils/thread":261}],221:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -29686,7 +29706,7 @@ var SpotLight = function (_PointLight) { Light.types['spotlight'] = SpotLight; -},{"./geo":201,"./gl/glsl":205,"./gl/shader_program":207,"./styles/style_parser":245,"./vector":268}],224:[function(_dereq_,module,exports){ +},{"./geo":199,"./gl/glsl":203,"./gl/shader_program":205,"./styles/style_parser":243,"./vector":266}],222:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -29847,7 +29867,7 @@ exports.default = Material; Material.block = 'material'; -},{"./gl/glsl":205,"./styles/style_parser":245}],225:[function(_dereq_,module,exports){ +},{"./gl/glsl":203,"./styles/style_parser":243}],223:[function(_dereq_,module,exports){ 'use strict'; _dereq_('./utils/polyfills'); @@ -30009,7 +30029,7 @@ module.exports = { version: _version2.default }; -},{"./geo":201,"./gl/glsl":205,"./gl/shader_program":207,"./gl/texture":208,"./gl/vertex_data":211,"./labels/collision":214,"./leaflet_layer":222,"./light":223,"./material":224,"./scene":226,"./scene_worker":229,"./selection":230,"./sources/data_source":231,"./sources/geojson":232,"./sources/mvt":233,"./sources/raster":234,"./sources/topojson":235,"./styles/layer":237,"./styles/style_manager":244,"./styles/style_parser":245,"./styles/text/canvas_text":246,"./utils/debug_settings":254,"./utils/log":257,"./utils/polyfills":261,"./utils/thread":263,"./utils/utils":265,"./utils/version":266,"./utils/worker_broker":267,"./vector":268,"js-yaml":95,"jszip":131}],226:[function(_dereq_,module,exports){ +},{"./geo":199,"./gl/glsl":203,"./gl/shader_program":205,"./gl/texture":206,"./gl/vertex_data":209,"./labels/collision":212,"./leaflet_layer":220,"./light":221,"./material":222,"./scene":224,"./scene_worker":227,"./selection":228,"./sources/data_source":229,"./sources/geojson":230,"./sources/mvt":231,"./sources/raster":232,"./sources/topojson":233,"./styles/layer":235,"./styles/style_manager":242,"./styles/style_parser":243,"./styles/text/canvas_text":244,"./utils/debug_settings":252,"./utils/log":255,"./utils/polyfills":259,"./utils/thread":261,"./utils/utils":263,"./utils/version":264,"./utils/worker_broker":265,"./vector":266,"js-yaml":95,"jszip":131}],224:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -30932,7 +30952,8 @@ var Scene = function () { } // Save queued request - _this8.building.queued = { resolve: resolve, reject: reject }; + var options = { sync: sync, sources: sources, serialize_funcs: serialize_funcs, profile: profile, fade_in: fade_in }; + _this8.building.queued = { resolve: resolve, reject: reject, options: options }; (0, _log2.default)('trace', 'Scene.rebuild(): queuing request'); return; } @@ -30986,7 +31007,7 @@ var Scene = function () { this.building = null; if (queued) { (0, _log2.default)('debug', 'Scene: starting queued rebuild() request'); - this.rebuild().then(queued.resolve, queued.reject); + this.rebuild(queued.options).then(queued.resolve, queued.reject); } } } @@ -31505,7 +31526,7 @@ exports.default = Scene; Scene.id = 0; // unique id for a scene instance Scene.generation = 0; // id that is incremented each time a scene config is re-parsed -},{"./gl/context":203,"./gl/render_state":206,"./gl/shader_program":207,"./gl/texture":208,"./gl/vao":209,"./light":223,"./scene_loader":228,"./selection":230,"./sources/data_source":231,"./styles/style":243,"./styles/style_manager":244,"./styles/style_parser":245,"./styles/text/font_manager":247,"./tile_manager":252,"./utils/log":257,"./utils/media_capture":258,"./utils/subscribe":262,"./utils/urls":264,"./utils/utils":265,"./utils/worker_broker":267,"./view":269}],227:[function(_dereq_,module,exports){ +},{"./gl/context":201,"./gl/render_state":204,"./gl/shader_program":205,"./gl/texture":206,"./gl/vao":207,"./light":221,"./scene_loader":226,"./selection":228,"./sources/data_source":229,"./styles/style":241,"./styles/style_manager":242,"./styles/style_parser":243,"./styles/text/font_manager":245,"./tile_manager":250,"./utils/log":255,"./utils/media_capture":256,"./utils/subscribe":260,"./utils/urls":262,"./utils/utils":263,"./utils/worker_broker":265,"./view":267}],225:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -31826,7 +31847,7 @@ function loadResource(source) { }); } -},{"./utils/urls":264,"./utils/utils":265,"js-yaml":95,"jszip":131}],228:[function(_dereq_,module,exports){ +},{"./utils/urls":262,"./utils/utils":263,"js-yaml":95,"jszip":131}],226:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -32245,7 +32266,7 @@ function flattenProperties(obj) { (0, _subscribe2.default)(SceneLoader); -},{"./gl/glsl":205,"./scene_bundle":227,"./utils/log":257,"./utils/merge":259,"./utils/subscribe":262,"./utils/urls":264}],229:[function(_dereq_,module,exports){ +},{"./gl/glsl":203,"./scene_bundle":225,"./utils/log":255,"./utils/merge":257,"./utils/subscribe":260,"./utils/urls":262}],227:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -32572,7 +32593,7 @@ if (_thread2.default.is_worker) { _worker_broker2.default.addTarget('self', self); } -},{"./gl/texture":208,"./selection":230,"./sources/data_source":231,"./styles/layer":237,"./styles/style_manager":244,"./styles/style_parser":245,"./tile":251,"./utils/log":257,"./utils/merge":259,"./utils/thread":263,"./utils/utils":265,"./utils/worker_broker":267}],230:[function(_dereq_,module,exports){ +},{"./gl/texture":206,"./selection":228,"./sources/data_source":229,"./styles/layer":235,"./styles/style_manager":242,"./styles/style_parser":243,"./tile":249,"./utils/log":255,"./utils/merge":257,"./utils/thread":261,"./utils/utils":263,"./utils/worker_broker":265}],228:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -32612,7 +32633,7 @@ var FeatureSelection = function () { // Selection state tracking this.requests = {}; // pending selection requests this.feature = null; // currently selected feature - this.read_delay = 5; // delay time from selection render to framebuffer sample, to avoid CPU/GPU sync lock + this.read_delay = 0; // delay time from selection render to framebuffer sample, to avoid CPU/GPU sync lock this.read_delay_timer = null; // current timer (setTimeout) for delayed selection reads this.pixel = new Uint8Array(4); @@ -32892,7 +32913,7 @@ FeatureSelection.map_entry = 0; FeatureSelection.map_prefix = 0; // set by worker to worker id # FeatureSelection.defaultColor = [0, 0, 0, 1]; -},{"./gl/texture":208,"./utils/log":257,"./utils/worker_broker":267}],231:[function(_dereq_,module,exports){ +},{"./gl/texture":206,"./utils/log":255,"./utils/worker_broker":265}],229:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -33351,7 +33372,7 @@ var NetworkTileSource = exports.NetworkTileSource = function (_NetworkSource) { return NetworkTileSource; }(NetworkSource); -},{"../geo":201,"../utils/errors":255,"../utils/urls":264,"../utils/utils":265}],232:[function(_dereq_,module,exports){ +},{"../geo":199,"../utils/errors":253,"../utils/urls":262,"../utils/utils":263}],230:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -33691,7 +33712,7 @@ function getCentroidFeatureForPolygon(coordinates, properties, newProperties) { }; } -},{"../geo":201,"../utils/log":257,"./data_source":231,"./mvt":233,"geojson-vt":81}],233:[function(_dereq_,module,exports){ +},{"../geo":199,"../utils/log":255,"./data_source":229,"./mvt":231,"geojson-vt":77}],231:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -33860,7 +33881,7 @@ function decodeMultiPolygon(geom) { _data_source2.default.register(MVTSource, 'MVT'); -},{"../geo":201,"./data_source":231,"pbf":187,"vector-tile":191}],234:[function(_dereq_,module,exports){ +},{"../geo":199,"./data_source":229,"pbf":173,"vector-tile":190}],232:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -33958,7 +33979,7 @@ var RasterTileSource = exports.RasterTileSource = function (_NetworkTileSource) _data_source2.default.register(RasterTileSource, 'Raster'); -},{"../geo":201,"../tile":251,"./data_source":231}],235:[function(_dereq_,module,exports){ +},{"../geo":199,"../tile":249,"./data_source":229}],233:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -34086,7 +34107,7 @@ var TopoJSONTileSource = exports.TopoJSONTileSource = function (_GeoJSONTileSour _data_source2.default.register(TopoJSONTileSource, 'TopoJSON'); // prefered shorter name -},{"./data_source":231,"./geojson":232,"topojson-client":190}],236:[function(_dereq_,module,exports){ +},{"./data_source":229,"./geojson":230,"topojson-client":185}],234:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -34243,7 +34264,7 @@ function buildFilter(filter, options) { return new Function('context', 'return ' + filterToString(parseFilter(filter, options)) + ';'); } -},{}],237:[function(_dereq_,module,exports){ +},{}],235:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -34811,7 +34832,7 @@ function matchFeature(context, layers, collected_layers, collected_layers_ids) { return matched; } -},{"../utils/log":257,"../utils/merge":259,"../utils/utils":265,"./filter":236,"./style_parser":245}],238:[function(_dereq_,module,exports){ +},{"../utils/log":255,"../utils/merge":257,"../utils/utils":263,"./filter":234,"./style_parser":243}],236:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -34862,7 +34883,7 @@ function renderDashArray(pattern) { return { pixels: pixels, length: length }; } -},{}],239:[function(_dereq_,module,exports){ +},{}],237:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -35215,7 +35236,7 @@ Object.assign(Lines, { } }); -},{"../../builders/polylines":199,"../../geo":201,"../../gl/constants":202,"../../gl/texture":208,"../../gl/vertex_layout":213,"../polygons/polygons":241,"../style":243,"../style_parser":245,"./dasharray":238}],240:[function(_dereq_,module,exports){ +},{"../../builders/polylines":197,"../../geo":199,"../../gl/constants":200,"../../gl/texture":206,"../../gl/vertex_layout":211,"../polygons/polygons":239,"../style":241,"../style_parser":243,"./dasharray":236}],238:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -35382,50 +35403,20 @@ Object.assign(Points, { // require color or texture if (!style.color && !this.texture) { - return null; + return; } - var sprite = style.sprite = _style_parser.StyleParser.evalProperty(draw.sprite, context); - style.sprite_default = draw.sprite_default; // optional fallback if 'sprite' not found - - // if point has texture and sprites, require a valid sprite to draw - if (this.texture && _texture2.default.textures[this.texture] && _texture2.default.textures[this.texture].sprites) { - if (!sprite && !style.sprite_default) { + // optional sprite + var sprite_info = void 0; + if (this.hasSprites()) { + sprite_info = this.parseSprite(draw, context); + if (sprite_info) { + style.texcoords = sprite_info.texcoords; + } else { return; - } else if (!_texture2.default.textures[this.texture].sprites[sprite]) { - // If sprite not found, check for default sprite - if (style.sprite_default) { - sprite = style.sprite_default; - if (!_texture2.default.textures[this.texture].sprites[sprite]) { - (0, _log2.default)('warn', 'Style: in style \'' + this.name + '\', could not find default sprite \'' + sprite + '\' for texture \'' + this.texture + '\''); - return; - } - } else { - if (!this.texture_missing_sprites[sprite]) { - // only log each missing sprite once - (0, _log2.default)('debug', 'Style: in style \'' + this.name + '\', could not find sprite \'' + sprite + '\' for texture \'' + this.texture + '\''); - this.texture_missing_sprites[sprite] = true; - } - return; - } } - } else if (sprite) { - (0, _log2.default)('warn', 'Style: in style \'' + this.name + '\', sprite \'' + sprite + '\' was specified, but texture \'' + this.texture + '\' has no sprites'); - sprite = null; - } - - // Sets texcoord scale if needed (e.g. for sprite sub-area) - var sprite_info = void 0; - if (this.texture && sprite) { - sprite_info = _texture2.default.getSpriteInfo(this.texture, sprite); - style.texcoords = sprite_info.texcoords; - } else { - style.texcoords = null; } - // points can be placed off the ground - style.z = draw.z && _style_parser.StyleParser.evalCachedDistanceProperty(draw.z, context) || _style_parser.StyleParser.defaults.z; - // point size defined explicitly, or defaults to sprite size, or generic fallback style.size = draw.size; if (!style.size) { @@ -35439,7 +35430,7 @@ Object.assign(Points, { } // size will be scaled to 16-bit signed int, so max allowed width + height of 256 pixels - style.size = [Math.min(style.size[0] || style.size, 256), Math.min(style.size[1] || style.size, 256)]; + style.size = [Math.min(style.size[0] != null ? style.size[0] : style.size, 256), Math.min(style.size[1] != null ? style.size[1] : style.size, 256)]; // Placement strategy style.placement = draw.placement; @@ -35453,6 +35444,9 @@ Object.assign(Points, { // Angle parameter (can be a number or the string "auto") style.angle = _style_parser.StyleParser.evalProperty(draw.angle, context); + // points can be placed off the ground + style.z = draw.z && _style_parser.StyleParser.evalCachedDistanceProperty(draw.z, context) || _style_parser.StyleParser.defaults.z; + style.tile_edges = draw.tile_edges; // usually activated for debugging, or rare visualization needs style.sampler = 0; // 0 = sprites @@ -35490,6 +35484,25 @@ Object.assign(Points, { // Register with collision manager _collision2.default.addStyle(this.collision_group_points, tile.key); }, + hasSprites: function hasSprites() { + return this.texture && _texture2.default.textures[this.texture] && _texture2.default.textures[this.texture].sprites; + }, + getSpriteInfo: function getSpriteInfo(sprite) { + var info = _texture2.default.textures[this.texture].sprites[sprite] && _texture2.default.getSpriteInfo(this.texture, sprite); + if (sprite && !info) { + if (!this.texture_missing_sprites[sprite]) { + // only log each missing sprite once + (0, _log2.default)('debug', 'Style: in style \'' + this.name + '\', could not find sprite \'' + sprite + '\' for texture \'' + this.texture + '\''); + this.texture_missing_sprites[sprite] = true; + } + } + return info; + }, + parseSprite: function parseSprite(draw, context) { + var sprite = _style_parser.StyleParser.evalProperty(draw.sprite, context); + var sprite_info = this.getSpriteInfo(sprite) || this.getSpriteInfo(draw.sprite_default); + return sprite_info; + }, // Override @@ -35908,7 +35921,7 @@ Object.assign(Points, { } }); -},{"../../builders/points":197,"../../geo":201,"../../gl/constants":202,"../../gl/texture":208,"../../gl/vertex_layout":213,"../../labels/collision":214,"../../labels/label_point":218,"../../labels/point_placement":220,"../../utils/debug_settings":254,"../../utils/log":257,"../../vector":268,"../../view":269,"../style":243,"../style_parser":245,"../text/text_labels":249}],241:[function(_dereq_,module,exports){ +},{"../../builders/points":195,"../../geo":199,"../../gl/constants":200,"../../gl/texture":206,"../../gl/vertex_layout":211,"../../labels/collision":212,"../../labels/label_point":216,"../../labels/point_placement":218,"../../utils/debug_settings":252,"../../utils/log":255,"../../vector":266,"../../view":267,"../style":241,"../style_parser":243,"../text/text_labels":247}],239:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -36089,7 +36102,7 @@ Object.assign(Polygons, { } }); -},{"../../builders/polygons":198,"../../geo":201,"../../gl/constants":202,"../../gl/vertex_layout":213,"../style":243,"../style_parser":245}],242:[function(_dereq_,module,exports){ +},{"../../builders/polygons":196,"../../geo":199,"../../gl/constants":200,"../../gl/vertex_layout":211,"../style":241,"../style_parser":243}],240:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -36125,7 +36138,7 @@ Object.assign(RasterStyle, { } }); -},{"../polygons/polygons":241,"../style_parser":245}],243:[function(_dereq_,module,exports){ +},{"../polygons/polygons":239,"../style_parser":243}],241:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -36223,6 +36236,8 @@ var Style = exports.Style = { this.blend_order = -1; // defaults to first } + this.removeShaderBlock('setup'); // clear before material injection + // If the style defines its own material, replace the inherited material instance if (!(this.material instanceof _material2.default)) { if (!_material2.default.isValid(this.material)) { @@ -36792,7 +36807,7 @@ var Style = exports.Style = { } }; -},{"../gl/shader_program":207,"../gl/texture":208,"../gl/vbo_mesh":210,"../light":223,"../material":224,"../selection":230,"../sources/raster":234,"../utils/log":257,"../utils/thread":263,"../utils/worker_broker":267,"./style_parser":245}],244:[function(_dereq_,module,exports){ +},{"../gl/shader_program":205,"../gl/texture":206,"../gl/vbo_mesh":208,"../light":221,"../material":222,"../selection":228,"../sources/raster":232,"../utils/log":255,"../utils/thread":261,"../utils/worker_broker":265,"./style_parser":243}],242:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -37301,7 +37316,7 @@ var StyleManager = exports.StyleManager = function () { return StyleManager; }(); -},{"../geo":201,"../gl/shader_program":207,"../utils/log":257,"../utils/merge":259,"./lines/lines":239,"./points/points":240,"./polygons/polygons":241,"./raster/raster":242,"./text/text":248}],245:[function(_dereq_,module,exports){ +},{"../geo":199,"../gl/shader_program":205,"../utils/log":255,"../utils/merge":257,"./lines/lines":237,"./points/points":238,"./polygons/polygons":239,"./raster/raster":240,"./text/text":246}],243:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -37711,7 +37726,7 @@ StyleParser.evalProperty = function (prop, context) { return prop; }; -},{"../geo":201,"../utils/utils":265,"csscolorparser":76}],246:[function(_dereq_,module,exports){ +},{"../geo":199,"../utils/utils":263,"csscolorparser":71}],244:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -38427,7 +38442,7 @@ var Line = function () { return Line; }(); -},{"../../gl/texture":208,"../../utils/debug_settings":254,"../../utils/utils":265,"./font_manager":247}],247:[function(_dereq_,module,exports){ +},{"../../gl/texture":206,"../../utils/debug_settings":252,"../../utils/utils":263,"./font_manager":245}],245:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -38597,7 +38612,7 @@ var FontManager = { exports.default = FontManager; -},{"../../utils/log":257,"../../utils/utils":265,"fontfaceobserver":78}],248:[function(_dereq_,module,exports){ +},{"../../utils/log":255,"../../utils/utils":263,"fontfaceobserver":74}],246:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -38901,7 +38916,7 @@ function placementStrategy(label) { TextStyle.texture_id = 0; // namespaces per-tile label textures -},{"../../geo":201,"../../labels/collision":214,"../../labels/label_line":217,"../../labels/label_point":218,"../points/points":240,"../style":243}],249:[function(_dereq_,module,exports){ +},{"../../geo":199,"../../labels/collision":212,"../../labels/label_line":215,"../../labels/label_point":216,"../points/points":238,"../style":241}],247:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -39221,7 +39236,7 @@ var TextLabels = exports.TextLabels = { } }; -},{"../../geo":201,"../../gl/texture":208,"../../labels/collision":214,"../../utils/log":257,"../../utils/thread":263,"../../utils/worker_broker":267,"../style_parser":245,"../text/canvas_text":246,"../text/text_settings":250}],250:[function(_dereq_,module,exports){ +},{"../../geo":199,"../../gl/texture":206,"../../labels/collision":212,"../../utils/log":255,"../../utils/thread":261,"../../utils/worker_broker":265,"../style_parser":243,"../text/canvas_text":244,"../text/text_settings":248}],248:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -39346,7 +39361,7 @@ exports.default = TextSettings = { } }; -},{"../../geo":201,"../../utils/utils":265,"../style_parser":245}],251:[function(_dereq_,module,exports){ +},{"../../geo":199,"../../utils/utils":263,"../style_parser":243}],249:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40089,7 +40104,7 @@ exports.default = Tile; Tile.coord_children = {}; // only allocate children coordinates once per coordinate -},{"./geo":201,"./gl/texture":208,"./labels/collision":214,"./styles/style_parser":245,"./utils/gl-matrix":256,"./utils/log":257,"./utils/utils":265,"./utils/worker_broker":267}],252:[function(_dereq_,module,exports){ +},{"./geo":199,"./gl/texture":206,"./labels/collision":212,"./styles/style_parser":243,"./utils/gl-matrix":254,"./utils/log":255,"./utils/utils":263,"./utils/worker_broker":265}],250:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40574,7 +40589,7 @@ var TileManager = function () { exports.default = TileManager; -},{"./tile":251,"./tile_pyramid":253,"./utils/log":257,"./utils/worker_broker":267}],253:[function(_dereq_,module,exports){ +},{"./tile":249,"./tile_pyramid":251,"./utils/log":255,"./utils/worker_broker":265}],251:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40602,7 +40617,8 @@ var TilePyramid = function () { _classCallCheck(this, TilePyramid); this.coords = {}; - this.max_proxy_descendant_depth = 3; // # of levels deep to search for descendant proxy tiles + this.max_proxy_descendant_depth = 3; // # of levels to search up/down for proxy tiles + this.max_proxy_ancestor_depth = 5; } _createClass(TilePyramid, [{ @@ -40678,6 +40694,11 @@ var TilePyramid = function () { var coords = _ref.coords, style_zoom = _ref.style_zoom, source = _ref.source; + var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + + if (level > this.max_proxy_ancestor_depth) { + return; + } // First check overzoomed tiles at same coordinate zoom if (style_zoom > source.max_zoom) { @@ -40687,6 +40708,10 @@ var TilePyramid = function () { if (source_tiles[z] && source_tiles[z].loaded) { return source_tiles[z]; } + + if (++level > this.max_proxy_ancestor_depth) { + return; + } } } style_zoom = source.max_zoom; @@ -40700,9 +40725,8 @@ var TilePyramid = function () { return parent_tiles[style_zoom]; } // didn't find ancestor, try next level - // TODO: max depth levels to check if (parent.z > 0) { - return this.getAncestor({ coords: parent, style_zoom: style_zoom, source: source }); + return this.getAncestor({ coords: parent, style_zoom: style_zoom, source: source }, level + 1); } } }, { @@ -40756,7 +40780,7 @@ var TilePyramid = function () { exports.default = TilePyramid; -},{"./geo":201,"./tile":251}],254:[function(_dereq_,module,exports){ +},{"./geo":199,"./tile":249}],252:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -40773,7 +40797,7 @@ exports.default = { suppress_label_snap_animation: false }; -},{}],255:[function(_dereq_,module,exports){ +},{}],253:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40802,7 +40826,7 @@ var MethodNotImplemented = exports.MethodNotImplemented = function (_Error) { return MethodNotImplemented; }(Error); -},{}],256:[function(_dereq_,module,exports){ +},{}],254:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40889,7 +40913,7 @@ exports.vec3 = vec3; exports.mat3 = mat3; exports.mat4 = mat4; -},{"gl-mat3/invert":85,"gl-mat3/normal-from-mat4":86,"gl-mat4/copy":87,"gl-mat4/identity":88,"gl-mat4/lookAt":89,"gl-mat4/multiply":90,"gl-mat4/perspective":91,"gl-mat4/scale":92,"gl-mat4/translate":93}],257:[function(_dereq_,module,exports){ +},{"gl-mat3/invert":81,"gl-mat3/normal-from-mat4":82,"gl-mat4/copy":83,"gl-mat4/identity":84,"gl-mat4/lookAt":85,"gl-mat4/multiply":86,"gl-mat4/perspective":87,"gl-mat4/scale":88,"gl-mat4/translate":89}],255:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40973,7 +40997,7 @@ if (_thread2.default.is_main) { _worker_broker2.default.addTarget('_logProxy', log); // proxy log messages from worker to main thread _worker_broker2.default.addTarget('_logSetLevelProxy', log.setLevel); // proxy log level setting from main to worker thread -},{"./thread":263,"./version":266,"./worker_broker":267}],258:[function(_dereq_,module,exports){ +},{"./thread":261,"./version":264,"./worker_broker":265}],256:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41138,7 +41162,7 @@ var MediaCapture = function () { exports.default = MediaCapture; -},{"./log":257,"./urls":264}],259:[function(_dereq_,module,exports){ +},{"./log":255,"./urls":262}],257:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41182,7 +41206,7 @@ function mergeObjects(dest) { return dest; } -},{}],260:[function(_dereq_,module,exports){ +},{}],258:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41299,7 +41323,7 @@ var OBB = function () { exports.default = OBB; -},{"../vector":268}],261:[function(_dereq_,module,exports){ +},{"../vector":266}],259:[function(_dereq_,module,exports){ 'use strict'; _dereq_('core-js/es6/promise'); @@ -41332,13 +41356,20 @@ if (typeof Object.assign !== 'function') { })(); } // Promises polyfill -},{"core-js/es6/promise":12}],262:[function(_dereq_,module,exports){ +},{"core-js/es6/promise":6}],260:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = subscribeMixin; + +var _log = _dereq_('./log'); + +var _log2 = _interopRequireDefault(_log); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + function subscribeMixin(target) { var listeners = []; @@ -41365,7 +41396,11 @@ function subscribeMixin(target) { listeners.forEach(function (listener) { if (typeof listener[event] === 'function') { - listener[event].apply(listener, data); + try { + listener[event].apply(listener, data); + } catch (e) { + (0, _log2.default)('warn', 'Caught exception in listener for event \'' + event + '\':', e); + } } }); }, @@ -41381,7 +41416,7 @@ function subscribeMixin(target) { }); } -},{}],263:[function(_dereq_,module,exports){ +},{"./log":255}],261:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -41413,7 +41448,7 @@ try { } } -},{}],264:[function(_dereq_,module,exports){ +},{}],262:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41606,7 +41641,7 @@ function findCurrentURL() { } } -},{"./log":257}],265:[function(_dereq_,module,exports){ +},{"./log":255}],263:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41920,18 +41955,18 @@ Utils.pointInTile = function (point) { return point[0] >= 0 && point[1] > -_geo2.default.tile_scale && point[0] < _geo2.default.tile_scale && point[1] <= 0; }; -},{"../geo":201,"./log":257,"./thread":263,"./worker_broker":267}],266:[function(_dereq_,module,exports){ +},{"../geo":199,"./log":255,"./thread":261,"./worker_broker":265}],264:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -var pkg = JSON.parse("{\n \"name\": \"tangram\",\n \"version\": \"0.11.4\",\n \"description\": \"WebGL Maps for Vector Tiles\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/tangrams/tangram.git\"\n },\n \"main\": \"dist/tangram.min.js\",\n \"homepage\": \"https://github.com/tangrams/tangram\",\n \"keywords\": [\n \"maps\",\n \"graphics\",\n \"rendering\",\n \"visualization\",\n \"WebGL\",\n \"OpenStreetMap\"\n ],\n \"scripts\": {\n \"start\": \"npm run watch\",\n \"test\": \"npm run lint && npm run build-test && npm run test-local\",\n \"test-ci\": \"npm run lint && npm run build-test && npm run test-remote\",\n \"test-remote\": \"./node_modules/karma/bin/karma start --browsers SL_Firefox --single-run\",\n \"test-local\": \"./node_modules/karma/bin/karma start --browsers Chrome --single-run\",\n \"karma-start\": \"./node_modules/karma/bin/karma start --browsers Chrome --no-watch\",\n \"karma-run\": \"./node_modules/karma/bin/karma run --browsers Chrome\",\n \"lint\": \"$(npm bin)/jshint src/ && jshint test/\",\n \"build\": \"npm run build-bundle -- -o dist/tangram.debug.js && npm run build-minify\",\n \"build-test\": \"npm run build-bundle -- -o dist/tangram.test.js\",\n \"build-debug\": \"npm run build-bundle -- -o dist/tangram.debug.js\",\n \"build-bundle\": \"$(npm bin)/browserify src/module.js -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram -p browserify-derequire --debug\",\n \"build-minify\": \"$(npm bin)/uglifyjs dist/tangram.debug.js -c warnings=false -m -o dist/tangram.min.js && npm run build-size\",\n \"build-size\": \"gzip dist/tangram.min.js -c | wc -c | awk '{kb=$1/1024; print kb}' OFMT='%.0fk minified+gzipped'\",\n \"watch\": \"$(npm bin)/budo src/module.js:dist/tangram.debug.js --port 8000 --cors --live -- -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram\"\n },\n \"author\": {\n \"name\": \"Mapzen\",\n \"email\": \"tangram@mapzen.com\"\n },\n \"contributors\": [\n {\n \"name\": \"Brett Camper\"\n },\n {\n \"name\": \"Peter Richardson\"\n },\n {\n \"name\": \"Patricio Gonzalez Vivo\"\n },\n {\n \"name\": \"Karim Naaji\"\n },\n {\n \"name\": \"Ivan Willig\"\n },\n {\n \"name\": \"Lou Huang\"\n },\n {\n \"name\": \"David Valdman\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"brfs\": \"1.4.3\",\n \"csscolorparser\": \"1.0.3\",\n \"earcut\": \"2.1.1\",\n \"fontfaceobserver\": \"1.7.1\",\n \"geojson-vt\": \"2.1.6\",\n \"gl-mat3\": \"1.0.0\",\n \"gl-mat4\": \"1.1.4\",\n \"gl-shader-errors\": \"1.0.3\",\n \"js-yaml\": \"tangrams/js-yaml#read-only\",\n \"jszip\": \"tangrams/jszip#read-only\",\n \"pbf\": \"1.3.2\",\n \"strip-comments\": \"0.3.2\",\n \"topojson-client\": \"tangrams/topojson-client#read-only\",\n \"vector-tile\": \"1.1.2\"\n },\n \"devDependencies\": {\n \"babelify\": \"7.3.0\",\n \"babel-preset-es2015\": \"6.16.0\",\n \"browserify\": \"13.0.1\",\n \"browserify-derequire\": \"0.9.4\",\n \"budo\": \"8.2.1\",\n \"chai\": \"1.9.2\",\n \"chai-as-promised\": \"4.1.1\",\n \"core-js\": \"2.4.1\",\n \"glob\": \"4.0.6\",\n \"jshint\": \"jshint/jshint#3a8efa979dbb157bfb5c10b5826603a55a33b9ad\",\n \"karma\": \"0.12.23\",\n \"karma-browserify\": \"5.1.0\",\n \"karma-chrome-launcher\": \"0.1.4\",\n \"karma-mocha\": \"0.1.9\",\n \"karma-mocha-reporter\": \"1.0.0\",\n \"karma-sauce-launcher\": \"tangrams/karma-sauce-launcher#firefox-profiles\",\n \"karma-sinon\": \"1.0.4\",\n \"mocha\": \"1.21.4\",\n \"sinon\": \"1.10.3\",\n \"uglify-js\": \"2.4.14\",\n \"yargs\": \"1.3.2\"\n }\n}\n"); +var pkg = JSON.parse("{\n \"name\": \"tangram\",\n \"version\": \"0.11.5\",\n \"description\": \"WebGL Maps for Vector Tiles\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/tangrams/tangram.git\"\n },\n \"main\": \"dist/tangram.min.js\",\n \"homepage\": \"https://github.com/tangrams/tangram\",\n \"keywords\": [\n \"maps\",\n \"graphics\",\n \"rendering\",\n \"visualization\",\n \"WebGL\",\n \"OpenStreetMap\"\n ],\n \"scripts\": {\n \"start\": \"npm run watch\",\n \"test\": \"npm run lint && npm run build-test && npm run test-local\",\n \"test-ci\": \"npm run lint && npm run build-test && npm run test-remote\",\n \"test-remote\": \"./node_modules/karma/bin/karma start --browsers SL_Firefox --single-run\",\n \"test-local\": \"./node_modules/karma/bin/karma start --browsers Chrome --single-run\",\n \"karma-start\": \"./node_modules/karma/bin/karma start --browsers Chrome --no-watch\",\n \"karma-run\": \"./node_modules/karma/bin/karma run --browsers Chrome\",\n \"lint\": \"$(npm bin)/jshint src/ && jshint test/\",\n \"build\": \"npm run build-bundle -- -o dist/tangram.debug.js && npm run build-minify\",\n \"build-test\": \"npm run build-bundle -- -o dist/tangram.test.js\",\n \"build-debug\": \"npm run build-bundle -- -o dist/tangram.debug.js\",\n \"build-bundle\": \"$(npm bin)/browserify src/module.js -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram -p browserify-derequire --debug\",\n \"build-minify\": \"$(npm bin)/uglifyjs dist/tangram.debug.js -c warnings=false -m -o dist/tangram.min.js && npm run build-size\",\n \"build-size\": \"gzip dist/tangram.min.js -c | wc -c | awk '{kb=$1/1024; print kb}' OFMT='%.0fk minified+gzipped'\",\n \"watch\": \"$(npm bin)/budo src/module.js:dist/tangram.debug.js --port 8000 --cors --live -- -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram\"\n },\n \"author\": {\n \"name\": \"Mapzen\",\n \"email\": \"tangram@mapzen.com\"\n },\n \"contributors\": [\n {\n \"name\": \"Brett Camper\"\n },\n {\n \"name\": \"Peter Richardson\"\n },\n {\n \"name\": \"Patricio Gonzalez Vivo\"\n },\n {\n \"name\": \"Karim Naaji\"\n },\n {\n \"name\": \"Ivan Willig\"\n },\n {\n \"name\": \"Lou Huang\"\n },\n {\n \"name\": \"David Valdman\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"brfs\": \"1.4.3\",\n \"csscolorparser\": \"1.0.3\",\n \"earcut\": \"2.1.1\",\n \"fontfaceobserver\": \"1.7.1\",\n \"geojson-vt\": \"2.1.6\",\n \"gl-mat3\": \"1.0.0\",\n \"gl-mat4\": \"1.1.4\",\n \"gl-shader-errors\": \"1.0.3\",\n \"js-yaml\": \"tangrams/js-yaml#read-only\",\n \"jszip\": \"tangrams/jszip#read-only\",\n \"pbf\": \"1.3.2\",\n \"strip-comments\": \"0.3.2\",\n \"topojson-client\": \"tangrams/topojson-client#read-only\",\n \"vector-tile\": \"1.1.2\"\n },\n \"devDependencies\": {\n \"babelify\": \"7.3.0\",\n \"babel-preset-es2015\": \"6.16.0\",\n \"browserify\": \"13.0.1\",\n \"browserify-derequire\": \"0.9.4\",\n \"budo\": \"8.2.1\",\n \"chai\": \"1.9.2\",\n \"chai-as-promised\": \"4.1.1\",\n \"core-js\": \"2.4.1\",\n \"glob\": \"4.0.6\",\n \"jshint\": \"jshint/jshint#3a8efa979dbb157bfb5c10b5826603a55a33b9ad\",\n \"karma\": \"0.12.23\",\n \"karma-browserify\": \"5.1.0\",\n \"karma-chrome-launcher\": \"0.1.4\",\n \"karma-mocha\": \"0.1.9\",\n \"karma-mocha-reporter\": \"1.0.0\",\n \"karma-sauce-launcher\": \"tangrams/karma-sauce-launcher#firefox-profiles\",\n \"karma-sinon\": \"1.0.4\",\n \"mocha\": \"1.21.4\",\n \"sinon\": \"1.10.3\",\n \"uglify-js\": \"2.4.14\",\n \"yargs\": \"1.3.2\"\n }\n}\n"); var version = void 0; exports.default = version = 'v' + pkg.version; -},{}],267:[function(_dereq_,module,exports){ +},{}],265:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -42511,7 +42546,7 @@ if (_thread2.default.is_worker) { setupWorkerThread(); } -},{"./log":257,"./thread":263}],268:[function(_dereq_,module,exports){ +},{"./log":255,"./thread":261}],266:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -42702,7 +42737,7 @@ Vector.dot = function (v1, v2) { return n; }; -},{}],269:[function(_dereq_,module,exports){ +},{}],267:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -43137,6 +43172,6 @@ var View = function () { exports.default = View; -},{"./camera":200,"./geo":201,"./tile":251,"./utils/log":257,"./utils/subscribe":262,"./utils/utils":265}]},{},[225])(225) +},{"./camera":198,"./geo":199,"./tile":249,"./utils/log":255,"./utils/subscribe":260,"./utils/utils":263}]},{},[223])(223) }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1yZXNvbHZlL2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9idWZmZXIvbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9idWZmZXIvbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnVmZmVyL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvaW5zZXJ0LW1vZHVsZS1nbG9iYWxzL25vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3V0aWwvbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9lczYvcHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1pbnN0YW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWluY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY2xhc3NvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvcmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jdHguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZWZpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZm9yLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGlkZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2h0bWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ludm9rZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lvYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGV0ZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1zdGVwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbGlicmFyeS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1rZXlzLWludGVybmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUtYWxsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW5kZXguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3VpZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jc3Njb2xvcnBhcnNlci9jc3Njb2xvcnBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIm5vZGVfbW9kdWxlcy9mb250ZmFjZW9ic2VydmVyL2ZvbnRmYWNlb2JzZXJ2ZXIuc3RhbmRhbG9uZS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9jbGlwLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NvbnZlcnQuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvc2ltcGxpZnkuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvdGlsZS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy93cmFwLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDMvaW52ZXJ0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDMvbm9ybWFsLWZyb20tbWF0NC5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2NvcHkuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9pZGVudGl0eS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2xvb2tBdC5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L211bHRpcGx5LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvcGVyc3BlY3RpdmUuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9zY2FsZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L3RyYW5zbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1zaGFkZXItZXJyb3JzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2NvbW1vbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2V4Y2VwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2xvYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL21hcmsuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2pzb24uanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9iaW5hcnkuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Jvb2wuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Zsb2F0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9pbnQuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL2Z1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9yZWdleHAuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL3VuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWFwLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbnVsbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvb21hcC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NlcS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2V0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zdHIuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3RpbWVzdGFtcC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvYmFzZTY0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2VkT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2lvbnMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2NyYzMyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9kZWZhdWx0cy5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvZXh0ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2ZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbG9hZC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL25vZGVqc1V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9vYmplY3QuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9BcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL0RhdGFSZWFkZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9Ob2RlQnVmZmVyUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvU3RyaW5nUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvVWludDhBcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL3JlYWRlckZvci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc2lnbmF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vQ29udmVydFdvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL0NyYzMyUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhV29ya2VyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vR2VuZXJpY1dvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL1N0cmVhbUhlbHBlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3VwcG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRmOC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJpZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJ5LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi96aXBPYmplY3QuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL2FzYXAvYnJvd3Nlci1hc2FwLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9hc2FwL2Jyb3dzZXItcmF3LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9wYWtvL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9wYWtvL2xpYi9kZWZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9wYWtvL2xpYi9pbmZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9jb21tb24uanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL3N0cmluZ3MuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvYWRsZXIzMi5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jb25zdGFudHMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9nemhlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmxhdGUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvdHJlZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvenN0cmVhbS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL25vZGVfbW9kdWxlcy9jb3JlLXV0aWwtaXMvbGliL3V0aWwuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9ub2RlX21vZHVsZXMvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9ub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL3BiZi9idWZmZXIuanMiLCJub2RlX21vZHVsZXMvcGJmL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N0cmlwLWNvbW1lbnRzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3RvcG9qc29uLWNsaWVudC9kaXN0L3RvcG9qc29uLWNsaWVudC5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZS5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVsYXllci5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9ub2RlX21vZHVsZXMvcG9pbnQtZ2VvbWV0cnkvaW5kZXguanMiLCJzcmMvYnVpbGRlcnMvY29tbW9uLmpzIiwic3JjL2J1aWxkZXJzL3BvaW50cy5qcyIsInNyYy9idWlsZGVycy9wb2x5Z29ucy5qcyIsInNyYy9idWlsZGVycy9wb2x5bGluZXMuanMiLCJzcmMvY2FtZXJhLmpzIiwic3JjL2dlby5qcyIsInNyYy9nbC9jb25zdGFudHMuanMiLCJzcmMvZ2wvY29udGV4dC5qcyIsInNyYy9nbC9leHRlbnNpb25zLmpzIiwic3JjL2dsL2dsc2wuanMiLCJzcmMvZ2wvcmVuZGVyX3N0YXRlLmpzIiwic3JjL2dsL3NoYWRlcl9wcm9ncmFtLmpzIiwic3JjL2dsL3RleHR1cmUuanMiLCJzcmMvZ2wvdmFvLmpzIiwic3JjL2dsL3Zib19tZXNoLmpzIiwic3JjL2dsL3ZlcnRleF9kYXRhLmpzIiwic3JjL2dsL3ZlcnRleF9lbGVtZW50cy5qcyIsInNyYy9nbC92ZXJ0ZXhfbGF5b3V0LmpzIiwic3JjL2xhYmVscy9jb2xsaXNpb24uanMiLCJzcmMvbGFiZWxzL2ludGVyc2VjdC5qcyIsInNyYy9sYWJlbHMvbGFiZWwuanMiLCJzcmMvbGFiZWxzL2xhYmVsX2xpbmUuanMiLCJzcmMvbGFiZWxzL2xhYmVsX3BvaW50LmpzIiwic3JjL2xhYmVscy9wb2ludF9hbmNob3IuanMiLCJzcmMvbGFiZWxzL3BvaW50X3BsYWNlbWVudC5qcyIsInNyYy9sYWJlbHMvcmVwZWF0X2dyb3VwLmpzIiwic3JjL2xlYWZsZXRfbGF5ZXIuanMiLCJzcmMvbGlnaHQuanMiLCJzcmMvbWF0ZXJpYWwuanMiLCJzcmMvbW9kdWxlLmpzIiwic3JjL3NjZW5lLmpzIiwic3JjL3NjZW5lX2J1bmRsZS5qcyIsInNyYy9zY2VuZV9sb2FkZXIuanMiLCJzcmMvc2NlbmVfd29ya2VyLmpzIiwic3JjL3NlbGVjdGlvbi5qcyIsInNyYy9zb3VyY2VzL2RhdGFfc291cmNlLmpzIiwic3JjL3NvdXJjZXMvZ2VvanNvbi5qcyIsInNyYy9zb3VyY2VzL212dC5qcyIsInNyYy9zb3VyY2VzL3Jhc3Rlci5qcyIsInNyYy9zb3VyY2VzL3RvcG9qc29uLmpzIiwic3JjL3N0eWxlcy9maWx0ZXIuanMiLCJzcmMvc3R5bGVzL2xheWVyLmpzIiwic3JjL3N0eWxlcy9saW5lcy9kYXNoYXJyYXkuanMiLCJzcmMvc3R5bGVzL2xpbmVzL2xpbmVzLmpzIiwic3JjL3N0eWxlcy9wb2ludHMvcG9pbnRzLmpzIiwic3JjL3N0eWxlcy9wb2x5Z29ucy9wb2x5Z29ucy5qcyIsInNyYy9zdHlsZXMvcmFzdGVyL3Jhc3Rlci5qcyIsInNyYy9zdHlsZXMvc3R5bGUuanMiLCJzcmMvc3R5bGVzL3N0eWxlX21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3N0eWxlX3BhcnNlci5qcyIsInNyYy9zdHlsZXMvdGV4dC9jYW52YXNfdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC9mb250X21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3RleHQvdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X2xhYmVscy5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X3NldHRpbmdzLmpzIiwic3JjL3RpbGUuanMiLCJzcmMvdGlsZV9tYW5hZ2VyLmpzIiwic3JjL3RpbGVfcHlyYW1pZC5qcyIsInNyYy91dGlscy9kZWJ1Z19zZXR0aW5ncy5qcyIsInNyYy91dGlscy9lcnJvcnMuanMiLCJzcmMvdXRpbHMvZ2wtbWF0cml4LmpzIiwic3JjL3V0aWxzL2xvZy5qcyIsInNyYy91dGlscy9tZWRpYV9jYXB0dXJlLmpzIiwic3JjL3V0aWxzL21lcmdlLmpzIiwic3JjL3V0aWxzL29iYi5qcyIsInNyYy91dGlscy9wb2x5ZmlsbHMuanMiLCJzcmMvdXRpbHMvc3Vic2NyaWJlLmpzIiwic3JjL3V0aWxzL3RocmVhZC5qcyIsInNyYy91dGlscy91cmxzLmpzIiwic3JjL3V0aWxzL3V0aWxzLmpzIiwic3JjL3V0aWxzL3ZlcnNpb24uanMiLCJzcmMvdXRpbHMvd29ya2VyX2Jyb2tlci5qcyIsInNyYy92ZWN0b3IuanMiLCJzcmMvdmlldy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBOzs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDN3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBOztBQ0FBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7O0FDRkE7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDelFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGpEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDN01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25SQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDL05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2haQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy96REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2VUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbHJDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDLzJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25MQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDbmdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDdmFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDSDs7QUFFRDs7OztxQ0FDYyxPLEVBQVM7QUFDbkIsb0JBQVEsT0FBUixDQUFnQixLQUFoQixFQUF1QixjQUF2QixFQUF1QyxDQUFDLEtBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsS0FBbEIsRUFBeUIsS0FBSyxJQUFMLENBQVUsTUFBVixDQUFpQixNQUExQyxDQUF2QztBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsS0FBaEIsRUFBdUIsZ0JBQXZCLEVBQXlDLENBQUMsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFwQixFQUF1QixLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLENBQTFDLEVBQTZDLEtBQUssSUFBbEQsQ0FBekM7QUFDQSxvQkFBUSxPQUFSLENBQWdCLElBQWhCLEVBQXNCLG9CQUF0QixFQUE0QyxLQUFLLGdCQUFqRDtBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0Isc0JBQXRCLEVBQThDLGdCQUFNLGtCQUFwRDtBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0IsdUJBQXRCLEVBQStDLEtBQUssY0FBcEQ7QUFDQSxvQkFBUSxPQUFSLENBQWdCLElBQWhCLEVBQXNCLGdCQUF0QixFQUF3QyxLQUFLLE9BQTdDOztBQUVBLGlCQUFLLE1BQUwsQ0FBWSxZQUFaLENBQXlCLE9BQXpCO0FBQ0g7O0FBRUQ7Ozs7c0NBQ2U7QUFDWCxtQkFBUSxLQUFLLGNBQUwsSUFBdUIsa0JBQS9CO0FBQ0g7Ozs7OztrQkF0VWdCLEkiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gcGxhY2VIb2xkZXJzQ291bnQgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcbiAgLy8gaWYgdGhlcmUgYXJlIHR3byBwbGFjZWhvbGRlcnMsIHRoYW4gdGhlIHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBpdFxuICAvLyByZXByZXNlbnQgb25lIGJ5dGVcbiAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG4gIC8vIHRoaXMgaXMganVzdCBhIGNoZWFwIGhhY2sgdG8gbm90IGRvIGluZGV4T2YgdHdpY2VcbiAgcmV0dXJuIGI2NFtsZW4gLSAyXSA9PT0gJz0nID8gMiA6IGI2NFtsZW4gLSAxXSA9PT0gJz0nID8gMSA6IDBcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICByZXR1cm4gYjY0Lmxlbmd0aCAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzQ291bnQoYjY0KVxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciBpLCBqLCBsLCB0bXAsIHBsYWNlSG9sZGVycywgYXJyXG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIHBsYWNlSG9sZGVycyA9IHBsYWNlSG9sZGVyc0NvdW50KGI2NClcblxuICBhcnIgPSBuZXcgQXJyKGxlbiAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgb3V0cHV0ID0gJydcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz09J1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMTBdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPSdcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuICgnICsgZXIgKyAnKScpO1xuICAgICAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChoYW5kbGVyKSkge1xuICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIGxpc3RlbmVycyA9IGhhbmRsZXIuc2xpY2UoKTtcbiAgICBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBtO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gIGlmICh0aGlzLl9ldmVudHMubmV3TGlzdGVuZXIpXG4gICAgdGhpcy5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb24obGlzdGVuZXIubGlzdGVuZXIpID9cbiAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gIGVsc2UgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZVxuICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IFt0aGlzLl9ldmVudHNbdHlwZV0sIGxpc3RlbmVyXTtcblxuICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSAmJiAhdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5fbWF4TGlzdGVuZXJzKSkge1xuICAgICAgbSA9IHRoaXMuX21heExpc3RlbmVycztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICAgIH1cblxuICAgIGlmIChtICYmIG0gPiAwICYmIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGggPiBtKSB7XG4gICAgICB0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xuICAgICAgICAgICAgICAgICAgICAnbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LicsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgpO1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLnRyYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgaW4gSUUgMTBcbiAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICB2YXIgZmlyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBnKCkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG5cbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgdGhpcy5vbih0eXBlLCBnKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGxpc3QsIHBvc2l0aW9uLCBsZW5ndGgsIGk7XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgbGlzdCA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIHBvc2l0aW9uID0gLTE7XG5cbiAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8XG4gICAgICAoaXNGdW5jdGlvbihsaXN0Lmxpc3RlbmVyKSAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QobGlzdCkpIHtcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHxcbiAgICAgICAgICAobGlzdFtpXS5saXN0ZW5lciAmJiBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3Quc3BsaWNlKHBvc2l0aW9uLCAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBrZXksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gIGlmICghdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICBlbHNlIGlmICh0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChrZXkgaW4gdGhpcy5fZXZlbnRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVycykpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gIH0gZWxzZSBpZiAobGlzdGVuZXJzKSB7XG4gICAgLy8gTElGTyBvcmRlclxuICAgIHdoaWxlIChsaXN0ZW5lcnMubGVuZ3RoKVxuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgfVxuICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciByZXQ7XG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0ID0gW107XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24odGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcbiAgZWxzZVxuICAgIHJldCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5zbGljZSgpO1xuICByZXR1cm4gcmV0O1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24odHlwZSkge1xuICBpZiAodGhpcy5fZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgICBpZiAoaXNGdW5jdGlvbihldmxpc3RlbmVyKSlcbiAgICAgIHJldHVybiAxO1xuICAgIGVsc2UgaWYgKGV2bGlzdGVuZXIpXG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbiIsIi8qIVxuICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlclxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKGlzQnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikgfHwgISFvYmouX2lzQnVmZmVyKVxufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiAhIW9iai5jb25zdHJ1Y3RvciAmJiB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyID09PSAnZnVuY3Rpb24nICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopXG59XG5cbi8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuXG5mdW5jdGlvbiBpc1Nsb3dCdWZmZXIgKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iai5yZWFkRmxvYXRMRSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnNsaWNlID09PSAnZnVuY3Rpb24nICYmIGlzQnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJykuUHJvbWlzZTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKVxuICAsIEFycmF5UHJvdG8gID0gQXJyYXkucHJvdG90eXBlO1xuaWYoQXJyYXlQcm90b1tVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKXJlcXVpcmUoJy4vX2hpZGUnKShBcnJheVByb3RvLCBVTlNDT1BBQkxFUywge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKXtcbiAgaWYoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB8fCAoZm9yYmlkZGVuRmllbGQgIT09IHVuZGVmaW5lZCAmJiBmb3JiaWRkZW5GaWVsZCBpbiBpdCkpe1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgdG9JbmRleCAgID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oSVNfSU5DTFVERVMpe1xuICByZXR1cm4gZnVuY3Rpb24oJHRoaXMsIGVsLCBmcm9tSW5kZXgpe1xuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3QoJHRoaXMpXG4gICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuICAgICAgLCBpbmRleCAgPSB0b0luZGV4KGZyb21JbmRleCwgbGVuZ3RoKVxuICAgICAgLCB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgaWYoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpd2hpbGUobGVuZ3RoID4gaW5kZXgpe1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgaWYodmFsdWUgIT0gdmFsdWUpcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjdG9JbmRleCBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKWlmKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pe1xuICAgICAgaWYoT1tpbmRleF0gPT09IGVsKXJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07IiwiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpXG4gIC8vIEVTMyB3cm9uZyBoZXJlXG4gICwgQVJHID0gY29mKGZ1bmN0aW9uKCl7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTsiLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59OyIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7dmVyc2lvbjogJzIuNC4wJ307XG5pZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCB0aGF0LCBsZW5ndGgpe1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZih0aGF0ID09PSB1bmRlZmluZWQpcmV0dXJuIGZuO1xuICBzd2l0Y2gobGVuZ3RoKXtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbihhKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYSwgYil7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEsIGIsIGMpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59OyIsIi8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG59KTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnRcbiAgLy8gaW4gb2xkIElFIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnXG4gICwgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07IiwiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7IiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY29yZSAgICAgID0gcmVxdWlyZSgnLi9fY29yZScpXG4gICwgaGlkZSAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgcmVkZWZpbmUgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIGN0eCAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKXtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkZcbiAgICAsIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0LkdcbiAgICAsIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlNcbiAgICAsIElTX1BST1RPICA9IHR5cGUgJiAkZXhwb3J0LlBcbiAgICAsIElTX0JJTkQgICA9IHR5cGUgJiAkZXhwb3J0LkJcbiAgICAsIHRhcmdldCAgICA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSB8fCAoZ2xvYmFsW25hbWVdID0ge30pIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXVxuICAgICwgZXhwb3J0cyAgID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSlcbiAgICAsIGV4cFByb3RvICA9IGV4cG9ydHNbUFJPVE9UWVBFXSB8fCAoZXhwb3J0c1tQUk9UT1RZUEVdID0ge30pXG4gICAgLCBrZXksIG93biwgb3V0LCBleHA7XG4gIGlmKElTX0dMT0JBTClzb3VyY2UgPSBuYW1lO1xuICBmb3Ioa2V5IGluIHNvdXJjZSl7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYodGFyZ2V0KXJlZGVmaW5lKHRhcmdldCwga2V5LCBvdXQsIHR5cGUgJiAkZXhwb3J0LlUpO1xuICAgIC8vIGV4cG9ydFxuICAgIGlmKGV4cG9ydHNba2V5XSAhPSBvdXQpaGlkZShleHBvcnRzLCBrZXksIGV4cCk7XG4gICAgaWYoSVNfUFJPVE8gJiYgZXhwUHJvdG9ba2V5XSAhPSBvdXQpZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWAgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07IiwidmFyIGN0eCAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBjYWxsICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpXG4gICwgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJylcbiAgLCBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgdG9MZW5ndGggICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGdldEl0ZXJGbiAgID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKVxuICAsIEJSRUFLICAgICAgID0ge31cbiAgLCBSRVRVUk4gICAgICA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCwgSVRFUkFUT1Ipe1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbigpeyByZXR1cm4gaXRlcmFibGU7IH0gOiBnZXRJdGVyRm4oaXRlcmFibGUpXG4gICAgLCBmICAgICAgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSlcbiAgICAsIGluZGV4ICA9IDBcbiAgICAsIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3IsIHJlc3VsdDtcbiAgaWYodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYoaXNBcnJheUl0ZXIoaXRlckZuKSlmb3IobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4Kyspe1xuICAgIHJlc3VsdCA9IGVudHJpZXMgPyBmKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGYoaXRlcmFibGVbaW5kZXhdKTtcbiAgICBpZihyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKXJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgKXtcbiAgICByZXN1bHQgPSBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgICBpZihyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKXJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLICA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47IiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZiA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZih0eXBlb2YgX19nID09ICdudW1iZXInKV9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwga2V5KXtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59OyIsInZhciBkUCAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsiLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdkaXYnKSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgYXJncywgdGhhdCl7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoKGFyZ3MubGVuZ3RoKXtcbiAgICBjYXNlIDA6IHJldHVybiB1biA/IGZuKClcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCk7XG4gICAgY2FzZSAxOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgY2FzZSA0OiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgfSByZXR1cm4gICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTsiLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTsiLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgSVRFUkFUT1IgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG9bSVRFUkFUT1JdID09PSBpdCk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTsiLCIvLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaChlKXtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmKHJldCAhPT0gdW5kZWZpbmVkKWFuT2JqZWN0KHJldC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTsiLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCBkZXNjcmlwdG9yICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpe1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHtuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcbiAgLCAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgcmVkZWZpbmUgICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgaGlkZSAgICAgICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgSXRlcmF0b3JzICAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsICRpdGVyQ3JlYXRlICAgID0gcmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpXG4gICwgSVRFUkFUT1IgICAgICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEJVR0dZICAgICAgICAgID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpIC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgLCBGRl9JVEVSQVRPUiAgICA9ICdAQGl0ZXJhdG9yJ1xuICAsIEtFWVMgICAgICAgICAgID0gJ2tleXMnXG4gICwgVkFMVUVTICAgICAgICAgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpe1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbihraW5kKXtcbiAgICBpZighQlVHR1kgJiYga2luZCBpbiBwcm90bylyZXR1cm4gcHJvdG9ba2luZF07XG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgICAgICAgID0gTkFNRSArICcgSXRlcmF0b3InXG4gICAgLCBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVNcbiAgICAsIFZBTFVFU19CVUcgPSBmYWxzZVxuICAgICwgcHJvdG8gICAgICA9IEJhc2UucHJvdG90eXBlXG4gICAgLCAkbmF0aXZlICAgID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdXG4gICAgLCAkZGVmYXVsdCAgID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVClcbiAgICAsICRlbnRyaWVzICAgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkXG4gICAgLCAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZVxuICAgICwgbWV0aG9kcywga2V5LCBJdGVyYXRvclByb3RvdHlwZTtcbiAgLy8gRml4IG5hdGl2ZVxuICBpZigkYW55TmF0aXZlKXtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSkpO1xuICAgIGlmKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKXtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZighTElCUkFSWSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUyl7XG4gICAgVkFMVUVTX0JVRyA9IHRydWU7XG4gICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpe1xuICAgIGhpZGUocHJvdG8sIElURVJBVE9SLCAkZGVmYXVsdCk7XG4gIH1cbiAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuICBJdGVyYXRvcnNbTkFNRV0gPSAkZGVmYXVsdDtcbiAgSXRlcmF0b3JzW1RBR10gID0gcmV0dXJuVGhpcztcbiAgaWYoREVGQVVMVCl7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogIERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogICAgSVNfU0VUICAgICA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmKEZPUkNFRClmb3Ioa2V5IGluIG1ldGhvZHMpe1xuICAgICAgaWYoIShrZXkgaW4gcHJvdG8pKXJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07IiwidmFyIElURVJBVE9SICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24oKXsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTtcbiAgQXJyYXkuZnJvbShyaXRlciwgZnVuY3Rpb24oKXsgdGhyb3cgMjsgfSk7XG59IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYywgc2tpcENsb3Npbmcpe1xuICBpZighc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORylyZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciAgPSBbN11cbiAgICAgICwgaXRlciA9IGFycltJVEVSQVRPUl0oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbigpeyByZXR1cm4ge2RvbmU6IHNhZmUgPSB0cnVlfTsgfTtcbiAgICBhcnJbSVRFUkFUT1JdID0gZnVuY3Rpb24oKXsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcbiAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG59OyIsIm1vZHVsZS5leHBvcnRzID0ge307IiwibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0XG4gICwgT2JzZXJ2ZXIgID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXJcbiAgLCBwcm9jZXNzICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIFByb21pc2UgICA9IGdsb2JhbC5Qcm9taXNlXG4gICwgaXNOb2RlICAgID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZihpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSlwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlKGhlYWQpe1xuICAgICAgZm4gICA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIGlmKGhlYWQpbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYocGFyZW50KXBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYoaXNOb2RlKXtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyXG4gIH0gZWxzZSBpZihPYnNlcnZlcil7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWVcbiAgICAgICwgbm9kZSAgID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7Y2hhcmFjdGVyRGF0YTogdHJ1ZX0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZihQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSl7XG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oZm4pe1xuICAgIHZhciB0YXNrID0ge2ZuOiBmbiwgbmV4dDogdW5kZWZpbmVkfTtcbiAgICBpZihsYXN0KWxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYoIWhlYWQpe1xuICAgICAgaGVhZCA9IHRhc2s7XG4gICAgICBub3RpZnkoKTtcbiAgICB9IGxhc3QgPSB0YXNrO1xuICB9O1xufTsiLCIvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbnZhciBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgZFBzICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJylcbiAgLCBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKVxuICAsIElFX1BST1RPICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpXG4gICwgRW1wdHkgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XG4gICwgUFJPVE9UWVBFICAgPSAncHJvdG90eXBlJztcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbigpe1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKVxuICAgICwgaSAgICAgID0gZW51bUJ1Z0tleXMubGVuZ3RoXG4gICAgLCBsdCAgICAgPSAnPCdcbiAgICAsIGd0ICAgICA9ICc+J1xuICAgICwgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUoaS0tKWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKXtcbiAgdmFyIHJlc3VsdDtcbiAgaWYoTyAhPT0gbnVsbCl7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKVxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBkUCAgICAgICAgICAgICA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpe1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgaWYoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKXRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmKCd2YWx1ZScgaW4gQXR0cmlidXRlcylPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59OyIsInZhciBkUCAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGdldEtleXMgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpe1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgICA9IGdldEtleXMoUHJvcGVydGllcylcbiAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgLCBpID0gMFxuICAgICwgUDtcbiAgd2hpbGUobGVuZ3RoID4gaSlkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07IiwiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgdG9PYmplY3QgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsIElFX1BST1RPICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpXG4gICwgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbihPKXtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZihoYXMoTywgSUVfUFJPVE8pKXJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcil7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTsiLCJ2YXIgaGFzICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCB0b0lPYmplY3QgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKVxuICAsIElFX1BST1RPICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIG5hbWVzKXtcbiAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwga2V5O1xuICBmb3Ioa2V5IGluIE8paWYoa2V5ICE9IElFX1BST1RPKWhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSlpZihoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpe1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07IiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpXG4gICwgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKXtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihiaXRtYXAsIHZhbHVlKXtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlICA6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlICAgIDogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZSAgICAgICA6IHZhbHVlXG4gIH07XG59OyIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHRhcmdldCwgc3JjLCBzYWZlKXtcbiAgZm9yKHZhciBrZXkgaW4gc3JjKXJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgc2FmZSk7XG4gIHJldHVybiB0YXJnZXQ7XG59OyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGhpZGUgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIGhhcyAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgU1JDICAgICAgID0gcmVxdWlyZSgnLi9fdWlkJykoJ3NyYycpXG4gICwgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJ1xuICAsICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR11cbiAgLCBUUEwgICAgICAgPSAoJycgKyAkdG9TdHJpbmcpLnNwbGl0KFRPX1NUUklORyk7XG5cbnJlcXVpcmUoJy4vX2NvcmUnKS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTywga2V5LCB2YWwsIHNhZmUpe1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJztcbiAgaWYoaXNGdW5jdGlvbiloYXModmFsLCAnbmFtZScpIHx8IGhpZGUodmFsLCAnbmFtZScsIGtleSk7XG4gIGlmKE9ba2V5XSA9PT0gdmFsKXJldHVybjtcbiAgaWYoaXNGdW5jdGlvbiloYXModmFsLCBTUkMpIHx8IGhpZGUodmFsLCBTUkMsIE9ba2V5XSA/ICcnICsgT1trZXldIDogVFBMLmpvaW4oU3RyaW5nKGtleSkpKTtcbiAgaWYoTyA9PT0gZ2xvYmFsKXtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaWYoIXNhZmUpe1xuICAgICAgZGVsZXRlIE9ba2V5XTtcbiAgICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZihPW2tleV0pT1trZXldID0gdmFsO1xuICAgICAgZWxzZSBoaWRlKE8sIGtleSwgdmFsKTtcbiAgICB9XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIHRoaXNbU1JDXSB8fCAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbn0pOyIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgZFAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKVxuICAsIFNQRUNJRVMgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVkpe1xuICB2YXIgQyA9IGdsb2JhbFtLRVldO1xuICBpZihERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKWRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTsiLCJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZlxuICAsIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIHRhZywgc3RhdCl7XG4gIGlmKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpZGVmKGl0LCBUQUcsIHtjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWd9KTtcbn07IiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJylcbiAgLCB1aWQgICAgPSByZXF1aXJlKCcuL191aWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07IiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXydcbiAgLCBzdG9yZSAgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pO1xufTsiLCIvLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcbnZhciBhbk9iamVjdCAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIFNQRUNJRVMgICA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE8sIEQpe1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yLCBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59OyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBkZWZpbmVkICAgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUT19TVFJJTkcpe1xuICByZXR1cm4gZnVuY3Rpb24odGhhdCwgcG9zKXtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKVxuICAgICAgLCBpID0gdG9JbnRlZ2VyKHBvcylcbiAgICAgICwgbCA9IHMubGVuZ3RoXG4gICAgICAsIGEsIGI7XG4gICAgaWYoaSA8IDAgfHwgaSA+PSBsKXJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59OyIsInZhciBjdHggICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGludm9rZSAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2ludm9rZScpXG4gICwgaHRtbCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faHRtbCcpXG4gICwgY2VsICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpXG4gICwgZ2xvYmFsICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIHNldFRhc2sgICAgICAgICAgICA9IGdsb2JhbC5zZXRJbW1lZGlhdGVcbiAgLCBjbGVhclRhc2sgICAgICAgICAgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGVcbiAgLCBNZXNzYWdlQ2hhbm5lbCAgICAgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWxcbiAgLCBjb3VudGVyICAgICAgICAgICAgPSAwXG4gICwgcXVldWUgICAgICAgICAgICAgID0ge31cbiAgLCBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJ1xuICAsIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uKCl7XG4gIHZhciBpZCA9ICt0aGlzO1xuICBpZihxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpe1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCl7XG4gIHJ1bi5jYWxsKGV2ZW50LmRhdGEpO1xufTtcbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spe1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKXtcbiAgICB2YXIgYXJncyA9IFtdLCBpID0gMTtcbiAgICB3aGlsZShhcmd1bWVudHMubGVuZ3RoID4gaSlhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbigpe1xuICAgICAgaW52b2tlKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbiksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyVGFzayA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKXtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYocmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIH0gZWxzZSBpZihNZXNzYWdlQ2hhbm5lbCl7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbDtcbiAgICBwb3J0ICAgID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNlbCgnc2NyaXB0Jykpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjZWwoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24oKXtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6ICAgc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTsiLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgbWF4ICAgICAgID0gTWF0aC5tYXhcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaW5kZXgsIGxlbmd0aCl7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59OyIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgID0gTWF0aC5jZWlsXG4gICwgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTsiLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpXG4gICwgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59OyIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59OyIsIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTsiLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBTKXtcbiAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZihTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgaWYoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTsiLCJ2YXIgaWQgPSAwXG4gICwgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTsiLCJ2YXIgc3RvcmUgICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKVxuICAsIHVpZCAgICAgICAgPSByZXF1aXJlKCcuL191aWQnKVxuICAsIFN5bWJvbCAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2xcbiAgLCBVU0VfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xuXG52YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTsiLCJ2YXIgY2xhc3NvZiAgID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgSVRFUkFUT1IgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29yZScpLmdldEl0ZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCAhPSB1bmRlZmluZWQpcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpXG4gICwgc3RlcCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpXG4gICwgSXRlcmF0b3JzICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgdG9JT2JqZWN0ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwga2luZCAgPSB0aGlzLl9rXG4gICAgLCBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpe1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYoa2luZCA9PSAna2V5cycgIClyZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpOyIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCB0ZXN0ICAgID0ge307XG50ZXN0W3JlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpXSA9ICd6JztcbmlmKHRlc3QgKyAnJyAhPSAnW29iamVjdCB6XScpe1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG4gICAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nO1xuICB9LCB0cnVlKTtcbn0iLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgZ2xvYmFsICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjdHggICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGNsYXNzb2YgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsICRleHBvcnQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgaXNPYmplY3QgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBhRnVuY3Rpb24gICAgICAgICAgPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcbiAgLCBhbkluc3RhbmNlICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpXG4gICwgZm9yT2YgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZm9yLW9mJylcbiAgLCBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJylcbiAgLCB0YXNrICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL190YXNrJykuc2V0XG4gICwgbWljcm90YXNrICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKVxuICAsIFBST01JU0UgICAgICAgICAgICA9ICdQcm9taXNlJ1xuICAsIFR5cGVFcnJvciAgICAgICAgICA9IGdsb2JhbC5UeXBlRXJyb3JcbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsICRQcm9taXNlICAgICAgICAgICA9IGdsb2JhbFtQUk9NSVNFXVxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgaXNOb2RlICAgICAgICAgICAgID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2VzcydcbiAgLCBlbXB0eSAgICAgICAgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XG4gICwgSW50ZXJuYWwsIEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgV3JhcHBlcjtcblxudmFyIFVTRV9OQVRJVkUgPSAhIWZ1bmN0aW9uKCl7XG4gIHRyeSB7XG4gICAgLy8gY29ycmVjdCBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgICAgID0gJFByb21pc2UucmVzb2x2ZSgxKVxuICAgICAgLCBGYWtlUHJvbWlzZSA9IChwcm9taXNlLmNvbnN0cnVjdG9yID0ge30pW3JlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyldID0gZnVuY3Rpb24oZXhlYyl7IGV4ZWMoZW1wdHksIGVtcHR5KTsgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKSAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2U7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbn0oKTtcblxuLy8gaGVscGVyc1xudmFyIHNhbWVDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKGEsIGIpe1xuICAvLyB3aXRoIGxpYnJhcnkgd3JhcHBlciBzcGVjaWFsIGNhc2VcbiAgcmV0dXJuIGEgPT09IGIgfHwgYSA9PT0gJFByb21pc2UgJiYgYiA9PT0gV3JhcHBlcjtcbn07XG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbihDKXtcbiAgcmV0dXJuIHNhbWVDb25zdHJ1Y3RvcigkUHJvbWlzZSwgQylcbiAgICA/IG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgIDogbmV3IEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbihDKXtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24oJCRyZXNvbHZlLCAkJHJlamVjdCl7XG4gICAgaWYocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCAgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59O1xudmFyIHBlcmZvcm0gPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICBleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHtlcnJvcjogZX07XG4gIH1cbn07XG52YXIgbm90aWZ5ID0gZnVuY3Rpb24ocHJvbWlzZSwgaXNSZWplY3Qpe1xuICBpZihwcm9taXNlLl9uKXJldHVybjtcbiAgcHJvbWlzZS5fbiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2M7XG4gIG1pY3JvdGFzayhmdW5jdGlvbigpe1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3ZcbiAgICAgICwgb2sgICAgPSBwcm9taXNlLl9zID09IDFcbiAgICAgICwgaSAgICAgPSAwO1xuICAgIHZhciBydW4gPSBmdW5jdGlvbihyZWFjdGlvbil7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsXG4gICAgICAgICwgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmVcbiAgICAgICAgLCByZWplY3QgID0gcmVhY3Rpb24ucmVqZWN0XG4gICAgICAgICwgZG9tYWluICA9IHJlYWN0aW9uLmRvbWFpblxuICAgICAgICAsIHJlc3VsdCwgdGhlbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmKGhhbmRsZXIpe1xuICAgICAgICAgIGlmKCFvayl7XG4gICAgICAgICAgICBpZihwcm9taXNlLl9oID09IDIpb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgICAgICAgICBwcm9taXNlLl9oID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoaGFuZGxlciA9PT0gdHJ1ZSlyZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmKGRvbWFpbilkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpO1xuICAgICAgICAgICAgaWYoZG9tYWluKWRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSl7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZih0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKXtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoKGUpe1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZShjaGFpbi5sZW5ndGggPiBpKXJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmKGlzUmVqZWN0ICYmICFwcm9taXNlLl9oKW9uVW5oYW5kbGVkKHByb21pc2UpO1xuICB9KTtcbn07XG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24oKXtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92XG4gICAgICAsIGFicnVwdCwgaGFuZGxlciwgY29uc29sZTtcbiAgICBpZihpc1VuaGFuZGxlZChwcm9taXNlKSl7XG4gICAgICBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKGlzTm9kZSl7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZihoYW5kbGVyID0gZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKXtcbiAgICAgICAgICBoYW5kbGVyKHtwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlfSk7XG4gICAgICAgIH0gZWxzZSBpZigoY29uc29sZSA9IGdsb2JhbC5jb25zb2xlKSAmJiBjb25zb2xlLmVycm9yKXtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYoYWJydXB0KXRocm93IGFicnVwdC5lcnJvcjtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIGlmKHByb21pc2UuX2ggPT0gMSlyZXR1cm4gZmFsc2U7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2EgfHwgcHJvbWlzZS5fY1xuICAgICwgaSAgICAgPSAwXG4gICAgLCByZWFjdGlvbjtcbiAgd2hpbGUoY2hhaW4ubGVuZ3RoID4gaSl7XG4gICAgcmVhY3Rpb24gPSBjaGFpbltpKytdO1xuICAgIGlmKHJlYWN0aW9uLmZhaWwgfHwgIWlzVW5oYW5kbGVkKHJlYWN0aW9uLnByb21pc2UpKXJldHVybiBmYWxzZTtcbiAgfSByZXR1cm4gdHJ1ZTtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24oKXtcbiAgICB2YXIgaGFuZGxlcjtcbiAgICBpZihpc05vZGUpe1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub25yZWplY3Rpb25oYW5kbGVkKXtcbiAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdn0pO1xuICAgIH1cbiAgfSk7XG59O1xudmFyICRyZWplY3QgPSBmdW5jdGlvbih2YWx1ZSl7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYocHJvbWlzZS5fZClyZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICBwcm9taXNlLl9zID0gMjtcbiAgaWYoIXByb21pc2UuX2EpcHJvbWlzZS5fYSA9IHByb21pc2UuX2Muc2xpY2UoKTtcbiAgbm90aWZ5KHByb21pc2UsIHRydWUpO1xufTtcbnZhciAkcmVzb2x2ZSA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIHByb21pc2UgPSB0aGlzXG4gICAgLCB0aGVuO1xuICBpZihwcm9taXNlLl9kKXJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmKHByb21pc2UgPT09IHZhbHVlKXRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSl7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7X3c6IHByb21pc2UsIF9kOiBmYWxzZX07IC8vIHdyYXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGN0eCgkcmVzb2x2ZSwgd3JhcHBlciwgMSksIGN0eCgkcmVqZWN0LCB3cmFwcGVyLCAxKSk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgJHJlamVjdC5jYWxsKHdyYXBwZXIsIGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fcyA9IDE7XG4gICAgICBub3RpZnkocHJvbWlzZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaChlKXtcbiAgICAkcmVqZWN0LmNhbGwoe193OiBwcm9taXNlLCBfZDogZmFsc2V9LCBlKTsgLy8gd3JhcFxuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYoIVVTRV9OQVRJVkUpe1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICAkUHJvbWlzZSA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3Ipe1xuICAgIGFuSW5zdGFuY2UodGhpcywgJFByb21pc2UsIFBST01JU0UsICdfaCcpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoY3R4KCRyZXNvbHZlLCB0aGlzLCAxKSwgY3R4KCRyZWplY3QsIHRoaXMsIDEpKTtcbiAgICB9IGNhdGNoKGVycil7XG4gICAgICAkcmVqZWN0LmNhbGwodGhpcywgZXJyKTtcbiAgICB9XG4gIH07XG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcil7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKXtcbiAgICAgIHZhciByZWFjdGlvbiAgICA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkUHJvbWlzZSkpO1xuICAgICAgcmVhY3Rpb24ub2sgICAgID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsICAgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBpc05vZGUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2MucHVzaChyZWFjdGlvbik7XG4gICAgICBpZih0aGlzLl9hKXRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZih0aGlzLl9zKW5vdGlmeSh0aGlzLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24ob25SZWplY3RlZCl7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbigpe1xuICAgIHZhciBwcm9taXNlICA9IG5ldyBJbnRlcm5hbDtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGN0eCgkcmVzb2x2ZSwgcHJvbWlzZSwgMSk7XG4gICAgdGhpcy5yZWplY3QgID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7UHJvbWlzZTogJFByb21pc2V9KTtcbnJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJykoJFByb21pc2UsIFBST01JU0UpO1xucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKShQUk9NSVNFKTtcbldyYXBwZXIgPSByZXF1aXJlKCcuL19jb3JlJylbUFJPTUlTRV07XG5cbi8vIHN0YXRpY3NcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjUgUHJvbWlzZS5yZWplY3QocilcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocil7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKVxuICAgICAgLCAkJHJlamVjdCAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgJCRyZWplY3Qocik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChMSUJSQVJZIHx8ICFVU0VfTkFUSVZFKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNiBQcm9taXNlLnJlc29sdmUoeClcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KXtcbiAgICAvLyBpbnN0YW5jZW9mIGluc3RlYWQgb2YgaW50ZXJuYWwgc2xvdCBjaGVjayBiZWNhdXNlIHdlIHNob3VsZCBmaXggaXQgd2l0aG91dCByZXBsYWNlbWVudCBuYXRpdmUgUHJvbWlzZSBjb3JlXG4gICAgaWYoeCBpbnN0YW5jZW9mICRQcm9taXNlICYmIHNhbWVDb25zdHJ1Y3Rvcih4LmNvbnN0cnVjdG9yLCB0aGlzKSlyZXR1cm4geDtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpXG4gICAgICAsICQkcmVzb2x2ZSAgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgJCRyZXNvbHZlKHgpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKFVTRV9OQVRJVkUgJiYgcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbihpdGVyKXtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpe1xuICAgIHZhciBDICAgICAgICAgID0gdGhpc1xuICAgICAgLCBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgICwgcmVzb2x2ZSAgICA9IGNhcGFiaWxpdHkucmVzb2x2ZVxuICAgICAgLCByZWplY3QgICAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgIHZhciB2YWx1ZXMgICAgPSBbXVxuICAgICAgICAsIGluZGV4ICAgICA9IDBcbiAgICAgICAgLCByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbihwcm9taXNlKXtcbiAgICAgICAgdmFyICRpbmRleCAgICAgICAgPSBpbmRleCsrXG4gICAgICAgICAgLCBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihmdW5jdGlvbih2YWx1ZSl7XG4gICAgICAgICAgaWYoYWxyZWFkeUNhbGxlZClyZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCAgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1skaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYoYWJydXB0KXJlamVjdChhYnJ1cHQuZXJyb3IpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIDI1LjQuNC40IFByb21pc2UucmFjZShpdGVyYWJsZSlcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSB0aGlzXG4gICAgICAsIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgLCByZWplY3QgICAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24ocHJvbWlzZSl7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmKGFicnVwdClyZWplY3QoYWJydXB0LmVycm9yKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTsiLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ICA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwgaW5kZXggPSB0aGlzLl9pXG4gICAgLCBwb2ludDtcbiAgaWYoaW5kZXggPj0gTy5sZW5ndGgpcmV0dXJuIHt2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHt2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlfTtcbn0pOyIsInZhciAkaXRlcmF0b3JzICAgID0gcmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKVxuICAsIHJlZGVmaW5lICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgZ2xvYmFsICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGlkZSAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIEl0ZXJhdG9ycyAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIHdrcyAgICAgICAgICAgPSByZXF1aXJlKCcuL193a3MnKVxuICAsIElURVJBVE9SICAgICAgPSB3a3MoJ2l0ZXJhdG9yJylcbiAgLCBUT19TVFJJTkdfVEFHID0gd2tzKCd0b1N0cmluZ1RhZycpXG4gICwgQXJyYXlWYWx1ZXMgICA9IEl0ZXJhdG9ycy5BcnJheTtcblxuZm9yKHZhciBjb2xsZWN0aW9ucyA9IFsnTm9kZUxpc3QnLCAnRE9NVG9rZW5MaXN0JywgJ01lZGlhTGlzdCcsICdTdHlsZVNoZWV0TGlzdCcsICdDU1NSdWxlTGlzdCddLCBpID0gMDsgaSA8IDU7IGkrKyl7XG4gIHZhciBOQU1FICAgICAgID0gY29sbGVjdGlvbnNbaV1cbiAgICAsIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV1cbiAgICAsIHByb3RvICAgICAgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlXG4gICAgLCBrZXk7XG4gIGlmKHByb3RvKXtcbiAgICBpZighcHJvdG9bSVRFUkFUT1JdKWhpZGUocHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgaWYoIXByb3RvW1RPX1NUUklOR19UQUddKWhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IEFycmF5VmFsdWVzO1xuICAgIGZvcihrZXkgaW4gJGl0ZXJhdG9ycylpZighcHJvdG9ba2V5XSlyZWRlZmluZShwcm90bywga2V5LCAkaXRlcmF0b3JzW2tleV0sIHRydWUpO1xuICB9XG59IiwiLy8gKGMpIERlYW4gTWNOYW1lZSA8ZGVhbkBnbWFpbC5jb20+LCAyMDEyLlxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kZWFubS9jc3MtY29sb3ItcGFyc2VyLWpzXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbi8vIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1Ncbi8vIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci9cbnZhciBrQ1NTQ29sb3JUYWJsZSA9IHtcbiAgXCJ0cmFuc3BhcmVudFwiOiBbMCwwLDAsMF0sIFwiYWxpY2VibHVlXCI6IFsyNDAsMjQ4LDI1NSwxXSxcbiAgXCJhbnRpcXVld2hpdGVcIjogWzI1MCwyMzUsMjE1LDFdLCBcImFxdWFcIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJhcXVhbWFyaW5lXCI6IFsxMjcsMjU1LDIxMiwxXSwgXCJhenVyZVwiOiBbMjQwLDI1NSwyNTUsMV0sXG4gIFwiYmVpZ2VcIjogWzI0NSwyNDUsMjIwLDFdLCBcImJpc3F1ZVwiOiBbMjU1LDIyOCwxOTYsMV0sXG4gIFwiYmxhY2tcIjogWzAsMCwwLDFdLCBcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsMjM1LDIwNSwxXSxcbiAgXCJibHVlXCI6IFswLDAsMjU1LDFdLCBcImJsdWV2aW9sZXRcIjogWzEzOCw0MywyMjYsMV0sXG4gIFwiYnJvd25cIjogWzE2NSw0Miw0MiwxXSwgXCJidXJseXdvb2RcIjogWzIyMiwxODQsMTM1LDFdLFxuICBcImNhZGV0Ymx1ZVwiOiBbOTUsMTU4LDE2MCwxXSwgXCJjaGFydHJldXNlXCI6IFsxMjcsMjU1LDAsMV0sXG4gIFwiY2hvY29sYXRlXCI6IFsyMTAsMTA1LDMwLDFdLCBcImNvcmFsXCI6IFsyNTUsMTI3LDgwLDFdLFxuICBcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsMTQ5LDIzNywxXSwgXCJjb3Juc2lsa1wiOiBbMjU1LDI0OCwyMjAsMV0sXG4gIFwiY3JpbXNvblwiOiBbMjIwLDIwLDYwLDFdLCBcImN5YW5cIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJkYXJrYmx1ZVwiOiBbMCwwLDEzOSwxXSwgXCJkYXJrY3lhblwiOiBbMCwxMzksMTM5LDFdLFxuICBcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwxMzQsMTEsMV0sIFwiZGFya2dyYXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtncmVlblwiOiBbMCwxMDAsMCwxXSwgXCJkYXJrZ3JleVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2toYWtpXCI6IFsxODksMTgzLDEwNywxXSwgXCJkYXJrbWFnZW50YVwiOiBbMTM5LDAsMTM5LDFdLFxuICBcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwxMDcsNDcsMV0sIFwiZGFya29yYW5nZVwiOiBbMjU1LDE0MCwwLDFdLFxuICBcImRhcmtvcmNoaWRcIjogWzE1Myw1MCwyMDQsMV0sIFwiZGFya3JlZFwiOiBbMTM5LDAsMCwxXSxcbiAgXCJkYXJrc2FsbW9uXCI6IFsyMzMsMTUwLDEyMiwxXSwgXCJkYXJrc2VhZ3JlZW5cIjogWzE0MywxODgsMTQzLDFdLFxuICBcImRhcmtzbGF0ZWJsdWVcIjogWzcyLDYxLDEzOSwxXSwgXCJkYXJrc2xhdGVncmF5XCI6IFs0Nyw3OSw3OSwxXSxcbiAgXCJkYXJrc2xhdGVncmV5XCI6IFs0Nyw3OSw3OSwxXSwgXCJkYXJrdHVycXVvaXNlXCI6IFswLDIwNiwyMDksMV0sXG4gIFwiZGFya3Zpb2xldFwiOiBbMTQ4LDAsMjExLDFdLCBcImRlZXBwaW5rXCI6IFsyNTUsMjAsMTQ3LDFdLFxuICBcImRlZXBza3libHVlXCI6IFswLDE5MSwyNTUsMV0sIFwiZGltZ3JheVwiOiBbMTA1LDEwNSwxMDUsMV0sXG4gIFwiZGltZ3JleVwiOiBbMTA1LDEwNSwxMDUsMV0sIFwiZG9kZ2VyYmx1ZVwiOiBbMzAsMTQ0LDI1NSwxXSxcbiAgXCJmaXJlYnJpY2tcIjogWzE3OCwzNCwzNCwxXSwgXCJmbG9yYWx3aGl0ZVwiOiBbMjU1LDI1MCwyNDAsMV0sXG4gIFwiZm9yZXN0Z3JlZW5cIjogWzM0LDEzOSwzNCwxXSwgXCJmdWNoc2lhXCI6IFsyNTUsMCwyNTUsMV0sXG4gIFwiZ2FpbnNib3JvXCI6IFsyMjAsMjIwLDIyMCwxXSwgXCJnaG9zdHdoaXRlXCI6IFsyNDgsMjQ4LDI1NSwxXSxcbiAgXCJnb2xkXCI6IFsyNTUsMjE1LDAsMV0sIFwiZ29sZGVucm9kXCI6IFsyMTgsMTY1LDMyLDFdLFxuICBcImdyYXlcIjogWzEyOCwxMjgsMTI4LDFdLCBcImdyZWVuXCI6IFswLDEyOCwwLDFdLFxuICBcImdyZWVueWVsbG93XCI6IFsxNzMsMjU1LDQ3LDFdLCBcImdyZXlcIjogWzEyOCwxMjgsMTI4LDFdLFxuICBcImhvbmV5ZGV3XCI6IFsyNDAsMjU1LDI0MCwxXSwgXCJob3RwaW5rXCI6IFsyNTUsMTA1LDE4MCwxXSxcbiAgXCJpbmRpYW5yZWRcIjogWzIwNSw5Miw5MiwxXSwgXCJpbmRpZ29cIjogWzc1LDAsMTMwLDFdLFxuICBcIml2b3J5XCI6IFsyNTUsMjU1LDI0MCwxXSwgXCJraGFraVwiOiBbMjQwLDIzMCwxNDAsMV0sXG4gIFwibGF2ZW5kZXJcIjogWzIzMCwyMzAsMjUwLDFdLCBcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwyNDAsMjQ1LDFdLFxuICBcImxhd25ncmVlblwiOiBbMTI0LDI1MiwwLDFdLCBcImxlbW9uY2hpZmZvblwiOiBbMjU1LDI1MCwyMDUsMV0sXG4gIFwibGlnaHRibHVlXCI6IFsxNzMsMjE2LDIzMCwxXSwgXCJsaWdodGNvcmFsXCI6IFsyNDAsMTI4LDEyOCwxXSxcbiAgXCJsaWdodGN5YW5cIjogWzIyNCwyNTUsMjU1LDFdLCBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsMjUwLDIxMCwxXSxcbiAgXCJsaWdodGdyYXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0Z3JlZW5cIjogWzE0NCwyMzgsMTQ0LDFdLFxuICBcImxpZ2h0Z3JleVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRwaW5rXCI6IFsyNTUsMTgyLDE5MywxXSxcbiAgXCJsaWdodHNhbG1vblwiOiBbMjU1LDE2MCwxMjIsMV0sIFwibGlnaHRzZWFncmVlblwiOiBbMzIsMTc4LDE3MCwxXSxcbiAgXCJsaWdodHNreWJsdWVcIjogWzEzNSwyMDYsMjUwLDFdLCBcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksMTM2LDE1MywxXSxcbiAgXCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LDEzNiwxNTMsMV0sIFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwxOTYsMjIyLDFdLFxuICBcImxpZ2h0eWVsbG93XCI6IFsyNTUsMjU1LDIyNCwxXSwgXCJsaW1lXCI6IFswLDI1NSwwLDFdLFxuICBcImxpbWVncmVlblwiOiBbNTAsMjA1LDUwLDFdLCBcImxpbmVuXCI6IFsyNTAsMjQwLDIzMCwxXSxcbiAgXCJtYWdlbnRhXCI6IFsyNTUsMCwyNTUsMV0sIFwibWFyb29uXCI6IFsxMjgsMCwwLDFdLFxuICBcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwyMDUsMTcwLDFdLCBcIm1lZGl1bWJsdWVcIjogWzAsMCwyMDUsMV0sXG4gIFwibWVkaXVtb3JjaGlkXCI6IFsxODYsODUsMjExLDFdLCBcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LDExMiwyMTksMV0sXG4gIFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLDE3OSwxMTMsMV0sIFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsMTA0LDIzOCwxXSxcbiAgXCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwyNTAsMTU0LDFdLCBcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsMjA5LDIwNCwxXSxcbiAgXCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwyMSwxMzMsMV0sIFwibWlkbmlnaHRibHVlXCI6IFsyNSwyNSwxMTIsMV0sXG4gIFwibWludGNyZWFtXCI6IFsyNDUsMjU1LDI1MCwxXSwgXCJtaXN0eXJvc2VcIjogWzI1NSwyMjgsMjI1LDFdLFxuICBcIm1vY2Nhc2luXCI6IFsyNTUsMjI4LDE4MSwxXSwgXCJuYXZham93aGl0ZVwiOiBbMjU1LDIyMiwxNzMsMV0sXG4gIFwibmF2eVwiOiBbMCwwLDEyOCwxXSwgXCJvbGRsYWNlXCI6IFsyNTMsMjQ1LDIzMCwxXSxcbiAgXCJvbGl2ZVwiOiBbMTI4LDEyOCwwLDFdLCBcIm9saXZlZHJhYlwiOiBbMTA3LDE0MiwzNSwxXSxcbiAgXCJvcmFuZ2VcIjogWzI1NSwxNjUsMCwxXSwgXCJvcmFuZ2VyZWRcIjogWzI1NSw2OSwwLDFdLFxuICBcIm9yY2hpZFwiOiBbMjE4LDExMiwyMTQsMV0sIFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LDIzMiwxNzAsMV0sXG4gIFwicGFsZWdyZWVuXCI6IFsxNTIsMjUxLDE1MiwxXSwgXCJwYWxldHVycXVvaXNlXCI6IFsxNzUsMjM4LDIzOCwxXSxcbiAgXCJwYWxldmlvbGV0cmVkXCI6IFsyMTksMTEyLDE0NywxXSwgXCJwYXBheWF3aGlwXCI6IFsyNTUsMjM5LDIxMywxXSxcbiAgXCJwZWFjaHB1ZmZcIjogWzI1NSwyMTgsMTg1LDFdLCBcInBlcnVcIjogWzIwNSwxMzMsNjMsMV0sXG4gIFwicGlua1wiOiBbMjU1LDE5MiwyMDMsMV0sIFwicGx1bVwiOiBbMjIxLDE2MCwyMjEsMV0sXG4gIFwicG93ZGVyYmx1ZVwiOiBbMTc2LDIyNCwyMzAsMV0sIFwicHVycGxlXCI6IFsxMjgsMCwxMjgsMV0sXG4gIFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLDUxLDE1MywxXSxcbiAgXCJyZWRcIjogWzI1NSwwLDAsMV0sIFwicm9zeWJyb3duXCI6IFsxODgsMTQzLDE0MywxXSxcbiAgXCJyb3lhbGJsdWVcIjogWzY1LDEwNSwyMjUsMV0sIFwic2FkZGxlYnJvd25cIjogWzEzOSw2OSwxOSwxXSxcbiAgXCJzYWxtb25cIjogWzI1MCwxMjgsMTE0LDFdLCBcInNhbmR5YnJvd25cIjogWzI0NCwxNjQsOTYsMV0sXG4gIFwic2VhZ3JlZW5cIjogWzQ2LDEzOSw4NywxXSwgXCJzZWFzaGVsbFwiOiBbMjU1LDI0NSwyMzgsMV0sXG4gIFwic2llbm5hXCI6IFsxNjAsODIsNDUsMV0sIFwic2lsdmVyXCI6IFsxOTIsMTkyLDE5MiwxXSxcbiAgXCJza3libHVlXCI6IFsxMzUsMjA2LDIzNSwxXSwgXCJzbGF0ZWJsdWVcIjogWzEwNiw5MCwyMDUsMV0sXG4gIFwic2xhdGVncmF5XCI6IFsxMTIsMTI4LDE0NCwxXSwgXCJzbGF0ZWdyZXlcIjogWzExMiwxMjgsMTQ0LDFdLFxuICBcInNub3dcIjogWzI1NSwyNTAsMjUwLDFdLCBcInNwcmluZ2dyZWVuXCI6IFswLDI1NSwxMjcsMV0sXG4gIFwic3RlZWxibHVlXCI6IFs3MCwxMzAsMTgwLDFdLCBcInRhblwiOiBbMjEwLDE4MCwxNDAsMV0sXG4gIFwidGVhbFwiOiBbMCwxMjgsMTI4LDFdLCBcInRoaXN0bGVcIjogWzIxNiwxOTEsMjE2LDFdLFxuICBcInRvbWF0b1wiOiBbMjU1LDk5LDcxLDFdLCBcInR1cnF1b2lzZVwiOiBbNjQsMjI0LDIwOCwxXSxcbiAgXCJ2aW9sZXRcIjogWzIzOCwxMzAsMjM4LDFdLCBcIndoZWF0XCI6IFsyNDUsMjIyLDE3OSwxXSxcbiAgXCJ3aGl0ZVwiOiBbMjU1LDI1NSwyNTUsMV0sIFwid2hpdGVzbW9rZVwiOiBbMjQ1LDI0NSwyNDUsMV0sXG4gIFwieWVsbG93XCI6IFsyNTUsMjU1LDAsMV0sIFwieWVsbG93Z3JlZW5cIjogWzE1NCwyMDUsNTAsMV19XG5cbmZ1bmN0aW9uIGNsYW1wX2Nzc19ieXRlKGkpIHsgIC8vIENsYW1wIHRvIGludGVnZXIgMCAuLiAyNTUuXG4gIGkgPSBNYXRoLnJvdW5kKGkpOyAgLy8gU2VlbXMgdG8gYmUgd2hhdCBDaHJvbWUgZG9lcyAodnMgdHJ1bmNhdGlvbikuXG4gIHJldHVybiBpIDwgMCA/IDAgOiBpID4gMjU1ID8gMjU1IDogaTtcbn1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2Zsb2F0KGYpIHsgIC8vIENsYW1wIHRvIGZsb2F0IDAuMCAuLiAxLjAuXG4gIHJldHVybiBmIDwgMCA/IDAgOiBmID4gMSA/IDEgOiBmO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfaW50KHN0cikgeyAgLy8gaW50IG9yIHBlcmNlbnRhZ2UuXG4gIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnJScpXG4gICAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlRmxvYXQoc3RyKSAvIDEwMCAqIDI1NSk7XG4gIHJldHVybiBjbGFtcF9jc3NfYnl0ZShwYXJzZUludChzdHIpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3NzX2Zsb2F0KHN0cikgeyAgLy8gZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2Zsb2F0KHBhcnNlRmxvYXQoc3RyKSAvIDEwMCk7XG4gIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpKTtcbn1cblxuZnVuY3Rpb24gY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSB7XG4gIGlmIChoIDwgMCkgaCArPSAxO1xuICBlbHNlIGlmIChoID4gMSkgaCAtPSAxO1xuXG4gIGlmIChoICogNiA8IDEpIHJldHVybiBtMSArIChtMiAtIG0xKSAqIGggKiA2O1xuICBpZiAoaCAqIDIgPCAxKSByZXR1cm4gbTI7XG4gIGlmIChoICogMyA8IDIpIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyLzMgLSBoKSAqIDY7XG4gIHJldHVybiBtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VDU1NDb2xvcihjc3Nfc3RyKSB7XG4gIC8vIFJlbW92ZSBhbGwgd2hpdGVzcGFjZSwgbm90IGNvbXBsaWFudCwgYnV0IHNob3VsZCBqdXN0IGJlIG1vcmUgYWNjZXB0aW5nLlxuICB2YXIgc3RyID0gY3NzX3N0ci5yZXBsYWNlKC8gL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIENvbG9yIGtleXdvcmRzIChhbmQgdHJhbnNwYXJlbnQpIGxvb2t1cC5cbiAgaWYgKHN0ciBpbiBrQ1NTQ29sb3JUYWJsZSkgcmV0dXJuIGtDU1NDb2xvclRhYmxlW3N0cl0uc2xpY2UoKTsgIC8vIGR1cC5cblxuICAvLyAjYWJjIGFuZCAjYWJjMTIzIHN5bnRheC5cbiAgaWYgKHN0clswXSA9PT0gJyMnKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPT09IDQpIHtcbiAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZikpIHJldHVybiBudWxsOyAgLy8gQ292ZXJzIE5hTi5cbiAgICAgIHJldHVybiBbKChpdiAmIDB4ZjAwKSA+PiA0KSB8ICgoaXYgJiAweGYwMCkgPj4gOCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZjApIHwgKChpdiAmIDB4ZjApID4+IDQpLFxuICAgICAgICAgICAgICAoaXYgJiAweGYpIHwgKChpdiAmIDB4ZikgPDwgNCksXG4gICAgICAgICAgICAgIDFdO1xuICAgIH0gZWxzZSBpZiAoc3RyLmxlbmd0aCA9PT0gNykge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoaXYgJiAweGZmMDAwMCkgPj4gMTYsXG4gICAgICAgICAgICAgIChpdiAmIDB4ZmYwMCkgPj4gOCxcbiAgICAgICAgICAgICAgaXYgJiAweGZmLFxuICAgICAgICAgICAgICAxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBvcCA9IHN0ci5pbmRleE9mKCcoJyksIGVwID0gc3RyLmluZGV4T2YoJyknKTtcbiAgaWYgKG9wICE9PSAtMSAmJiBlcCArIDEgPT09IHN0ci5sZW5ndGgpIHtcbiAgICB2YXIgZm5hbWUgPSBzdHIuc3Vic3RyKDAsIG9wKTtcbiAgICB2YXIgcGFyYW1zID0gc3RyLnN1YnN0cihvcCsxLCBlcC0ob3ArMSkpLnNwbGl0KCcsJyk7XG4gICAgdmFyIGFscGhhID0gMTsgIC8vIFRvIGFsbG93IGNhc2UgZmFsbHRocm91Z2guXG4gICAgc3dpdGNoIChmbmFtZSkge1xuICAgICAgY2FzZSAncmdiYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAncmdiJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gW3BhcnNlX2Nzc19pbnQocGFyYW1zWzBdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1sxXSksXG4gICAgICAgICAgICAgICAgcGFyc2VfY3NzX2ludChwYXJhbXNbMl0pLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGNhc2UgJ2hzbGEnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGFscGhhID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtcy5wb3AoKSk7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJ2hzbCc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGggPSAoKChwYXJzZUZsb2F0KHBhcmFtc1swXSkgJSAzNjApICsgMzYwKSAlIDM2MCkgLyAzNjA7ICAvLyAwIC4uIDFcbiAgICAgICAgLy8gTk9URShkZWFubSk6IEFjY29yZGluZyB0byB0aGUgQ1NTIHNwZWMgcy9sIHNob3VsZCBvbmx5IGJlXG4gICAgICAgIC8vIHBlcmNlbnRhZ2VzLCBidXQgd2UgZG9uJ3QgYm90aGVyIGFuZCBsZXQgZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgICAgICAgdmFyIHMgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzFdKTtcbiAgICAgICAgdmFyIGwgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzJdKTtcbiAgICAgICAgdmFyIG0yID0gbCA8PSAwLjUgPyBsICogKHMgKyAxKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgICAgIHZhciBtMSA9IGwgKiAyIC0gbTI7XG4gICAgICAgIHJldHVybiBbY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKzEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCkgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaC0xLzMpICogMjU1KSxcbiAgICAgICAgICAgICAgICBhbHBoYV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudHJ5IHsgZXhwb3J0cy5wYXJzZUNTU0NvbG9yID0gcGFyc2VDU1NDb2xvciB9IGNhdGNoKGUpIHsgfVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVhcmN1dDtcblxuZnVuY3Rpb24gZWFyY3V0KGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0pIHtcblxuICAgIGRpbSA9IGRpbSB8fCAyO1xuXG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoLFxuICAgICAgICBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aCxcbiAgICAgICAgb3V0ZXJOb2RlID0gbGlua2VkTGlzdChkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlKSxcbiAgICAgICAgdHJpYW5nbGVzID0gW107XG5cbiAgICBpZiAoIW91dGVyTm9kZSkgcmV0dXJuIHRyaWFuZ2xlcztcblxuICAgIHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBzaXplO1xuXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xuXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcbiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdO1xuICAgICAgICBtaW5ZID0gbWF4WSA9IGRhdGFbMV07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xuICAgICAgICAgICAgeCA9IGRhdGFbaV07XG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgc2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cbiAgICAgICAgc2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgfVxuXG4gICAgZWFyY3V0TGlua2VkKG91dGVyTm9kZSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgcmV0dXJuIHRyaWFuZ2xlcztcbn1cblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5mdW5jdGlvbiBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlKSB7XG4gICAgdmFyIGksIGxhc3Q7XG5cbiAgICBpZiAoY2xvY2t3aXNlID09PSAoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pID4gMCkpIHtcbiAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpID0gZW5kIC0gZGltOyBpID49IHN0YXJ0OyBpIC09IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH1cblxuICAgIGlmIChsYXN0ICYmIGVxdWFscyhsYXN0LCBsYXN0Lm5leHQpKSB7XG4gICAgICAgIHJlbW92ZU5vZGUobGFzdCk7XG4gICAgICAgIGxhc3QgPSBsYXN0Lm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3Q7XG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5mdW5jdGlvbiBmaWx0ZXJQb2ludHMoc3RhcnQsIGVuZCkge1xuICAgIGlmICghc3RhcnQpIHJldHVybiBzdGFydDtcbiAgICBpZiAoIWVuZCkgZW5kID0gc3RhcnQ7XG5cbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBhZ2FpbjtcbiAgICBkbyB7XG4gICAgICAgIGFnYWluID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFwLnN0ZWluZXIgJiYgKGVxdWFscyhwLCBwLm5leHQpIHx8IGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID09PSAwKSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcbiAgICAgICAgICAgIHAgPSBlbmQgPSBwLnByZXY7XG4gICAgICAgICAgICBpZiAocCA9PT0gcC5uZXh0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGFnYWluID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcCA9IHAubmV4dDtcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKGFnYWluIHx8IHAgIT09IGVuZCk7XG5cbiAgICByZXR1cm4gZW5kO1xufVxuXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCBwYXNzKSB7XG4gICAgaWYgKCFlYXIpIHJldHVybjtcblxuICAgIC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbiAgICBpZiAoIXBhc3MgJiYgc2l6ZSkgaW5kZXhDdXJ2ZShlYXIsIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgdmFyIHN0b3AgPSBlYXIsXG4gICAgICAgIHByZXYsIG5leHQ7XG5cbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmVcbiAgICB3aGlsZSAoZWFyLnByZXYgIT09IGVhci5uZXh0KSB7XG4gICAgICAgIHByZXYgPSBlYXIucHJldjtcbiAgICAgICAgbmV4dCA9IGVhci5uZXh0O1xuXG4gICAgICAgIGlmIChzaXplID8gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBzaXplKSA6IGlzRWFyKGVhcikpIHtcbiAgICAgICAgICAgIC8vIGN1dCBvZmYgdGhlIHRyaWFuZ2xlXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChwcmV2LmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goZWFyLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gobmV4dC5pIC8gZGltKTtcblxuICAgICAgICAgICAgcmVtb3ZlTm9kZShlYXIpO1xuXG4gICAgICAgICAgICAvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0aWNlIGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuICAgICAgICAgICAgZWFyID0gbmV4dC5uZXh0O1xuICAgICAgICAgICAgc3RvcCA9IG5leHQubmV4dDtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlYXIgPSBuZXh0O1xuXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXG4gICAgICAgIGlmIChlYXIgPT09IHN0b3ApIHtcbiAgICAgICAgICAgIC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCAxKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZWFyLCB0cmlhbmdsZXMsIGRpbSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUsIDIpO1xuXG4gICAgICAgICAgICAvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAyKSB7XG4gICAgICAgICAgICAgICAgc3BsaXRFYXJjdXQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBjaGVjayB3aGV0aGVyIGEgcG9seWdvbiBub2RlIGZvcm1zIGEgdmFsaWQgZWFyIHdpdGggYWRqYWNlbnQgbm9kZXNcbmZ1bmN0aW9uIGlzRWFyKGVhcikge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBvdGhlciBwb2ludHMgaW5zaWRlIHRoZSBwb3RlbnRpYWwgZWFyXG4gICAgdmFyIHAgPSBlYXIubmV4dC5uZXh0O1xuXG4gICAgd2hpbGUgKHAgIT09IGVhci5wcmV2KSB7XG4gICAgICAgIGlmIChwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIHRyaWFuZ2xlIGJib3g7IG1pbiAmIG1heCBhcmUgY2FsY3VsYXRlZCBsaWtlIHRoaXMgZm9yIHNwZWVkXG4gICAgdmFyIG1pblRYID0gYS54IDwgYi54ID8gKGEueCA8IGMueCA/IGEueCA6IGMueCkgOiAoYi54IDwgYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWluVFkgPSBhLnkgPCBiLnkgPyAoYS55IDwgYy55ID8gYS55IDogYy55KSA6IChiLnkgPCBjLnkgPyBiLnkgOiBjLnkpLFxuICAgICAgICBtYXhUWCA9IGEueCA+IGIueCA/IChhLnggPiBjLnggPyBhLnggOiBjLngpIDogKGIueCA+IGMueCA/IGIueCA6IGMueCksXG4gICAgICAgIG1heFRZID0gYS55ID4gYi55ID8gKGEueSA+IGMueSA/IGEueSA6IGMueSkgOiAoYi55ID4gYy55ID8gYi55IDogYy55KTtcblxuICAgIC8vIHotb3JkZXIgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHRyaWFuZ2xlIGJib3g7XG4gICAgdmFyIG1pblogPSB6T3JkZXIobWluVFgsIG1pblRZLCBtaW5YLCBtaW5ZLCBzaXplKSxcbiAgICAgICAgbWF4WiA9IHpPcmRlcihtYXhUWCwgbWF4VFksIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgLy8gZmlyc3QgbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgaW4gaW5jcmVhc2luZyB6LW9yZGVyXG4gICAgdmFyIHAgPSBlYXIubmV4dFo7XG5cbiAgICB3aGlsZSAocCAmJiBwLnogPD0gbWF4Wikge1xuICAgICAgICBpZiAocCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgfVxuXG4gICAgLy8gdGhlbiBsb29rIGZvciBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyXG4gICAgcCA9IGVhci5wcmV2WjtcblxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5wcmV2WjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcywgZGltKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBhID0gcC5wcmV2LFxuICAgICAgICAgICAgYiA9IHAubmV4dC5uZXh0O1xuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcblxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYS5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChiLmkgLyBkaW0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwLm5leHQpO1xuXG4gICAgICAgICAgICBwID0gc3RhcnQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIHA7XG59XG5cbi8vIHRyeSBzcGxpdHRpbmcgcG9seWdvbiBpbnRvIHR3byBhbmQgdHJpYW5ndWxhdGUgdGhlbSBpbmRlcGVuZGVudGx5XG5mdW5jdGlvbiBzcGxpdEVhcmN1dChzdGFydCwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpIHtcbiAgICAvLyBsb29rIGZvciBhIHZhbGlkIGRpYWdvbmFsIHRoYXQgZGl2aWRlcyB0aGUgcG9seWdvbiBpbnRvIHR3b1xuICAgIHZhciBhID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICB2YXIgYiA9IGEubmV4dC5uZXh0O1xuICAgICAgICB3aGlsZSAoYiAhPT0gYS5wcmV2KSB7XG4gICAgICAgICAgICBpZiAoYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKGEsIGIpKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbFxuICAgICAgICAgICAgICAgIHZhciBjID0gc3BsaXRQb2x5Z29uKGEsIGIpO1xuXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcbiAgICAgICAgICAgICAgICBhID0gZmlsdGVyUG9pbnRzKGEsIGEubmV4dCk7XG4gICAgICAgICAgICAgICAgYyA9IGZpbHRlclBvaW50cyhjLCBjLm5leHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChjLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYiA9IGIubmV4dDtcbiAgICAgICAgfVxuICAgICAgICBhID0gYS5uZXh0O1xuICAgIH0gd2hpbGUgKGEgIT09IHN0YXJ0KTtcbn1cblxuLy8gbGluayBldmVyeSBob2xlIGludG8gdGhlIG91dGVyIGxvb3AsIHByb2R1Y2luZyBhIHNpbmdsZS1yaW5nIHBvbHlnb24gd2l0aG91dCBob2xlc1xuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltKSB7XG4gICAgdmFyIHF1ZXVlID0gW10sXG4gICAgICAgIGksIGxlbiwgc3RhcnQsIGVuZCwgbGlzdDtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XG4gICAgICAgIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgIGxpc3QgPSBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgZmFsc2UpO1xuICAgICAgICBpZiAobGlzdCA9PT0gbGlzdC5uZXh0KSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuICAgICAgICBxdWV1ZS5wdXNoKGdldExlZnRtb3N0KGxpc3QpKTtcbiAgICB9XG5cbiAgICBxdWV1ZS5zb3J0KGNvbXBhcmVYKTtcblxuICAgIC8vIHByb2Nlc3MgaG9sZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0XG4gICAgZm9yIChpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVsaW1pbmF0ZUhvbGUocXVldWVbaV0sIG91dGVyTm9kZSk7XG4gICAgICAgIG91dGVyTm9kZSA9IGZpbHRlclBvaW50cyhvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0ZXJOb2RlO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlWChhLCBiKSB7XG4gICAgcmV0dXJuIGEueCAtIGIueDtcbn1cblxuLy8gZmluZCBhIGJyaWRnZSBiZXR3ZWVuIHZlcnRpY2VzIHRoYXQgY29ubmVjdHMgaG9sZSB3aXRoIGFuIG91dGVyIHJpbmcgYW5kIGFuZCBsaW5rIGl0XG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIG91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSk7XG4gICAgaWYgKG91dGVyTm9kZSkge1xuICAgICAgICB2YXIgYiA9IHNwbGl0UG9seWdvbihvdXRlck5vZGUsIGhvbGUpO1xuICAgICAgICBmaWx0ZXJQb2ludHMoYiwgYi5uZXh0KTtcbiAgICB9XG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cbmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIHZhciBwID0gb3V0ZXJOb2RlLFxuICAgICAgICBoeCA9IGhvbGUueCxcbiAgICAgICAgaHkgPSBob2xlLnksXG4gICAgICAgIHF4ID0gLUluZmluaXR5LFxuICAgICAgICBtO1xuXG4gICAgLy8gZmluZCBhIHNlZ21lbnQgaW50ZXJzZWN0ZWQgYnkgYSByYXkgZnJvbSB0aGUgaG9sZSdzIGxlZnRtb3N0IHBvaW50IHRvIHRoZSBsZWZ0O1xuICAgIC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcbiAgICBkbyB7XG4gICAgICAgIGlmIChoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcC54ICsgKGh5IC0gcC55KSAqIChwLm5leHQueCAtIHAueCkgLyAocC5uZXh0LnkgLSBwLnkpO1xuICAgICAgICAgICAgaWYgKHggPD0gaHggJiYgeCA+IHF4KSB7XG4gICAgICAgICAgICAgICAgcXggPSB4O1xuICAgICAgICAgICAgICAgIGlmICh4ID09PSBoeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAueSkgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC5uZXh0LnkpIHJldHVybiBwLm5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBvdXRlck5vZGUpO1xuXG4gICAgaWYgKCFtKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChoeCA9PT0gcXgpIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XG5cbiAgICAvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247XG4gICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuICAgIHZhciBzdG9wID0gbSxcbiAgICAgICAgbXggPSBtLngsXG4gICAgICAgIG15ID0gbS55LFxuICAgICAgICB0YW5NaW4gPSBJbmZpbml0eSxcbiAgICAgICAgdGFuO1xuXG4gICAgcCA9IG0ubmV4dDtcblxuICAgIHdoaWxlIChwICE9PSBzdG9wKSB7XG4gICAgICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmXG4gICAgICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55KSkge1xuXG4gICAgICAgICAgICB0YW4gPSBNYXRoLmFicyhoeSAtIHAueSkgLyAoaHggLSBwLngpOyAvLyB0YW5nZW50aWFsXG5cbiAgICAgICAgICAgIGlmICgodGFuIDwgdGFuTWluIHx8ICh0YW4gPT09IHRhbk1pbiAmJiBwLnggPiBtLngpKSAmJiBsb2NhbGx5SW5zaWRlKHAsIGhvbGUpKSB7XG4gICAgICAgICAgICAgICAgbSA9IHA7XG4gICAgICAgICAgICAgICAgdGFuTWluID0gdGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbTtcbn1cblxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuZnVuY3Rpb24gaW5kZXhDdXJ2ZShzdGFydCwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIHZhciBwID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC56ID09PSBudWxsKSBwLnogPSB6T3JkZXIocC54LCBwLnksIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICBwLnByZXZaID0gcC5wcmV2O1xuICAgICAgICBwLm5leHRaID0gcC5uZXh0O1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHAucHJldloubmV4dFogPSBudWxsO1xuICAgIHAucHJldlogPSBudWxsO1xuXG4gICAgc29ydExpbmtlZChwKTtcbn1cblxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXG5mdW5jdGlvbiBzb3J0TGlua2VkKGxpc3QpIHtcbiAgICB2YXIgaSwgcCwgcSwgZSwgdGFpbCwgbnVtTWVyZ2VzLCBwU2l6ZSwgcVNpemUsXG4gICAgICAgIGluU2l6ZSA9IDE7XG5cbiAgICBkbyB7XG4gICAgICAgIHAgPSBsaXN0O1xuICAgICAgICBsaXN0ID0gbnVsbDtcbiAgICAgICAgdGFpbCA9IG51bGw7XG4gICAgICAgIG51bU1lcmdlcyA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHApIHtcbiAgICAgICAgICAgIG51bU1lcmdlcysrO1xuICAgICAgICAgICAgcSA9IHA7XG4gICAgICAgICAgICBwU2l6ZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5TaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwU2l6ZSsrO1xuICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgIGlmICghcSkgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHFTaXplID0gaW5TaXplO1xuXG4gICAgICAgICAgICB3aGlsZSAocFNpemUgPiAwIHx8IChxU2l6ZSA+IDAgJiYgcSkpIHtcblxuICAgICAgICAgICAgICAgIGlmIChwU2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxU2l6ZSA9PT0gMCB8fCAhcSkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcDtcbiAgICAgICAgICAgICAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHBTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwLnogPD0gcS56KSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRhaWwpIHRhaWwubmV4dFogPSBlO1xuICAgICAgICAgICAgICAgIGVsc2UgbGlzdCA9IGU7XG5cbiAgICAgICAgICAgICAgICBlLnByZXZaID0gdGFpbDtcbiAgICAgICAgICAgICAgICB0YWlsID0gZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcCA9IHE7XG4gICAgICAgIH1cblxuICAgICAgICB0YWlsLm5leHRaID0gbnVsbDtcbiAgICAgICAgaW5TaXplICo9IDI7XG5cbiAgICB9IHdoaWxlIChudW1NZXJnZXMgPiAxKTtcblxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBzaXplIG9mIHRoZSBkYXRhIGJvdW5kaW5nIGJveFxuZnVuY3Rpb24gek9yZGVyKHgsIHksIG1pblgsIG1pblksIHNpemUpIHtcbiAgICAvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG4gICAgeCA9IDMyNzY3ICogKHggLSBtaW5YKSAvIHNpemU7XG4gICAgeSA9IDMyNzY3ICogKHkgLSBtaW5ZKSAvIHNpemU7XG5cbiAgICB4ID0gKHggfCAoeCA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeCA9ICh4IHwgKHggPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB4ID0gKHggfCAoeCA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgeSA9ICh5IHwgKHkgPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB5ID0gKHkgfCAoeSA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeSA9ICh5IHwgKHkgPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHJldHVybiB4IHwgKHkgPDwgMSk7XG59XG5cbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcbmZ1bmN0aW9uIGdldExlZnRtb3N0KHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgbGVmdG1vc3QgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnggPCBsZWZ0bW9zdC54KSBsZWZ0bW9zdCA9IHA7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGxlZnRtb3N0O1xufVxuXG4vLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KSB7XG4gICAgcmV0dXJuIChjeCAtIHB4KSAqIChheSAtIHB5KSAtIChheCAtIHB4KSAqIChjeSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChheCAtIHB4KSAqIChieSAtIHB5KSAtIChieCAtIHB4KSAqIChheSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChieCAtIHB4KSAqIChjeSAtIHB5KSAtIChjeCAtIHB4KSAqIChieSAtIHB5KSA+PSAwO1xufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcbmZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbChhLCBiKSB7XG4gICAgcmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhaW50ZXJzZWN0c1BvbHlnb24oYSwgYikgJiZcbiAgICAgICAgICAgbG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpICYmIG1pZGRsZUluc2lkZShhLCBiKTtcbn1cblxuLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZVxuZnVuY3Rpb24gYXJlYShwLCBxLCByKSB7XG4gICAgcmV0dXJuIChxLnkgLSBwLnkpICogKHIueCAtIHEueCkgLSAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpO1xufVxuXG4vLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbFxuZnVuY3Rpb24gZXF1YWxzKHAxLCBwMikge1xuICAgIHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBzZWdtZW50cyBpbnRlcnNlY3RcbmZ1bmN0aW9uIGludGVyc2VjdHMocDEsIHExLCBwMiwgcTIpIHtcbiAgICBpZiAoKGVxdWFscyhwMSwgcTEpICYmIGVxdWFscyhwMiwgcTIpKSB8fFxuICAgICAgICAoZXF1YWxzKHAxLCBxMikgJiYgZXF1YWxzKHAyLCBxMSkpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gYXJlYShwMSwgcTEsIHAyKSA+IDAgIT09IGFyZWEocDEsIHExLCBxMikgPiAwICYmXG4gICAgICAgICAgIGFyZWEocDIsIHEyLCBwMSkgPiAwICE9PSBhcmVhKHAyLCBxMiwgcTEpID4gMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGludGVyc2VjdHMgYW55IHBvbHlnb24gc2VnbWVudHNcbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgcCA9IGE7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmXG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0cyhwLCBwLm5leHQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGxvY2FsbHkgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBsb2NhbGx5SW5zaWRlKGEsIGIpIHtcbiAgICByZXR1cm4gYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPCAwID9cbiAgICAgICAgYXJlYShhLCBiLCBhLm5leHQpID49IDAgJiYgYXJlYShhLCBhLnByZXYsIGIpID49IDAgOlxuICAgICAgICBhcmVhKGEsIGIsIGEucHJldikgPCAwIHx8IGFyZWEoYSwgYS5uZXh0LCBiKSA8IDA7XG59XG5cbi8vIGNoZWNrIGlmIHRoZSBtaWRkbGUgcG9pbnQgb2YgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKGEsIGIpIHtcbiAgICB2YXIgcCA9IGEsXG4gICAgICAgIGluc2lkZSA9IGZhbHNlLFxuICAgICAgICBweCA9IChhLnggKyBiLngpIC8gMixcbiAgICAgICAgcHkgPSAoYS55ICsgYi55KSAvIDI7XG4gICAgZG8ge1xuICAgICAgICBpZiAoKChwLnkgPiBweSkgIT09IChwLm5leHQueSA+IHB5KSkgJiYgKHB4IDwgKHAubmV4dC54IC0gcC54KSAqIChweSAtIHAueSkgLyAocC5uZXh0LnkgLSBwLnkpICsgcC54KSlcbiAgICAgICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gaW5zaWRlO1xufVxuXG4vLyBsaW5rIHR3byBwb2x5Z29uIHZlcnRpY2VzIHdpdGggYSBicmlkZ2U7IGlmIHRoZSB2ZXJ0aWNlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcmluZywgaXQgc3BsaXRzIHBvbHlnb24gaW50byB0d287XG4vLyBpZiBvbmUgYmVsb25ncyB0byB0aGUgb3V0ZXIgcmluZyBhbmQgYW5vdGhlciB0byBhIGhvbGUsIGl0IG1lcmdlcyBpdCBpbnRvIGEgc2luZ2xlIHJpbmdcbmZ1bmN0aW9uIHNwbGl0UG9seWdvbihhLCBiKSB7XG4gICAgdmFyIGEyID0gbmV3IE5vZGUoYS5pLCBhLngsIGEueSksXG4gICAgICAgIGIyID0gbmV3IE5vZGUoYi5pLCBiLngsIGIueSksXG4gICAgICAgIGFuID0gYS5uZXh0LFxuICAgICAgICBicCA9IGIucHJldjtcblxuICAgIGEubmV4dCA9IGI7XG4gICAgYi5wcmV2ID0gYTtcblxuICAgIGEyLm5leHQgPSBhbjtcbiAgICBhbi5wcmV2ID0gYTI7XG5cbiAgICBiMi5uZXh0ID0gYTI7XG4gICAgYTIucHJldiA9IGIyO1xuXG4gICAgYnAubmV4dCA9IGIyO1xuICAgIGIyLnByZXYgPSBicDtcblxuICAgIHJldHVybiBiMjtcbn1cblxuLy8gY3JlYXRlIGEgbm9kZSBhbmQgb3B0aW9uYWxseSBsaW5rIGl0IHdpdGggcHJldmlvdXMgb25lIChpbiBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGluc2VydE5vZGUoaSwgeCwgeSwgbGFzdCkge1xuICAgIHZhciBwID0gbmV3IE5vZGUoaSwgeCwgeSk7XG5cbiAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgcC5wcmV2ID0gcDtcbiAgICAgICAgcC5uZXh0ID0gcDtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHAubmV4dCA9IGxhc3QubmV4dDtcbiAgICAgICAgcC5wcmV2ID0gbGFzdDtcbiAgICAgICAgbGFzdC5uZXh0LnByZXYgPSBwO1xuICAgICAgICBsYXN0Lm5leHQgPSBwO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShwKSB7XG4gICAgcC5uZXh0LnByZXYgPSBwLnByZXY7XG4gICAgcC5wcmV2Lm5leHQgPSBwLm5leHQ7XG5cbiAgICBpZiAocC5wcmV2WikgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7XG4gICAgaWYgKHAubmV4dFopIHAubmV4dFoucHJldlogPSBwLnByZXZaO1xufVxuXG5mdW5jdGlvbiBOb2RlKGksIHgsIHkpIHtcbiAgICAvLyB2ZXJ0aWNlIGluZGV4IGluIGNvb3JkaW5hdGVzIGFycmF5XG4gICAgdGhpcy5pID0gaTtcblxuICAgIC8vIHZlcnRleCBjb29yZGluYXRlc1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IHZlcnRpY2Ugbm9kZXMgaW4gYSBwb2x5Z29uIHJpbmdcbiAgICB0aGlzLnByZXYgPSBudWxsO1xuICAgIHRoaXMubmV4dCA9IG51bGw7XG5cbiAgICAvLyB6LW9yZGVyIGN1cnZlIHZhbHVlXG4gICAgdGhpcy56ID0gbnVsbDtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcbiAgICB0aGlzLnByZXZaID0gbnVsbDtcbiAgICB0aGlzLm5leHRaID0gbnVsbDtcblxuICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG4gICAgdGhpcy5zdGVpbmVyID0gZmFsc2U7XG59XG5cbi8vIHJldHVybiBhIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwb2x5Z29uIGFyZWEgYW5kIGl0cyB0cmlhbmd1bGF0aW9uIGFyZWE7XG4vLyB1c2VkIHRvIHZlcmlmeSBjb3JyZWN0bmVzcyBvZiB0cmlhbmd1bGF0aW9uXG5lYXJjdXQuZGV2aWF0aW9uID0gZnVuY3Rpb24gKGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0sIHRyaWFuZ2xlcykge1xuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aDtcbiAgICB2YXIgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGg7XG5cbiAgICB2YXIgcG9seWdvbkFyZWEgPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIDAsIG91dGVyTGVuLCBkaW0pKTtcbiAgICBpZiAoaGFzSG9sZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgcG9seWdvbkFyZWEgLT0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0cmlhbmdsZXNBcmVhID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBhID0gdHJpYW5nbGVzW2ldICogZGltO1xuICAgICAgICB2YXIgYiA9IHRyaWFuZ2xlc1tpICsgMV0gKiBkaW07XG4gICAgICAgIHZhciBjID0gdHJpYW5nbGVzW2kgKyAyXSAqIGRpbTtcbiAgICAgICAgdHJpYW5nbGVzQXJlYSArPSBNYXRoLmFicyhcbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtjXSkgKiAoZGF0YVtiICsgMV0gLSBkYXRhW2EgKyAxXSkgLVxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2JdKSAqIChkYXRhW2MgKyAxXSAtIGRhdGFbYSArIDFdKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvbHlnb25BcmVhID09PSAwICYmIHRyaWFuZ2xlc0FyZWEgPT09IDAgPyAwIDpcbiAgICAgICAgTWF0aC5hYnMoKHRyaWFuZ2xlc0FyZWEgLSBwb2x5Z29uQXJlYSkgLyBwb2x5Z29uQXJlYSk7XG59O1xuXG5mdW5jdGlvbiBzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSBzdGFydCwgaiA9IGVuZCAtIGRpbTsgaSA8IGVuZDsgaSArPSBkaW0pIHtcbiAgICAgICAgc3VtICs9IChkYXRhW2pdIC0gZGF0YVtpXSkgKiAoZGF0YVtpICsgMV0gKyBkYXRhW2ogKyAxXSk7XG4gICAgICAgIGogPSBpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG4vLyB0dXJuIGEgcG9seWdvbiBpbiBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IGZvcm0gKGUuZy4gYXMgaW4gR2VvSlNPTikgaW50byBhIGZvcm0gRWFyY3V0IGFjY2VwdHNcbmVhcmN1dC5mbGF0dGVuID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgZGltID0gZGF0YVswXVswXS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IHt2ZXJ0aWNlczogW10sIGhvbGVzOiBbXSwgZGltZW5zaW9uczogZGltfSxcbiAgICAgICAgaG9sZUluZGV4ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgZGltOyBkKyspIHJlc3VsdC52ZXJ0aWNlcy5wdXNoKGRhdGFbaV1bal1bZF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgaG9sZUluZGV4ICs9IGRhdGFbaSAtIDFdLmxlbmd0aDtcbiAgICAgICAgICAgIHJlc3VsdC5ob2xlcy5wdXNoKGhvbGVJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIoZnVuY3Rpb24oKXt2YXIgaz0hIWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI7ZnVuY3Rpb24gbChhLGIpe2s/YS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsYiwhMSk6YS5hdHRhY2hFdmVudChcInNjcm9sbFwiLGIpfWZ1bmN0aW9uIHYoYSl7ZG9jdW1lbnQuYm9keT9hKCk6az9kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLGEpOmRvY3VtZW50LmF0dGFjaEV2ZW50KFwib25yZWFkeXN0YXRlY2hhbmdlXCIsZnVuY3Rpb24oKXtcImludGVyYWN0aXZlXCIhPWRvY3VtZW50LnJlYWR5U3RhdGUmJlwiY29tcGxldGVcIiE9ZG9jdW1lbnQucmVhZHlTdGF0ZXx8YSgpfSl9O2Z1bmN0aW9uIHcoYSl7dGhpcy5hPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dGhpcy5hLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpO3RoaXMuYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7dGhpcy5iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt0aGlzLmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7dGhpcy5mPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuZz0tMTt0aGlzLmIuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6c2Nyb2xsO2ZvbnQtc2l6ZToxNnB4O1wiO3RoaXMuYy5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtvdmVyZmxvdzpzY3JvbGw7Zm9udC1zaXplOjE2cHg7XCI7XG50aGlzLmYuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6c2Nyb2xsO2ZvbnQtc2l6ZToxNnB4O1wiO3RoaXMuaC5zdHlsZS5jc3NUZXh0PVwiZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MjAwJTtoZWlnaHQ6MjAwJTtmb250LXNpemU6MTZweDttYXgtd2lkdGg6bm9uZTtcIjt0aGlzLmIuYXBwZW5kQ2hpbGQodGhpcy5oKTt0aGlzLmMuYXBwZW5kQ2hpbGQodGhpcy5mKTt0aGlzLmEuYXBwZW5kQ2hpbGQodGhpcy5iKTt0aGlzLmEuYXBwZW5kQ2hpbGQodGhpcy5jKX1cbmZ1bmN0aW9uIHkoYSxiKXthLmEuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO21pbi13aWR0aDoyMHB4O21pbi1oZWlnaHQ6MjBweDtkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6YXV0bzttYXJnaW46MDtwYWRkaW5nOjA7dG9wOi05OTlweDtsZWZ0Oi05OTlweDt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udDpcIitiK1wiO1wifWZ1bmN0aW9uIHooYSl7dmFyIGI9YS5hLm9mZnNldFdpZHRoLGM9YisxMDA7YS5mLnN0eWxlLndpZHRoPWMrXCJweFwiO2EuYy5zY3JvbGxMZWZ0PWM7YS5iLnNjcm9sbExlZnQ9YS5iLnNjcm9sbFdpZHRoKzEwMDtyZXR1cm4gYS5nIT09Yj8oYS5nPWIsITApOiExfWZ1bmN0aW9uIEEoYSxiKXtmdW5jdGlvbiBjKCl7dmFyIGE9bTt6KGEpJiZudWxsIT09YS5hLnBhcmVudE5vZGUmJmIoYS5nKX12YXIgbT1hO2woYS5iLGMpO2woYS5jLGMpO3ooYSl9O2Z1bmN0aW9uIEIoYSxiKXt2YXIgYz1ifHx7fTt0aGlzLmZhbWlseT1hO3RoaXMuc3R5bGU9Yy5zdHlsZXx8XCJub3JtYWxcIjt0aGlzLndlaWdodD1jLndlaWdodHx8XCJub3JtYWxcIjt0aGlzLnN0cmV0Y2g9Yy5zdHJldGNofHxcIm5vcm1hbFwifXZhciBDPW51bGwsRD1udWxsLEg9ISF3aW5kb3cuRm9udEZhY2U7ZnVuY3Rpb24gSSgpe2lmKG51bGw9PT1EKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3RyeXthLnN0eWxlLmZvbnQ9XCJjb25kZW5zZWQgMTAwcHggc2Fucy1zZXJpZlwifWNhdGNoKGIpe31EPVwiXCIhPT1hLnN0eWxlLmZvbnR9cmV0dXJuIER9ZnVuY3Rpb24gSihhLGIpe3JldHVyblthLnN0eWxlLGEud2VpZ2h0LEkoKT9hLnN0cmV0Y2g6XCJcIixcIjEwMHB4XCIsYl0uam9pbihcIiBcIil9XG5CLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxtPWF8fFwiQkVTYnN3eVwiLHg9Ynx8M0UzLEU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7aWYoSCl7dmFyIEs9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBlKCl7KG5ldyBEYXRlKS5nZXRUaW1lKCktRT49eD9iKCk6ZG9jdW1lbnQuZm9udHMubG9hZChKKGMsYy5mYW1pbHkpLG0pLnRoZW4oZnVuY3Rpb24oYyl7MTw9Yy5sZW5ndGg/YSgpOnNldFRpbWVvdXQoZSwyNSl9LGZ1bmN0aW9uKCl7YigpfSl9ZSgpfSksTD1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGMpe3NldFRpbWVvdXQoYyx4KX0pO1Byb21pc2UucmFjZShbTCxLXSkudGhlbihmdW5jdGlvbigpe2EoYyl9LGZ1bmN0aW9uKCl7YihjKX0pfWVsc2UgdihmdW5jdGlvbigpe2Z1bmN0aW9uIHEoKXt2YXIgYjtpZihiPS0xIT1mJiYtMSE9Z3x8LTEhPWYmJi0xIT1ofHwtMSE9ZyYmLTEhPVxuaCkoYj1mIT1nJiZmIT1oJiZnIT1oKXx8KG51bGw9PT1DJiYoYj0vQXBwbGVXZWJLaXRcXC8oWzAtOV0rKSg/OlxcLihbMC05XSspKS8uZXhlYyh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCksQz0hIWImJig1MzY+cGFyc2VJbnQoYlsxXSwxMCl8fDUzNj09PXBhcnNlSW50KGJbMV0sMTApJiYxMT49cGFyc2VJbnQoYlsyXSwxMCkpKSxiPUMmJihmPT1yJiZnPT1yJiZoPT1yfHxmPT10JiZnPT10JiZoPT10fHxmPT11JiZnPT11JiZoPT11KSksYj0hYjtiJiYobnVsbCE9PWQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpLGNsZWFyVGltZW91dChHKSxhKGMpKX1mdW5jdGlvbiBGKCl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktRT49eCludWxsIT09ZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCksYihjKTtlbHNle3ZhciBhPWRvY3VtZW50LmhpZGRlbjtpZighMD09PWF8fHZvaWQgMD09PWEpZj1lLmEub2Zmc2V0V2lkdGgsZz1uLmEub2Zmc2V0V2lkdGgsXG5oPXAuYS5vZmZzZXRXaWR0aCxxKCk7Rz1zZXRUaW1lb3V0KEYsNTApfX12YXIgZT1uZXcgdyhtKSxuPW5ldyB3KG0pLHA9bmV3IHcobSksZj0tMSxnPS0xLGg9LTEscj0tMSx0PS0xLHU9LTEsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLEc9MDtkLmRpcj1cImx0clwiO3koZSxKKGMsXCJzYW5zLXNlcmlmXCIpKTt5KG4sSihjLFwic2VyaWZcIikpO3kocCxKKGMsXCJtb25vc3BhY2VcIikpO2QuYXBwZW5kQ2hpbGQoZS5hKTtkLmFwcGVuZENoaWxkKG4uYSk7ZC5hcHBlbmRDaGlsZChwLmEpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7cj1lLmEub2Zmc2V0V2lkdGg7dD1uLmEub2Zmc2V0V2lkdGg7dT1wLmEub2Zmc2V0V2lkdGg7RigpO0EoZSxmdW5jdGlvbihhKXtmPWE7cSgpfSk7eShlLEooYywnXCInK2MuZmFtaWx5KydcIixzYW5zLXNlcmlmJykpO0EobixmdW5jdGlvbihhKXtnPWE7cSgpfSk7eShuLEooYywnXCInK2MuZmFtaWx5KydcIixzZXJpZicpKTtBKHAsZnVuY3Rpb24oYSl7aD1cbmE7cSgpfSk7eShwLEooYywnXCInK2MuZmFtaWx5KydcIixtb25vc3BhY2UnKSl9KX0pfTt3aW5kb3cuRm9udEZhY2VPYnNlcnZlcj1CO3dpbmRvdy5Gb250RmFjZU9ic2VydmVyLnByb3RvdHlwZS5jaGVjaz13aW5kb3cuRm9udEZhY2VPYnNlcnZlci5wcm90b3R5cGUubG9hZD1CLnByb3RvdHlwZS5sb2FkO1widW5kZWZpbmVkXCIhPT10eXBlb2YgbW9kdWxlJiYobW9kdWxlLmV4cG9ydHM9d2luZG93LkZvbnRGYWNlT2JzZXJ2ZXIpO30oKSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcDtcblxuLyogY2xpcCBmZWF0dXJlcyBiZXR3ZWVuIHR3byBheGlzLXBhcmFsbGVsIGxpbmVzOlxuICogICAgIHwgICAgICAgIHxcbiAqICBfX198X19fICAgICB8ICAgICAvXG4gKiAvICAgfCAgIFxcX19fX3xfX19fL1xuICogICAgIHwgICAgICAgIHxcbiAqL1xuXG5mdW5jdGlvbiBjbGlwKGZlYXR1cmVzLCBzY2FsZSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIG1pbkFsbCwgbWF4QWxsKSB7XG5cbiAgICBrMSAvPSBzY2FsZTtcbiAgICBrMiAvPSBzY2FsZTtcblxuICAgIGlmIChtaW5BbGwgPj0gazEgJiYgbWF4QWxsIDw9IGsyKSByZXR1cm4gZmVhdHVyZXM7IC8vIHRyaXZpYWwgYWNjZXB0XG4gICAgZWxzZSBpZiAobWluQWxsID4gazIgfHwgbWF4QWxsIDwgazEpIHJldHVybiBudWxsOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgdmFyIGNsaXBwZWQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgIG1pbiwgbWF4O1xuXG4gICAgICAgIG1pbiA9IGZlYXR1cmUubWluW2F4aXNdO1xuICAgICAgICBtYXggPSBmZWF0dXJlLm1heFtheGlzXTtcblxuICAgICAgICBpZiAobWluID49IGsxICYmIG1heCA8PSBrMikgeyAvLyB0cml2aWFsIGFjY2VwdFxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGZlYXR1cmUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWluID4gazIgfHwgbWF4IDwgazEpIGNvbnRpbnVlOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgICAgIHZhciBzbGljZXMgPSB0eXBlID09PSAxID9cbiAgICAgICAgICAgICAgICBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIDpcbiAgICAgICAgICAgICAgICBjbGlwR2VvbWV0cnkoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCB0eXBlID09PSAzKTtcblxuICAgICAgICBpZiAoc2xpY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gaWYgYSBmZWF0dXJlIGdvdCBjbGlwcGVkLCBpdCB3aWxsIGxpa2VseSBnZXQgY2xpcHBlZCBvbiB0aGUgbmV4dCB6b29tIGxldmVsIGFzIHdlbGwsXG4gICAgICAgICAgICAvLyBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgYmJveGVzXG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBzbGljZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICB0YWdzOiBmZWF0dXJlc1tpXS50YWdzIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgbWluOiBmZWF0dXJlLm1pbixcbiAgICAgICAgICAgICAgICBtYXg6IGZlYXR1cmUubWF4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGVkLmxlbmd0aCA/IGNsaXBwZWQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIHtcbiAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGEgPSBnZW9tZXRyeVtpXSxcbiAgICAgICAgICAgIGFrID0gYVtheGlzXTtcblxuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG4gICAgfVxuICAgIHJldHVybiBzbGljZTtcbn1cblxuZnVuY3Rpb24gY2xpcEdlb21ldHJ5KGdlb21ldHJ5LCBrMSwgazIsIGF4aXMsIGludGVyc2VjdCwgY2xvc2VkKSB7XG5cbiAgICB2YXIgc2xpY2VzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgdmFyIGFrID0gMCxcbiAgICAgICAgICAgIGJrID0gMCxcbiAgICAgICAgICAgIGIgPSBudWxsLFxuICAgICAgICAgICAgcG9pbnRzID0gZ2VvbWV0cnlbaV0sXG4gICAgICAgICAgICBhcmVhID0gcG9pbnRzLmFyZWEsXG4gICAgICAgICAgICBkaXN0ID0gcG9pbnRzLmRpc3QsXG4gICAgICAgICAgICBsZW4gPSBwb2ludHMubGVuZ3RoLFxuICAgICAgICAgICAgYSwgaiwgbGFzdDtcblxuICAgICAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBhID0gYiB8fCBwb2ludHNbal07XG4gICAgICAgICAgICBiID0gcG9pbnRzW2ogKyAxXTtcbiAgICAgICAgICAgIGFrID0gYmsgfHwgYVtheGlzXTtcbiAgICAgICAgICAgIGJrID0gYltheGlzXTtcblxuICAgICAgICAgICAgaWYgKGFrIDwgazEpIHtcblxuICAgICAgICAgICAgICAgIGlmICgoYmsgPiBrMikpIHsgLy8gLS0tfC0tLS0tfC0tPlxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSksIGludGVyc2VjdChhLCBiLCBrMikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPj0gazEpIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSk7IC8vIC0tLXwtLT4gIHxcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChhayA+IGsyKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGJrIDwgazEpKSB7IC8vIDwtLXwtLS0tLXwtLS1cbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazIpLCBpbnRlcnNlY3QoYSwgYiwgazEpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJrIDw9IGsyKSBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMikpOyAvLyB8ICA8LS18LS0tXG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJrIDwgazEpIHsgLy8gPC0tfC0tLSAgfFxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPiBrMikgeyAvLyB8ICAtLS18LS0+XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB8IC0tPiB8XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgdGhlIGxhc3QgcG9pbnRcbiAgICAgICAgYSA9IHBvaW50c1tsZW4gLSAxXTtcbiAgICAgICAgYWsgPSBhW2F4aXNdO1xuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG5cbiAgICAgICAgLy8gY2xvc2UgdGhlIHBvbHlnb24gaWYgaXRzIGVuZHBvaW50cyBhcmUgbm90IHRoZSBzYW1lIGFmdGVyIGNsaXBwaW5nXG5cbiAgICAgICAgbGFzdCA9IHNsaWNlW3NsaWNlLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoY2xvc2VkICYmIGxhc3QgJiYgKHNsaWNlWzBdWzBdICE9PSBsYXN0WzBdIHx8IHNsaWNlWzBdWzFdICE9PSBsYXN0WzFdKSkgc2xpY2UucHVzaChzbGljZVswXSk7XG5cbiAgICAgICAgLy8gYWRkIHRoZSBmaW5hbCBzbGljZVxuICAgICAgICBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2xpY2VzO1xufVxuXG5mdW5jdGlvbiBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KSB7XG4gICAgaWYgKHNsaWNlLmxlbmd0aCkge1xuICAgICAgICAvLyB3ZSBkb24ndCByZWNhbGN1bGF0ZSB0aGUgYXJlYS9sZW5ndGggb2YgdGhlIHVuY2xpcHBlZCBnZW9tZXRyeSBiZWNhdXNlIHRoZSBjYXNlIHdoZXJlIGl0IGdvZXNcbiAgICAgICAgLy8gYmVsb3cgdGhlIHZpc2liaWxpdHkgdGhyZXNob2xkIGFzIGEgcmVzdWx0IG9mIGNsaXBwaW5nIGlzIHJhcmUsIHNvIHdlIGF2b2lkIGRvaW5nIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgICAgc2xpY2UuYXJlYSA9IGFyZWE7XG4gICAgICAgIHNsaWNlLmRpc3QgPSBkaXN0O1xuXG4gICAgICAgIHNsaWNlcy5wdXNoKHNsaWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG5cbnZhciBzaW1wbGlmeSA9IHJlcXVpcmUoJy4vc2ltcGxpZnknKTtcblxuLy8gY29udmVydHMgR2VvSlNPTiBmZWF0dXJlIGludG8gYW4gaW50ZXJtZWRpYXRlIHByb2plY3RlZCBKU09OIHZlY3RvciBmb3JtYXQgd2l0aCBzaW1wbGlmaWNhdGlvbiBkYXRhXG5cbmZ1bmN0aW9uIGNvbnZlcnQoZGF0YSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gW107XG5cbiAgICBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEuZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLCB0b2xlcmFuY2UpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2luZ2xlIGdlb21ldHJ5IG9yIGEgZ2VvbWV0cnkgY29sbGVjdGlvblxuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge2dlb21ldHJ5OiBkYXRhfSwgdG9sZXJhbmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZmVhdHVyZSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZ2VvbS50eXBlLFxuICAgICAgICBjb29yZHMgPSBnZW9tLmNvb3JkaW5hdGVzLFxuICAgICAgICB0YWdzID0gZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICBpLCBqLCByaW5ncztcblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIFtwcm9qZWN0UG9pbnQoY29vcmRzKV0pKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIHByb2plY3QoY29vcmRzKSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMiwgW3Byb2plY3QoY29vcmRzLCB0b2xlcmFuY2UpXSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgcmluZ3MgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmluZ3MucHVzaChwcm9qZWN0KGNvb3Jkc1tpXSwgdG9sZXJhbmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgdHlwZSA9PT0gJ1BvbHlnb24nID8gMyA6IDIsIHJpbmdzKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHJpbmdzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICByaW5ncy5wdXNoKHByb2plY3QoY29vcmRzW2ldW2pdLCB0b2xlcmFuY2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAzLCByaW5ncykpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnR2VvbWV0cnlDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9tLmdlb21ldHJpZXNbaV0sXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogdGFnc1xuICAgICAgICAgICAgfSwgdG9sZXJhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LicpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlKHRhZ3MsIHR5cGUsIGdlb21ldHJ5KSB7XG4gICAgdmFyIGZlYXR1cmUgPSB7XG4gICAgICAgIGdlb21ldHJ5OiBnZW9tZXRyeSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdGFnczogdGFncyB8fCBudWxsLFxuICAgICAgICBtaW46IFsyLCAxXSwgLy8gaW5pdGlhbCBiYm94IHZhbHVlcztcbiAgICAgICAgbWF4OiBbLTEsIDBdICAvLyBub3RlIHRoYXQgY29vcmRzIGFyZSB1c3VhbGx5IGluIFswLi4xXSByYW5nZVxuICAgIH07XG4gICAgY2FsY0JCb3goZmVhdHVyZSk7XG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIHByb2plY3QobG9ubGF0cywgdG9sZXJhbmNlKSB7XG4gICAgdmFyIHByb2plY3RlZCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9ubGF0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwcm9qZWN0ZWQucHVzaChwcm9qZWN0UG9pbnQobG9ubGF0c1tpXSkpO1xuICAgIH1cbiAgICBpZiAodG9sZXJhbmNlKSB7XG4gICAgICAgIHNpbXBsaWZ5KHByb2plY3RlZCwgdG9sZXJhbmNlKTtcbiAgICAgICAgY2FsY1NpemUocHJvamVjdGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2plY3RlZDtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFBvaW50KHApIHtcbiAgICB2YXIgc2luID0gTWF0aC5zaW4ocFsxXSAqIE1hdGguUEkgLyAxODApLFxuICAgICAgICB4ID0gKHBbMF0gLyAzNjAgKyAwLjUpLFxuICAgICAgICB5ID0gKDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSSk7XG5cbiAgICB5ID0geSA8IC0xID8gLTEgOlxuICAgICAgICB5ID4gMSA/IDEgOiB5O1xuXG4gICAgcmV0dXJuIFt4LCB5LCAwXTtcbn1cblxuLy8gY2FsY3VsYXRlIGFyZWEgYW5kIGxlbmd0aCBvZiB0aGUgcG9seVxuZnVuY3Rpb24gY2FsY1NpemUocG9pbnRzKSB7XG4gICAgdmFyIGFyZWEgPSAwLFxuICAgICAgICBkaXN0ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBhLCBiOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBhID0gYiB8fCBwb2ludHNbaV07XG4gICAgICAgIGIgPSBwb2ludHNbaSArIDFdO1xuXG4gICAgICAgIGFyZWEgKz0gYVswXSAqIGJbMV0gLSBiWzBdICogYVsxXTtcblxuICAgICAgICAvLyB1c2UgTWFuaGF0dGFuIGRpc3RhbmNlIGluc3RlYWQgb2YgRXVjbGlkaWFuIG9uZSB0byBhdm9pZCBleHBlbnNpdmUgc3F1YXJlIHJvb3QgY29tcHV0YXRpb25cbiAgICAgICAgZGlzdCArPSBNYXRoLmFicyhiWzBdIC0gYVswXSkgKyBNYXRoLmFicyhiWzFdIC0gYVsxXSk7XG4gICAgfVxuICAgIHBvaW50cy5hcmVhID0gTWF0aC5hYnMoYXJlYSAvIDIpO1xuICAgIHBvaW50cy5kaXN0ID0gZGlzdDtcbn1cblxuLy8gY2FsY3VsYXRlIHRoZSBmZWF0dXJlIGJvdW5kaW5nIGJveCBmb3IgZmFzdGVyIGNsaXBwaW5nIGxhdGVyXG5mdW5jdGlvbiBjYWxjQkJveChmZWF0dXJlKSB7XG4gICAgdmFyIGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgbWluID0gZmVhdHVyZS5taW4sXG4gICAgICAgIG1heCA9IGZlYXR1cmUubWF4O1xuXG4gICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gMSkgY2FsY1JpbmdCQm94KG1pbiwgbWF4LCBnZW9tZXRyeSk7XG4gICAgZWxzZSBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSBjYWxjUmluZ0JCb3gobWluLCBtYXgsIGdlb21ldHJ5W2ldKTtcblxuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5mdW5jdGlvbiBjYWxjUmluZ0JCb3gobWluLCBtYXgsIHBvaW50cykge1xuICAgIGZvciAodmFyIGkgPSAwLCBwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHAgPSBwb2ludHNbaV07XG4gICAgICAgIG1pblswXSA9IE1hdGgubWluKHBbMF0sIG1pblswXSk7XG4gICAgICAgIG1heFswXSA9IE1hdGgubWF4KHBbMF0sIG1heFswXSk7XG4gICAgICAgIG1pblsxXSA9IE1hdGgubWluKHBbMV0sIG1pblsxXSk7XG4gICAgICAgIG1heFsxXSA9IE1hdGgubWF4KHBbMV0sIG1heFsxXSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdlb2pzb252dDtcblxudmFyIGNvbnZlcnQgPSByZXF1aXJlKCcuL2NvbnZlcnQnKSwgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXG4gICAgY2xpcCA9IHJlcXVpcmUoJy4vY2xpcCcpLCAgICAgICAvLyBzdHJpcGUgY2xpcHBpbmcgYWxnb3JpdGhtXG4gICAgd3JhcCA9IHJlcXVpcmUoJy4vd3JhcCcpLCAgICAgICAvLyBkYXRlIGxpbmUgcHJvY2Vzc2luZ1xuICAgIGNyZWF0ZVRpbGUgPSByZXF1aXJlKCcuL3RpbGUnKTsgLy8gZmluYWwgc2ltcGxpZmllZCB0aWxlIGdlbmVyYXRpb25cblxuXG5mdW5jdGlvbiBnZW9qc29udnQoZGF0YSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZSh0aGlzLm9wdGlvbnMpLCBvcHRpb25zKTtcblxuICAgIHZhciBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICBpZiAoZGVidWcpIGNvbnNvbGUudGltZSgncHJlcHJvY2VzcyBkYXRhJyk7XG5cbiAgICB2YXIgejIgPSAxIDw8IG9wdGlvbnMubWF4Wm9vbSwgLy8gMl56XG4gICAgICAgIGZlYXR1cmVzID0gY29udmVydChkYXRhLCBvcHRpb25zLnRvbGVyYW5jZSAvICh6MiAqIG9wdGlvbnMuZXh0ZW50KSk7XG5cbiAgICB0aGlzLnRpbGVzID0ge307XG4gICAgdGhpcy50aWxlQ29vcmRzID0gW107XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdwcmVwcm9jZXNzIGRhdGEnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ2luZGV4OiBtYXhab29tOiAlZCwgbWF4UG9pbnRzOiAlZCcsIG9wdGlvbnMuaW5kZXhNYXhab29tLCBvcHRpb25zLmluZGV4TWF4UG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICB0aGlzLnN0YXRzID0ge307XG4gICAgICAgIHRoaXMudG90YWwgPSAwO1xuICAgIH1cblxuICAgIGZlYXR1cmVzID0gd3JhcChmZWF0dXJlcywgb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCwgaW50ZXJzZWN0WCk7XG5cbiAgICAvLyBzdGFydCBzbGljaW5nIGZyb20gdGhlIHRvcCB0aWxlIGRvd25cbiAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSB0aGlzLnNwbGl0VGlsZShmZWF0dXJlcywgMCwgMCwgMCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgY29uc29sZS5sb2coJ2ZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCcsIHRoaXMudGlsZXNbMF0ubnVtRmVhdHVyZXMsIHRoaXMudGlsZXNbMF0ubnVtUG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICBjb25zb2xlLmxvZygndGlsZXMgZ2VuZXJhdGVkOicsIHRoaXMudG90YWwsIEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdHMpKTtcbiAgICB9XG59XG5cbkdlb0pTT05WVC5wcm90b3R5cGUub3B0aW9ucyA9IHtcbiAgICBtYXhab29tOiAxNCwgICAgICAgICAgICAvLyBtYXggem9vbSB0byBwcmVzZXJ2ZSBkZXRhaWwgb25cbiAgICBpbmRleE1heFpvb206IDUsICAgICAgICAvLyBtYXggem9vbSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIGluZGV4TWF4UG9pbnRzOiAxMDAwMDAsIC8vIG1heCBudW1iZXIgb2YgcG9pbnRzIHBlciB0aWxlIGluIHRoZSB0aWxlIGluZGV4XG4gICAgc29saWRDaGlsZHJlbjogZmFsc2UsICAgLy8gd2hldGhlciB0byB0aWxlIHNvbGlkIHNxdWFyZSB0aWxlcyBmdXJ0aGVyXG4gICAgdG9sZXJhbmNlOiAzLCAgICAgICAgICAgLy8gc2ltcGxpZmljYXRpb24gdG9sZXJhbmNlIChoaWdoZXIgbWVhbnMgc2ltcGxlcilcbiAgICBleHRlbnQ6IDQwOTYsICAgICAgICAgICAvLyB0aWxlIGV4dGVudFxuICAgIGJ1ZmZlcjogNjQsICAgICAgICAgICAgIC8vIHRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZVxuICAgIGRlYnVnOiAwICAgICAgICAgICAgICAgIC8vIGxvZ2dpbmcgbGV2ZWwgKDAsIDEgb3IgMilcbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlID0gZnVuY3Rpb24gKGZlYXR1cmVzLCB6LCB4LCB5LCBjeiwgY3gsIGN5KSB7XG5cbiAgICB2YXIgc3RhY2sgPSBbZmVhdHVyZXMsIHosIHgsIHldLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICAvLyBhdm9pZCByZWN1cnNpb24gYnkgdXNpbmcgYSBwcm9jZXNzaW5nIHF1ZXVlXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB5ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHggPSBzdGFjay5wb3AoKTtcbiAgICAgICAgeiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBmZWF0dXJlcyA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIHZhciB6MiA9IDEgPDwgeixcbiAgICAgICAgICAgIGlkID0gdG9JRCh6LCB4LCB5KSxcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSxcbiAgICAgICAgICAgIHRpbGVUb2xlcmFuY2UgPSB6ID09PSBvcHRpb25zLm1heFpvb20gPyAwIDogb3B0aW9ucy50b2xlcmFuY2UgLyAoejIgKiBvcHRpb25zLmV4dGVudCk7XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NyZWF0aW9uJyk7XG5cbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSA9IGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHoyLCB4LCB5LCB0aWxlVG9sZXJhbmNlLCB6ID09PSBvcHRpb25zLm1heFpvb20pO1xuICAgICAgICAgICAgdGhpcy50aWxlQ29vcmRzLnB1c2goe3o6IHosIHg6IHgsIHk6IHl9KTtcblxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGlsZSB6JWQtJWQtJWQgKGZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCwgc2ltcGxpZmllZDogJWQpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHosIHgsIHksIHRpbGUubnVtRmVhdHVyZXMsIHRpbGUubnVtUG9pbnRzLCB0aWxlLm51bVNpbXBsaWZpZWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2NyZWF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSAneicgKyB6O1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHNba2V5XSA9ICh0aGlzLnN0YXRzW2tleV0gfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWwrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIGdlb21ldHJ5IGluIHRpbGUgc28gdGhhdCB3ZSBjYW4gZHJpbGwgZG93biBsYXRlciBpZiB3ZSBzdG9wIG5vd1xuICAgICAgICB0aWxlLnNvdXJjZSA9IGZlYXR1cmVzO1xuXG4gICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHRoZSB0aWxlIGlzIHNvbGlkIGNsaXBwZWQgc3F1YXJlXG4gICAgICAgIGlmICghb3B0aW9ucy5zb2xpZENoaWxkcmVuICYmIGlzQ2xpcHBlZFNxdWFyZSh0aWxlLCBvcHRpb25zLmV4dGVudCwgb3B0aW9ucy5idWZmZXIpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBpdCdzIHRoZSBmaXJzdC1wYXNzIHRpbGluZ1xuICAgICAgICBpZiAoIWN6KSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIG1heCB6b29tLCBvciBpZiB0aGUgdGlsZSBpcyB0b28gc2ltcGxlXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5pbmRleE1heFpvb20gfHwgdGlsZS5udW1Qb2ludHMgPD0gb3B0aW9ucy5pbmRleE1heFBvaW50cykgY29udGludWU7XG5cbiAgICAgICAgLy8gaWYgYSBkcmlsbGRvd24gdG8gYSBzcGVjaWZpYyB0aWxlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIGJhc2Ugem9vbSBvciBvdXIgdGFyZ2V0IHRpbGUgem9vbVxuICAgICAgICAgICAgaWYgKHogPT09IG9wdGlvbnMubWF4Wm9vbSB8fCB6ID09PSBjeikgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIGl0J3Mgbm90IGFuIGFuY2VzdG9yIG9mIHRoZSB0YXJnZXQgdGlsZVxuICAgICAgICAgICAgdmFyIG0gPSAxIDw8IChjeiAtIHopO1xuICAgICAgICAgICAgaWYgKHggIT09IE1hdGguZmxvb3IoY3ggLyBtKSB8fCB5ICE9PSBNYXRoLmZsb29yKGN5IC8gbSkpIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2Ugc2xpY2UgZnVydGhlciBkb3duLCBubyBuZWVkIHRvIGtlZXAgc291cmNlIGdlb21ldHJ5XG4gICAgICAgIHRpbGUuc291cmNlID0gbnVsbDtcblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgLy8gdmFsdWVzIHdlJ2xsIHVzZSBmb3IgY2xpcHBpbmdcbiAgICAgICAgdmFyIGsxID0gMC41ICogb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCxcbiAgICAgICAgICAgIGsyID0gMC41IC0gazEsXG4gICAgICAgICAgICBrMyA9IDAuNSArIGsxLFxuICAgICAgICAgICAgazQgPSAxICsgazEsXG4gICAgICAgICAgICB0bCwgYmwsIHRyLCBiciwgbGVmdCwgcmlnaHQ7XG5cbiAgICAgICAgdGwgPSBibCA9IHRyID0gYnIgPSBudWxsO1xuXG4gICAgICAgIGxlZnQgID0gY2xpcChmZWF0dXJlcywgejIsIHggLSBrMSwgeCArIGszLCAwLCBpbnRlcnNlY3RYLCB0aWxlLm1pblswXSwgdGlsZS5tYXhbMF0pO1xuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4ICsgazIsIHggKyBrNCwgMCwgaW50ZXJzZWN0WCwgdGlsZS5taW5bMF0sIHRpbGUubWF4WzBdKTtcblxuICAgICAgICBpZiAobGVmdCkge1xuICAgICAgICAgICAgdGwgPSBjbGlwKGxlZnQsIHoyLCB5IC0gazEsIHkgKyBrMywgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgICAgIGJsID0gY2xpcChsZWZ0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIHRyID0gY2xpcChyaWdodCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICAgICAgYnIgPSBjbGlwKHJpZ2h0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgaWYgKHRsKSBzdGFjay5wdXNoKHRsLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMik7XG4gICAgICAgIGlmIChibCkgc3RhY2sucHVzaChibCwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIgKyAxKTtcbiAgICAgICAgaWYgKHRyKSBzdGFjay5wdXNoKHRyLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMik7XG4gICAgICAgIGlmIChicikgc3RhY2sucHVzaChiciwgeiArIDEsIHggKiAyICsgMSwgeSAqIDIgKyAxKTtcbiAgICB9XG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLmdldFRpbGUgPSBmdW5jdGlvbiAoeiwgeCwgeSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBleHRlbnQgPSBvcHRpb25zLmV4dGVudCxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgdmFyIHoyID0gMSA8PCB6O1xuICAgIHggPSAoKHggJSB6MikgKyB6MikgJSB6MjsgLy8gd3JhcCB0aWxlIHggY29vcmRpbmF0ZVxuXG4gICAgdmFyIGlkID0gdG9JRCh6LCB4LCB5KTtcbiAgICBpZiAodGhpcy50aWxlc1tpZF0pIHJldHVybiB0cmFuc2Zvcm1UaWxlKHRoaXMudGlsZXNbaWRdLCBleHRlbnQpO1xuXG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS5sb2coJ2RyaWxsaW5nIGRvd24gdG8geiVkLSVkLSVkJywgeiwgeCwgeSk7XG5cbiAgICB2YXIgejAgPSB6LFxuICAgICAgICB4MCA9IHgsXG4gICAgICAgIHkwID0geSxcbiAgICAgICAgcGFyZW50O1xuXG4gICAgd2hpbGUgKCFwYXJlbnQgJiYgejAgPiAwKSB7XG4gICAgICAgIHowLS07XG4gICAgICAgIHgwID0gTWF0aC5mbG9vcih4MCAvIDIpO1xuICAgICAgICB5MCA9IE1hdGguZmxvb3IoeTAgLyAyKTtcbiAgICAgICAgcGFyZW50ID0gdGhpcy50aWxlc1t0b0lEKHowLCB4MCwgeTApXTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZm91bmQgcGFyZW50IHRpbGUgeiVkLSVkLSVkJywgejAsIHgwLCB5MCk7XG5cbiAgICAvLyBpZiB3ZSBmb3VuZCBhIHBhcmVudCB0aWxlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGdlb21ldHJ5LCB3ZSBjYW4gZHJpbGwgZG93biBmcm9tIGl0XG4gICAgaWYgKHBhcmVudC5zb3VyY2UpIHtcbiAgICAgICAgaWYgKGlzQ2xpcHBlZFNxdWFyZShwYXJlbnQsIGV4dGVudCwgb3B0aW9ucy5idWZmZXIpKSByZXR1cm4gdHJhbnNmb3JtVGlsZShwYXJlbnQsIGV4dGVudCk7XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdkcmlsbGluZyBkb3duJyk7XG4gICAgICAgIHRoaXMuc3BsaXRUaWxlKHBhcmVudC5zb3VyY2UsIHowLCB4MCwgeTAsIHosIHgsIHkpO1xuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2RyaWxsaW5nIGRvd24nKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudGlsZXNbaWRdKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1UaWxlKHRoaXMudGlsZXNbaWRdLCBleHRlbnQpO1xufTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtVGlsZSh0aWxlLCBleHRlbnQpIHtcbiAgICBpZiAodGlsZS50cmFuc2Zvcm1lZCkgcmV0dXJuIHRpbGU7XG5cbiAgICB2YXIgejIgPSB0aWxlLnoyLFxuICAgICAgICB0eCA9IHRpbGUueCxcbiAgICAgICAgdHkgPSB0aWxlLnksXG4gICAgICAgIGksIGosIGs7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IHRpbGUuZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaisrKSBnZW9tW2pdID0gdHJhbnNmb3JtUG9pbnQoZ2VvbVtqXSwgZXh0ZW50LCB6MiwgdHgsIHR5KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb20ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcmluZyA9IGdlb21bal07XG4gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHJpbmcubGVuZ3RoOyBrKyspIHJpbmdba10gPSB0cmFuc2Zvcm1Qb2ludChyaW5nW2tdLCBleHRlbnQsIHoyLCB0eCwgdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGlsZS50cmFuc2Zvcm1lZCA9IHRydWU7XG5cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnQocCwgZXh0ZW50LCB6MiwgdHgsIHR5KSB7XG4gICAgdmFyIHggPSBNYXRoLnJvdW5kKGV4dGVudCAqIChwWzBdICogejIgLSB0eCkpLFxuICAgICAgICB5ID0gTWF0aC5yb3VuZChleHRlbnQgKiAocFsxXSAqIHoyIC0gdHkpKTtcbiAgICByZXR1cm4gW3gsIHldO1xufVxuXG5mdW5jdGlvbiB0b0lEKHosIHgsIHkpIHtcbiAgICByZXR1cm4gKCgoMSA8PCB6KSAqIHkgKyB4KSAqIDMyKSArIHo7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdFgoYSwgYiwgeCkge1xuICAgIHJldHVybiBbeCwgKHggLSBhWzBdKSAqIChiWzFdIC0gYVsxXSkgLyAoYlswXSAtIGFbMF0pICsgYVsxXSwgMV07XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RZKGEsIGIsIHkpIHtcbiAgICByZXR1cm4gWyh5IC0gYVsxXSkgKiAoYlswXSAtIGFbMF0pIC8gKGJbMV0gLSBhWzFdKSArIGFbMF0sIHksIDFdO1xufVxuXG5mdW5jdGlvbiBleHRlbmQoZGVzdCwgc3JjKSB7XG4gICAgZm9yICh2YXIgaSBpbiBzcmMpIGRlc3RbaV0gPSBzcmNbaV07XG4gICAgcmV0dXJuIGRlc3Q7XG59XG5cbi8vIGNoZWNrcyB3aGV0aGVyIGEgdGlsZSBpcyBhIHdob2xlLWFyZWEgZmlsbCBhZnRlciBjbGlwcGluZzsgaWYgaXQgaXMsIHRoZXJlJ3Mgbm8gc2Vuc2Ugc2xpY2luZyBpdCBmdXJ0aGVyXG5mdW5jdGlvbiBpc0NsaXBwZWRTcXVhcmUodGlsZSwgZXh0ZW50LCBidWZmZXIpIHtcblxuICAgIHZhciBmZWF0dXJlcyA9IHRpbGUuc291cmNlO1xuICAgIGlmIChmZWF0dXJlcy5sZW5ndGggIT09IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbMF07XG4gICAgaWYgKGZlYXR1cmUudHlwZSAhPT0gMyB8fCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aCA+IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBsZW4gPSBmZWF0dXJlLmdlb21ldHJ5WzBdLmxlbmd0aDtcbiAgICBpZiAobGVuICE9PSA1KSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBwID0gdHJhbnNmb3JtUG9pbnQoZmVhdHVyZS5nZW9tZXRyeVswXVtpXSwgZXh0ZW50LCB0aWxlLnoyLCB0aWxlLngsIHRpbGUueSk7XG4gICAgICAgIGlmICgocFswXSAhPT0gLWJ1ZmZlciAmJiBwWzBdICE9PSBleHRlbnQgKyBidWZmZXIpIHx8XG4gICAgICAgICAgICAocFsxXSAhPT0gLWJ1ZmZlciAmJiBwWzFdICE9PSBleHRlbnQgKyBidWZmZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc2ltcGxpZnk7XG5cbi8vIGNhbGN1bGF0ZSBzaW1wbGlmaWNhdGlvbiBkYXRhIHVzaW5nIG9wdGltaXplZCBEb3VnbGFzLVBldWNrZXIgYWxnb3JpdGhtXG5cbmZ1bmN0aW9uIHNpbXBsaWZ5KHBvaW50cywgdG9sZXJhbmNlKSB7XG5cbiAgICB2YXIgc3FUb2xlcmFuY2UgPSB0b2xlcmFuY2UgKiB0b2xlcmFuY2UsXG4gICAgICAgIGxlbiA9IHBvaW50cy5sZW5ndGgsXG4gICAgICAgIGZpcnN0ID0gMCxcbiAgICAgICAgbGFzdCA9IGxlbiAtIDEsXG4gICAgICAgIHN0YWNrID0gW10sXG4gICAgICAgIGksIG1heFNxRGlzdCwgc3FEaXN0LCBpbmRleDtcblxuICAgIC8vIGFsd2F5cyByZXRhaW4gdGhlIGVuZHBvaW50cyAoMSBpcyB0aGUgbWF4IHZhbHVlKVxuICAgIHBvaW50c1tmaXJzdF1bMl0gPSAxO1xuICAgIHBvaW50c1tsYXN0XVsyXSA9IDE7XG5cbiAgICAvLyBhdm9pZCByZWN1cnNpb24gYnkgdXNpbmcgYSBzdGFja1xuICAgIHdoaWxlIChsYXN0KSB7XG5cbiAgICAgICAgbWF4U3FEaXN0ID0gMDtcblxuICAgICAgICBmb3IgKGkgPSBmaXJzdCArIDE7IGkgPCBsYXN0OyBpKyspIHtcbiAgICAgICAgICAgIHNxRGlzdCA9IGdldFNxU2VnRGlzdChwb2ludHNbaV0sIHBvaW50c1tmaXJzdF0sIHBvaW50c1tsYXN0XSk7XG5cbiAgICAgICAgICAgIGlmIChzcURpc3QgPiBtYXhTcURpc3QpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgbWF4U3FEaXN0ID0gc3FEaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heFNxRGlzdCA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICBwb2ludHNbaW5kZXhdWzJdID0gbWF4U3FEaXN0OyAvLyBzYXZlIHRoZSBwb2ludCBpbXBvcnRhbmNlIGluIHNxdWFyZWQgcGl4ZWxzIGFzIGEgeiBjb29yZGluYXRlXG4gICAgICAgICAgICBzdGFjay5wdXNoKGZpcnN0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgZmlyc3QgPSBpbmRleDtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFzdCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgZmlyc3QgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gc3F1YXJlIGRpc3RhbmNlIGZyb20gYSBwb2ludCB0byBhIHNlZ21lbnRcbmZ1bmN0aW9uIGdldFNxU2VnRGlzdChwLCBhLCBiKSB7XG5cbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSxcbiAgICAgICAgcHggPSBwWzBdLCBweSA9IHBbMV0sXG4gICAgICAgIGR4ID0gYnggLSB4LFxuICAgICAgICBkeSA9IGJ5IC0geTtcblxuICAgIGlmIChkeCAhPT0gMCB8fCBkeSAhPT0gMCkge1xuXG4gICAgICAgIHZhciB0ID0gKChweCAtIHgpICogZHggKyAocHkgLSB5KSAqIGR5KSAvIChkeCAqIGR4ICsgZHkgKiBkeSk7XG5cbiAgICAgICAgaWYgKHQgPiAxKSB7XG4gICAgICAgICAgICB4ID0gYng7XG4gICAgICAgICAgICB5ID0gYnk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0ID4gMCkge1xuICAgICAgICAgICAgeCArPSBkeCAqIHQ7XG4gICAgICAgICAgICB5ICs9IGR5ICogdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGR4ID0gcHggLSB4O1xuICAgIGR5ID0gcHkgLSB5O1xuXG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVRpbGU7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHoyLCB0eCwgdHksIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSkge1xuICAgIHZhciB0aWxlID0ge1xuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICAgIG51bVBvaW50czogMCxcbiAgICAgICAgbnVtU2ltcGxpZmllZDogMCxcbiAgICAgICAgbnVtRmVhdHVyZXM6IDAsXG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgeDogdHgsXG4gICAgICAgIHk6IHR5LFxuICAgICAgICB6MjogejIsXG4gICAgICAgIHRyYW5zZm9ybWVkOiBmYWxzZSxcbiAgICAgICAgbWluOiBbMiwgMV0sXG4gICAgICAgIG1heDogWy0xLCAwXVxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aWxlLm51bUZlYXR1cmVzKys7XG4gICAgICAgIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSk7XG5cbiAgICAgICAgdmFyIG1pbiA9IGZlYXR1cmVzW2ldLm1pbixcbiAgICAgICAgICAgIG1heCA9IGZlYXR1cmVzW2ldLm1heDtcblxuICAgICAgICBpZiAobWluWzBdIDwgdGlsZS5taW5bMF0pIHRpbGUubWluWzBdID0gbWluWzBdO1xuICAgICAgICBpZiAobWluWzFdIDwgdGlsZS5taW5bMV0pIHRpbGUubWluWzFdID0gbWluWzFdO1xuICAgICAgICBpZiAobWF4WzBdID4gdGlsZS5tYXhbMF0pIHRpbGUubWF4WzBdID0gbWF4WzBdO1xuICAgICAgICBpZiAobWF4WzFdID4gdGlsZS5tYXhbMV0pIHRpbGUubWF4WzFdID0gbWF4WzFdO1xuICAgIH1cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlLCB0b2xlcmFuY2UsIG5vU2ltcGxpZnkpIHtcblxuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgc2ltcGxpZmllZCA9IFtdLFxuICAgICAgICBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZSxcbiAgICAgICAgaSwgaiwgcmluZywgcDtcblxuICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzaW1wbGlmaWVkLnB1c2goZ2VvbVtpXSk7XG4gICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgdGlsZS5udW1TaW1wbGlmaWVkKys7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSB7XG5cbiAgICAgICAgLy8gc2ltcGxpZnkgYW5kIHRyYW5zZm9ybSBwcm9qZWN0ZWQgY29vcmRpbmF0ZXMgZm9yIHRpbGUgZ2VvbWV0cnlcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJpbmcgPSBnZW9tW2ldO1xuXG4gICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IHRpbnkgcG9seWxpbmVzICYgcG9seWdvbnNcbiAgICAgICAgICAgIGlmICghbm9TaW1wbGlmeSAmJiAoKHR5cGUgPT09IDIgJiYgcmluZy5kaXN0IDwgdG9sZXJhbmNlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PT0gMyAmJiByaW5nLmFyZWEgPCBzcVRvbGVyYW5jZSkpKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMgKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzaW1wbGlmaWVkUmluZyA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHAgPSByaW5nW2pdO1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgcG9pbnRzIHdpdGggaW1wb3J0YW5jZSA+IHRvbGVyYW5jZVxuICAgICAgICAgICAgICAgIGlmIChub1NpbXBsaWZ5IHx8IHBbMl0gPiBzcVRvbGVyYW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBzaW1wbGlmaWVkUmluZy5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKHNpbXBsaWZpZWRSaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaW1wbGlmaWVkLmxlbmd0aCkge1xuICAgICAgICB0aWxlLmZlYXR1cmVzLnB1c2goe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IHNpbXBsaWZpZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgdGFnczogZmVhdHVyZS50YWdzIHx8IG51bGxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2xpcCA9IHJlcXVpcmUoJy4vY2xpcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXA7XG5cbmZ1bmN0aW9uIHdyYXAoZmVhdHVyZXMsIGJ1ZmZlciwgaW50ZXJzZWN0WCkge1xuICAgIHZhciBtZXJnZWQgPSBmZWF0dXJlcyxcbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCAxLCAtMSAtIGJ1ZmZlciwgYnVmZmVyLCAgICAgMCwgaW50ZXJzZWN0WCwgLTEsIDIpLCAvLyBsZWZ0IHdvcmxkIGNvcHlcbiAgICAgICAgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCAxLCAgMSAtIGJ1ZmZlciwgMiArIGJ1ZmZlciwgMCwgaW50ZXJzZWN0WCwgLTEsIDIpOyAvLyByaWdodCB3b3JsZCBjb3B5XG5cbiAgICBpZiAobGVmdCB8fCByaWdodCkge1xuICAgICAgICBtZXJnZWQgPSBjbGlwKGZlYXR1cmVzLCAxLCAtYnVmZmVyLCAxICsgYnVmZmVyLCAwLCBpbnRlcnNlY3RYLCAtMSwgMik7IC8vIGNlbnRlciB3b3JsZCBjb3B5XG5cbiAgICAgICAgaWYgKGxlZnQpIG1lcmdlZCA9IHNoaWZ0RmVhdHVyZUNvb3JkcyhsZWZ0LCAxKS5jb25jYXQobWVyZ2VkKTsgLy8gbWVyZ2UgbGVmdCBpbnRvIGNlbnRlclxuICAgICAgICBpZiAocmlnaHQpIG1lcmdlZCA9IG1lcmdlZC5jb25jYXQoc2hpZnRGZWF0dXJlQ29vcmRzKHJpZ2h0LCAtMSkpOyAvLyBtZXJnZSByaWdodCBpbnRvIGNlbnRlclxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0RmVhdHVyZUNvb3JkcyhmZWF0dXJlcywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld0ZlYXR1cmVzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlO1xuXG4gICAgICAgIHZhciBuZXdHZW9tZXRyeTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5LCBvZmZzZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZmVhdHVyZS5nZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIG5ld0dlb21ldHJ5LnB1c2goc2hpZnRDb29yZHMoZmVhdHVyZS5nZW9tZXRyeVtqXSwgb2Zmc2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXdGZWF0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiBuZXdHZW9tZXRyeSxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICB0YWdzOiBmZWF0dXJlLnRhZ3MsXG4gICAgICAgICAgICBtaW46IFtmZWF0dXJlLm1pblswXSArIG9mZnNldCwgZmVhdHVyZS5taW5bMV1dLFxuICAgICAgICAgICAgbWF4OiBbZmVhdHVyZS5tYXhbMF0gKyBvZmZzZXQsIGZlYXR1cmUubWF4WzFdXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0Q29vcmRzKHBvaW50cywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld1BvaW50cyA9IFtdO1xuICAgIG5ld1BvaW50cy5hcmVhID0gcG9pbnRzLmFyZWE7XG4gICAgbmV3UG9pbnRzLmRpc3QgPSBwb2ludHMuZGlzdDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1BvaW50cy5wdXNoKFtwb2ludHNbaV1bMF0gKyBvZmZzZXQsIHBvaW50c1tpXVsxXSwgcG9pbnRzW2ldWzJdXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdQb2ludHM7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGludmVydFxuXG4vKipcbiAqIEludmVydHMgYSBtYXQzXG4gKlxuICogQGFsaWFzIG1hdDMuaW52ZXJ0XG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbmZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl1cbiAgdmFyIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV1cbiAgdmFyIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF1cblxuICB2YXIgYjAxID0gYTIyICogYTExIC0gYTEyICogYTIxXG4gIHZhciBiMTEgPSAtYTIyICogYTEwICsgYTEyICogYTIwXG4gIHZhciBiMjEgPSBhMjEgKiBhMTAgLSBhMTEgKiBhMjBcblxuICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gIHZhciBkZXQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEgKyBhMDIgKiBiMjFcblxuICBpZiAoIWRldCkgcmV0dXJuIG51bGxcbiAgZGV0ID0gMS4wIC8gZGV0XG5cbiAgb3V0WzBdID0gYjAxICogZGV0XG4gIG91dFsxXSA9ICgtYTIyICogYTAxICsgYTAyICogYTIxKSAqIGRldFxuICBvdXRbMl0gPSAoYTEyICogYTAxIC0gYTAyICogYTExKSAqIGRldFxuICBvdXRbM10gPSBiMTEgKiBkZXRcbiAgb3V0WzRdID0gKGEyMiAqIGEwMCAtIGEwMiAqIGEyMCkgKiBkZXRcbiAgb3V0WzVdID0gKC1hMTIgKiBhMDAgKyBhMDIgKiBhMTApICogZGV0XG4gIG91dFs2XSA9IGIyMSAqIGRldFxuICBvdXRbN10gPSAoLWEyMSAqIGEwMCArIGEwMSAqIGEyMCkgKiBkZXRcbiAgb3V0WzhdID0gKGExMSAqIGEwMCAtIGEwMSAqIGExMCkgKiBkZXRcblxuICByZXR1cm4gb3V0XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IG5vcm1hbEZyb21NYXQ0XG5cbi8qKlxuKiBDYWxjdWxhdGVzIGEgM3gzIG5vcm1hbCBtYXRyaXggKHRyYW5zcG9zZSBpbnZlcnNlKSBmcm9tIHRoZSA0eDQgbWF0cml4XG4qXG4qIEBhbGlhcyBtYXQzLm5vcm1hbEZyb21NYXQ0XG4qIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiogQHBhcmFtIHttYXQ0fSBhIE1hdDQgdG8gZGVyaXZlIHRoZSBub3JtYWwgbWF0cml4IGZyb21cbipcbiogQHJldHVybnMge21hdDN9IG91dFxuKi9cbmZ1bmN0aW9uIG5vcm1hbEZyb21NYXQ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXVxuICB2YXIgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XVxuICB2YXIgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdXG4gIHZhciBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XVxuXG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTBcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMFxuICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwXG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTFcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMVxuICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyXG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzBcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMFxuICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwXG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzFcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMVxuICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyXG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICB2YXIgZGV0ID0gYjAwICogYjExXG4gICAgICAgICAgLSBiMDEgKiBiMTBcbiAgICAgICAgICArIGIwMiAqIGIwOVxuICAgICAgICAgICsgYjAzICogYjA4XG4gICAgICAgICAgLSBiMDQgKiBiMDdcbiAgICAgICAgICArIGIwNSAqIGIwNlxuXG4gIGlmICghZGV0KSByZXR1cm4gbnVsbFxuICBkZXQgPSAxLjAgLyBkZXRcblxuICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldFxuICBvdXRbMV0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldFxuICBvdXRbMl0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldFxuXG4gIG91dFszXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0XG4gIG91dFs0XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0XG4gIG91dFs1XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0XG5cbiAgb3V0WzZdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXRcbiAgb3V0WzddID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXRcbiAgb3V0WzhdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXRcblxuICByZXR1cm4gb3V0XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGNvcHk7XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICBvdXRbOV0gPSBhWzldO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG5cbi8qKlxuICogU2V0IGEgbWF0NCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9va0F0O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGxvb2stYXQgbWF0cml4IHdpdGggdGhlIGdpdmVuIGV5ZSBwb3NpdGlvbiwgZm9jYWwgcG9pbnQsIGFuZCB1cCBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHt2ZWMzfSBleWUgUG9zaXRpb24gb2YgdGhlIHZpZXdlclxuICogQHBhcmFtIHt2ZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XG4gKiBAcGFyYW0ge3ZlYzN9IHVwIHZlYzMgcG9pbnRpbmcgdXBcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gbG9va0F0KG91dCwgZXllLCBjZW50ZXIsIHVwKSB7XG4gICAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbixcbiAgICAgICAgZXlleCA9IGV5ZVswXSxcbiAgICAgICAgZXlleSA9IGV5ZVsxXSxcbiAgICAgICAgZXlleiA9IGV5ZVsyXSxcbiAgICAgICAgdXB4ID0gdXBbMF0sXG4gICAgICAgIHVweSA9IHVwWzFdLFxuICAgICAgICB1cHogPSB1cFsyXSxcbiAgICAgICAgY2VudGVyeCA9IGNlbnRlclswXSxcbiAgICAgICAgY2VudGVyeSA9IGNlbnRlclsxXSxcbiAgICAgICAgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICAgIGlmIChNYXRoLmFicyhleWV4IC0gY2VudGVyeCkgPCAwLjAwMDAwMSAmJlxuICAgICAgICBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCAwLjAwMDAwMSAmJlxuICAgICAgICBNYXRoLmFicyhleWV6IC0gY2VudGVyeikgPCAwLjAwMDAwMSkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHkob3V0KTtcbiAgICB9XG5cbiAgICB6MCA9IGV5ZXggLSBjZW50ZXJ4O1xuICAgIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gICAgejIgPSBleWV6IC0gY2VudGVyejtcblxuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQoejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyKTtcbiAgICB6MCAqPSBsZW47XG4gICAgejEgKj0gbGVuO1xuICAgIHoyICo9IGxlbjtcblxuICAgIHgwID0gdXB5ICogejIgLSB1cHogKiB6MTtcbiAgICB4MSA9IHVweiAqIHowIC0gdXB4ICogejI7XG4gICAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICAgIGxlbiA9IE1hdGguc3FydCh4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHgwID0gMDtcbiAgICAgICAgeDEgPSAwO1xuICAgICAgICB4MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeDAgKj0gbGVuO1xuICAgICAgICB4MSAqPSBsZW47XG4gICAgICAgIHgyICo9IGxlbjtcbiAgICB9XG5cbiAgICB5MCA9IHoxICogeDIgLSB6MiAqIHgxO1xuICAgIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gICAgeTIgPSB6MCAqIHgxIC0gejEgKiB4MDtcblxuICAgIGxlbiA9IE1hdGguc3FydCh5MCAqIHkwICsgeTEgKiB5MSArIHkyICogeTIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHkwID0gMDtcbiAgICAgICAgeTEgPSAwO1xuICAgICAgICB5MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeTAgKj0gbGVuO1xuICAgICAgICB5MSAqPSBsZW47XG4gICAgICAgIHkyICo9IGxlbjtcbiAgICB9XG5cbiAgICBvdXRbMF0gPSB4MDtcbiAgICBvdXRbMV0gPSB5MDtcbiAgICBvdXRbMl0gPSB6MDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IHgxO1xuICAgIG91dFs1XSA9IHkxO1xuICAgIG91dFs2XSA9IHoxO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0geDI7XG4gICAgb3V0WzldID0geTI7XG4gICAgb3V0WzEwXSA9IHoyO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAtKHgwICogZXlleCArIHgxICogZXlleSArIHgyICogZXlleik7XG4gICAgb3V0WzEzXSA9IC0oeTAgKiBleWV4ICsgeTEgKiBleWV5ICsgeTIgKiBleWV6KTtcbiAgICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICAgIG91dFsxNV0gPSAxO1xuXG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBtdWx0aXBseTtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQ0J3NcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdO1xuXG4gICAgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4XG4gICAgdmFyIGIwICA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdLCBiMyA9IGJbM107ICBcbiAgICBvdXRbMF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzFdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsyXSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbM10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbNF07IGIxID0gYls1XTsgYjIgPSBiWzZdOyBiMyA9IGJbN107XG4gICAgb3V0WzRdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs1XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbNl0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzddID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzhdOyBiMSA9IGJbOV07IGIyID0gYlsxMF07IGIzID0gYlsxMV07XG4gICAgb3V0WzhdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs5XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTBdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxMV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbMTJdOyBiMSA9IGJbMTNdOyBiMiA9IGJbMTRdOyBiMyA9IGJbMTVdO1xuICAgIG91dFsxMl0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzEzXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTRdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxNV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBwZXJzcGVjdGl2ZTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge251bWJlcn0gZm92eSBWZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgQXNwZWN0IHJhdGlvLiB0eXBpY2FsbHkgdmlld3BvcnQgd2lkdGgvaGVpZ2h0XG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBwZXJzcGVjdGl2ZShvdXQsIGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gICAgdmFyIGYgPSAxLjAgLyBNYXRoLnRhbihmb3Z5IC8gMiksXG4gICAgICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gZjtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTFdID0gLTE7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9ICgyICogZmFyICogbmVhcikgKiBuZjtcbiAgICBvdXRbMTVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHNjYWxlO1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjM1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHt2ZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqKi9cbmZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV0sIHogPSB2WzJdO1xuXG4gICAgb3V0WzBdID0gYVswXSAqIHg7XG4gICAgb3V0WzFdID0gYVsxXSAqIHg7XG4gICAgb3V0WzJdID0gYVsyXSAqIHg7XG4gICAgb3V0WzNdID0gYVszXSAqIHg7XG4gICAgb3V0WzRdID0gYVs0XSAqIHk7XG4gICAgb3V0WzVdID0gYVs1XSAqIHk7XG4gICAgb3V0WzZdID0gYVs2XSAqIHk7XG4gICAgb3V0WzddID0gYVs3XSAqIHk7XG4gICAgb3V0WzhdID0gYVs4XSAqIHo7XG4gICAgb3V0WzldID0gYVs5XSAqIHo7XG4gICAgb3V0WzEwXSA9IGFbMTBdICogejtcbiAgICBvdXRbMTFdID0gYVsxMV0gKiB6O1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHRyYW5zbGF0ZTtcblxuLyoqXG4gKiBUcmFuc2xhdGUgYSBtYXQ0IGJ5IHRoZSBnaXZlbiB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGUob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXSwgeiA9IHZbMl0sXG4gICAgICAgIGEwMCwgYTAxLCBhMDIsIGEwMyxcbiAgICAgICAgYTEwLCBhMTEsIGExMiwgYTEzLFxuICAgICAgICBhMjAsIGEyMSwgYTIyLCBhMjM7XG5cbiAgICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgICAgIG91dFsxMl0gPSBhWzBdICogeCArIGFbNF0gKiB5ICsgYVs4XSAqIHogKyBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMV0gKiB4ICsgYVs1XSAqIHkgKyBhWzldICogeiArIGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVszXSAqIHggKyBhWzddICogeSArIGFbMTFdICogeiArIGFbMTVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGEwMCA9IGFbMF07IGEwMSA9IGFbMV07IGEwMiA9IGFbMl07IGEwMyA9IGFbM107XG4gICAgICAgIGExMCA9IGFbNF07IGExMSA9IGFbNV07IGExMiA9IGFbNl07IGExMyA9IGFbN107XG4gICAgICAgIGEyMCA9IGFbOF07IGEyMSA9IGFbOV07IGEyMiA9IGFbMTBdOyBhMjMgPSBhWzExXTtcblxuICAgICAgICBvdXRbMF0gPSBhMDA7IG91dFsxXSA9IGEwMTsgb3V0WzJdID0gYTAyOyBvdXRbM10gPSBhMDM7XG4gICAgICAgIG91dFs0XSA9IGExMDsgb3V0WzVdID0gYTExOyBvdXRbNl0gPSBhMTI7IG91dFs3XSA9IGExMztcbiAgICAgICAgb3V0WzhdID0gYTIwOyBvdXRbOV0gPSBhMjE7IG91dFsxMF0gPSBhMjI7IG91dFsxMV0gPSBhMjM7XG5cbiAgICAgICAgb3V0WzEyXSA9IGEwMCAqIHggKyBhMTAgKiB5ICsgYTIwICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYTAxICogeCArIGExMSAqIHkgKyBhMjEgKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhMDIgKiB4ICsgYTEyICogeSArIGEyMiAqIHogKyBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGEwMyAqIHggKyBhMTMgKiB5ICsgYTIzICogeiArIGFbMTVdO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcGFyc2VFcnJvcnNcblxuZnVuY3Rpb24gcGFyc2VFcnJvcnMobG9nKSB7XG4gIGxvZyA9IFN0cmluZyhsb2cpXG5cbiAgdmFyIGxvZ3MgPSBbXVxuICB2YXIgcmVzdWx0XG5cbiAgd2hpbGUgKHJlc3VsdCA9IGxvZy5tYXRjaCgvRVJST1JcXDooW15cXG5dKykvKSkge1xuICAgIGxvZyA9IGxvZy5zbGljZShyZXN1bHQuaW5kZXggKyAxKVxuXG4gICAgdmFyIGxpbmUgPSByZXN1bHRbMV0udHJpbSgpXG4gICAgdmFyIHNlcHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICB2YXIgZW1zZyA9IHNlcHMuc2xpY2UoMikuam9pbignOicpLnRyaW0oKVxuICAgIHZhciBmaWxlID0gcGFyc2VJbnQoc2Vwc1swXSwgMTApXG4gICAgdmFyIGxpbmUgPSBwYXJzZUludChzZXBzWzFdLCAxMClcblxuICAgIGxvZ3MucHVzaCh7XG4gICAgICAgIG1lc3NhZ2U6IGVtc2dcbiAgICAgICwgZmlsZTogZmlsZVxuICAgICAgLCBsaW5lOiBsaW5lXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBsb2dzXG59XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHlhbWwgPSByZXF1aXJlKCcuL2xpYi9qcy15YW1sLmpzJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB5YW1sO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBsb2FkZXIgPSByZXF1aXJlKCcuL2pzLXlhbWwvbG9hZGVyJyk7XG4vLyB2YXIgZHVtcGVyID0gcmVxdWlyZSgnLi9qcy15YW1sL2R1bXBlcicpO1xuXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZWQobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gJyArIG5hbWUgKyAnIGlzIGRlcHJlY2F0ZWQgYW5kIGNhbm5vdCBiZSB1c2VkLicpO1xuICB9O1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLlR5cGUgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvdHlwZScpO1xubW9kdWxlLmV4cG9ydHMuU2NoZW1hICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEnKTtcbm1vZHVsZS5leHBvcnRzLkZBSUxTQUZFX1NDSEVNQSAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5KU09OX1NDSEVNQSAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9qc29uJyk7XG5tb2R1bGUuZXhwb3J0cy5DT1JFX1NDSEVNQSAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9jb3JlJyk7XG5tb2R1bGUuZXhwb3J0cy5ERUZBVUxUX1NBRkVfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xubW9kdWxlLmV4cG9ydHMubG9hZCAgICAgICAgICAgICAgICA9IGxvYWRlci5sb2FkO1xubW9kdWxlLmV4cG9ydHMubG9hZEFsbCAgICAgICAgICAgICA9IGxvYWRlci5sb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWQgICAgICAgICAgICA9IGxvYWRlci5zYWZlTG9hZDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsICAgICAgICAgPSBsb2FkZXIuc2FmZUxvYWRBbGw7XG4vLyBtb2R1bGUuZXhwb3J0cy5kdW1wICAgICAgICAgICAgICAgID0gZHVtcGVyLmR1bXA7XG4vLyBtb2R1bGUuZXhwb3J0cy5zYWZlRHVtcCAgICAgICAgICAgID0gZHVtcGVyLnNhZmVEdW1wO1xubW9kdWxlLmV4cG9ydHMuWUFNTEV4Y2VwdGlvbiAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9leGNlcHRpb24nKTtcblxuLy8gRGVwcmVjYXRlZCBzY2hlbWEgbmFtZXMgZnJvbSBKUy1ZQU1MIDIuMC54XG5tb2R1bGUuZXhwb3J0cy5NSU5JTUFMX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZmFpbHNhZmUnKTtcbm1vZHVsZS5leHBvcnRzLlNBRkVfU0NIRU1BICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcblxuLy8gRGVwcmVjYXRlZCBmdW5jdGlvbnMgZnJvbSBKUy1ZQU1MIDEueC54XG5tb2R1bGUuZXhwb3J0cy5zY2FuICAgICAgICAgICA9IGRlcHJlY2F0ZWQoJ3NjYW4nKTtcbm1vZHVsZS5leHBvcnRzLnBhcnNlICAgICAgICAgID0gZGVwcmVjYXRlZCgncGFyc2UnKTtcbm1vZHVsZS5leHBvcnRzLmNvbXBvc2UgICAgICAgID0gZGVwcmVjYXRlZCgnY29tcG9zZScpO1xubW9kdWxlLmV4cG9ydHMuYWRkQ29uc3RydWN0b3IgPSBkZXByZWNhdGVkKCdhZGRDb25zdHJ1Y3RvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIGlzTm90aGluZyhzdWJqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIHN1YmplY3QgPT09ICd1bmRlZmluZWQnKSB8fCAoc3ViamVjdCA9PT0gbnVsbCk7XG59XG5cblxuZnVuY3Rpb24gaXNPYmplY3Qoc3ViamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBzdWJqZWN0ID09PSAnb2JqZWN0JykgJiYgKHN1YmplY3QgIT09IG51bGwpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoc2VxdWVuY2UpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VxdWVuY2UpKSByZXR1cm4gc2VxdWVuY2U7XG4gIGVsc2UgaWYgKGlzTm90aGluZyhzZXF1ZW5jZSkpIHJldHVybiBbXTtcblxuICByZXR1cm4gWyBzZXF1ZW5jZSBdO1xufVxuXG5cbmZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIgaW5kZXgsIGxlbmd0aCwga2V5LCBzb3VyY2VLZXlzO1xuXG4gIGlmIChzb3VyY2UpIHtcbiAgICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGtleSA9IHNvdXJjZUtleXNbaW5kZXhdO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5cbmZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIGNvdW50KSB7XG4gIHZhciByZXN1bHQgPSAnJywgY3ljbGU7XG5cbiAgZm9yIChjeWNsZSA9IDA7IGN5Y2xlIDwgY291bnQ7IGN5Y2xlICs9IDEpIHtcbiAgICByZXN1bHQgKz0gc3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5mdW5jdGlvbiBpc05lZ2F0aXZlWmVybyhudW1iZXIpIHtcbiAgcmV0dXJuIChudW1iZXIgPT09IDApICYmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IDEgLyBudW1iZXIpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmlzTm90aGluZyAgICAgID0gaXNOb3RoaW5nO1xubW9kdWxlLmV4cG9ydHMuaXNPYmplY3QgICAgICAgPSBpc09iamVjdDtcbm1vZHVsZS5leHBvcnRzLnRvQXJyYXkgICAgICAgID0gdG9BcnJheTtcbm1vZHVsZS5leHBvcnRzLnJlcGVhdCAgICAgICAgID0gcmVwZWF0O1xubW9kdWxlLmV4cG9ydHMuaXNOZWdhdGl2ZVplcm8gPSBpc05lZ2F0aXZlWmVybztcbm1vZHVsZS5leHBvcnRzLmV4dGVuZCAgICAgICAgID0gZXh0ZW5kO1xuIiwiLy8gWUFNTCBlcnJvciBjbGFzcy4gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NDU4OTg0XG4vL1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBZQU1MRXhjZXB0aW9uKHJlYXNvbiwgbWFyaykge1xuICAvLyBTdXBlciBjb25zdHJ1Y3RvclxuICBFcnJvci5jYWxsKHRoaXMpO1xuXG4gIC8vIEluY2x1ZGUgc3RhY2sgdHJhY2UgaW4gZXJyb3Igb2JqZWN0XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIC8vIENocm9tZSBhbmQgTm9kZUpTXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gRkYsIElFIDEwKyBhbmQgU2FmYXJpIDYrLiBGYWxsYmFjayBmb3Igb3RoZXJzXG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2sgfHwgJyc7XG4gIH1cblxuICB0aGlzLm5hbWUgPSAnWUFNTEV4Y2VwdGlvbic7XG4gIHRoaXMucmVhc29uID0gcmVhc29uO1xuICB0aGlzLm1hcmsgPSBtYXJrO1xuICB0aGlzLm1lc3NhZ2UgPSAodGhpcy5yZWFzb24gfHwgJyh1bmtub3duIHJlYXNvbiknKSArICh0aGlzLm1hcmsgPyAnICcgKyB0aGlzLm1hcmsudG9TdHJpbmcoKSA6ICcnKTtcbn1cblxuXG4vLyBJbmhlcml0IGZyb20gRXJyb3JcbllBTUxFeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuWUFNTEV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBZQU1MRXhjZXB0aW9uO1xuXG5cbllBTUxFeGNlcHRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoY29tcGFjdCkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5uYW1lICsgJzogJztcblxuICByZXN1bHQgKz0gdGhpcy5yZWFzb24gfHwgJyh1bmtub3duIHJlYXNvbiknO1xuXG4gIGlmICghY29tcGFjdCAmJiB0aGlzLm1hcmspIHtcbiAgICByZXN1bHQgKz0gJyAnICsgdGhpcy5tYXJrLnRvU3RyaW5nKCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFlBTUxFeGNlcHRpb247XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbWF4LWxlbixuby11c2UtYmVmb3JlLWRlZmluZSovXG5cbnZhciBjb21tb24gICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBZQU1MRXhjZXB0aW9uICAgICAgID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcbnZhciBNYXJrICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9tYXJrJyk7XG52YXIgREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmUoJy4vc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xudmFyIERFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcblxuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuXG52YXIgQ09OVEVYVF9GTE9XX0lOICAgPSAxO1xudmFyIENPTlRFWFRfRkxPV19PVVQgID0gMjtcbnZhciBDT05URVhUX0JMT0NLX0lOICA9IDM7XG52YXIgQ09OVEVYVF9CTE9DS19PVVQgPSA0O1xuXG5cbnZhciBDSE9NUElOR19DTElQICA9IDE7XG52YXIgQ0hPTVBJTkdfU1RSSVAgPSAyO1xudmFyIENIT01QSU5HX0tFRVAgID0gMztcblxuXG52YXIgUEFUVEVSTl9OT05fUFJJTlRBQkxFICAgICAgICAgPSAvW1xceDAwLVxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGXFx4N0YtXFx4ODRcXHg4Ni1cXHg5RlxcdUZGRkVcXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXS87XG52YXIgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MgPSAvW1xceDg1XFx1MjAyOFxcdTIwMjldLztcbnZhciBQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUyAgICAgICA9IC9bLFxcW1xcXVxce1xcfV0vO1xudmFyIFBBVFRFUk5fVEFHX0hBTkRMRSAgICAgICAgICAgID0gL14oPzohfCEhfCFbYS16XFwtXSshKSQvaTtcbnZhciBQQVRURVJOX1RBR19VUkkgICAgICAgICAgICAgICA9IC9eKD86IXxbXixcXFtcXF1cXHtcXH1dKSg/OiVbMC05YS1mXXsyfXxbMC05YS16XFwtIztcXC9cXD86QCY9XFwrXFwkLF9cXC4hflxcKidcXChcXClcXFtcXF1dKSokL2k7XG5cblxuZnVuY3Rpb24gaXNfRU9MKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDBBLyogTEYgKi8pIHx8IChjID09PSAweDBELyogQ1IgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19XSElURV9TUEFDRShjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwOS8qIFRhYiAqLykgfHwgKGMgPT09IDB4MjAvKiBTcGFjZSAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX1dTX09SX0VPTChjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwOS8qIFRhYiAqLykgfHxcbiAgICAgICAgIChjID09PSAweDIwLyogU3BhY2UgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgwQS8qIExGICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MEQvKiBDUiAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX0ZMT1dfSU5ESUNBVE9SKGMpIHtcbiAgcmV0dXJuIGMgPT09IDB4MkMvKiAsICovIHx8XG4gICAgICAgICBjID09PSAweDVCLyogWyAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg1RC8qIF0gKi8gfHxcbiAgICAgICAgIGMgPT09IDB4N0IvKiB7ICovIHx8XG4gICAgICAgICBjID09PSAweDdELyogfSAqLztcbn1cblxuZnVuY3Rpb24gZnJvbUhleENvZGUoYykge1xuICB2YXIgbGM7XG5cbiAgaWYgKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHtcbiAgICByZXR1cm4gYyAtIDB4MzA7XG4gIH1cblxuICAvKmVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UqL1xuICBsYyA9IGMgfCAweDIwO1xuXG4gIGlmICgoMHg2MS8qIGEgKi8gPD0gbGMpICYmIChsYyA8PSAweDY2LyogZiAqLykpIHtcbiAgICByZXR1cm4gbGMgLSAweDYxICsgMTA7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZWRIZXhMZW4oYykge1xuICBpZiAoYyA9PT0gMHg3OC8qIHggKi8pIHsgcmV0dXJuIDI7IH1cbiAgaWYgKGMgPT09IDB4NzUvKiB1ICovKSB7IHJldHVybiA0OyB9XG4gIGlmIChjID09PSAweDU1LyogVSAqLykgeyByZXR1cm4gODsgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZnJvbURlY2ltYWxDb2RlKGMpIHtcbiAgaWYgKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHtcbiAgICByZXR1cm4gYyAtIDB4MzA7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZUVzY2FwZVNlcXVlbmNlKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDMwLyogMCAqLykgPyAnXFx4MDAnIDpcbiAgICAgICAgKGMgPT09IDB4NjEvKiBhICovKSA/ICdcXHgwNycgOlxuICAgICAgICAoYyA9PT0gMHg2Mi8qIGIgKi8pID8gJ1xceDA4JyA6XG4gICAgICAgIChjID09PSAweDc0LyogdCAqLykgPyAnXFx4MDknIDpcbiAgICAgICAgKGMgPT09IDB4MDkvKiBUYWIgKi8pID8gJ1xceDA5JyA6XG4gICAgICAgIChjID09PSAweDZFLyogbiAqLykgPyAnXFx4MEEnIDpcbiAgICAgICAgKGMgPT09IDB4NzYvKiB2ICovKSA/ICdcXHgwQicgOlxuICAgICAgICAoYyA9PT0gMHg2Ni8qIGYgKi8pID8gJ1xceDBDJyA6XG4gICAgICAgIChjID09PSAweDcyLyogciAqLykgPyAnXFx4MEQnIDpcbiAgICAgICAgKGMgPT09IDB4NjUvKiBlICovKSA/ICdcXHgxQicgOlxuICAgICAgICAoYyA9PT0gMHgyMC8qIFNwYWNlICovKSA/ICcgJyA6XG4gICAgICAgIChjID09PSAweDIyLyogXCIgKi8pID8gJ1xceDIyJyA6XG4gICAgICAgIChjID09PSAweDJGLyogLyAqLykgPyAnLycgOlxuICAgICAgICAoYyA9PT0gMHg1Qy8qIFxcICovKSA/ICdcXHg1QycgOlxuICAgICAgICAoYyA9PT0gMHg0RS8qIE4gKi8pID8gJ1xceDg1JyA6XG4gICAgICAgIChjID09PSAweDVGLyogXyAqLykgPyAnXFx4QTAnIDpcbiAgICAgICAgKGMgPT09IDB4NEMvKiBMICovKSA/ICdcXHUyMDI4JyA6XG4gICAgICAgIChjID09PSAweDUwLyogUCAqLykgPyAnXFx1MjAyOScgOiAnJztcbn1cblxuZnVuY3Rpb24gY2hhckZyb21Db2RlcG9pbnQoYykge1xuICBpZiAoYyA8PSAweEZGRkYpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgfVxuICAvLyBFbmNvZGUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyXG4gIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNDb2RlX3BvaW50c19VLjJCMDEwMDAwX3RvX1UuMkIxMEZGRkZcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKChjIC0gMHgwMTAwMDApID4+IDEwKSArIDB4RDgwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjIC0gMHgwMTAwMDApICYgMHgwM0ZGKSArIDB4REMwMCk7XG59XG5cbnZhciBzaW1wbGVFc2NhcGVDaGVjayA9IG5ldyBBcnJheSgyNTYpOyAvLyBpbnRlZ2VyLCBmb3IgZmFzdCBhY2Nlc3NcbnZhciBzaW1wbGVFc2NhcGVNYXAgPSBuZXcgQXJyYXkoMjU2KTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcbiAgc2ltcGxlRXNjYXBlQ2hlY2tbaV0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpKSA/IDEgOiAwO1xuICBzaW1wbGVFc2NhcGVNYXBbaV0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpKTtcbn1cblxuXG5mdW5jdGlvbiBTdGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB0aGlzLmlucHV0ID0gaW5wdXQ7XG5cbiAgdGhpcy5maWxlbmFtZSAgPSBvcHRpb25zWydmaWxlbmFtZSddICB8fCBudWxsO1xuICB0aGlzLnNjaGVtYSAgICA9IG9wdGlvbnNbJ3NjaGVtYSddICAgIHx8IERFRkFVTFRfRlVMTF9TQ0hFTUE7XG4gIHRoaXMub25XYXJuaW5nID0gb3B0aW9uc1snb25XYXJuaW5nJ10gfHwgbnVsbDtcbiAgdGhpcy5sZWdhY3kgICAgPSBvcHRpb25zWydsZWdhY3knXSAgICB8fCBmYWxzZTtcbiAgdGhpcy5qc29uICAgICAgPSBvcHRpb25zWydqc29uJ10gICAgICB8fCBmYWxzZTtcbiAgdGhpcy5saXN0ZW5lciAgPSBvcHRpb25zWydsaXN0ZW5lciddICB8fCBudWxsO1xuXG4gIHRoaXMuaW1wbGljaXRUeXBlcyA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkSW1wbGljaXQ7XG4gIHRoaXMudHlwZU1hcCAgICAgICA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkVHlwZU1hcDtcblxuICB0aGlzLmxlbmd0aCAgICAgPSBpbnB1dC5sZW5ndGg7XG4gIHRoaXMucG9zaXRpb24gICA9IDA7XG4gIHRoaXMubGluZSAgICAgICA9IDA7XG4gIHRoaXMubGluZVN0YXJ0ICA9IDA7XG4gIHRoaXMubGluZUluZGVudCA9IDA7XG5cbiAgdGhpcy5kb2N1bWVudHMgPSBbXTtcblxuICAvKlxuICB0aGlzLnZlcnNpb247XG4gIHRoaXMuY2hlY2tMaW5lQnJlYWtzO1xuICB0aGlzLnRhZ01hcDtcbiAgdGhpcy5hbmNob3JNYXA7XG4gIHRoaXMudGFnO1xuICB0aGlzLmFuY2hvcjtcbiAgdGhpcy5raW5kO1xuICB0aGlzLnJlc3VsdDsqL1xuXG59XG5cblxuZnVuY3Rpb24gZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSkge1xuICByZXR1cm4gbmV3IFlBTUxFeGNlcHRpb24oXG4gICAgbWVzc2FnZSxcbiAgICBuZXcgTWFyayhzdGF0ZS5maWxlbmFtZSwgc3RhdGUuaW5wdXQsIHN0YXRlLnBvc2l0aW9uLCBzdGF0ZS5saW5lLCAoc3RhdGUucG9zaXRpb24gLSBzdGF0ZS5saW5lU3RhcnQpKSk7XG59XG5cbmZ1bmN0aW9uIHRocm93RXJyb3Ioc3RhdGUsIG1lc3NhZ2UpIHtcbiAgdGhyb3cgZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIHRocm93V2FybmluZyhzdGF0ZSwgbWVzc2FnZSkge1xuICBpZiAoc3RhdGUub25XYXJuaW5nKSB7XG4gICAgc3RhdGUub25XYXJuaW5nLmNhbGwobnVsbCwgZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSkpO1xuICB9XG59XG5cblxudmFyIGRpcmVjdGl2ZUhhbmRsZXJzID0ge1xuXG4gIFlBTUw6IGZ1bmN0aW9uIGhhbmRsZVlhbWxEaXJlY3RpdmUoc3RhdGUsIG5hbWUsIGFyZ3MpIHtcblxuICAgIHZhciBtYXRjaCwgbWFqb3IsIG1pbm9yO1xuXG4gICAgaWYgKHN0YXRlLnZlcnNpb24gIT09IG51bGwpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiAlWUFNTCBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdZQU1MIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgb25lIGFyZ3VtZW50Jyk7XG4gICAgfVxuXG4gICAgbWF0Y2ggPSAvXihbMC05XSspXFwuKFswLTldKykkLy5leGVjKGFyZ3NbMF0pO1xuXG4gICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCBhcmd1bWVudCBvZiB0aGUgWUFNTCBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBtYWpvciA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgbWlub3IgPSBwYXJzZUludChtYXRjaFsyXSwgMTApO1xuXG4gICAgaWYgKG1ham9yICE9PSAxKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5hY2NlcHRhYmxlIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS52ZXJzaW9uID0gYXJnc1swXTtcbiAgICBzdGF0ZS5jaGVja0xpbmVCcmVha3MgPSAobWlub3IgPCAyKTtcblxuICAgIGlmIChtaW5vciAhPT0gMSAmJiBtaW5vciAhPT0gMikge1xuICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAndW5zdXBwb3J0ZWQgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCcpO1xuICAgIH1cbiAgfSxcblxuICBUQUc6IGZ1bmN0aW9uIGhhbmRsZVRhZ0RpcmVjdGl2ZShzdGF0ZSwgbmFtZSwgYXJncykge1xuXG4gICAgdmFyIGhhbmRsZSwgcHJlZml4O1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnVEFHIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cycpO1xuICAgIH1cblxuICAgIGhhbmRsZSA9IGFyZ3NbMF07XG4gICAgcHJlZml4ID0gYXJnc1sxXTtcblxuICAgIGlmICghUEFUVEVSTl9UQUdfSEFORExFLnRlc3QoaGFuZGxlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2lsbC1mb3JtZWQgdGFnIGhhbmRsZSAoZmlyc3QgYXJndW1lbnQpIG9mIHRoZSBUQUcgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnRhZ01hcCwgaGFuZGxlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RoZXJlIGlzIGEgcHJldmlvdXNseSBkZWNsYXJlZCBzdWZmaXggZm9yIFwiJyArIGhhbmRsZSArICdcIiB0YWcgaGFuZGxlJyk7XG4gICAgfVxuXG4gICAgaWYgKCFQQVRURVJOX1RBR19VUkkudGVzdChwcmVmaXgpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCB0YWcgcHJlZml4IChzZWNvbmQgYXJndW1lbnQpIG9mIHRoZSBUQUcgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgc3RhdGUudGFnTWFwW2hhbmRsZV0gPSBwcmVmaXg7XG4gIH1cbn07XG5cblxuZnVuY3Rpb24gY2FwdHVyZVNlZ21lbnQoc3RhdGUsIHN0YXJ0LCBlbmQsIGNoZWNrSnNvbikge1xuICB2YXIgX3Bvc2l0aW9uLCBfbGVuZ3RoLCBfY2hhcmFjdGVyLCBfcmVzdWx0O1xuXG4gIGlmIChzdGFydCA8IGVuZCkge1xuICAgIF9yZXN1bHQgPSBzdGF0ZS5pbnB1dC5zbGljZShzdGFydCwgZW5kKTtcblxuICAgIGlmIChjaGVja0pzb24pIHtcbiAgICAgIGZvciAoX3Bvc2l0aW9uID0gMCwgX2xlbmd0aCA9IF9yZXN1bHQubGVuZ3RoO1xuICAgICAgICAgICBfcG9zaXRpb24gPCBfbGVuZ3RoO1xuICAgICAgICAgICBfcG9zaXRpb24gKz0gMSkge1xuICAgICAgICBfY2hhcmFjdGVyID0gX3Jlc3VsdC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG4gICAgICAgIGlmICghKF9jaGFyYWN0ZXIgPT09IDB4MDkgfHxcbiAgICAgICAgICAgICAgKDB4MjAgPD0gX2NoYXJhY3RlciAmJiBfY2hhcmFjdGVyIDw9IDB4MTBGRkZGKSkpIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZXhwZWN0ZWQgdmFsaWQgSlNPTiBjaGFyYWN0ZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoUEFUVEVSTl9OT05fUFJJTlRBQkxFLnRlc3QoX3Jlc3VsdCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0aGUgc3RyZWFtIGNvbnRhaW5zIG5vbi1wcmludGFibGUgY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIHN0YXRlLnJlc3VsdCArPSBfcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlTWFwcGluZ3Moc3RhdGUsIGRlc3RpbmF0aW9uLCBzb3VyY2UsIG92ZXJyaWRhYmxlS2V5cykge1xuICB2YXIgc291cmNlS2V5cywga2V5LCBpbmRleCwgcXVhbnRpdHk7XG5cbiAgaWYgKCFjb21tb24uaXNPYmplY3Qoc291cmNlKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW5ub3QgbWVyZ2UgbWFwcGluZ3M7IHRoZSBwcm92aWRlZCBzb3VyY2Ugb2JqZWN0IGlzIHVuYWNjZXB0YWJsZScpO1xuICB9XG5cbiAgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cbiAgZm9yIChpbmRleCA9IDAsIHF1YW50aXR5ID0gc291cmNlS2V5cy5sZW5ndGg7IGluZGV4IDwgcXVhbnRpdHk7IGluZGV4ICs9IDEpIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2luZGV4XTtcblxuICAgIGlmICghX2hhc093blByb3BlcnR5LmNhbGwoZGVzdGluYXRpb24sIGtleSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIG92ZXJyaWRhYmxlS2V5c1trZXldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSkge1xuICB2YXIgaW5kZXgsIHF1YW50aXR5O1xuXG4gIGtleU5vZGUgPSBTdHJpbmcoa2V5Tm9kZSk7XG5cbiAgaWYgKF9yZXN1bHQgPT09IG51bGwpIHtcbiAgICBfcmVzdWx0ID0ge307XG4gIH1cblxuICBpZiAoa2V5VGFnID09PSAndGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVOb2RlKSkge1xuICAgICAgZm9yIChpbmRleCA9IDAsIHF1YW50aXR5ID0gdmFsdWVOb2RlLmxlbmd0aDsgaW5kZXggPCBxdWFudGl0eTsgaW5kZXggKz0gMSkge1xuICAgICAgICBtZXJnZU1hcHBpbmdzKHN0YXRlLCBfcmVzdWx0LCB2YWx1ZU5vZGVbaW5kZXhdLCBvdmVycmlkYWJsZUtleXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZU1hcHBpbmdzKHN0YXRlLCBfcmVzdWx0LCB2YWx1ZU5vZGUsIG92ZXJyaWRhYmxlS2V5cyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghc3RhdGUuanNvbiAmJlxuICAgICAgICAhX2hhc093blByb3BlcnR5LmNhbGwob3ZlcnJpZGFibGVLZXlzLCBrZXlOb2RlKSAmJlxuICAgICAgICBfaGFzT3duUHJvcGVydHkuY2FsbChfcmVzdWx0LCBrZXlOb2RlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0ZWQgbWFwcGluZyBrZXknKTtcbiAgICB9XG4gICAgX3Jlc3VsdFtrZXlOb2RlXSA9IHZhbHVlTm9kZTtcbiAgICBkZWxldGUgb3ZlcnJpZGFibGVLZXlzW2tleU5vZGVdO1xuICB9XG5cbiAgcmV0dXJuIF9yZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRMaW5lQnJlYWsoc3RhdGUpIHtcbiAgdmFyIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDBBLyogTEYgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDBELyogQ1IgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgwQS8qIExGICovKSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYSBsaW5lIGJyZWFrIGlzIGV4cGVjdGVkJyk7XG4gIH1cblxuICBzdGF0ZS5saW5lICs9IDE7XG4gIHN0YXRlLmxpbmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xufVxuXG5mdW5jdGlvbiBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBhbGxvd0NvbW1lbnRzLCBjaGVja0luZGVudCkge1xuICB2YXIgbGluZUJyZWFrcyA9IDAsXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoYWxsb3dDb21tZW50cyAmJiBjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIGRvIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfSB3aGlsZSAoY2ggIT09IDB4MEEvKiBMRiAqLyAmJiBjaCAhPT0gMHgwRC8qIENSICovICYmIGNoICE9PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBsaW5lQnJlYWtzKys7XG4gICAgICBzdGF0ZS5saW5lSW5kZW50ID0gMDtcblxuICAgICAgd2hpbGUgKGNoID09PSAweDIwLyogU3BhY2UgKi8pIHtcbiAgICAgICAgc3RhdGUubGluZUluZGVudCsrO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjaGVja0luZGVudCAhPT0gLTEgJiYgbGluZUJyZWFrcyAhPT0gMCAmJiBzdGF0ZS5saW5lSW5kZW50IDwgY2hlY2tJbmRlbnQpIHtcbiAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICdkZWZpY2llbnQgaW5kZW50YXRpb24nKTtcbiAgfVxuXG4gIHJldHVybiBsaW5lQnJlYWtzO1xufVxuXG5mdW5jdGlvbiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG5cbiAgLy8gQ29uZGl0aW9uIHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgaXMgdGVzdGVkXG4gIC8vIGluIHBhcmVudCBvbiBlYWNoIGNhbGwsIGZvciBlZmZpY2llbmN5LiBObyBuZWVkcyB0byB0ZXN0IGhlcmUgYWdhaW4uXG4gIGlmICgoY2ggPT09IDB4MkQvKiAtICovIHx8IGNoID09PSAweDJFLyogLiAqLykgJiZcbiAgICAgIGNoID09PSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbiArIDEpICYmXG4gICAgICBjaCA9PT0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24gKyAyKSkge1xuXG4gICAgX3Bvc2l0aW9uICs9IDM7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gMCB8fCBpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIGNvdW50KSB7XG4gIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHN0YXRlLnJlc3VsdCArPSAnICc7XG4gIH0gZWxzZSBpZiAoY291bnQgPiAxKSB7XG4gICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGNvdW50IC0gMSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiByZWFkUGxhaW5TY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQsIHdpdGhpbkZsb3dDb2xsZWN0aW9uKSB7XG4gIHZhciBwcmVjZWRpbmcsXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICBjYXB0dXJlU3RhcnQsXG4gICAgICBjYXB0dXJlRW5kLFxuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQsXG4gICAgICBfbGluZSxcbiAgICAgIF9saW5lU3RhcnQsXG4gICAgICBfbGluZUluZGVudCxcbiAgICAgIF9raW5kID0gc3RhdGUua2luZCxcbiAgICAgIF9yZXN1bHQgPSBzdGF0ZS5yZXN1bHQsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChpc19XU19PUl9FT0woY2gpICAgICAgfHxcbiAgICAgIGlzX0ZMT1dfSU5ESUNBVE9SKGNoKSB8fFxuICAgICAgY2ggPT09IDB4MjMvKiAjICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNi8qICYgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDJBLyogKiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjEvKiAhICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg3Qy8qIHwgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDNFLyogPiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjcvKiAnICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyMi8qIFwiICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNS8qICUgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDQwLyogQCAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4NjAvKiBgICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGNoID09PSAweDNGLyogPyAqLyB8fCBjaCA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykgfHxcbiAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoZm9sbG93aW5nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fFxuICAgICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGZvbGxvd2luZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgcHJlY2VkaW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiAtIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKHByZWNlZGluZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHx8XG4gICAgICAgICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICAgIGJyZWFrO1xuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgICBfbGluZVN0YXJ0ID0gc3RhdGUubGluZVN0YXJ0O1xuICAgICAgX2xpbmVJbmRlbnQgPSBzdGF0ZS5saW5lSW5kZW50O1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIC0xKTtcblxuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPj0gbm9kZUluZGVudCkge1xuICAgICAgICBoYXNQZW5kaW5nQ29udGVudCA9IHRydWU7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucG9zaXRpb24gPSBjYXB0dXJlRW5kO1xuICAgICAgICBzdGF0ZS5saW5lID0gX2xpbmU7XG4gICAgICAgIHN0YXRlLmxpbmVTdGFydCA9IF9saW5lU3RhcnQ7XG4gICAgICAgIHN0YXRlLmxpbmVJbmRlbnQgPSBfbGluZUluZGVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1BlbmRpbmdDb250ZW50KSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBzdGF0ZS5saW5lIC0gX2xpbmUpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uICsgMTtcbiAgICB9XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG5cbiAgaWYgKHN0YXRlLnJlc3VsdCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9IF9raW5kO1xuICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNoLFxuICAgICAgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDI3LyogJyAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIHN0YXRlLnBvc2l0aW9uKys7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7XG4gICAgaWYgKGNoID09PSAweDI3LyogJyAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICBpZiAoY2ggPT09IDB4MjcvKiAnICovKSB7XG4gICAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCB0cnVlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhcicpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgc2luZ2xlIHF1b3RlZCBzY2FsYXInKTtcbn1cblxuZnVuY3Rpb24gcmVhZERvdWJsZVF1b3RlZFNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2FwdHVyZVN0YXJ0LFxuICAgICAgY2FwdHVyZUVuZCxcbiAgICAgIGhleExlbmd0aCxcbiAgICAgIGhleFJlc3VsdCxcbiAgICAgIHRtcCxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDIyLyogXCIgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuICBzdGF0ZS5wb3NpdGlvbisrO1xuICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkge1xuICAgIGlmIChjaCA9PT0gMHgyMi8qIFwiICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDVDLyogXFwgKi8pIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpO1xuXG4gICAgICAgIC8vIFRPRE86IHJld29yayB0byBpbmxpbmUgZm4gd2l0aCBubyB0eXBlIGNhc3Q/XG4gICAgICB9IGVsc2UgaWYgKGNoIDwgMjU2ICYmIHNpbXBsZUVzY2FwZUNoZWNrW2NoXSkge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gc2ltcGxlRXNjYXBlTWFwW2NoXTtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgICAgfSBlbHNlIGlmICgodG1wID0gZXNjYXBlZEhleExlbihjaCkpID4gMCkge1xuICAgICAgICBoZXhMZW5ndGggPSB0bXA7XG4gICAgICAgIGhleFJlc3VsdCA9IDA7XG5cbiAgICAgICAgZm9yICg7IGhleExlbmd0aCA+IDA7IGhleExlbmd0aC0tKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgICAgaWYgKCh0bXAgPSBmcm9tSGV4Q29kZShjaCkpID49IDApIHtcbiAgICAgICAgICAgIGhleFJlc3VsdCA9IChoZXhSZXN1bHQgPDwgNCkgKyB0bXA7XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2V4cGVjdGVkIGhleGFkZWNpbWFsIGNoYXJhY3RlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjaGFyRnJvbUNvZGVwb2ludChoZXhSZXN1bHQpO1xuXG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmtub3duIGVzY2FwZSBzZXF1ZW5jZScpO1xuICAgICAgfVxuXG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIHRydWUpO1xuICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpKTtcbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIH0gZWxzZSBpZiAoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyJyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhcicpO1xufVxuXG5mdW5jdGlvbiByZWFkRmxvd0NvbGxlY3Rpb24oc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIHJlYWROZXh0ID0gdHJ1ZSxcbiAgICAgIF9saW5lLFxuICAgICAgX3RhZyAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfcmVzdWx0LFxuICAgICAgX2FuY2hvciAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICB0ZXJtaW5hdG9yLFxuICAgICAgaXNQYWlyLFxuICAgICAgaXNFeHBsaWNpdFBhaXIsXG4gICAgICBpc01hcHBpbmcsXG4gICAgICBvdmVycmlkYWJsZUtleXMgPSB7fSxcbiAgICAgIGtleU5vZGUsXG4gICAgICBrZXlUYWcsXG4gICAgICB2YWx1ZU5vZGUsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHg1Qi8qIFsgKi8pIHtcbiAgICB0ZXJtaW5hdG9yID0gMHg1RDsvKiBdICovXG4gICAgaXNNYXBwaW5nID0gZmFsc2U7XG4gICAgX3Jlc3VsdCA9IFtdO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDdCLyogeyAqLykge1xuICAgIHRlcm1pbmF0b3IgPSAweDdEOy8qIH0gKi9cbiAgICBpc01hcHBpbmcgPSB0cnVlO1xuICAgIF9yZXN1bHQgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gdGVybWluYXRvcikge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgc3RhdGUua2luZCA9IGlzTWFwcGluZyA/ICdtYXBwaW5nJyA6ICdzZXF1ZW5jZSc7XG4gICAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICghcmVhZE5leHQpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdtaXNzZWQgY29tbWEgYmV0d2VlbiBmbG93IGNvbGxlY3Rpb24gZW50cmllcycpO1xuICAgIH1cblxuICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgIGlzUGFpciA9IGlzRXhwbGljaXRQYWlyID0gZmFsc2U7XG5cbiAgICBpZiAoY2ggPT09IDB4M0YvKiA/ICovKSB7XG4gICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSkge1xuICAgICAgICBpc1BhaXIgPSBpc0V4cGxpY2l0UGFpciA9IHRydWU7XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAga2V5VGFnID0gc3RhdGUudGFnO1xuICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKChpc0V4cGxpY2l0UGFpciB8fCBzdGF0ZS5saW5lID09PSBfbGluZSkgJiYgY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBpc1BhaXIgPSB0cnVlO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG4gICAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB2YWx1ZU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKGlzTWFwcGluZykge1xuICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSk7XG4gICAgfSBlbHNlIGlmIChpc1BhaXIpIHtcbiAgICAgIF9yZXN1bHQucHVzaChzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBudWxsLCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9yZXN1bHQucHVzaChrZXlOb2RlKTtcbiAgICB9XG5cbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDB4MkMvKiAsICovKSB7XG4gICAgICByZWFkTmV4dCA9IHRydWU7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYWROZXh0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgZmxvdyBjb2xsZWN0aW9uJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2FwdHVyZVN0YXJ0LFxuICAgICAgZm9sZGluZyxcbiAgICAgIGNob21waW5nICAgICAgID0gQ0hPTVBJTkdfQ0xJUCxcbiAgICAgIGRldGVjdGVkSW5kZW50ID0gZmFsc2UsXG4gICAgICB0ZXh0SW5kZW50ICAgICA9IG5vZGVJbmRlbnQsXG4gICAgICBlbXB0eUxpbmVzICAgICA9IDAsXG4gICAgICBhdE1vcmVJbmRlbnRlZCA9IGZhbHNlLFxuICAgICAgdG1wLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4N0MvKiB8ICovKSB7XG4gICAgZm9sZGluZyA9IGZhbHNlO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDNFLyogPiAqLykge1xuICAgIGZvbGRpbmcgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAweDJCLyogKyAqLyB8fCBjaCA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICAgIGlmIChDSE9NUElOR19DTElQID09PSBjaG9tcGluZykge1xuICAgICAgICBjaG9tcGluZyA9IChjaCA9PT0gMHgyQi8qICsgKi8pID8gQ0hPTVBJTkdfS0VFUCA6IENIT01QSU5HX1NUUklQO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3JlcGVhdCBvZiBhIGNob21waW5nIG1vZGUgaWRlbnRpZmllcicpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICgodG1wID0gZnJvbURlY2ltYWxDb2RlKGNoKSkgPj0gMCkge1xuICAgICAgaWYgKHRtcCA9PT0gMCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGV4cGxpY2l0IGluZGVudGF0aW9uIHdpZHRoIG9mIGEgYmxvY2sgc2NhbGFyOyBpdCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9uZScpO1xuICAgICAgfSBlbHNlIGlmICghZGV0ZWN0ZWRJbmRlbnQpIHtcbiAgICAgICAgdGV4dEluZGVudCA9IG5vZGVJbmRlbnQgKyB0bXAgLSAxO1xuICAgICAgICBkZXRlY3RlZEluZGVudCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAncmVwZWF0IG9mIGFuIGluZGVudGF0aW9uIHdpZHRoIGlkZW50aWZpZXInKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKTtcblxuICAgIGlmIChjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgICB3aGlsZSAoIWlzX0VPTChjaCkgJiYgKGNoICE9PSAwKSk7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG4gICAgc3RhdGUubGluZUluZGVudCA9IDA7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgd2hpbGUgKCghZGV0ZWN0ZWRJbmRlbnQgfHwgc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpICYmXG4gICAgICAgICAgIChjaCA9PT0gMHgyMC8qIFNwYWNlICovKSkge1xuICAgICAgc3RhdGUubGluZUluZGVudCsrO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmICghZGV0ZWN0ZWRJbmRlbnQgJiYgc3RhdGUubGluZUluZGVudCA+IHRleHRJbmRlbnQpIHtcbiAgICAgIHRleHRJbmRlbnQgPSBzdGF0ZS5saW5lSW5kZW50O1xuICAgIH1cblxuICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBlbXB0eUxpbmVzKys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBFbmQgb2YgdGhlIHNjYWxhci5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpIHtcblxuICAgICAgLy8gUGVyZm9ybSB0aGUgY2hvbXBpbmcuXG4gICAgICBpZiAoY2hvbXBpbmcgPT09IENIT01QSU5HX0tFRVApIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMpO1xuICAgICAgfSBlbHNlIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfQ0xJUCkge1xuICAgICAgICBpZiAoZGV0ZWN0ZWRJbmRlbnQpIHsgLy8gaS5lLiBvbmx5IGlmIHRoZSBzY2FsYXIgaXMgbm90IGVtcHR5LlxuICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCcmVhayB0aGlzIGB3aGlsZWAgY3ljbGUgYW5kIGdvIHRvIHRoZSBmdW5jaXRvbidzIGVwaWxvZ3VlLlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gRm9sZGVkIHN0eWxlOiB1c2UgZmFuY3kgcnVsZXMgdG8gaGFuZGxlIGxpbmUgYnJlYWtzLlxuICAgIGlmIChmb2xkaW5nKSB7XG5cbiAgICAgIC8vIExpbmVzIHN0YXJ0aW5nIHdpdGggd2hpdGUgc3BhY2UgY2hhcmFjdGVycyAobW9yZS1pbmRlbnRlZCBsaW5lcykgYXJlIG5vdCBmb2xkZWQuXG4gICAgICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMgKyAxKTtcblxuICAgICAgLy8gRW5kIG9mIG1vcmUtaW5kZW50ZWQgYmxvY2suXG4gICAgICB9IGVsc2UgaWYgKGF0TW9yZUluZGVudGVkKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzICsgMSk7XG5cbiAgICAgIC8vIEp1c3Qgb25lIGxpbmUgYnJlYWsgLSBwZXJjZWl2ZSBhcyB0aGUgc2FtZSBsaW5lLlxuICAgICAgfSBlbHNlIGlmIChlbXB0eUxpbmVzID09PSAwKSB7XG4gICAgICAgIGlmIChkZXRlY3RlZEluZGVudCkgeyAvLyBpLmUuIG9ubHkgaWYgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgc29tZSBzY2FsYXIgY29udGVudC5cbiAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gJyAnO1xuICAgICAgICB9XG5cbiAgICAgIC8vIFNldmVyYWwgbGluZSBicmVha3MgLSBwZXJjZWl2ZSBhcyBkaWZmZXJlbnQgbGluZXMuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgICB9XG5cbiAgICAvLyBMaXRlcmFsIHN0eWxlOiBqdXN0IGFkZCBleGFjdCBudW1iZXIgb2YgbGluZSBicmVha3MgYmV0d2VlbiBjb250ZW50IGxpbmVzLlxuICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWRJbmRlbnQpIHtcbiAgICAgIC8vIElmIGN1cnJlbnQgbGluZSBpc24ndCB0aGUgZmlyc3Qgb25lIC0gY291bnQgbGluZSBicmVhayBmcm9tIHRoZSBsYXN0IGNvbnRlbnQgbGluZS5cbiAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIGNhc2Ugb2YgdGhlIGZpcnN0IGNvbnRlbnQgbGluZSAtIGNvdW50IG9ubHkgZW1wdHkgbGluZXMuXG4gICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgfVxuXG4gICAgZGV0ZWN0ZWRJbmRlbnQgPSB0cnVlO1xuICAgIGVtcHR5TGluZXMgPSAwO1xuICAgIGNhcHR1cmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgd2hpbGUgKCFpc19FT0woY2gpICYmIChjaCAhPT0gMCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgZmFsc2UpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBfbGluZSxcbiAgICAgIF90YWcgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9hbmNob3IgICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIF9yZXN1bHQgICA9IFtdLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgZGV0ZWN0ZWQgID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcblxuICAgIGlmIChjaCAhPT0gMHgyRC8qIC0gKi8pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgIGlmICghaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkge1xuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPD0gbm9kZUluZGVudCkge1xuICAgICAgICBfcmVzdWx0LnB1c2gobnVsbCk7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9CTE9DS19JTiwgZmFsc2UsIHRydWUpO1xuICAgIF9yZXN1bHQucHVzaChzdGF0ZS5yZXN1bHQpO1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSAmJiAoY2ggIT09IDApKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGluZGVudGF0aW9uIG9mIGEgc2VxdWVuY2UgZW50cnknKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBub2RlSW5kZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoZGV0ZWN0ZWQpIHtcbiAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgc3RhdGUua2luZCA9ICdzZXF1ZW5jZSc7XG4gICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja01hcHBpbmcoc3RhdGUsIG5vZGVJbmRlbnQsIGZsb3dJbmRlbnQpIHtcbiAgdmFyIGZvbGxvd2luZyxcbiAgICAgIGFsbG93Q29tcGFjdCxcbiAgICAgIF9saW5lLFxuICAgICAgX3RhZyAgICAgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9hbmNob3IgICAgICAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBfcmVzdWx0ICAgICAgID0ge30sXG4gICAgICBvdmVycmlkYWJsZUtleXMgPSB7fSxcbiAgICAgIGtleVRhZyAgICAgICAgPSBudWxsLFxuICAgICAga2V5Tm9kZSAgICAgICA9IG51bGwsXG4gICAgICB2YWx1ZU5vZGUgICAgID0gbnVsbCxcbiAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZSxcbiAgICAgIGRldGVjdGVkICAgICAgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IF9yZXN1bHQ7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7IC8vIFNhdmUgdGhlIGN1cnJlbnQgbGluZS5cblxuICAgIC8vXG4gICAgLy8gRXhwbGljaXQgbm90YXRpb24gY2FzZS4gVGhlcmUgYXJlIHR3byBzZXBhcmF0ZSBibG9ja3M6XG4gICAgLy8gZmlyc3QgZm9yIHRoZSBrZXkgKGRlbm90ZWQgYnkgXCI/XCIpIGFuZCBzZWNvbmQgZm9yIHRoZSB2YWx1ZSAoZGVub3RlZCBieSBcIjpcIilcbiAgICAvL1xuICAgIGlmICgoY2ggPT09IDB4M0YvKiA/ICovIHx8IGNoID09PSAweDNBLyogOiAqLykgJiYgaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcblxuICAgICAgaWYgKGNoID09PSAweDNGLyogPyAqLykge1xuICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IHRydWU7XG4gICAgICAgIGFsbG93Q29tcGFjdCA9IHRydWU7XG5cbiAgICAgIH0gZWxzZSBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAvLyBpLmUuIDB4M0EvKiA6ICovID09PSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGV4cGxpY2l0IGtleS5cbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlO1xuICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaW5jb21wbGV0ZSBleHBsaWNpdCBtYXBwaW5nIHBhaXI7IGEga2V5IG5vZGUgaXMgbWlzc2VkJyk7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDE7XG4gICAgICBjaCA9IGZvbGxvd2luZztcblxuICAgIC8vXG4gICAgLy8gSW1wbGljaXQgbm90YXRpb24gY2FzZS4gRmxvdy1zdHlsZSBub2RlIGFzIHRoZSBrZXkgZmlyc3QsIHRoZW4gXCI6XCIsIGFuZCB0aGUgdmFsdWUuXG4gICAgLy9cbiAgICB9IGVsc2UgaWYgKGNvbXBvc2VOb2RlKHN0YXRlLCBmbG93SW5kZW50LCBDT05URVhUX0ZMT1dfT1VULCBmYWxzZSwgdHJ1ZSkpIHtcblxuICAgICAgaWYgKHN0YXRlLmxpbmUgPT09IF9saW5lKSB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaCA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgICBpZiAoIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGV4cGVjdGVkIGFmdGVyIHRoZSBrZXktdmFsdWUgc2VwYXJhdG9yIHdpdGhpbiBhIGJsb2NrIG1hcHBpbmcnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICAgICAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZTtcbiAgICAgICAgICBhbGxvd0NvbXBhY3QgPSBmYWxzZTtcbiAgICAgICAgICBrZXlUYWcgPSBzdGF0ZS50YWc7XG4gICAgICAgICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcblxuICAgICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2NhbiBub3QgcmVhZCBhbiBpbXBsaWNpdCBtYXBwaW5nIHBhaXI7IGEgY29sb24gaXMgbWlzc2VkJyk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgdGhlIHJlc3VsdCBvZiBgY29tcG9zZU5vZGVgLlxuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2NhbiBub3QgcmVhZCBhIGJsb2NrIG1hcHBpbmcgZW50cnk7IGEgbXVsdGlsaW5lIGtleSBtYXkgbm90IGJlIGFuIGltcGxpY2l0IGtleScpO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gS2VlcCB0aGUgcmVzdWx0IG9mIGBjb21wb3NlTm9kZWAuXG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7IC8vIFJlYWRpbmcgaXMgZG9uZS4gR28gdG8gdGhlIGVwaWxvZ3VlLlxuICAgIH1cblxuICAgIC8vXG4gICAgLy8gQ29tbW9uIHJlYWRpbmcgY29kZSBmb3IgYm90aCBleHBsaWNpdCBhbmQgaW1wbGljaXQgbm90YXRpb25zLlxuICAgIC8vXG4gICAgaWYgKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSB7XG4gICAgICBpZiAoY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfT1VULCB0cnVlLCBhbGxvd0NvbXBhY3QpKSB7XG4gICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQgJiYgKGNoICE9PSAwKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2JhZCBpbmRlbnRhdGlvbiBvZiBhIG1hcHBpbmcgZW50cnknKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBub2RlSW5kZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvL1xuICAvLyBFcGlsb2d1ZS5cbiAgLy9cblxuICAvLyBTcGVjaWFsIGNhc2U6IGxhc3QgbWFwcGluZydzIG5vZGUgY29udGFpbnMgb25seSB0aGUga2V5IGluIGV4cGxpY2l0IG5vdGF0aW9uLlxuICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgfVxuXG4gIC8vIEV4cG9zZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcuXG4gIGlmIChkZXRlY3RlZCkge1xuICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICBzdGF0ZS5raW5kID0gJ21hcHBpbmcnO1xuICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gZGV0ZWN0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWdQcm9wZXJ0eShzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uLFxuICAgICAgaXNWZXJiYXRpbSA9IGZhbHNlLFxuICAgICAgaXNOYW1lZCAgICA9IGZhbHNlLFxuICAgICAgdGFnSGFuZGxlLFxuICAgICAgdGFnTmFtZSxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDIxLyogISAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChzdGF0ZS50YWcgIT09IG51bGwpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgYSB0YWcgcHJvcGVydHknKTtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4M0MvKiA8ICovKSB7XG4gICAgaXNWZXJiYXRpbSA9IHRydWU7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4MjEvKiAhICovKSB7XG4gICAgaXNOYW1lZCA9IHRydWU7XG4gICAgdGFnSGFuZGxlID0gJyEhJztcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgfSBlbHNlIHtcbiAgICB0YWdIYW5kbGUgPSAnISc7XG4gIH1cblxuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICBpZiAoaXNWZXJiYXRpbSkge1xuICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgd2hpbGUgKGNoICE9PSAwICYmIGNoICE9PSAweDNFLyogPiAqLyk7XG5cbiAgICBpZiAoc3RhdGUucG9zaXRpb24gPCBzdGF0ZS5sZW5ndGgpIHtcbiAgICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgdmVyYmF0aW0gdGFnJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkge1xuXG4gICAgICBpZiAoY2ggPT09IDB4MjEvKiAhICovKSB7XG4gICAgICAgIGlmICghaXNOYW1lZCkge1xuICAgICAgICAgIHRhZ0hhbmRsZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiAtIDEsIHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgICAgICBpZiAoIVBBVFRFUk5fVEFHX0hBTkRMRS50ZXN0KHRhZ0hhbmRsZSkpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICduYW1lZCB0YWcgaGFuZGxlIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVycycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlzTmFtZWQgPSB0cnVlO1xuICAgICAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIHN1ZmZpeCBjYW5ub3QgY29udGFpbiBleGNsYW1hdGlvbiBtYXJrcycpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICB0YWdOYW1lID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoUEFUVEVSTl9GTE9XX0lORElDQVRPUlMudGVzdCh0YWdOYW1lKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZmxvdyBpbmRpY2F0b3IgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0YWdOYW1lICYmICFQQVRURVJOX1RBR19VUkkudGVzdCh0YWdOYW1lKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgbmFtZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnM6ICcgKyB0YWdOYW1lKTtcbiAgfVxuXG4gIGlmIChpc1ZlcmJhdGltKSB7XG4gICAgc3RhdGUudGFnID0gdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnRhZ01hcCwgdGFnSGFuZGxlKSkge1xuICAgIHN0YXRlLnRhZyA9IHN0YXRlLnRhZ01hcFt0YWdIYW5kbGVdICsgdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKHRhZ0hhbmRsZSA9PT0gJyEnKSB7XG4gICAgc3RhdGUudGFnID0gJyEnICsgdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKHRhZ0hhbmRsZSA9PT0gJyEhJykge1xuICAgIHN0YXRlLnRhZyA9ICd0YWc6eWFtbC5vcmcsMjAwMjonICsgdGFnTmFtZTtcblxuICB9IGVsc2Uge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmRlY2xhcmVkIHRhZyBoYW5kbGUgXCInICsgdGFnSGFuZGxlICsgJ1wiJyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVhZEFuY2hvclByb3BlcnR5KHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyNi8qICYgKi8pIHJldHVybiBmYWxzZTtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mIGFuIGFuY2hvciBwcm9wZXJ0eScpO1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkgJiYgIWlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gX3Bvc2l0aW9uKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWUgb2YgYW4gYW5jaG9yIG5vZGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXInKTtcbiAgfVxuXG4gIHN0YXRlLmFuY2hvciA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVhZEFsaWFzKHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sIGFsaWFzLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MkEvKiAqICovKSByZXR1cm4gZmFsc2U7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkgJiYgIWlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gX3Bvc2l0aW9uKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWUgb2YgYW4gYWxpYXMgbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlcicpO1xuICB9XG5cbiAgYWxpYXMgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoIXN0YXRlLmFuY2hvck1hcC5oYXNPd25Qcm9wZXJ0eShhbGlhcykpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5pZGVudGlmaWVkIGFsaWFzIFwiJyArIGFsaWFzICsgJ1wiJyk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bHQgPSBzdGF0ZS5hbmNob3JNYXBbYWxpYXNdO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb21wb3NlTm9kZShzdGF0ZSwgcGFyZW50SW5kZW50LCBub2RlQ29udGV4dCwgYWxsb3dUb1NlZWssIGFsbG93Q29tcGFjdCkge1xuICB2YXIgYWxsb3dCbG9ja1N0eWxlcyxcbiAgICAgIGFsbG93QmxvY2tTY2FsYXJzLFxuICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zLFxuICAgICAgaW5kZW50U3RhdHVzID0gMSwgLy8gMTogdGhpcz5wYXJlbnQsIDA6IHRoaXM9cGFyZW50LCAtMTogdGhpczxwYXJlbnRcbiAgICAgIGF0TmV3TGluZSAgPSBmYWxzZSxcbiAgICAgIGhhc0NvbnRlbnQgPSBmYWxzZSxcbiAgICAgIHR5cGVJbmRleCxcbiAgICAgIHR5cGVRdWFudGl0eSxcbiAgICAgIHR5cGUsXG4gICAgICBmbG93SW5kZW50LFxuICAgICAgYmxvY2tJbmRlbnQ7XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ29wZW4nLCBzdGF0ZSk7XG4gIH1cblxuICBzdGF0ZS50YWcgICAgPSBudWxsO1xuICBzdGF0ZS5hbmNob3IgPSBudWxsO1xuICBzdGF0ZS5raW5kICAgPSBudWxsO1xuICBzdGF0ZS5yZXN1bHQgPSBudWxsO1xuXG4gIGFsbG93QmxvY2tTdHlsZXMgPSBhbGxvd0Jsb2NrU2NhbGFycyA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9XG4gICAgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0IHx8XG4gICAgQ09OVEVYVF9CTE9DS19JTiAgPT09IG5vZGVDb250ZXh0O1xuXG4gIGlmIChhbGxvd1RvU2Vlaykge1xuICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgIGF0TmV3TGluZSA9IHRydWU7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICBpbmRlbnRTdGF0dXMgPSAwO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEpIHtcbiAgICB3aGlsZSAocmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB8fCByZWFkQW5jaG9yUHJvcGVydHkoc3RhdGUpKSB7XG4gICAgICBpZiAoc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpKSB7XG4gICAgICAgIGF0TmV3TGluZSA9IHRydWU7XG4gICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGFsbG93QmxvY2tTdHlsZXM7XG5cbiAgICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zKSB7XG4gICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gYXROZXdMaW5lIHx8IGFsbG93Q29tcGFjdDtcbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEgfHwgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0KSB7XG4gICAgaWYgKENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQgfHwgQ09OVEVYVF9GTE9XX09VVCA9PT0gbm9kZUNvbnRleHQpIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQgKyAxO1xuICAgIH1cblxuICAgIGJsb2NrSW5kZW50ID0gc3RhdGUucG9zaXRpb24gLSBzdGF0ZS5saW5lU3RhcnQ7XG5cbiAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7XG4gICAgICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmXG4gICAgICAgICAgKHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCkgfHxcbiAgICAgICAgICAgcmVhZEJsb2NrTWFwcGluZyhzdGF0ZSwgYmxvY2tJbmRlbnQsIGZsb3dJbmRlbnQpKSB8fFxuICAgICAgICAgIHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGFsbG93QmxvY2tTY2FsYXJzICYmIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHx8XG4gICAgICAgICAgICByZWFkU2luZ2xlUXVvdGVkU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSB8fFxuICAgICAgICAgICAgcmVhZERvdWJsZVF1b3RlZFNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlYWRBbGlhcyhzdGF0ZSkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgfHwgc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYWxpYXMgbm9kZSBzaG91bGQgbm90IGhhdmUgYW55IHByb3BlcnRpZXMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWFkUGxhaW5TY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQpKSB7XG4gICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc3RhdGUudGFnID09PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZS50YWcgPSAnPyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbmRlbnRTdGF0dXMgPT09IDApIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZTogYmxvY2sgc2VxdWVuY2VzIGFyZSBhbGxvd2VkIHRvIGhhdmUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbCBhcyB0aGUgcGFyZW50LlxuICAgICAgLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyNzk5Nzg0XG4gICAgICBoYXNDb250ZW50ID0gYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICchJykge1xuICAgIGlmIChzdGF0ZS50YWcgPT09ICc/Jykge1xuICAgICAgZm9yICh0eXBlSW5kZXggPSAwLCB0eXBlUXVhbnRpdHkgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgdHlwZUluZGV4IDwgdHlwZVF1YW50aXR5O1xuICAgICAgICAgICB0eXBlSW5kZXggKz0gMSkge1xuICAgICAgICB0eXBlID0gc3RhdGUuaW1wbGljaXRUeXBlc1t0eXBlSW5kZXhdO1xuXG4gICAgICAgIC8vIEltcGxpY2l0IHJlc29sdmluZyBpcyBub3QgYWxsb3dlZCBmb3Igbm9uLXNjYWxhciB0eXBlcywgYW5kICc/J1xuICAgICAgICAvLyBub24tc3BlY2lmaWMgdGFnIGlzIG9ubHkgYXNzaWduZWQgdG8gcGxhaW4gc2NhbGFycy4gU28sIGl0IGlzbid0XG4gICAgICAgIC8vIG5lZWRlZCB0byBjaGVjayBmb3IgJ2tpbmQnIGNvbmZvcm1pdHkuXG5cbiAgICAgICAgaWYgKHR5cGUucmVzb2x2ZShzdGF0ZS5yZXN1bHQpKSB7IC8vIGBzdGF0ZS5yZXN1bHRgIHVwZGF0ZWQgaW4gcmVzb2x2ZXIgaWYgbWF0Y2hlZFxuICAgICAgICAgIHN0YXRlLnJlc3VsdCA9IHR5cGUuY29uc3RydWN0KHN0YXRlLnJlc3VsdCk7XG4gICAgICAgICAgc3RhdGUudGFnID0gdHlwZS50YWc7XG4gICAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50eXBlTWFwLCBzdGF0ZS50YWcpKSB7XG4gICAgICB0eXBlID0gc3RhdGUudHlwZU1hcFtzdGF0ZS50YWddO1xuXG4gICAgICBpZiAoc3RhdGUucmVzdWx0ICE9PSBudWxsICYmIHR5cGUua2luZCAhPT0gc3RhdGUua2luZCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITwnICsgc3RhdGUudGFnICsgJz4gdGFnOyBpdCBzaG91bGQgYmUgXCInICsgdHlwZS5raW5kICsgJ1wiLCBub3QgXCInICsgc3RhdGUua2luZCArICdcIicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXR5cGUucmVzb2x2ZShzdGF0ZS5yZXN1bHQpKSB7IC8vIGBzdGF0ZS5yZXN1bHRgIHVwZGF0ZWQgaW4gcmVzb2x2ZXIgaWYgbWF0Y2hlZFxuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2Fubm90IHJlc29sdmUgYSBub2RlIHdpdGggITwnICsgc3RhdGUudGFnICsgJz4gZXhwbGljaXQgdGFnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgPSB0eXBlLmNvbnN0cnVjdChzdGF0ZS5yZXN1bHQpO1xuICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3Vua25vd24gdGFnICE8JyArIHN0YXRlLnRhZyArICc+Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ2Nsb3NlJywgc3RhdGUpO1xuICB9XG4gIHJldHVybiBzdGF0ZS50YWcgIT09IG51bGwgfHwgIHN0YXRlLmFuY2hvciAhPT0gbnVsbCB8fCBoYXNDb250ZW50O1xufVxuXG5mdW5jdGlvbiByZWFkRG9jdW1lbnQoc3RhdGUpIHtcbiAgdmFyIGRvY3VtZW50U3RhcnQgPSBzdGF0ZS5wb3NpdGlvbixcbiAgICAgIF9wb3NpdGlvbixcbiAgICAgIGRpcmVjdGl2ZU5hbWUsXG4gICAgICBkaXJlY3RpdmVBcmdzLFxuICAgICAgaGFzRGlyZWN0aXZlcyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgc3RhdGUudmVyc2lvbiA9IG51bGw7XG4gIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IHN0YXRlLmxlZ2FjeTtcbiAgc3RhdGUudGFnTWFwID0ge307XG4gIHN0YXRlLmFuY2hvck1hcCA9IHt9O1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiAwIHx8IGNoICE9PSAweDI1LyogJSAqLykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaGFzRGlyZWN0aXZlcyA9IHRydWU7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgZGlyZWN0aXZlTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICAgIGRpcmVjdGl2ZUFyZ3MgPSBbXTtcblxuICAgIGlmIChkaXJlY3RpdmVOYW1lLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkaXJlY3RpdmUgbmFtZSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gb25lIGNoYXJhY3RlciBpbiBsZW5ndGgnKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfRU9MKGNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNfRU9MKGNoKSkgYnJlYWs7XG5cbiAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBkaXJlY3RpdmVBcmdzLnB1c2goc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbikpO1xuICAgIH1cblxuICAgIGlmIChjaCAhPT0gMCkgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoZGlyZWN0aXZlSGFuZGxlcnMsIGRpcmVjdGl2ZU5hbWUpKSB7XG4gICAgICBkaXJlY3RpdmVIYW5kbGVyc1tkaXJlY3RpdmVOYW1lXShzdGF0ZSwgZGlyZWN0aXZlTmFtZSwgZGlyZWN0aXZlQXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ3Vua25vd24gZG9jdW1lbnQgZGlyZWN0aXZlIFwiJyArIGRpcmVjdGl2ZU5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH1cblxuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IDAgJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pICAgICA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKSA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAyKSA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAzO1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICB9IGVsc2UgaWYgKGhhc0RpcmVjdGl2ZXMpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZGlyZWN0aXZlcyBlbmQgbWFyayBpcyBleHBlY3RlZCcpO1xuICB9XG5cbiAgY29tcG9zZU5vZGUoc3RhdGUsIHN0YXRlLmxpbmVJbmRlbnQgLSAxLCBDT05URVhUX0JMT0NLX09VVCwgZmFsc2UsIHRydWUpO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmNoZWNrTGluZUJyZWFrcyAmJlxuICAgICAgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MudGVzdChzdGF0ZS5pbnB1dC5zbGljZShkb2N1bWVudFN0YXJ0LCBzdGF0ZS5wb3NpdGlvbikpKSB7XG4gICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAnbm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50Jyk7XG4gIH1cblxuICBzdGF0ZS5kb2N1bWVudHMucHVzaChzdGF0ZS5yZXN1bHQpO1xuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcblxuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgyRS8qIC4gKi8pIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDM7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA8IChzdGF0ZS5sZW5ndGggLSAxKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdlbmQgb2YgdGhlIHN0cmVhbSBvciBhIGRvY3VtZW50IHNlcGFyYXRvciBpcyBleHBlY3RlZCcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpIHtcbiAgaW5wdXQgPSBTdHJpbmcoaW5wdXQpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBpZiAoaW5wdXQubGVuZ3RoICE9PSAwKSB7XG5cbiAgICAvLyBBZGQgdGFpbGluZyBgXFxuYCBpZiBub3QgZXhpc3RzXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDB4MEEvKiBMRiAqLyAmJlxuICAgICAgICBpbnB1dC5jaGFyQ29kZUF0KGlucHV0Lmxlbmd0aCAtIDEpICE9PSAweDBELyogQ1IgKi8pIHtcbiAgICAgIGlucHV0ICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8vIFN0cmlwIEJPTVxuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0YXRlID0gbmV3IFN0YXRlKGlucHV0LCBvcHRpb25zKTtcblxuICAvLyBVc2UgMCBhcyBzdHJpbmcgdGVybWluYXRvci4gVGhhdCBzaWduaWZpY2FudGx5IHNpbXBsaWZpZXMgYm91bmRzIGNoZWNrLlxuICBzdGF0ZS5pbnB1dCArPSAnXFwwJztcblxuICB3aGlsZSAoc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgPT09IDB4MjAvKiBTcGFjZSAqLykge1xuICAgIHN0YXRlLmxpbmVJbmRlbnQgKz0gMTtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAxO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLnBvc2l0aW9uIDwgKHN0YXRlLmxlbmd0aCAtIDEpKSB7XG4gICAgcmVhZERvY3VtZW50KHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZS5kb2N1bWVudHM7XG59XG5cblxuZnVuY3Rpb24gbG9hZEFsbChpbnB1dCwgaXRlcmF0b3IsIG9wdGlvbnMpIHtcbiAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpLCBpbmRleCwgbGVuZ3RoO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBkb2N1bWVudHMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGl0ZXJhdG9yKGRvY3VtZW50c1tpbmRleF0pO1xuICB9XG59XG5cblxuZnVuY3Rpb24gbG9hZChpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgZG9jdW1lbnRzID0gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucyk7XG5cbiAgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAvKmVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCovXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChkb2N1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50c1swXTtcbiAgfVxuICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignZXhwZWN0ZWQgYSBzaW5nbGUgZG9jdW1lbnQgaW4gdGhlIHN0cmVhbSwgYnV0IGZvdW5kIG1vcmUnKTtcbn1cblxuXG5mdW5jdGlvbiBzYWZlTG9hZEFsbChpbnB1dCwgb3V0cHV0LCBvcHRpb25zKSB7XG4gIGxvYWRBbGwoaW5wdXQsIG91dHB1dCwgY29tbW9uLmV4dGVuZCh7IHNjaGVtYTogREVGQVVMVF9TQUZFX1NDSEVNQSB9LCBvcHRpb25zKSk7XG59XG5cblxuZnVuY3Rpb24gc2FmZUxvYWQoaW5wdXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxvYWQoaW5wdXQsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmxvYWRBbGwgICAgID0gbG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLmxvYWQgICAgICAgID0gbG9hZDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsID0gc2FmZUxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCAgICA9IHNhZmVMb2FkO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cbmZ1bmN0aW9uIE1hcmsobmFtZSwgYnVmZmVyLCBwb3NpdGlvbiwgbGluZSwgY29sdW1uKSB7XG4gIHRoaXMubmFtZSAgICAgPSBuYW1lO1xuICB0aGlzLmJ1ZmZlciAgID0gYnVmZmVyO1xuICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247XG4gIHRoaXMubGluZSAgICAgPSBsaW5lO1xuICB0aGlzLmNvbHVtbiAgID0gY29sdW1uO1xufVxuXG5cbk1hcmsucHJvdG90eXBlLmdldFNuaXBwZXQgPSBmdW5jdGlvbiBnZXRTbmlwcGV0KGluZGVudCwgbWF4TGVuZ3RoKSB7XG4gIHZhciBoZWFkLCBzdGFydCwgdGFpbCwgZW5kLCBzbmlwcGV0O1xuXG4gIGlmICghdGhpcy5idWZmZXIpIHJldHVybiBudWxsO1xuXG4gIGluZGVudCA9IGluZGVudCB8fCA0O1xuICBtYXhMZW5ndGggPSBtYXhMZW5ndGggfHwgNzU7XG5cbiAgaGVhZCA9ICcnO1xuICBzdGFydCA9IHRoaXMucG9zaXRpb247XG5cbiAgd2hpbGUgKHN0YXJ0ID4gMCAmJiAnXFx4MDBcXHJcXG5cXHg4NVxcdTIwMjhcXHUyMDI5Jy5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChzdGFydCAtIDEpKSA9PT0gLTEpIHtcbiAgICBzdGFydCAtPSAxO1xuICAgIGlmICh0aGlzLnBvc2l0aW9uIC0gc3RhcnQgPiAobWF4TGVuZ3RoIC8gMiAtIDEpKSB7XG4gICAgICBoZWFkID0gJyAuLi4gJztcbiAgICAgIHN0YXJ0ICs9IDU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB0YWlsID0gJyc7XG4gIGVuZCA9IHRoaXMucG9zaXRpb247XG5cbiAgd2hpbGUgKGVuZCA8IHRoaXMuYnVmZmVyLmxlbmd0aCAmJiAnXFx4MDBcXHJcXG5cXHg4NVxcdTIwMjhcXHUyMDI5Jy5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChlbmQpKSA9PT0gLTEpIHtcbiAgICBlbmQgKz0gMTtcbiAgICBpZiAoZW5kIC0gdGhpcy5wb3NpdGlvbiA+IChtYXhMZW5ndGggLyAyIC0gMSkpIHtcbiAgICAgIHRhaWwgPSAnIC4uLiAnO1xuICAgICAgZW5kIC09IDU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBzbmlwcGV0ID0gdGhpcy5idWZmZXIuc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgcmV0dXJuIGNvbW1vbi5yZXBlYXQoJyAnLCBpbmRlbnQpICsgaGVhZCArIHNuaXBwZXQgKyB0YWlsICsgJ1xcbicgK1xuICAgICAgICAgY29tbW9uLnJlcGVhdCgnICcsIGluZGVudCArIHRoaXMucG9zaXRpb24gLSBzdGFydCArIGhlYWQubGVuZ3RoKSArICdeJztcbn07XG5cblxuTWFyay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhjb21wYWN0KSB7XG4gIHZhciBzbmlwcGV0LCB3aGVyZSA9ICcnO1xuXG4gIGlmICh0aGlzLm5hbWUpIHtcbiAgICB3aGVyZSArPSAnaW4gXCInICsgdGhpcy5uYW1lICsgJ1wiICc7XG4gIH1cblxuICB3aGVyZSArPSAnYXQgbGluZSAnICsgKHRoaXMubGluZSArIDEpICsgJywgY29sdW1uICcgKyAodGhpcy5jb2x1bW4gKyAxKTtcblxuICBpZiAoIWNvbXBhY3QpIHtcbiAgICBzbmlwcGV0ID0gdGhpcy5nZXRTbmlwcGV0KCk7XG5cbiAgICBpZiAoc25pcHBldCkge1xuICAgICAgd2hlcmUgKz0gJzpcXG4nICsgc25pcHBldDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2hlcmU7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWFyaztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBtYXgtbGVuKi9cblxudmFyIGNvbW1vbiAgICAgICAgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIFlBTUxFeGNlcHRpb24gPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xudmFyIFR5cGUgICAgICAgICAgPSByZXF1aXJlKCcuL3R5cGUnKTtcblxuXG5mdW5jdGlvbiBjb21waWxlTGlzdChzY2hlbWEsIG5hbWUsIHJlc3VsdCkge1xuICB2YXIgZXhjbHVkZSA9IFtdO1xuXG4gIHNjaGVtYS5pbmNsdWRlLmZvckVhY2goZnVuY3Rpb24gKGluY2x1ZGVkU2NoZW1hKSB7XG4gICAgcmVzdWx0ID0gY29tcGlsZUxpc3QoaW5jbHVkZWRTY2hlbWEsIG5hbWUsIHJlc3VsdCk7XG4gIH0pO1xuXG4gIHNjaGVtYVtuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uIChjdXJyZW50VHlwZSkge1xuICAgIHJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChwcmV2aW91c1R5cGUsIHByZXZpb3VzSW5kZXgpIHtcbiAgICAgIGlmIChwcmV2aW91c1R5cGUudGFnID09PSBjdXJyZW50VHlwZS50YWcpIHtcbiAgICAgICAgZXhjbHVkZS5wdXNoKHByZXZpb3VzSW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVzdWx0LnB1c2goY3VycmVudFR5cGUpO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0LmZpbHRlcihmdW5jdGlvbiAodHlwZSwgaW5kZXgpIHtcbiAgICByZXR1cm4gZXhjbHVkZS5pbmRleE9mKGluZGV4KSA9PT0gLTE7XG4gIH0pO1xufVxuXG5cbmZ1bmN0aW9uIGNvbXBpbGVNYXAoLyogbGlzdHMuLi4gKi8pIHtcbiAgdmFyIHJlc3VsdCA9IHt9LCBpbmRleCwgbGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3RUeXBlKHR5cGUpIHtcbiAgICByZXN1bHRbdHlwZS50YWddID0gdHlwZTtcbiAgfVxuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGFyZ3VtZW50c1tpbmRleF0uZm9yRWFjaChjb2xsZWN0VHlwZSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbmZ1bmN0aW9uIFNjaGVtYShkZWZpbml0aW9uKSB7XG4gIHRoaXMuaW5jbHVkZSAgPSBkZWZpbml0aW9uLmluY2x1ZGUgIHx8IFtdO1xuICB0aGlzLmltcGxpY2l0ID0gZGVmaW5pdGlvbi5pbXBsaWNpdCB8fCBbXTtcbiAgdGhpcy5leHBsaWNpdCA9IGRlZmluaXRpb24uZXhwbGljaXQgfHwgW107XG5cbiAgdGhpcy5pbXBsaWNpdC5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgaWYgKHR5cGUubG9hZEtpbmQgJiYgdHlwZS5sb2FkS2luZCAhPT0gJ3NjYWxhcicpIHtcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdUaGVyZSBpcyBhIG5vbi1zY2FsYXIgdHlwZSBpbiB0aGUgaW1wbGljaXQgbGlzdCBvZiBhIHNjaGVtYS4gSW1wbGljaXQgcmVzb2x2aW5nIG9mIHN1Y2ggdHlwZXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMuY29tcGlsZWRJbXBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICdpbXBsaWNpdCcsIFtdKTtcbiAgdGhpcy5jb21waWxlZEV4cGxpY2l0ID0gY29tcGlsZUxpc3QodGhpcywgJ2V4cGxpY2l0JywgW10pO1xuICB0aGlzLmNvbXBpbGVkVHlwZU1hcCAgPSBjb21waWxlTWFwKHRoaXMuY29tcGlsZWRJbXBsaWNpdCwgdGhpcy5jb21waWxlZEV4cGxpY2l0KTtcbn1cblxuXG5TY2hlbWEuREVGQVVMVCA9IG51bGw7XG5cblxuU2NoZW1hLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYSgpIHtcbiAgdmFyIHNjaGVtYXMsIHR5cGVzO1xuXG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHNjaGVtYXMgPSBTY2hlbWEuREVGQVVMVDtcbiAgICAgIHR5cGVzID0gYXJndW1lbnRzWzBdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDI6XG4gICAgICBzY2hlbWFzID0gYXJndW1lbnRzWzBdO1xuICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMV07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgU2NoZW1hLmNyZWF0ZSBmdW5jdGlvbicpO1xuICB9XG5cbiAgc2NoZW1hcyA9IGNvbW1vbi50b0FycmF5KHNjaGVtYXMpO1xuICB0eXBlcyA9IGNvbW1vbi50b0FycmF5KHR5cGVzKTtcblxuICBpZiAoIXNjaGVtYXMuZXZlcnkoZnVuY3Rpb24gKHNjaGVtYSkgeyByZXR1cm4gc2NoZW1hIGluc3RhbmNlb2YgU2NoZW1hOyB9KSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdTcGVjaWZpZWQgbGlzdCBvZiBzdXBlciBzY2hlbWFzIChvciBhIHNpbmdsZSBTY2hlbWEgb2JqZWN0KSBjb250YWlucyBhIG5vbi1TY2hlbWEgb2JqZWN0LicpO1xuICB9XG5cbiAgaWYgKCF0eXBlcy5ldmVyeShmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIFR5cGU7IH0pKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1NwZWNpZmllZCBsaXN0IG9mIFlBTUwgdHlwZXMgKG9yIGEgc2luZ2xlIFR5cGUgb2JqZWN0KSBjb250YWlucyBhIG5vbi1UeXBlIG9iamVjdC4nKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2NoZW1hKHtcbiAgICBpbmNsdWRlOiBzY2hlbWFzLFxuICAgIGV4cGxpY2l0OiB0eXBlc1xuICB9KTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY2hlbWE7XG4iLCIvLyBTdGFuZGFyZCBZQU1MJ3MgQ29yZSBzY2hlbWEuXG4vLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDQ5MjNcbi8vXG4vLyBOT1RFOiBKUy1ZQU1MIGRvZXMgbm90IHN1cHBvcnQgc2NoZW1hLXNwZWNpZmljIHRhZyByZXNvbHV0aW9uIHJlc3RyaWN0aW9ucy5cbi8vIFNvLCBDb3JlIHNjaGVtYSBoYXMgbm8gZGlzdGluY3Rpb25zIGZyb20gSlNPTiBzY2hlbWEgaXMgSlMtWUFNTC5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2pzb24nKVxuICBdXG59KTtcbiIsIi8vIEpTLVlBTUwncyBkZWZhdWx0IHNjaGVtYSBmb3IgYGxvYWRgIGZ1bmN0aW9uLlxuLy8gSXQgaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy9cbi8vIFRoaXMgc2NoZW1hIGlzIGJhc2VkIG9uIEpTLVlBTUwncyBkZWZhdWx0IHNhZmUgc2NoZW1hIGFuZCBpbmNsdWRlc1xuLy8gSmF2YVNjcmlwdC1zcGVjaWZpYyB0eXBlczogISFqcy91bmRlZmluZWQsICEhanMvcmVnZXhwIGFuZCAhIWpzL2Z1bmN0aW9uLlxuLy9cbi8vIEFsc28gdGhpcyBzY2hlbWEgaXMgdXNlZCBhcyBkZWZhdWx0IGJhc2Ugc2NoZW1hIGF0IGBTY2hlbWEuY3JlYXRlYCBmdW5jdGlvbi5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gU2NoZW1hLkRFRkFVTFQgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vZGVmYXVsdF9zYWZlJylcbiAgXSxcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL3VuZGVmaW5lZCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvcmVnZXhwJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy9mdW5jdGlvbicpXG4gIF1cbn0pO1xuIiwiLy8gSlMtWUFNTCdzIGRlZmF1bHQgc2NoZW1hIGZvciBgc2FmZUxvYWRgIGZ1bmN0aW9uLlxuLy8gSXQgaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy9cbi8vIFRoaXMgc2NoZW1hIGlzIGJhc2VkIG9uIHN0YW5kYXJkIFlBTUwncyBDb3JlIHNjaGVtYSBhbmQgaW5jbHVkZXMgbW9zdCBvZlxuLy8gZXh0cmEgdHlwZXMgZGVzY3JpYmVkIGF0IFlBTUwgdGFnIHJlcG9zaXRvcnkuIChodHRwOi8veWFtbC5vcmcvdHlwZS8pXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9jb3JlJylcbiAgXSxcbiAgaW1wbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL3RpbWVzdGFtcCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvbWVyZ2UnKVxuICBdLFxuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvYmluYXJ5JyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9vbWFwJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9wYWlycycpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvc2V0JylcbiAgXVxufSk7XG4iLCIvLyBTdGFuZGFyZCBZQU1MJ3MgRmFpbHNhZmUgc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODAyMzQ2XG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvc3RyJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9zZXEnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL21hcCcpXG4gIF1cbn0pO1xuIiwiLy8gU3RhbmRhcmQgWUFNTCdzIEpTT04gc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODAzMjMxXG4vL1xuLy8gTk9URTogSlMtWUFNTCBkb2VzIG5vdCBzdXBwb3J0IHNjaGVtYS1zcGVjaWZpYyB0YWcgcmVzb2x1dGlvbiByZXN0cmljdGlvbnMuXG4vLyBTbywgdGhpcyBzY2hlbWEgaXMgbm90IHN1Y2ggc3RyaWN0IGFzIGRlZmluZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vIEl0IGFsbG93cyBudW1iZXJzIGluIGJpbmFyeSBub3RhaW9uLCB1c2UgYE51bGxgIGFuZCBgTlVMTGAgYXMgYG51bGxgLCBldGMuXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9mYWlsc2FmZScpXG4gIF0sXG4gIGltcGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9udWxsJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9ib29sJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9pbnQnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2Zsb2F0JylcbiAgXVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcblxudmFyIFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUyA9IFtcbiAgJ2tpbmQnLFxuICAncmVzb2x2ZScsXG4gICdjb25zdHJ1Y3QnLFxuICAnaW5zdGFuY2VPZicsXG4gICdwcmVkaWNhdGUnLFxuICAncmVwcmVzZW50JyxcbiAgJ2RlZmF1bHRTdHlsZScsXG4gICdzdHlsZUFsaWFzZXMnXG5dO1xuXG52YXIgWUFNTF9OT0RFX0tJTkRTID0gW1xuICAnc2NhbGFyJyxcbiAgJ3NlcXVlbmNlJyxcbiAgJ21hcHBpbmcnXG5dO1xuXG5mdW5jdGlvbiBjb21waWxlU3R5bGVBbGlhc2VzKG1hcCkge1xuICB2YXIgcmVzdWx0ID0ge307XG5cbiAgaWYgKG1hcCAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgIG1hcFtzdHlsZV0uZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgcmVzdWx0W1N0cmluZyhhbGlhcyldID0gc3R5bGU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIFR5cGUodGFnLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoVFlQRV9DT05TVFJVQ1RPUl9PUFRJT05TLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVW5rbm93biBvcHRpb24gXCInICsgbmFtZSArICdcIiBpcyBtZXQgaW4gZGVmaW5pdGlvbiBvZiBcIicgKyB0YWcgKyAnXCIgWUFNTCB0eXBlLicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gVE9ETzogQWRkIHRhZyBmb3JtYXQgY2hlY2suXG4gIHRoaXMudGFnICAgICAgICAgID0gdGFnO1xuICB0aGlzLmtpbmQgICAgICAgICA9IG9wdGlvbnNbJ2tpbmQnXSAgICAgICAgIHx8IG51bGw7XG4gIHRoaXMucmVzb2x2ZSAgICAgID0gb3B0aW9uc1sncmVzb2x2ZSddICAgICAgfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgdGhpcy5jb25zdHJ1Y3QgICAgPSBvcHRpb25zWydjb25zdHJ1Y3QnXSAgICB8fCBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YTsgfTtcbiAgdGhpcy5pbnN0YW5jZU9mICAgPSBvcHRpb25zWydpbnN0YW5jZU9mJ10gICB8fCBudWxsO1xuICB0aGlzLnByZWRpY2F0ZSAgICA9IG9wdGlvbnNbJ3ByZWRpY2F0ZSddICAgIHx8IG51bGw7XG4gIHRoaXMucmVwcmVzZW50ICAgID0gb3B0aW9uc1sncmVwcmVzZW50J10gICAgfHwgbnVsbDtcbiAgdGhpcy5kZWZhdWx0U3R5bGUgPSBvcHRpb25zWydkZWZhdWx0U3R5bGUnXSB8fCBudWxsO1xuICB0aGlzLnN0eWxlQWxpYXNlcyA9IGNvbXBpbGVTdHlsZUFsaWFzZXMob3B0aW9uc1snc3R5bGVBbGlhc2VzJ10gfHwgbnVsbCk7XG5cbiAgaWYgKFlBTUxfTk9ERV9LSU5EUy5pbmRleE9mKHRoaXMua2luZCkgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24ga2luZCBcIicgKyB0aGlzLmtpbmQgKyAnXCIgaXMgc3BlY2lmaWVkIGZvciBcIicgKyB0YWcgKyAnXCIgWUFNTCB0eXBlLicpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVHlwZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlKi9cblxuLy8gQSB0cmljayBmb3IgYnJvd3NlcmlmaWVkIHZlcnNpb24uXG4vLyBTaW5jZSB3ZSBtYWtlIGJyb3dzZXJpZmllciB0byBpZ25vcmUgYGJ1ZmZlcmAgbW9kdWxlLCBOb2RlQnVmZmVyIHdpbGwgYmUgdW5kZWZpbmVkXG52YXIgTm9kZUJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbnZhciBUeXBlICAgICAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5cbi8vIFsgNjQsIDY1LCA2NiBdIC0+IFsgcGFkZGluZywgQ1IsIExGIF1cbnZhciBCQVNFNjRfTUFQID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XFxuXFxyJztcblxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEJpbmFyeShkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGNvZGUsIGlkeCwgYml0bGVuID0gMCwgbWF4ID0gZGF0YS5sZW5ndGgsIG1hcCA9IEJBU0U2NF9NQVA7XG5cbiAgLy8gQ29udmVydCBvbmUgYnkgb25lLlxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBjb2RlID0gbWFwLmluZGV4T2YoZGF0YS5jaGFyQXQoaWR4KSk7XG5cbiAgICAvLyBTa2lwIENSL0xGXG4gICAgaWYgKGNvZGUgPiA2NCkgY29udGludWU7XG5cbiAgICAvLyBGYWlsIG9uIGlsbGVnYWwgY2hhcmFjdGVyc1xuICAgIGlmIChjb2RlIDwgMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYml0bGVuICs9IDY7XG4gIH1cblxuICAvLyBJZiB0aGVyZSBhcmUgYW55IGJpdHMgbGVmdCwgc291cmNlIHdhcyBjb3JydXB0ZWRcbiAgcmV0dXJuIChiaXRsZW4gJSA4KSA9PT0gMDtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEJpbmFyeShkYXRhKSB7XG4gIHZhciBpZHgsIHRhaWxiaXRzLFxuICAgICAgaW5wdXQgPSBkYXRhLnJlcGxhY2UoL1tcXHJcXG49XS9nLCAnJyksIC8vIHJlbW92ZSBDUi9MRiAmIHBhZGRpbmcgdG8gc2ltcGxpZnkgc2NhblxuICAgICAgbWF4ID0gaW5wdXQubGVuZ3RoLFxuICAgICAgbWFwID0gQkFTRTY0X01BUCxcbiAgICAgIGJpdHMgPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgLy8gQ29sbGVjdCBieSA2KjQgYml0cyAoMyBieXRlcylcblxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDQgPT09IDApICYmIGlkeCkge1xuICAgICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTYpICYgMHhGRik7XG4gICAgICByZXN1bHQucHVzaCgoYml0cyA+PiA4KSAmIDB4RkYpO1xuICAgICAgcmVzdWx0LnB1c2goYml0cyAmIDB4RkYpO1xuICAgIH1cblxuICAgIGJpdHMgPSAoYml0cyA8PCA2KSB8IG1hcC5pbmRleE9mKGlucHV0LmNoYXJBdChpZHgpKTtcbiAgfVxuXG4gIC8vIER1bXAgdGFpbFxuXG4gIHRhaWxiaXRzID0gKG1heCAlIDQpICogNjtcblxuICBpZiAodGFpbGJpdHMgPT09IDApIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxNikgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiA4KSAmIDB4RkYpO1xuICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAweEZGKTtcbiAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTgpIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxMCkgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAyKSAmIDB4RkYpO1xuICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxMikge1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDQpICYgMHhGRik7XG4gIH1cblxuICAvLyBXcmFwIGludG8gQnVmZmVyIGZvciBOb2RlSlMgYW5kIGxlYXZlIEFycmF5IGZvciBicm93c2VyXG4gIGlmIChOb2RlQnVmZmVyKSByZXR1cm4gbmV3IE5vZGVCdWZmZXIocmVzdWx0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sQmluYXJ5KG9iamVjdCAvKiwgc3R5bGUqLykge1xuICB2YXIgcmVzdWx0ID0gJycsIGJpdHMgPSAwLCBpZHgsIHRhaWwsXG4gICAgICBtYXggPSBvYmplY3QubGVuZ3RoLFxuICAgICAgbWFwID0gQkFTRTY0X01BUDtcblxuICAvLyBDb252ZXJ0IGV2ZXJ5IHRocmVlIGJ5dGVzIHRvIDQgQVNDSUkgY2hhcmFjdGVycy5cblxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDMgPT09IDApICYmIGlkeCkge1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTIpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDYpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgICB9XG5cbiAgICBiaXRzID0gKGJpdHMgPDwgOCkgKyBvYmplY3RbaWR4XTtcbiAgfVxuXG4gIC8vIER1bXAgdGFpbFxuXG4gIHRhaWwgPSBtYXggJSAzO1xuXG4gIGlmICh0YWlsID09PSAwKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgfSBlbHNlIGlmICh0YWlsID09PSAyKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDQpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCAyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9IGVsc2UgaWYgKHRhaWwgPT09IDEpIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCA0KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNCaW5hcnkob2JqZWN0KSB7XG4gIHJldHVybiBOb2RlQnVmZmVyICYmIE5vZGVCdWZmZXIuaXNCdWZmZXIob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxCaW5hcnksXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEJpbmFyeSxcbiAgcHJlZGljYXRlOiBpc0JpbmFyeSxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sQmluYXJ5XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sQm9vbGVhbihkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoO1xuXG4gIHJldHVybiAobWF4ID09PSA0ICYmIChkYXRhID09PSAndHJ1ZScgfHwgZGF0YSA9PT0gJ1RydWUnIHx8IGRhdGEgPT09ICdUUlVFJykpIHx8XG4gICAgICAgICAobWF4ID09PSA1ICYmIChkYXRhID09PSAnZmFsc2UnIHx8IGRhdGEgPT09ICdGYWxzZScgfHwgZGF0YSA9PT0gJ0ZBTFNFJykpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sQm9vbGVhbihkYXRhKSB7XG4gIHJldHVybiBkYXRhID09PSAndHJ1ZScgfHxcbiAgICAgICAgIGRhdGEgPT09ICdUcnVlJyB8fFxuICAgICAgICAgZGF0YSA9PT0gJ1RSVUUnO1xufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4ob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgQm9vbGVhbl0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpib29sJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxCb29sZWFuLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxCb29sZWFuLFxuICBwcmVkaWNhdGU6IGlzQm9vbGVhbixcbiAgcmVwcmVzZW50OiB7XG4gICAgbG93ZXJjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAndHJ1ZScgOiAnZmFsc2UnOyB9LFxuICAgIHVwcGVyY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ1RSVUUnIDogJ0ZBTFNFJzsgfSxcbiAgICBjYW1lbGNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICdUcnVlJyA6ICdGYWxzZSc7IH1cbiAgfSxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBUeXBlICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBZQU1MX0ZMT0FUX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFxuICAnXig/OlstK10/KD86WzAtOV1bMC05X10qKVxcXFwuWzAtOV9dKig/OltlRV1bLStdWzAtOV0rKT8nICtcbiAgJ3xcXFxcLlswLTlfXSsoPzpbZUVdWy0rXVswLTldKyk/JyArXG4gICd8Wy0rXT9bMC05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pK1xcXFwuWzAtOV9dKicgK1xuICAnfFstK10/XFxcXC4oPzppbmZ8SW5mfElORiknICtcbiAgJ3xcXFxcLig/Om5hbnxOYU58TkFOKSkkJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sRmxvYXQoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICghWUFNTF9GTE9BVF9QQVRURVJOLnRlc3QoZGF0YSkpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEZsb2F0KGRhdGEpIHtcbiAgdmFyIHZhbHVlLCBzaWduLCBiYXNlLCBkaWdpdHM7XG5cbiAgdmFsdWUgID0gZGF0YS5yZXBsYWNlKC9fL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICBzaWduICAgPSB2YWx1ZVswXSA9PT0gJy0nID8gLTEgOiAxO1xuICBkaWdpdHMgPSBbXTtcblxuICBpZiAoJystJy5pbmRleE9mKHZhbHVlWzBdKSA+PSAwKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJy5pbmYnKSB7XG4gICAgcmV0dXJuIChzaWduID09PSAxKSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICB9IGVsc2UgaWYgKHZhbHVlID09PSAnLm5hbicpIHtcbiAgICByZXR1cm4gTmFOO1xuXG4gIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignOicpID49IDApIHtcbiAgICB2YWx1ZS5zcGxpdCgnOicpLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgIGRpZ2l0cy51bnNoaWZ0KHBhcnNlRmxvYXQodiwgMTApKTtcbiAgICB9KTtcblxuICAgIHZhbHVlID0gMC4wO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IGQgKiBiYXNlO1xuICAgICAgYmFzZSAqPSA2MDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaWduICogdmFsdWU7XG5cbiAgfVxuICByZXR1cm4gc2lnbiAqIHBhcnNlRmxvYXQodmFsdWUsIDEwKTtcbn1cblxuXG52YXIgU0NJRU5USUZJQ19XSVRIT1VUX0RPVCA9IC9eWy0rXT9bMC05XStlLztcblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbEZsb2F0KG9iamVjdCwgc3R5bGUpIHtcbiAgdmFyIHJlcztcblxuICBpZiAoaXNOYU4ob2JqZWN0KSkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLm5hbic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy5OQU4nO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICcuTmFOJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZID09PSBvYmplY3QpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy5pbmYnO1xuICAgICAgY2FzZSAndXBwZXJjYXNlJzogcmV0dXJuICcuSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLkluZic7XG4gICAgfVxuICB9IGVsc2UgaWYgKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA9PT0gb2JqZWN0KSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICctLmluZic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy0uSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLS5JbmYnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSkge1xuICAgIHJldHVybiAnLTAuMCc7XG4gIH1cblxuICByZXMgPSBvYmplY3QudG9TdHJpbmcoMTApO1xuXG4gIC8vIEpTIHN0cmluZ2lmaWVyIGNhbiBidWlsZCBzY2llbnRpZmljIGZvcm1hdCB3aXRob3V0IGRvdHM6IDVlLTEwMCxcbiAgLy8gd2hpbGUgWUFNTCByZXF1cmVzIGRvdDogNS5lLTEwMC4gRml4IGl0IHdpdGggc2ltcGxlIGhhY2tcblxuICByZXR1cm4gU0NJRU5USUZJQ19XSVRIT1VUX0RPVC50ZXN0KHJlcykgPyByZXMucmVwbGFjZSgnZScsICcuZScpIDogcmVzO1xufVxuXG5mdW5jdGlvbiBpc0Zsb2F0KG9iamVjdCkge1xuICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBOdW1iZXJdJykgJiZcbiAgICAgICAgIChvYmplY3QgJSAxICE9PSAwIHx8IGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEZsb2F0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxGbG9hdCxcbiAgcHJlZGljYXRlOiBpc0Zsb2F0LFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxGbG9hdCxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBUeXBlICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIGlzSGV4Q29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSkgfHxcbiAgICAgICAgICgoMHg0MS8qIEEgKi8gPD0gYykgJiYgKGMgPD0gMHg0Ni8qIEYgKi8pKSB8fFxuICAgICAgICAgKCgweDYxLyogYSAqLyA8PSBjKSAmJiAoYyA8PSAweDY2LyogZiAqLykpO1xufVxuXG5mdW5jdGlvbiBpc09jdENvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM3LyogNyAqLykpO1xufVxuXG5mdW5jdGlvbiBpc0RlY0NvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEludGVnZXIoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGluZGV4ID0gMCxcbiAgICAgIGhhc0RpZ2l0cyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKCFtYXgpIHJldHVybiBmYWxzZTtcblxuICBjaCA9IGRhdGFbaW5kZXhdO1xuXG4gIC8vIHNpZ25cbiAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykge1xuICAgIGNoID0gZGF0YVsrK2luZGV4XTtcbiAgfVxuXG4gIGlmIChjaCA9PT0gJzAnKSB7XG4gICAgLy8gMFxuICAgIGlmIChpbmRleCArIDEgPT09IG1heCkgcmV0dXJuIHRydWU7XG4gICAgY2ggPSBkYXRhWysraW5kZXhdO1xuXG4gICAgLy8gYmFzZSAyLCBiYXNlIDgsIGJhc2UgMTZcblxuICAgIGlmIChjaCA9PT0gJ2InKSB7XG4gICAgICAvLyBiYXNlIDJcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICAgIGlmIChjaCAhPT0gJzAnICYmIGNoICE9PSAnMScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNEaWdpdHM7XG4gICAgfVxuXG5cbiAgICBpZiAoY2ggPT09ICd4Jykge1xuICAgICAgLy8gYmFzZSAxNlxuICAgICAgaW5kZXgrKztcblxuICAgICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFpc0hleENvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNEaWdpdHM7XG4gICAgfVxuXG4gICAgLy8gYmFzZSA4XG4gICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc09jdENvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNEaWdpdHM7XG4gIH1cblxuICAvLyBiYXNlIDEwIChleGNlcHQgMCkgb3IgYmFzZSA2MFxuXG4gIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgIGlmIChjaCA9PT0gJzonKSBicmVhaztcbiAgICBpZiAoIWlzRGVjQ29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICB9XG5cbiAgaWYgKCFoYXNEaWdpdHMpIHJldHVybiBmYWxzZTtcblxuICAvLyBpZiAhYmFzZTYwIC0gZG9uZTtcbiAgaWYgKGNoICE9PSAnOicpIHJldHVybiB0cnVlO1xuXG4gIC8vIGJhc2U2MCBhbG1vc3Qgbm90IHVzZWQsIG5vIG5lZWRzIHRvIG9wdGltaXplXG4gIHJldHVybiAvXig6WzAtNV0/WzAtOV0pKyQvLnRlc3QoZGF0YS5zbGljZShpbmRleCkpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sSW50ZWdlcihkYXRhKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGEsIHNpZ24gPSAxLCBjaCwgYmFzZSwgZGlnaXRzID0gW107XG5cbiAgaWYgKHZhbHVlLmluZGV4T2YoJ18nKSAhPT0gLTEpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL18vZywgJycpO1xuICB9XG5cbiAgY2ggPSB2YWx1ZVswXTtcblxuICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7XG4gICAgaWYgKGNoID09PSAnLScpIHNpZ24gPSAtMTtcbiAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICAgIGNoID0gdmFsdWVbMF07XG4gIH1cblxuICBpZiAodmFsdWUgPT09ICcwJykgcmV0dXJuIDA7XG5cbiAgaWYgKGNoID09PSAnMCcpIHtcbiAgICBpZiAodmFsdWVbMV0gPT09ICdiJykgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgMik7XG4gICAgaWYgKHZhbHVlWzFdID09PSAneCcpIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDE2KTtcbiAgICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCA4KTtcbiAgfVxuXG4gIGlmICh2YWx1ZS5pbmRleE9mKCc6JykgIT09IC0xKSB7XG4gICAgdmFsdWUuc3BsaXQoJzonKS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUludCh2LCAxMCkpO1xuICAgIH0pO1xuXG4gICAgdmFsdWUgPSAwO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IChkICogYmFzZSk7XG4gICAgICBiYXNlICo9IDYwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpZ24gKiB2YWx1ZTtcblxuICB9XG5cbiAgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgMTApO1xufVxuXG5mdW5jdGlvbiBpc0ludGVnZXIob2JqZWN0KSB7XG4gIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJlxuICAgICAgICAgKG9iamVjdCAlIDEgPT09IDAgJiYgIWNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6aW50Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxJbnRlZ2VyLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxJbnRlZ2VyLFxuICBwcmVkaWNhdGU6IGlzSW50ZWdlcixcbiAgcmVwcmVzZW50OiB7XG4gICAgYmluYXJ5OiAgICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICcwYicgKyBvYmplY3QudG9TdHJpbmcoMik7IH0sXG4gICAgb2N0YWw6ICAgICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICcwJyAgKyBvYmplY3QudG9TdHJpbmcoOCk7IH0sXG4gICAgZGVjaW1hbDogICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICAgICAgICBvYmplY3QudG9TdHJpbmcoMTApOyB9LFxuICAgIGhleGFkZWNpbWFsOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAnMHgnICsgb2JqZWN0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2RlY2ltYWwnLFxuICBzdHlsZUFsaWFzZXM6IHtcbiAgICBiaW5hcnk6ICAgICAgWyAyLCAgJ2JpbicgXSxcbiAgICBvY3RhbDogICAgICAgWyA4LCAgJ29jdCcgXSxcbiAgICBkZWNpbWFsOiAgICAgWyAxMCwgJ2RlYycgXSxcbiAgICBoZXhhZGVjaW1hbDogWyAxNiwgJ2hleCcgXVxuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGVzcHJpbWE7XG5cbi8vIEJyb3dzZXJpZmllZCB2ZXJzaW9uIGRvZXMgbm90IGhhdmUgZXNwcmltYVxuLy9cbi8vIDEuIEZvciBub2RlLmpzIGp1c3QgcmVxdWlyZSBtb2R1bGUgYXMgZGVwc1xuLy8gMi4gRm9yIGJyb3dzZXIgdHJ5IHRvIHJlcXVpcmUgbXVkdWxlIHZpYSBleHRlcm5hbCBBTUQgc3lzdGVtLlxuLy8gICAgSWYgbm90IGZvdW5kIC0gdHJ5IHRvIGZhbGxiYWNrIHRvIHdpbmRvdy5lc3ByaW1hLiBJZiBub3Rcbi8vICAgIGZvdW5kIHRvbyAtIHRoZW4gZmFpbCB0byBwYXJzZS5cbi8vXG50cnkge1xuICAvLyB3b3JrYXJvdW5kIHRvIGV4Y2x1ZGUgcGFja2FnZSBmcm9tIGJyb3dzZXJpZnkgbGlzdC5cbiAgdmFyIF9yZXF1aXJlID0gcmVxdWlyZTtcbiAgZXNwcmltYSA9IF9yZXF1aXJlKCdlc3ByaW1hJyk7XG59IGNhdGNoIChfKSB7XG4gIC8qZ2xvYmFsIHdpbmRvdyAqL1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIGVzcHJpbWEgPSB3aW5kb3cuZXNwcmltYTtcbn1cblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24oZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgdmFyIHNvdXJjZSA9ICcoJyArIGRhdGEgKyAnKScsXG4gICAgICAgIGFzdCAgICA9IGVzcHJpbWEucGFyc2Uoc291cmNlLCB7IHJhbmdlOiB0cnVlIH0pO1xuXG4gICAgaWYgKGFzdC50eXBlICAgICAgICAgICAgICAgICAgICAhPT0gJ1Byb2dyYW0nICAgICAgICAgICAgIHx8XG4gICAgICAgIGFzdC5ib2R5Lmxlbmd0aCAgICAgICAgICAgICAhPT0gMSAgICAgICAgICAgICAgICAgICAgIHx8XG4gICAgICAgIGFzdC5ib2R5WzBdLnR5cGUgICAgICAgICAgICAhPT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnIHx8XG4gICAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbihkYXRhKSB7XG4gIC8qanNsaW50IGV2aWw6dHJ1ZSovXG5cbiAgdmFyIHNvdXJjZSA9ICcoJyArIGRhdGEgKyAnKScsXG4gICAgICBhc3QgICAgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KSxcbiAgICAgIHBhcmFtcyA9IFtdLFxuICAgICAgYm9keTtcblxuICBpZiAoYXN0LnR5cGUgICAgICAgICAgICAgICAgICAgICE9PSAnUHJvZ3JhbScgICAgICAgICAgICAgfHxcbiAgICAgIGFzdC5ib2R5Lmxlbmd0aCAgICAgICAgICAgICAhPT0gMSAgICAgICAgICAgICAgICAgICAgIHx8XG4gICAgICBhc3QuYm9keVswXS50eXBlICAgICAgICAgICAgIT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyB8fFxuICAgICAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAnRnVuY3Rpb25FeHByZXNzaW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlc29sdmUgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24ucGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgcGFyYW1zLnB1c2gocGFyYW0ubmFtZSk7XG4gIH0pO1xuXG4gIGJvZHkgPSBhc3QuYm9keVswXS5leHByZXNzaW9uLmJvZHkucmFuZ2U7XG5cbiAgLy8gRXNwcmltYSdzIHJhbmdlcyBpbmNsdWRlIHRoZSBmaXJzdCAneycgYW5kIHRoZSBsYXN0ICd9JyBjaGFyYWN0ZXJzIG9uXG4gIC8vIGZ1bmN0aW9uIGV4cHJlc3Npb25zLiBTbyBjdXQgdGhlbSBvdXQuXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tbmV3LWZ1bmMqL1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKHBhcmFtcywgc291cmNlLnNsaWNlKGJvZHlbMF0gKyAxLCBib2R5WzFdIC0gMSkpO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0RnVuY3Rpb24ob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbihvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy9mdW5jdGlvbicsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24sXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdEZ1bmN0aW9uLFxuICBwcmVkaWNhdGU6IGlzRnVuY3Rpb24sXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIHJlZ2V4cCA9IGRhdGEsXG4gICAgICB0YWlsICAgPSAvXFwvKFtnaW1dKikkLy5leGVjKGRhdGEpLFxuICAgICAgbW9kaWZpZXJzID0gJyc7XG5cbiAgLy8gaWYgcmVnZXhwIHN0YXJ0cyB3aXRoICcvJyBpdCBjYW4gaGF2ZSBtb2RpZmllcnMgYW5kIG11c3QgYmUgcHJvcGVybHkgY2xvc2VkXG4gIC8vIGAvZm9vL2dpbWAgLSBtb2RpZmllcnMgdGFpbCBjYW4gYmUgbWF4aW11bSAzIGNoYXJzXG4gIGlmIChyZWdleHBbMF0gPT09ICcvJykge1xuICAgIGlmICh0YWlsKSBtb2RpZmllcnMgPSB0YWlsWzFdO1xuXG4gICAgaWYgKG1vZGlmaWVycy5sZW5ndGggPiAzKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gaWYgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCAvLCBpcyBzaG91bGQgYmUgcHJvcGVybHkgdGVybWluYXRlZFxuICAgIGlmIChyZWdleHBbcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxXSAhPT0gJy8nKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdFJlZ0V4cChkYXRhKSB7XG4gIHZhciByZWdleHAgPSBkYXRhLFxuICAgICAgdGFpbCAgID0gL1xcLyhbZ2ltXSopJC8uZXhlYyhkYXRhKSxcbiAgICAgIG1vZGlmaWVycyA9ICcnO1xuXG4gIC8vIGAvZm9vL2dpbWAgLSB0YWlsIGNhbiBiZSBtYXhpbXVtIDQgY2hhcnNcbiAgaWYgKHJlZ2V4cFswXSA9PT0gJy8nKSB7XG4gICAgaWYgKHRhaWwpIG1vZGlmaWVycyA9IHRhaWxbMV07XG4gICAgcmVnZXhwID0gcmVnZXhwLnNsaWNlKDEsIHJlZ2V4cC5sZW5ndGggLSBtb2RpZmllcnMubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleHAsIG1vZGlmaWVycyk7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRSZWdFeHAob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHZhciByZXN1bHQgPSAnLycgKyBvYmplY3Quc291cmNlICsgJy8nO1xuXG4gIGlmIChvYmplY3QuZ2xvYmFsKSByZXN1bHQgKz0gJ2cnO1xuICBpZiAob2JqZWN0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJztcbiAgaWYgKG9iamVjdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy9yZWdleHAnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwLFxuICBwcmVkaWNhdGU6IGlzUmVnRXhwLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRSZWdFeHBcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCovXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAndW5kZWZpbmVkJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvdW5kZWZpbmVkJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCxcbiAgcHJlZGljYXRlOiBpc1VuZGVmaW5lZCxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsIHtcbiAga2luZDogJ21hcHBpbmcnLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9OyB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sTWVyZ2UoZGF0YSkge1xuICByZXR1cm4gZGF0YSA9PT0gJzw8JyB8fCBkYXRhID09PSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjptZXJnZScsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sTWVyZ2Vcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxOdWxsKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aDtcblxuICByZXR1cm4gKG1heCA9PT0gMSAmJiBkYXRhID09PSAnficpIHx8XG4gICAgICAgICAobWF4ID09PSA0ICYmIChkYXRhID09PSAnbnVsbCcgfHwgZGF0YSA9PT0gJ051bGwnIHx8IGRhdGEgPT09ICdOVUxMJykpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sTnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzTnVsbChvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA9PT0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6bnVsbCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sTnVsbCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sTnVsbCxcbiAgcHJlZGljYXRlOiBpc051bGwsXG4gIHJlcHJlc2VudDoge1xuICAgIGNhbm9uaWNhbDogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ34nOyAgICB9LFxuICAgIGxvd2VyY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ251bGwnOyB9LFxuICAgIHVwcGVyY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ05VTEwnOyB9LFxuICAgIGNhbWVsY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ051bGwnOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2xvd2VyY2FzZSdcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX3RvU3RyaW5nICAgICAgID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxPbWFwKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBvYmplY3RLZXlzID0gW10sIGluZGV4LCBsZW5ndGgsIHBhaXIsIHBhaXJLZXksIHBhaXJIYXNLZXksXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHBhaXIgPSBvYmplY3RbaW5kZXhdO1xuICAgIHBhaXJIYXNLZXkgPSBmYWxzZTtcblxuICAgIGlmIChfdG9TdHJpbmcuY2FsbChwYWlyKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAocGFpcktleSBpbiBwYWlyKSB7XG4gICAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwocGFpciwgcGFpcktleSkpIHtcbiAgICAgICAgaWYgKCFwYWlySGFzS2V5KSBwYWlySGFzS2V5ID0gdHJ1ZTtcbiAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFwYWlySGFzS2V5KSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAob2JqZWN0S2V5cy5pbmRleE9mKHBhaXJLZXkpID09PSAtMSkgb2JqZWN0S2V5cy5wdXNoKHBhaXJLZXkpO1xuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxPbWFwKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sT21hcCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sT21hcFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxQYWlycyhkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgaW5kZXgsIGxlbmd0aCwgcGFpciwga2V5cywgcmVzdWx0LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG5cbiAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSByZXR1cm4gZmFsc2U7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMocGFpcik7XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sUGFpcnMoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuXG4gIHZhciBpbmRleCwgbGVuZ3RoLCBwYWlyLCBrZXlzLCByZXN1bHQsXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIHJlc3VsdCA9IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhwYWlyKTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFBhaXJzLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxQYWlyc1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzZXEnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107IH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sU2V0KGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBrZXksIG9iamVjdCA9IGRhdGE7XG5cbiAgZm9yIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgaWYgKG9iamVjdFtrZXldICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxTZXQoZGF0YSkge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c2V0Jywge1xuICBraW5kOiAnbWFwcGluZycsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sU2V0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxTZXRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c3RyJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiAnJzsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgWUFNTF9USU1FU1RBTVBfUkVHRVhQID0gbmV3IFJlZ0V4cChcbiAgJ14oWzAtOV1bMC05XVswLTldWzAtOV0pJyAgICAgICAgICArIC8vIFsxXSB5ZWFyXG4gICctKFswLTldWzAtOV0/KScgICAgICAgICAgICAgICAgICAgKyAvLyBbMl0gbW9udGhcbiAgJy0oWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICArIC8vIFszXSBkYXlcbiAgJyg/Oig/OltUdF18WyBcXFxcdF0rKScgICAgICAgICAgICAgICsgLy8gLi4uXG4gICcoWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNF0gaG91clxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzVdIG1pbnV0ZVxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzZdIHNlY29uZFxuICAnKD86XFxcXC4oWzAtOV0qKSk/JyAgICAgICAgICAgICAgICAgKyAvLyBbN10gZnJhY3Rpb25cbiAgJyg/OlsgXFxcXHRdKihafChbLStdKShbMC05XVswLTldPyknICsgLy8gWzhdIHR6IFs5XSB0el9zaWduIFsxMF0gdHpfaG91clxuICAnKD86OihbMC05XVswLTldKSk/KSk/KT8kJyk7ICAgICAgICAgLy8gWzExXSB0el9taW51dGVcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoWUFNTF9USU1FU1RBTVBfUkVHRVhQLmV4ZWMoZGF0YSkgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICB2YXIgbWF0Y2gsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbiA9IDAsXG4gICAgICBkZWx0YSA9IG51bGwsIHR6X2hvdXIsIHR6X21pbnV0ZSwgZGF0ZTtcblxuICBtYXRjaCA9IFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpO1xuXG4gIGlmIChtYXRjaCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdEYXRlIHJlc29sdmUgZXJyb3InKTtcblxuICAvLyBtYXRjaDogWzFdIHllYXIgWzJdIG1vbnRoIFszXSBkYXlcblxuICB5ZWFyID0gKyhtYXRjaFsxXSk7XG4gIG1vbnRoID0gKyhtYXRjaFsyXSkgLSAxOyAvLyBKUyBtb250aCBzdGFydHMgd2l0aCAwXG4gIGRheSA9ICsobWF0Y2hbM10pO1xuXG4gIGlmICghbWF0Y2hbNF0pIHsgLy8gbm8gaG91clxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5KSk7XG4gIH1cblxuICAvLyBtYXRjaDogWzRdIGhvdXIgWzVdIG1pbnV0ZSBbNl0gc2Vjb25kIFs3XSBmcmFjdGlvblxuXG4gIGhvdXIgPSArKG1hdGNoWzRdKTtcbiAgbWludXRlID0gKyhtYXRjaFs1XSk7XG4gIHNlY29uZCA9ICsobWF0Y2hbNl0pO1xuXG4gIGlmIChtYXRjaFs3XSkge1xuICAgIGZyYWN0aW9uID0gbWF0Y2hbN10uc2xpY2UoMCwgMyk7XG4gICAgd2hpbGUgKGZyYWN0aW9uLmxlbmd0aCA8IDMpIHsgLy8gbWlsbGktc2Vjb25kc1xuICAgICAgZnJhY3Rpb24gKz0gJzAnO1xuICAgIH1cbiAgICBmcmFjdGlvbiA9ICtmcmFjdGlvbjtcbiAgfVxuXG4gIC8vIG1hdGNoOiBbOF0gdHogWzldIHR6X3NpZ24gWzEwXSB0el9ob3VyIFsxMV0gdHpfbWludXRlXG5cbiAgaWYgKG1hdGNoWzldKSB7XG4gICAgdHpfaG91ciA9ICsobWF0Y2hbMTBdKTtcbiAgICB0el9taW51dGUgPSArKG1hdGNoWzExXSB8fCAwKTtcbiAgICBkZWx0YSA9ICh0el9ob3VyICogNjAgKyB0el9taW51dGUpICogNjAwMDA7IC8vIGRlbHRhIGluIG1pbGktc2Vjb25kc1xuICAgIGlmIChtYXRjaFs5XSA9PT0gJy0nKSBkZWx0YSA9IC1kZWx0YTtcbiAgfVxuXG4gIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24pKTtcblxuICBpZiAoZGVsdGEpIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSAtIGRlbHRhKTtcblxuICByZXR1cm4gZGF0ZTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbFRpbWVzdGFtcChvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgcmV0dXJuIG9iamVjdC50b0lTT1N0cmluZygpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFRpbWVzdGFtcCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wLFxuICBpbnN0YW5jZU9mOiBEYXRlLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxUaW1lc3RhbXBcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbi8vIHByaXZhdGUgcHJvcGVydHlcbnZhciBfa2V5U3RyID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuXG5cbi8vIHB1YmxpYyBtZXRob2QgZm9yIGVuY29kaW5nXG4vLyBleHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG4vLyAgICAgdmFyIG91dHB1dCA9IFtdO1xuLy8gICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzLCBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0O1xuLy8gICAgIHZhciBpID0gMCwgbGVuID0gaW5wdXQubGVuZ3RoLCByZW1haW5pbmdCeXRlcyA9IGxlbjtcblxuLy8gICAgIHZhciBpc0FycmF5ID0gdXRpbHMuZ2V0VHlwZU9mKGlucHV0KSAhPT0gXCJzdHJpbmdcIjtcbi8vICAgICB3aGlsZSAoaSA8IGlucHV0Lmxlbmd0aCkge1xuLy8gICAgICAgICByZW1haW5pbmdCeXRlcyA9IGxlbiAtIGk7XG5cbi8vICAgICAgICAgaWYgKCFpc0FycmF5KSB7XG4vLyAgICAgICAgICAgICBjaHIxID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuLy8gICAgICAgICAgICAgY2hyMiA9IGkgPCBsZW4gPyBpbnB1dC5jaGFyQ29kZUF0KGkrKykgOiAwO1xuLy8gICAgICAgICAgICAgY2hyMyA9IGkgPCBsZW4gPyBpbnB1dC5jaGFyQ29kZUF0KGkrKykgOiAwO1xuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgY2hyMSA9IGlucHV0W2krK107XG4vLyAgICAgICAgICAgICBjaHIyID0gaSA8IGxlbiA/IGlucHV0W2krK10gOiAwO1xuLy8gICAgICAgICAgICAgY2hyMyA9IGkgPCBsZW4gPyBpbnB1dFtpKytdIDogMDtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGVuYzEgPSBjaHIxID4+IDI7XG4vLyAgICAgICAgIGVuYzIgPSAoKGNocjEgJiAzKSA8PCA0KSB8IChjaHIyID4+IDQpO1xuLy8gICAgICAgICBlbmMzID0gcmVtYWluaW5nQnl0ZXMgPiAxID8gKCgoY2hyMiAmIDE1KSA8PCAyKSB8IChjaHIzID4+IDYpKSA6IDY0O1xuLy8gICAgICAgICBlbmM0ID0gcmVtYWluaW5nQnl0ZXMgPiAyID8gKGNocjMgJiA2MykgOiA2NDtcblxuLy8gICAgICAgICBvdXRwdXQucHVzaChfa2V5U3RyLmNoYXJBdChlbmMxKSArIF9rZXlTdHIuY2hhckF0KGVuYzIpICsgX2tleVN0ci5jaGFyQXQoZW5jMykgKyBfa2V5U3RyLmNoYXJBdChlbmM0KSk7XG5cbi8vICAgICB9XG5cbi8vICAgICByZXR1cm4gb3V0cHV0LmpvaW4oXCJcIik7XG4vLyB9O1xuXG4vLyBwdWJsaWMgbWV0aG9kIGZvciBkZWNvZGluZ1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzO1xuICAgIHZhciBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0O1xuICAgIHZhciBpID0gMCwgcmVzdWx0SW5kZXggPSAwO1xuXG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOVxcK1xcL1xcPV0vZywgXCJcIik7XG5cbiAgICB2YXIgdG90YWxMZW5ndGggPSBpbnB1dC5sZW5ndGggKiAzIC8gNDtcbiAgICBpZihpbnB1dC5jaGFyQXQoaW5wdXQubGVuZ3RoIC0gMSkgPT09IF9rZXlTdHIuY2hhckF0KDY0KSkge1xuICAgICAgICB0b3RhbExlbmd0aC0tO1xuICAgIH1cbiAgICBpZihpbnB1dC5jaGFyQXQoaW5wdXQubGVuZ3RoIC0gMikgPT09IF9rZXlTdHIuY2hhckF0KDY0KSkge1xuICAgICAgICB0b3RhbExlbmd0aC0tO1xuICAgIH1cbiAgICB2YXIgb3V0cHV0O1xuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dCA9IG5ldyBBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcblxuICAgICAgICBlbmMxID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jMiA9IF9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzMgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmM0ID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcblxuICAgICAgICBjaHIxID0gKGVuYzEgPDwgMikgfCAoZW5jMiA+PiA0KTtcbiAgICAgICAgY2hyMiA9ICgoZW5jMiAmIDE1KSA8PCA0KSB8IChlbmMzID4+IDIpO1xuICAgICAgICBjaHIzID0gKChlbmMzICYgMykgPDwgNikgfCBlbmM0O1xuXG4gICAgICAgIG91dHB1dFtyZXN1bHRJbmRleCsrXSA9IGNocjE7XG5cbiAgICAgICAgaWYgKGVuYzMgIT09IDY0KSB7XG4gICAgICAgICAgICBvdXRwdXRbcmVzdWx0SW5kZXgrK10gPSBjaHIyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmM0ICE9PSA2NCkge1xuICAgICAgICAgICAgb3V0cHV0W3Jlc3VsdEluZGV4KytdID0gY2hyMztcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBleHRlcm5hbCA9IHJlcXVpcmUoXCIuL2V4dGVybmFsXCIpO1xudmFyIERhdGFXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhV29ya2VyJyk7XG52YXIgRGF0YUxlbmd0aFByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlJyk7XG52YXIgQ3JjMzJQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0NyYzMyUHJvYmUnKTtcbnZhciBEYXRhTGVuZ3RoUHJvYmUgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUnKTtcblxuLyoqXG4gKiBSZXByZXNlbnQgYSBjb21wcmVzc2VkIG9iamVjdCwgd2l0aCBldmVyeXRoaW5nIG5lZWRlZCB0byBkZWNvbXByZXNzIGl0LlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge251bWJlcn0gY29tcHJlc3NlZFNpemUgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29tcHJlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB1bmNvbXByZXNzZWRTaXplIHRoZSBzaXplIG9mIHRoZSBkYXRhIGFmdGVyIGRlY29tcHJlc3Npb24uXG4gKiBAcGFyYW0ge251bWJlcn0gY3JjMzIgdGhlIGNyYzMyIG9mIHRoZSBkZWNvbXByZXNzZWQgZmlsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjb21wcmVzc2lvbiB0aGUgdHlwZSBvZiBjb21wcmVzc2lvbiwgc2VlIGxpYi9jb21wcmVzc2lvbnMuanMuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgY29tcHJlc3NlZCBkYXRhLlxuICovXG5mdW5jdGlvbiBDb21wcmVzc2VkT2JqZWN0KGNvbXByZXNzZWRTaXplLCB1bmNvbXByZXNzZWRTaXplLCBjcmMzMiwgY29tcHJlc3Npb24sIGRhdGEpIHtcbiAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gY29tcHJlc3NlZFNpemU7XG4gICAgdGhpcy51bmNvbXByZXNzZWRTaXplID0gdW5jb21wcmVzc2VkU2l6ZTtcbiAgICB0aGlzLmNyYzMyID0gY3JjMzI7XG4gICAgdGhpcy5jb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uO1xuICAgIHRoaXMuY29tcHJlc3NlZENvbnRlbnQgPSBkYXRhO1xufVxuXG5Db21wcmVzc2VkT2JqZWN0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB3b3JrZXIgdG8gZ2V0IHRoZSB1bmNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIGdldENvbnRlbnRXb3JrZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3b3JrZXIgPSBuZXcgRGF0YVdvcmtlcihleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUodGhpcy5jb21wcmVzc2VkQ29udGVudCkpXG4gICAgICAgIC5waXBlKHRoaXMuY29tcHJlc3Npb24udW5jb21wcmVzc1dvcmtlcigpKVxuICAgICAgICAucGlwZShuZXcgRGF0YUxlbmd0aFByb2JlKFwiZGF0YV9sZW5ndGhcIikpO1xuXG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgd29ya2VyLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuc3RyZWFtSW5mb1snZGF0YV9sZW5ndGgnXSAhPT0gdGhhdC51bmNvbXByZXNzZWRTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVnIDogdW5jb21wcmVzc2VkIGRhdGEgc2l6ZSBtaXNtYXRjaFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB3b3JrZXIgdG8gZ2V0IHRoZSBjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICBnZXRDb21wcmVzc2VkV29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGFXb3JrZXIoZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29tcHJlc3NlZENvbnRlbnQpKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJjb21wcmVzc2VkU2l6ZVwiLCB0aGlzLmNvbXByZXNzZWRTaXplKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJ1bmNvbXByZXNzZWRTaXplXCIsIHRoaXMudW5jb21wcmVzc2VkU2l6ZSlcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwiY3JjMzJcIiwgdGhpcy5jcmMzMilcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwiY29tcHJlc3Npb25cIiwgdGhpcy5jb21wcmVzc2lvbilcbiAgICAgICAgO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ2hhaW4gdGhlIGdpdmVuIHdvcmtlciB3aXRoIG90aGVyIHdvcmtlcnMgdG8gY29tcHJlc3MgdGhlIGNvbnRlbnQgd2l0aCB0aGVcbiAqIGdpdmVuIGNvbXByZXNpb24uXG4gKiBAcGFyYW0ge0dlbmVyaWNXb3JrZXJ9IHVuY29tcHJlc3NlZFdvcmtlciB0aGUgd29ya2VyIHRvIHBpcGUuXG4gKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb24gdGhlIGNvbXByZXNzaW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbk9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gY29tcHJlc3NpbmcuXG4gKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgbmV3IHdvcmtlciBjb21wcmVzc2luZyB0aGUgY29udGVudC5cbiAqL1xuQ29tcHJlc3NlZE9iamVjdC5jcmVhdGVXb3JrZXJGcm9tID0gZnVuY3Rpb24gKHVuY29tcHJlc3NlZFdvcmtlciwgY29tcHJlc3Npb24sIGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIHJldHVybiB1bmNvbXByZXNzZWRXb3JrZXJcbiAgICAucGlwZShuZXcgQ3JjMzJQcm9iZSgpKVxuICAgIC5waXBlKG5ldyBEYXRhTGVuZ3RoUHJvYmUoXCJ1bmNvbXByZXNzZWRTaXplXCIpKVxuICAgIC5waXBlKGNvbXByZXNzaW9uLmNvbXByZXNzV29ya2VyKGNvbXByZXNzaW9uT3B0aW9ucykpXG4gICAgLnBpcGUobmV3IERhdGFMZW5ndGhQcm9iZShcImNvbXByZXNzZWRTaXplXCIpKVxuICAgIC53aXRoU3RyZWFtSW5mbyhcImNvbXByZXNzaW9uXCIsIGNvbXByZXNzaW9uKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcHJlc3NlZE9iamVjdDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKFwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlclwiKTtcblxuZXhwb3J0cy5TVE9SRSA9IHtcbiAgICBtYWdpYzogXCJcXHgwMFxceDAwXCIsXG4gICAgLy8gY29tcHJlc3NXb3JrZXIgOiBmdW5jdGlvbiAoY29tcHJlc3Npb25PcHRpb25zKSB7XG4gICAgLy8gICAgIHJldHVybiBuZXcgR2VuZXJpY1dvcmtlcihcIlNUT1JFIGNvbXByZXNzaW9uXCIpO1xuICAgIC8vIH0sXG4gICAgdW5jb21wcmVzc1dvcmtlciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljV29ya2VyKFwiU1RPUkUgZGVjb21wcmVzc2lvblwiKTtcbiAgICB9XG59O1xuZXhwb3J0cy5ERUZMQVRFID0gcmVxdWlyZSgnLi9mbGF0ZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY29tZSBmcm9tIHBha28sIGZyb20gcGFrby9saWIvemxpYi9jcmMzMi5qc1xuICogcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLCBzZWUgcGFrbyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28vXG4gKi9cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgICB2YXIgYywgdGFibGUgPSBbXTtcblxuICAgIGZvcih2YXIgbiA9MDsgbiA8IDI1NjsgbisrKXtcbiAgICAgICAgYyA9IG47XG4gICAgICAgIGZvcih2YXIgayA9MDsgayA8IDg7IGsrKyl7XG4gICAgICAgICAgICBjID0gKChjJjEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICAgICAgfVxuICAgICAgICB0YWJsZVtuXSA9IGM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gICAgdmFyIHQgPSBjcmNUYWJsZSwgZW5kID0gcG9zICsgbGVuO1xuXG4gICAgY3JjID0gY3JjIF4gKC0xKTtcblxuICAgIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKyApIHtcbiAgICAgICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBidWZbaV0pICYgMHhGRl07XG4gICAgfVxuXG4gICAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cbi8vIFRoYXQncyBhbGwgZm9yIHRoZSBwYWtvIGZ1bmN0aW9ucy5cblxuLyoqXG4gKiBDb21wdXRlIHRoZSBjcmMzMiBvZiBhIHN0cmluZy5cbiAqIFRoaXMgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIHRoZSBmdW5jdGlvbiBjcmMzMiwgYnV0IGZvciBzdHJpbmdzLiBVc2luZyB0aGVcbiAqIHNhbWUgZnVuY3Rpb24gZm9yIHRoZSB0d28gdXNlIGNhc2VzIGxlYWRzIHRvIGhvcnJpYmxlIHBlcmZvcm1hbmNlcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBjcmMgdGhlIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZSBjcmMuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gdXNlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0ge051bWJlcn0gcG9zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIGNyYzMyIGNvbXB1dGF0aW9uLlxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgY29tcHV0ZWQgY3JjMzIuXG4gKi9cbmZ1bmN0aW9uIGNyYzMyc3RyKGNyYywgc3RyLCBsZW4sIHBvcykge1xuICAgIHZhciB0ID0gY3JjVGFibGUsIGVuZCA9IHBvcyArIGxlbjtcblxuICAgIGNyYyA9IGNyYyBeICgtMSk7XG5cbiAgICBmb3IgKHZhciBpID0gcG9zOyBpIDwgZW5kOyBpKysgKSB7XG4gICAgICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gc3RyLmNoYXJDb2RlQXQoaSkpICYgMHhGRl07XG4gICAgfVxuXG4gICAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JjMzJ3cmFwcGVyKGlucHV0LCBjcmMpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFpbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgdmFyIGlzQXJyYXkgPSB1dGlscy5nZXRUeXBlT2YoaW5wdXQpICE9PSBcInN0cmluZ1wiO1xuXG4gICAgaWYoaXNBcnJheSkge1xuICAgICAgICByZXR1cm4gY3JjMzIoY3JjfDAsIGlucHV0LCBpbnB1dC5sZW5ndGgsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjcmMzMnN0cihjcmN8MCwgaW5wdXQsIGlucHV0Lmxlbmd0aCwgMCk7XG4gICAgfVxufTtcbi8vIHZpbTogc2V0IHNoaWZ0d2lkdGg9NCBzb2Z0dGFic3RvcD00OlxuIiwiJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy5iYXNlNjQgPSBmYWxzZTtcbmV4cG9ydHMuYmluYXJ5ID0gZmFsc2U7XG5leHBvcnRzLmRpciA9IGZhbHNlO1xuZXhwb3J0cy5jcmVhdGVGb2xkZXJzID0gdHJ1ZTtcbmV4cG9ydHMuZGF0ZSA9IG51bGw7XG5leHBvcnRzLmNvbXByZXNzaW9uID0gbnVsbDtcbmV4cG9ydHMuY29tcHJlc3Npb25PcHRpb25zID0gbnVsbDtcbmV4cG9ydHMuY29tbWVudCA9IG51bGw7XG5leHBvcnRzLnVuaXhQZXJtaXNzaW9ucyA9IG51bGw7XG5leHBvcnRzLmRvc1Blcm1pc3Npb25zID0gbnVsbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gdmFyIEVTNlByb21pc2UgPSByZXF1aXJlKFwiZXM2LXByb21pc2VcIikuUHJvbWlzZTtcblxuLyoqXG4gKiBMZXQgdGhlIHVzZXIgdXNlL2NoYW5nZSBzb21lIGltcGxlbWVudGF0aW9ucy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgUHJvbWlzZTogd2luZG93LlByb21pc2Vcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVVNFX1RZUEVEQVJSQVkgPSAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJiAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiYgKHR5cGVvZiBVaW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpO1xuXG52YXIgcGFrbyA9IHJlcXVpcmUoXCJwYWtvXCIpO1xudmFyIHV0aWxzID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoXCIuL3N0cmVhbS9HZW5lcmljV29ya2VyXCIpO1xuXG52YXIgQVJSQVlfVFlQRSA9IFVTRV9UWVBFREFSUkFZID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCI7XG5cbmV4cG9ydHMubWFnaWMgPSBcIlxceDA4XFx4MDBcIjtcblxuLyoqXG4gKiBDcmVhdGUgYSB3b3JrZXIgdGhhdCB1c2VzIHBha28gdG8gaW5mbGF0ZS9kZWZsYXRlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uIHRoZSBuYW1lIG9mIHRoZSBwYWtvIGZ1bmN0aW9uIHRvIGNhbGwgOiBlaXRoZXIgXCJEZWZsYXRlXCIgb3IgXCJJbmZsYXRlXCIuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiAoZGUpY29tcHJlc3NpbmcuXG4gKi9cbmZ1bmN0aW9uIEZsYXRlV29ya2VyKGFjdGlvbiwgb3B0aW9ucykge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkZsYXRlV29ya2VyL1wiICsgYWN0aW9uKTtcblxuICAgIHRoaXMuX3Bha28gPSBuZXcgcGFrb1thY3Rpb25dKHtcbiAgICAgICAgcmF3OnRydWUsXG4gICAgICAgIGxldmVsIDogb3B0aW9ucy5sZXZlbCB8fCAtMSAvLyBkZWZhdWx0IGNvbXByZXNzaW9uXG4gICAgfSk7XG4gICAgLy8gdGhlIGBtZXRhYCBvYmplY3QgZnJvbSB0aGUgbGFzdCBjaHVuayByZWNlaXZlZFxuICAgIC8vIHRoaXMgYWxsb3cgdGhpcyB3b3JrZXIgdG8gcGFzcyBhcm91bmQgbWV0YWRhdGFcbiAgICB0aGlzLm1ldGEgPSB7fTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9wYWtvLm9uRGF0YSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgc2VsZi5wdXNoKHtcbiAgICAgICAgICAgIGRhdGEgOiBkYXRhLFxuICAgICAgICAgICAgbWV0YSA6IHNlbGYubWV0YVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG51dGlscy5pbmhlcml0cyhGbGF0ZVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5GbGF0ZVdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5tZXRhID0gY2h1bmsubWV0YTtcbiAgICB0aGlzLl9wYWtvLnB1c2godXRpbHMudHJhbnNmb3JtVG8oQVJSQVlfVFlQRSwgY2h1bmsuZGF0YSksIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmZsdXNoXG4gKi9cbkZsYXRlV29ya2VyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpO1xuICAgIHRoaXMuX3Bha28ucHVzaChbXSwgdHJ1ZSk7XG59O1xuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuY2xlYW5VcFxuICovXG5GbGF0ZVdvcmtlci5wcm90b3R5cGUuY2xlYW5VcCA9IGZ1bmN0aW9uICgpIHtcbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5jbGVhblVwLmNhbGwodGhpcyk7XG4gICAgdGhpcy5fcGFrbyA9IG51bGw7XG59O1xuXG5leHBvcnRzLmNvbXByZXNzV29ya2VyID0gZnVuY3Rpb24gKGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgRmxhdGVXb3JrZXIoXCJEZWZsYXRlXCIsIGNvbXByZXNzaW9uT3B0aW9ucyk7XG59O1xuZXhwb3J0cy51bmNvbXByZXNzV29ya2VyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgRmxhdGVXb3JrZXIoXCJJbmZsYXRlXCIsIHt9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gYSBvZiB6aXAgZmlsZSBpbiBqc1xuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEpTWmlwKCkge1xuICAgIC8vIGlmIHRoaXMgY29uc3RydWN0b3IgaXPCoHVzZWQgd2l0aG91dMKgYG5ld2AsIGl0wqBhZGRzIGBuZXdgIGJlZm9yZcKgaXRzZWxmOlxuICAgIGlmKCEodGhpcyBpbnN0YW5jZW9mIEpTWmlwKSkge1xuICAgICAgICByZXR1cm4gbmV3IEpTWmlwKCk7XG4gICAgfVxuXG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xuICAgIH1cblxuICAgIC8vIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWxlcyA6XG4gICAgLy8ge1xuICAgIC8vICAgXCJmb2xkZXIvXCIgOiB7Li4ufSxcbiAgICAvLyAgIFwiZm9sZGVyL2RhdGEudHh0XCIgOiB7Li4ufVxuICAgIC8vIH1cbiAgICB0aGlzLmZpbGVzID0ge307XG5cbiAgICB0aGlzLmNvbW1lbnQgPSBudWxsO1xuXG4gICAgLy8gV2hlcmUgd2UgYXJlIGluIHRoZSBoaWVyYXJjaHlcbiAgICB0aGlzLnJvb3QgPSBcIlwiO1xuICAgIHRoaXMuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG5ld09iaiA9IG5ldyBKU1ppcCgpO1xuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpc1tpXSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgbmV3T2JqW2ldID0gdGhpc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3T2JqO1xuICAgIH07XG59XG5KU1ppcC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL29iamVjdCcpO1xuSlNaaXAucHJvdG90eXBlLmxvYWRBc3luYyA9IHJlcXVpcmUoJy4vbG9hZCcpO1xuSlNaaXAuc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuSlNaaXAuZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbkpTWmlwLmxvYWRBc3luYyA9IGZ1bmN0aW9uIChjb250ZW50LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBKU1ppcCgpLmxvYWRBc3luYyhjb250ZW50LCBvcHRpb25zKTtcbn07XG5cbkpTWmlwLmV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG5tb2R1bGUuZXhwb3J0cyA9IEpTWmlwO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIFppcEVudHJpZXMgPSByZXF1aXJlKCcuL3ppcEVudHJpZXMnKTtcbnZhciBDcmMzMlByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vQ3JjMzJQcm9iZScpO1xudmFyIG5vZGVqc1V0aWxzID0gcmVxdWlyZShcIi4vbm9kZWpzVXRpbHNcIik7XG5cbi8qKlxuICogQ2hlY2sgdGhlIENSQzMyIG9mIGFuIGVudHJ5LlxuICogQHBhcmFtIHtaaXBFbnRyeX0gemlwRW50cnkgdGhlIHppcCBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrRW50cnlDUkMzMih6aXBFbnRyeSkge1xuICAgIHJldHVybiBuZXcgZXh0ZXJuYWwuUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciB3b3JrZXIgPSB6aXBFbnRyeS5kZWNvbXByZXNzZWQuZ2V0Q29udGVudFdvcmtlcigpLnBpcGUobmV3IENyYzMyUHJvYmUoKSk7XG4gICAgICAgIHdvcmtlci5vbihcImVycm9yXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAod29ya2VyLnN0cmVhbUluZm8uY3JjMzIgIT09IHppcEVudHJ5LmRlY29tcHJlc3NlZC5jcmMzMikge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogQ1JDMzIgbWlzbWF0Y2hcIikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bWUoKTtcbiAgICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkYXRhLCBvcHRpb25zKSB7XG4gICAgdmFyIHppcCA9IHRoaXM7XG4gICAgb3B0aW9ucyA9IHV0aWxzLmV4dGVuZChvcHRpb25zIHx8IHt9LCB7XG4gICAgICAgIGJhc2U2NDogZmFsc2UsXG4gICAgICAgIGNoZWNrQ1JDMzI6IGZhbHNlLFxuICAgICAgICBvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6IGZhbHNlLFxuICAgICAgICBjcmVhdGVGb2xkZXJzOiBmYWxzZSxcbiAgICAgICAgZGVjb2RlRmlsZU5hbWU6IHV0ZjgudXRmOGRlY29kZVxuICAgIH0pO1xuXG4gICAgaWYgKG5vZGVqc1V0aWxzLmlzTm9kZSAmJiBub2RlanNVdGlscy5pc1N0cmVhbShkYXRhKSkge1xuICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSlNaaXAgY2FuJ3QgYWNjZXB0IGEgc3RyZWFtIHdoZW4gbG9hZGluZyBhIHppcCBmaWxlLlwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHV0aWxzLnByZXBhcmVDb250ZW50KFwidGhlIGxvYWRlZCB6aXAgZmlsZVwiLCBkYXRhLCB0cnVlLCBvcHRpb25zLm9wdGltaXplZEJpbmFyeVN0cmluZywgb3B0aW9ucy5iYXNlNjQpXG4gICAgLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB2YXIgemlwRW50cmllcyA9IG5ldyBaaXBFbnRyaWVzKG9wdGlvbnMpO1xuICAgICAgICB6aXBFbnRyaWVzLmxvYWQoZGF0YSk7XG4gICAgICAgIHJldHVybiB6aXBFbnRyaWVzO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gY2hlY2tDUkMzMih6aXBFbnRyaWVzKSB7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IFtleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUoemlwRW50cmllcyldO1xuICAgICAgICB2YXIgZmlsZXMgPSB6aXBFbnRyaWVzLmZpbGVzO1xuICAgICAgICBpZiAob3B0aW9ucy5jaGVja0NSQzMyKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChjaGVja0VudHJ5Q1JDMzIoZmlsZXNbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gYWRkRmlsZXMocmVzdWx0cykge1xuICAgICAgICB2YXIgemlwRW50cmllcyA9IHJlc3VsdHMuc2hpZnQoKTtcbiAgICAgICAgdmFyIGZpbGVzID0gemlwRW50cmllcy5maWxlcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGlucHV0ID0gZmlsZXNbaV07XG4gICAgICAgICAgICB6aXAuZmlsZShpbnB1dC5maWxlTmFtZVN0ciwgaW5wdXQuZGVjb21wcmVzc2VkLCB7XG4gICAgICAgICAgICAgICAgYmluYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgIG9wdGltaXplZEJpbmFyeVN0cmluZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkYXRlOiBpbnB1dC5kYXRlLFxuICAgICAgICAgICAgICAgIGRpcjogaW5wdXQuZGlyLFxuICAgICAgICAgICAgICAgIGNvbW1lbnQgOiBpbnB1dC5maWxlQ29tbWVudFN0ci5sZW5ndGggPyBpbnB1dC5maWxlQ29tbWVudFN0ciA6IG51bGwsXG4gICAgICAgICAgICAgICAgdW5peFBlcm1pc3Npb25zIDogaW5wdXQudW5peFBlcm1pc3Npb25zLFxuICAgICAgICAgICAgICAgIGRvc1Blcm1pc3Npb25zIDogaW5wdXQuZG9zUGVybWlzc2lvbnMsXG4gICAgICAgICAgICAgICAgY3JlYXRlRm9sZGVyczogb3B0aW9ucy5jcmVhdGVGb2xkZXJzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoemlwRW50cmllcy56aXBDb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgemlwLmNvbW1lbnQgPSB6aXBFbnRyaWVzLnppcENvbW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gemlwO1xuICAgIH0pO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIEEgd29ya2VyIHRoYXQgdXNlIGEgbm9kZWpzIHN0cmVhbSBhcyBzb3VyY2UuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSBlbnRyeSBmb3IgdGhpcyBzdHJlYW0uXG4gKiBAcGFyYW0ge1JlYWRhYmxlfSBzdHJlYW0gdGhlIG5vZGVqcyBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlcihmaWxlbmFtZSwgc3RyZWFtKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiTm9kZWpzIHN0cmVhbSBpbnB1dCBhZGFwdGVyIGZvciBcIiArIGZpbGVuYW1lKTtcbiAgICB0aGlzLl91cHN0cmVhbUVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYmluZFN0cmVhbShzdHJlYW0pO1xufVxuXG51dGlscy5pbmhlcml0cyhOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIFByZXBhcmUgdGhlIHN0cmVhbSBhbmQgYmluZCB0aGUgY2FsbGJhY2tzIG9uIGl0LlxuICogRG8gdGhpcyBBU0FQIG9uIG5vZGUgMC4xMCAhIEEgbGF6eSBiaW5kaW5nIGRvZXNuJ3QgYWx3YXlzIHdvcmsuXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIHRoZSBub2RlanMgc3RyZWFtIHRvIHVzZS5cbiAqL1xuTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyLnByb3RvdHlwZS5fYmluZFN0cmVhbSA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIHN0cmVhbVxuICAgIC5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIHNlbGYucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiBjaHVuayxcbiAgICAgICAgICAgIG1ldGEgOiB7XG4gICAgICAgICAgICAgICAgcGVyY2VudCA6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSlcbiAgICAub24oXCJlcnJvclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZihzZWxmLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZEVycm9yID0gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgIC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmKHNlbGYuaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHNlbGYuX3Vwc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcbk5vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoIUdlbmVyaWNXb3JrZXIucHJvdG90eXBlLnBhdXNlLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9zdHJlYW0ucGF1c2UoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmKHRoaXMuX3Vwc3RyZWFtRW5kZWQpIHtcbiAgICAgICAgdGhpcy5lbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtJykuUmVhZGFibGU7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudXRpbC5pbmhlcml0cyhOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyLCBSZWFkYWJsZSk7XG5cbi8qKlxuKiBBIG5vZGVqcyBzdHJlYW0gdXNpbmcgYSB3b3JrZXIgYXMgc291cmNlLlxuKiBAc2VlIHRoZSBTb3VyY2VXcmFwcGVyIGluIGh0dHA6Ly9ub2RlanMub3JnL2FwaS9zdHJlYW0uaHRtbFxuKiBAY29uc3RydWN0b3JcbiogQHBhcmFtIHtTdHJlYW1IZWxwZXJ9IGhlbHBlciB0aGUgaGVscGVyIHdyYXBwaW5nIHRoZSB3b3JrZXJcbiogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG5vZGVqcyBzdHJlYW0gb3B0aW9uc1xuKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYiB0aGUgdXBkYXRlIGNhbGxiYWNrLlxuKi9cbmZ1bmN0aW9uIE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIoaGVscGVyLCBvcHRpb25zLCB1cGRhdGVDYikge1xuICAgIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5faGVscGVyID0gaGVscGVyO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGhlbHBlci5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGRhdGEsIG1ldGEpIHtcbiAgICAgICAgaWYgKCFzZWxmLnB1c2goZGF0YSkpIHtcbiAgICAgICAgICAgIHNlbGYuX2hlbHBlci5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHVwZGF0ZUNiKSB7XG4gICAgICAgICAgICB1cGRhdGVDYihtZXRhKTtcbiAgICAgICAgfVxuICAgIH0pXG4gICAgLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSlcbiAgICAub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLnB1c2gobnVsbCk7XG4gICAgfSk7XG59XG5cblxuTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlci5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9oZWxwZXIucmVzdW1lKCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhpcyBpcyBydW5uaW5nIGluIE5vZGVqcywgd2lsbCBiZSB1bmRlZmluZWQgaW4gYSBicm93c2VyLlxuICAgICAqIEluIGEgYnJvd3NlciwgYnJvd3NlcmlmeSB3b24ndCBpbmNsdWRlIHRoaXMgZmlsZSBhbmQgdGhlIHdob2xlIG1vZHVsZVxuICAgICAqIHdpbGwgYmUgcmVzb2x2ZWQgYW4gZW1wdHkgb2JqZWN0LlxuICAgICAqL1xuICAgIGlzTm9kZSA6IHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIsXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IG5vZGVqcyBCdWZmZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgdGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGVuY29kaW5nIHRoZSBlbmNvZGluZyB0byB1c2UuXG4gICAgICogQHJldHVybiB7QnVmZmVyfSBhIG5ldyBCdWZmZXIuXG4gICAgICovXG4gICAgbmV3QnVmZmVyIDogZnVuY3Rpb24oZGF0YSwgZW5jb2Rpbmcpe1xuICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcihkYXRhLCBlbmNvZGluZyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBGaW5kIG91dCBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGIgdGhlIG9iamVjdCB0byB0ZXN0LlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIEJ1ZmZlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzQnVmZmVyIDogZnVuY3Rpb24oYil7XG4gICAgICAgIHJldHVybiBCdWZmZXIuaXNCdWZmZXIoYik7XG4gICAgfSxcblxuICAgIGlzU3RyZWFtIDogZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLm9uID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBvYmoucGF1c2UgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIG9iai5yZXN1bWUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gdmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuLy8gdmFyIFN0cmVhbUhlbHBlciA9IHJlcXVpcmUoJy4vc3RyZWFtL1N0cmVhbUhlbHBlcicpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xudmFyIENvbXByZXNzZWRPYmplY3QgPSByZXF1aXJlKCcuL2NvbXByZXNzZWRPYmplY3QnKTtcbnZhciBaaXBPYmplY3QgPSByZXF1aXJlKCcuL3ppcE9iamVjdCcpO1xuLy8gdmFyIGdlbmVyYXRlID0gcmVxdWlyZShcIi4vZ2VuZXJhdGVcIik7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKFwiLi9ub2RlanNVdGlsc1wiKTtcbnZhciBOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIgPSByZXF1aXJlKFwiLi9ub2RlanMvTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyXCIpO1xuXG5cbi8qKlxuICogQWRkIGEgZmlsZSBpbiB0aGUgY3VycmVudCBmb2xkZXIuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhIG9mIHRoZSBmaWxlXG4gKiBAcGFyYW0ge09iamVjdH0gbyB0aGUgb3B0aW9ucyBvZiB0aGUgZmlsZVxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgbmV3IGZpbGUuXG4gKi9cbnZhciBmaWxlQWRkID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgbykge1xuICAgIC8vIGJlIHN1cmUgc3ViIGZvbGRlcnMgZXhpc3RcbiAgICB2YXIgZGF0YVR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSksXG4gICAgICAgIHBhcmVudDtcblxuXG4gICAgLypcbiAgICAgKiBDb3JyZWN0IG9wdGlvbnMuXG4gICAgICovXG5cbiAgICBvID0gdXRpbHMuZXh0ZW5kKG8gfHwge30sIGRlZmF1bHRzKTtcbiAgICBvLmRhdGUgPSBvLmRhdGUgfHwgbmV3IERhdGUoKTtcbiAgICBpZiAoby5jb21wcmVzc2lvbiAhPT0gbnVsbCkge1xuICAgICAgICBvLmNvbXByZXNzaW9uID0gby5jb21wcmVzc2lvbi50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygby51bml4UGVybWlzc2lvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgby51bml4UGVybWlzc2lvbnMgPSBwYXJzZUludChvLnVuaXhQZXJtaXNzaW9ucywgOCk7XG4gICAgfVxuXG4gICAgLy8gVU5YX0lGRElSICAwMDQwMDAwIHNlZSB6aXBpbmZvLmNcbiAgICBpZiAoby51bml4UGVybWlzc2lvbnMgJiYgKG8udW5peFBlcm1pc3Npb25zICYgMHg0MDAwKSkge1xuICAgICAgICBvLmRpciA9IHRydWU7XG4gICAgfVxuICAgIC8vIEJpdCA0ICAgIERpcmVjdG9yeVxuICAgIGlmIChvLmRvc1Blcm1pc3Npb25zICYmIChvLmRvc1Blcm1pc3Npb25zICYgMHgwMDEwKSkge1xuICAgICAgICBvLmRpciA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG8uZGlyKSB7XG4gICAgICAgIG5hbWUgPSBmb3JjZVRyYWlsaW5nU2xhc2gobmFtZSk7XG4gICAgfVxuICAgIGlmIChvLmNyZWF0ZUZvbGRlcnMgJiYgKHBhcmVudCA9IHBhcmVudEZvbGRlcihuYW1lKSkpIHtcbiAgICAgICAgZm9sZGVyQWRkLmNhbGwodGhpcywgcGFyZW50LCB0cnVlKTtcbiAgICB9XG5cbiAgICB2YXIgaXNVbmljb2RlU3RyaW5nID0gZGF0YVR5cGUgPT09IFwic3RyaW5nXCIgJiYgby5iaW5hcnkgPT09IGZhbHNlICYmIG8uYmFzZTY0ID09PSBmYWxzZTtcbiAgICBvLmJpbmFyeSA9ICFpc1VuaWNvZGVTdHJpbmc7XG5cblxuICAgIHZhciBpc0NvbXByZXNzZWRFbXB0eSA9IChkYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCkgJiYgZGF0YS51bmNvbXByZXNzZWRTaXplID09PSAwO1xuXG4gICAgaWYgKGlzQ29tcHJlc3NlZEVtcHR5IHx8IG8uZGlyIHx8ICFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG8uYmFzZTY0ID0gZmFsc2U7XG4gICAgICAgIG8uYmluYXJ5ID0gdHJ1ZTtcbiAgICAgICAgZGF0YSA9IFwiXCI7XG4gICAgICAgIG8uY29tcHJlc3Npb24gPSBcIlNUT1JFXCI7XG4gICAgICAgIGRhdGFUeXBlID0gXCJzdHJpbmdcIjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIENvbnZlcnQgY29udGVudCB0byBmaXQuXG4gICAgICovXG5cbiAgICB2YXIgemlwT2JqZWN0Q29udGVudCA9IG51bGw7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0IHx8IGRhdGEgaW5zdGFuY2VvZiBHZW5lcmljV29ya2VyKSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSBkYXRhO1xuICAgIH0gZWxzZSBpZiAobm9kZWpzVXRpbHMuaXNOb2RlICYmIG5vZGVqc1V0aWxzLmlzU3RyZWFtKGRhdGEpKSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSBuZXcgTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyKG5hbWUsIGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSB1dGlscy5wcmVwYXJlQ29udGVudChuYW1lLCBkYXRhLCBvLmJpbmFyeSwgby5vcHRpbWl6ZWRCaW5hcnlTdHJpbmcsIG8uYmFzZTY0KTtcbiAgICB9XG5cbiAgICB2YXIgb2JqZWN0ID0gbmV3IFppcE9iamVjdChuYW1lLCB6aXBPYmplY3RDb250ZW50LCBvKTtcbiAgICB0aGlzLmZpbGVzW25hbWVdID0gb2JqZWN0O1xuICAgIC8qXG4gICAgVE9ETzogd2UgY2FuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGJlY2F1c2Ugd2UgaGF2ZSBhc3luYyBwcm9taXNlc1xuICAgICh3ZSBjYW4gaGF2ZSBhIHByb21pc2Ugb2YgYSBEYXRlKCkgZm9yIGV4YW1wbGUpIGJ1dCByZXR1cm5pbmcgYVxuICAgIHByb21pc2UgaXMgdXNlbGVzcyBiZWNhdXNlIGZpbGUobmFtZSwgZGF0YSkgcmV0dXJucyB0aGUgSlNaaXBcbiAgICBvYmplY3QgZm9yIGNoYWluaW5nLiBTaG91bGQgd2UgYnJlYWsgdGhhdCB0byBhbGxvdyB0aGUgdXNlclxuICAgIHRvIGNhdGNoIHRoZSBlcnJvciA/XG5cbiAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHppcE9iamVjdENvbnRlbnQpXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuICAgICovXG59O1xuXG4vKipcbiAqIEZpbmQgdGhlIHBhcmVudCBmb2xkZXIgb2YgdGhlIHBhdGguXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIHBhdGggdG8gdXNlXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBwYXJlbnQgZm9sZGVyLCBvciBcIlwiXG4gKi9cbnZhciBwYXJlbnRGb2xkZXIgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIGlmIChwYXRoLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICB2YXIgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgIHJldHVybiAobGFzdFNsYXNoID4gMCkgPyBwYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2gpIDogXCJcIjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCB3aXRoIGEgc2xhc2ggYXQgdGhlIGVuZC5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aCB0aGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHBhdGggd2l0aCBhIHRyYWlsaW5nIHNsYXNoLlxuICovXG52YXIgZm9yY2VUcmFpbGluZ1NsYXNoID0gZnVuY3Rpb24ocGF0aCkge1xuICAgIC8vIENoZWNrIHRoZSBuYW1lIGVuZHMgd2l0aCBhIC9cbiAgICBpZiAocGF0aC5zbGljZSgtMSkgIT09IFwiL1wiKSB7XG4gICAgICAgIHBhdGggKz0gXCIvXCI7IC8vIElFIGRvZXNuJ3QgbGlrZSBzdWJzdHIoLTEpXG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xufTtcblxuLyoqXG4gKiBBZGQgYSAoc3ViKSBmb2xkZXIgaW4gdGhlIGN1cnJlbnQgZm9sZGVyLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBmb2xkZXIncyBuYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBbY3JlYXRlRm9sZGVyc10gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBjcmVhdGUgc3ViXG4gKiAgZm9sZGVycy4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXcgZm9sZGVyLlxuICovXG52YXIgZm9sZGVyQWRkID0gZnVuY3Rpb24obmFtZSwgY3JlYXRlRm9sZGVycykge1xuICAgIGNyZWF0ZUZvbGRlcnMgPSAodHlwZW9mIGNyZWF0ZUZvbGRlcnMgIT09ICd1bmRlZmluZWQnKSA/IGNyZWF0ZUZvbGRlcnMgOiBkZWZhdWx0cy5jcmVhdGVGb2xkZXJzO1xuXG4gICAgbmFtZSA9IGZvcmNlVHJhaWxpbmdTbGFzaChuYW1lKTtcblxuICAgIC8vIERvZXMgdGhpcyBmb2xkZXIgYWxyZWFkeSBleGlzdD9cbiAgICBpZiAoIXRoaXMuZmlsZXNbbmFtZV0pIHtcbiAgICAgICAgZmlsZUFkZC5jYWxsKHRoaXMsIG5hbWUsIG51bGwsIHtcbiAgICAgICAgICAgIGRpcjogdHJ1ZSxcbiAgICAgICAgICAgIGNyZWF0ZUZvbGRlcnM6IGNyZWF0ZUZvbGRlcnNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbGVzW25hbWVdO1xufTtcblxuLyoqXG4qIENyb3NzLXdpbmRvdywgY3Jvc3MtTm9kZS1jb250ZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBkZXRlY3Rpb25cbiogQHBhcmFtICB7T2JqZWN0fSAgb2JqZWN0IEFueXRoaW5nXG4qIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgICB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24sXG4qIGZhbHNlIG90aGVyd2lzZVxuKi9cbmZ1bmN0aW9uIGlzUmVnRXhwKG9iamVjdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIjtcbn1cblxuLy8gcmV0dXJuIHRoZSBhY3R1YWwgcHJvdG90eXBlIG9mIEpTWmlwXG52YXIgb3V0ID0ge1xuICAgIC8qKlxuICAgICAqIEBzZWUgbG9hZEFzeW5jXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIENhbGwgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZWFjaCBlbnRyeSBhdCB0aGlzIGZvbGRlciBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiB0aGUgY2FsbGJhY2sgZnVuY3Rpb246XG4gICAgICogZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZmlsZSkgey4uLn1cbiAgICAgKiBJdCB0YWtlcyAyIGFyZ3VtZW50cyA6IHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgZmlsZS5cbiAgICAgKi9cbiAgICBmb3JFYWNoOiBmdW5jdGlvbihjYikge1xuICAgICAgICB2YXIgZmlsZW5hbWUsIHJlbGF0aXZlUGF0aCwgZmlsZTtcbiAgICAgICAgZm9yIChmaWxlbmFtZSBpbiB0aGlzLmZpbGVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsZXMuaGFzT3duUHJvcGVydHkoZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxlID0gdGhpcy5maWxlc1tmaWxlbmFtZV07XG4gICAgICAgICAgICByZWxhdGl2ZVBhdGggPSBmaWxlbmFtZS5zbGljZSh0aGlzLnJvb3QubGVuZ3RoLCBmaWxlbmFtZS5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKHJlbGF0aXZlUGF0aCAmJiBmaWxlbmFtZS5zbGljZSgwLCB0aGlzLnJvb3QubGVuZ3RoKSA9PT0gdGhpcy5yb290KSB7IC8vIHRoZSBmaWxlIGlzIGluIHRoZSBjdXJyZW50IHJvb3RcbiAgICAgICAgICAgICAgICBjYihyZWxhdGl2ZVBhdGgsIGZpbGUpOyAvLyBUT0RPIHJldmVyc2UgdGhlIHBhcmFtZXRlcnMgPyBuZWVkIHRvIGJlIGNsZWFuIEFORCBjb25zaXN0ZW50IHdpdGggdGhlIGZpbHRlciBzZWFyY2ggZm4uLi5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgbmVzdGVkIGZpbGVzL2ZvbGRlcnMgd2l0aCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNlYXJjaCB0aGUgcHJlZGljYXRlIHRvIHVzZSA6XG4gICAgICogZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZmlsZSkgey4uLn1cbiAgICAgKiBJdCB0YWtlcyAyIGFyZ3VtZW50cyA6IHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgZmlsZS5cbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgbWF0Y2hpbmcgZWxlbWVudHMuXG4gICAgICovXG4gICAgZmlsdGVyOiBmdW5jdGlvbihzZWFyY2gpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZW50cnkpIHtcbiAgICAgICAgICAgIGlmIChzZWFyY2gocmVsYXRpdmVQYXRoLCBlbnRyeSkpIHsgLy8gdGhlIGZpbGUgbWF0Y2hlcyB0aGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGZpbGUgdG8gdGhlIHppcCBmaWxlLCBvciBzZWFyY2ggYSBmaWxlLlxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd8UmVnRXhwfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGFkZCAoaWYgZGF0YSBpcyBkZWZpbmVkKSxcbiAgICAgKiB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBmaW5kIChpZiBubyBkYXRhKSBvciBhIHJlZ2V4IHRvIG1hdGNoIGZpbGVzLlxuICAgICAqIEBwYXJhbSAgIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgIFRoZSBmaWxlIGRhdGEsIGVpdGhlciByYXcgb3IgYmFzZTY0IGVuY29kZWRcbiAgICAgKiBAcGFyYW0gICB7T2JqZWN0fSBvICAgICBGaWxlIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuICB7SlNaaXB8T2JqZWN0fEFycmF5fSB0aGlzIEpTWmlwIG9iamVjdCAod2hlbiBhZGRpbmcgYSBmaWxlKSxcbiAgICAgKiBhIGZpbGUgKHdoZW4gc2VhcmNoaW5nIGJ5IHN0cmluZykgb3IgYW4gYXJyYXkgb2YgZmlsZXMgKHdoZW4gc2VhcmNoaW5nIGJ5IHJlZ2V4KS5cbiAgICAgKi9cbiAgICBmaWxlOiBmdW5jdGlvbihuYW1lLCBkYXRhLCBvKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoaXNSZWdFeHAobmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVnZXhwID0gbmFtZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhZmlsZS5kaXIgJiYgcmVnZXhwLnRlc3QocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyB0ZXh0XG4gICAgICAgICAgICAgICAgdmFyIG9iaiA9IHRoaXMuZmlsZXNbdGhpcy5yb290ICsgbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKG9iaiAmJiAhb2JqLmRpcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gbW9yZSB0aGFuIG9uZSBhcmd1bWVudCA6IHdlIGhhdmUgZGF0YSAhXG4gICAgICAgICAgICBuYW1lID0gdGhpcy5yb290ICsgbmFtZTtcbiAgICAgICAgICAgIGZpbGVBZGQuY2FsbCh0aGlzLCBuYW1lLCBkYXRhLCBvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSB6aXAgZmlsZSwgb3Igc2VhcmNoLlxuICAgICAqIEBwYXJhbSAgIHtTdHJpbmd8UmVnRXhwfSBhcmcgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0byBhZGQsIG9yIGEgcmVnZXggdG8gc2VhcmNoIGZvbGRlcnMuXG4gICAgICogQHJldHVybiAge0pTWmlwfSBhbiBvYmplY3Qgd2l0aCB0aGUgbmV3IGRpcmVjdG9yeSBhcyB0aGUgcm9vdCwgb3IgYW4gYXJyYXkgY29udGFpbmluZyBtYXRjaGluZyBmb2xkZXJzLlxuICAgICAqL1xuICAgIGZvbGRlcjogZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIGlmICghYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1JlZ0V4cChhcmcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZGlyICYmIGFyZy50ZXN0KHJlbGF0aXZlUGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVsc2UsIG5hbWUgaXMgYSBuZXcgZm9sZGVyXG4gICAgICAgIHZhciBuYW1lID0gdGhpcy5yb290ICsgYXJnO1xuICAgICAgICB2YXIgbmV3Rm9sZGVyID0gZm9sZGVyQWRkLmNhbGwodGhpcywgbmFtZSk7XG5cbiAgICAgICAgLy8gQWxsb3cgY2hhaW5pbmcgYnkgcmV0dXJuaW5nIGEgbmV3IG9iamVjdCB3aXRoIHRoaXMgZm9sZGVyIGFzIHRoZSByb290XG4gICAgICAgIHZhciByZXQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJldC5yb290ID0gbmV3Rm9sZGVyLm5hbWU7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfS8vLFxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEgZmlsZSwgb3IgYSBkaXJlY3RvcnkgYW5kIGFsbCBzdWItZmlsZXMsIGZyb20gdGhlIHppcFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGRlbGV0ZVxuICAgICAqIEByZXR1cm4ge0pTWmlwfSB0aGlzIEpTWmlwIG9iamVjdFxuICAgICAqL1xuICAgIC8vIHJlbW92ZTogZnVuY3Rpb24obmFtZSkge1xuICAgIC8vICAgICBuYW1lID0gdGhpcy5yb290ICsgbmFtZTtcbiAgICAvLyAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVzW25hbWVdO1xuICAgIC8vICAgICBpZiAoIWZpbGUpIHtcbiAgICAvLyAgICAgICAgIC8vIExvb2sgZm9yIGFueSBmb2xkZXJzXG4gICAgLy8gICAgICAgICBpZiAobmFtZS5zbGljZSgtMSkgIT09IFwiL1wiKSB7XG4gICAgLy8gICAgICAgICAgICAgbmFtZSArPSBcIi9cIjtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIGZpbGUgPSB0aGlzLmZpbGVzW25hbWVdO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgaWYgKGZpbGUgJiYgIWZpbGUuZGlyKSB7XG4gICAgLy8gICAgICAgICAvLyBmaWxlXG4gICAgLy8gICAgICAgICBkZWxldGUgdGhpcy5maWxlc1tuYW1lXTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIC8vIG1heWJlIGEgZm9sZGVyLCBkZWxldGUgcmVjdXJzaXZlbHlcbiAgICAvLyAgICAgICAgIHZhciBraWRzID0gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuIGZpbGUubmFtZS5zbGljZSgwLCBuYW1lLmxlbmd0aCkgPT09IG5hbWU7XG4gICAgLy8gICAgICAgICB9KTtcbiAgICAvLyAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2lkcy5sZW5ndGg7IGkrKykge1xuICAgIC8vICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbGVzW2tpZHNbaV0ubmFtZV07XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICByZXR1cm4gdGhpcztcbiAgICAvLyB9LFxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIHppcCBmaWxlIDpcbiAgICAgKiAtIGNvbXByZXNzaW9uLCBcIlNUT1JFXCIgYnkgZGVmYXVsdC5cbiAgICAgKiAtIHR5cGUsIFwiYmFzZTY0XCIgYnkgZGVmYXVsdC4gVmFsdWVzIGFyZSA6IHN0cmluZywgYmFzZTY0LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlciwgYmxvYi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd8VWludDhBcnJheXxBcnJheUJ1ZmZlcnxCdWZmZXJ8QmxvYn0gdGhlIHppcCBmaWxlXG4gICAgICovXG4gICAgLy8gZ2VuZXJhdGU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG4gICAgLy8gfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZSBhcyBhbiBpbnRlcm5hbCBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIHppcCBmaWxlIDpcbiAgICAgKiAtIGNvbXByZXNzaW9uLCBcIlNUT1JFXCIgYnkgZGVmYXVsdC5cbiAgICAgKiAtIHR5cGUsIFwiYmFzZTY0XCIgYnkgZGVmYXVsdC4gVmFsdWVzIGFyZSA6IHN0cmluZywgYmFzZTY0LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlciwgYmxvYi5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBzdHJlYW1lZCB6aXAgZmlsZS5cbiAgICAgKi9cbiAgICAvLyBnZW5lcmF0ZUludGVybmFsU3RyZWFtOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgLy8gICB2YXIgd29ya2VyLCBvcHRzID0ge307XG4gICAgLy8gICB0cnkge1xuICAgIC8vICAgICAgIG9wdHMgPSB1dGlscy5leHRlbmQob3B0aW9ucyB8fCB7fSwge1xuICAgIC8vICAgICAgICAgICBzdHJlYW1GaWxlczogZmFsc2UsXG4gICAgLy8gICAgICAgICAgIGNvbXByZXNzaW9uOiBcIlNUT1JFXCIsXG4gICAgLy8gICAgICAgICAgIGNvbXByZXNzaW9uT3B0aW9ucyA6IG51bGwsXG4gICAgLy8gICAgICAgICAgIHR5cGU6IFwiXCIsXG4gICAgLy8gICAgICAgICAgIHBsYXRmb3JtOiBcIkRPU1wiLFxuICAgIC8vICAgICAgICAgICBjb21tZW50OiBudWxsLFxuICAgIC8vICAgICAgICAgICBtaW1lVHlwZTogJ2FwcGxpY2F0aW9uL3ppcCcsXG4gICAgLy8gICAgICAgICAgIGVuY29kZUZpbGVOYW1lOiB1dGY4LnV0ZjhlbmNvZGVcbiAgICAvLyAgICAgICB9KTtcblxuICAgIC8vICAgICAgIG9wdHMudHlwZSA9IG9wdHMudHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIC8vICAgICAgIG9wdHMuY29tcHJlc3Npb24gPSBvcHRzLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAvLyAgICAgICAvLyBcImJpbmFyeXN0cmluZ1wiIGlzIHByZWZlcmVkIGJ1dCB0aGUgaW50ZXJuYWxzIHVzZSBcInN0cmluZ1wiLlxuICAgIC8vICAgICAgIGlmKG9wdHMudHlwZSA9PT0gXCJiaW5hcnlzdHJpbmdcIikge1xuICAgIC8vICAgICAgICAgb3B0cy50eXBlID0gXCJzdHJpbmdcIjtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICBpZiAoIW9wdHMudHlwZSkge1xuICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gb3V0cHV0IHR5cGUgc3BlY2lmaWVkLlwiKTtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICB1dGlscy5jaGVja1N1cHBvcnQob3B0cy50eXBlKTtcblxuICAgIC8vICAgICAgIC8vIGFjY2VwdCBub2RlanMgYHByb2Nlc3MucGxhdGZvcm1gXG4gICAgLy8gICAgICAgaWYoXG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdkYXJ3aW4nIHx8XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdmcmVlYnNkJyB8fFxuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID09PSAnbGludXgnIHx8XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdzdW5vcydcbiAgICAvLyAgICAgICApIHtcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9IFwiVU5JWFwiO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgICBpZiAob3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID0gXCJET1NcIjtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICB2YXIgY29tbWVudCA9IG9wdHMuY29tbWVudCB8fCB0aGlzLmNvbW1lbnQgfHwgXCJcIjtcbiAgICAvLyAgICAgICB3b3JrZXIgPSBnZW5lcmF0ZS5nZW5lcmF0ZVdvcmtlcih0aGlzLCBvcHRzLCBjb21tZW50KTtcbiAgICAvLyAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyAgICAgd29ya2VyID0gbmV3IEdlbmVyaWNXb3JrZXIoXCJlcnJvclwiKTtcbiAgICAvLyAgICAgd29ya2VyLmVycm9yKGUpO1xuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuIG5ldyBTdHJlYW1IZWxwZXIod29ya2VyLCBvcHRzLnR5cGUgfHwgXCJzdHJpbmdcIiwgb3B0cy5taW1lVHlwZSk7XG4gICAgLy8gfSxcbiAgICAvLyAvKipcbiAgICAvLyAgKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGUgYXN5bmNocm9ub3VzbHkuXG4gICAgLy8gICogQHNlZSBnZW5lcmF0ZUludGVybmFsU3RyZWFtXG4gICAgLy8gICovXG4gICAgLy8gZ2VuZXJhdGVBc3luYzogZnVuY3Rpb24ob3B0aW9ucywgb25VcGRhdGUpIHtcbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShvcHRpb25zKS5hY2N1bXVsYXRlKG9uVXBkYXRlKTtcbiAgICAvLyB9LFxuICAgIC8vIC8qKlxuICAgIC8vICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZSBhc3luY2hyb25vdXNseS5cbiAgICAvLyAgKiBAc2VlIGdlbmVyYXRlSW50ZXJuYWxTdHJlYW1cbiAgICAvLyAgKi9cbiAgICAvLyBnZW5lcmF0ZU5vZGVTdHJlYW06IGZ1bmN0aW9uKG9wdGlvbnMsIG9uVXBkYXRlKSB7XG4gICAgLy8gICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIC8vICAgICBpZiAoIW9wdGlvbnMudHlwZSkge1xuICAgIC8vICAgICAgICAgb3B0aW9ucy50eXBlID0gXCJub2RlYnVmZmVyXCI7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShvcHRpb25zKS50b05vZGVqc1N0cmVhbShvblVwZGF0ZSk7XG4gICAgLy8gfVxufTtcbm1vZHVsZS5leHBvcnRzID0gb3V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERhdGFSZWFkZXIgPSByZXF1aXJlKCcuL0RhdGFSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIEFycmF5UmVhZGVyKGRhdGEpIHtcbiAgICBEYXRhUmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRkYXRhW2ldID0gZGF0YVtpXSAmIDB4RkY7XG5cdH1cbn1cbnV0aWxzLmluaGVyaXRzKEFycmF5UmVhZGVyLCBEYXRhUmVhZGVyKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmJ5dGVBdFxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUuYnl0ZUF0ID0gZnVuY3Rpb24oaSkge1xuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy56ZXJvICsgaV07XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmVcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlID0gZnVuY3Rpb24oc2lnKSB7XG4gICAgdmFyIHNpZzAgPSBzaWcuY2hhckNvZGVBdCgwKSxcbiAgICAgICAgc2lnMSA9IHNpZy5jaGFyQ29kZUF0KDEpLFxuICAgICAgICBzaWcyID0gc2lnLmNoYXJDb2RlQXQoMiksXG4gICAgICAgIHNpZzMgPSBzaWcuY2hhckNvZGVBdCgzKTtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSA0OyBpID49IDA7IC0taSkge1xuICAgICAgICBpZiAodGhpcy5kYXRhW2ldID09PSBzaWcwICYmIHRoaXMuZGF0YVtpICsgMV0gPT09IHNpZzEgJiYgdGhpcy5kYXRhW2kgKyAyXSA9PT0gc2lnMiAmJiB0aGlzLmRhdGFbaSArIDNdID09PSBzaWczKSB7XG4gICAgICAgICAgICByZXR1cm4gaSAtIHRoaXMuemVybztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmVcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZSA9IGZ1bmN0aW9uIChzaWcpIHtcbiAgICB2YXIgc2lnMCA9IHNpZy5jaGFyQ29kZUF0KDApLFxuICAgICAgICBzaWcxID0gc2lnLmNoYXJDb2RlQXQoMSksXG4gICAgICAgIHNpZzIgPSBzaWcuY2hhckNvZGVBdCgyKSxcbiAgICAgICAgc2lnMyA9IHNpZy5jaGFyQ29kZUF0KDMpLFxuICAgICAgICBkYXRhID0gdGhpcy5yZWFkRGF0YSg0KTtcbiAgICByZXR1cm4gc2lnMCA9PT0gZGF0YVswXSAmJiBzaWcxID09PSBkYXRhWzFdICYmIHNpZzIgPT09IGRhdGFbMl0gJiYgc2lnMyA9PT0gZGF0YVszXTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICBpZihzaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheVJlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIERhdGFSZWFkZXIoZGF0YSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7IC8vIHR5cGUgOiBzZWUgaW1wbGVtZW50YXRpb25cbiAgICB0aGlzLmxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIHRoaXMuemVybyA9IDA7XG59XG5EYXRhUmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGF0IHRoZSBvZmZzZXQgd2lsbCBub3QgZ28gdG9vIGZhci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2Zmc2V0IHRoZSBhZGRpdGlvbmFsIG9mZnNldCB0byBjaGVjay5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzLlxuICAgICAqL1xuICAgIGNoZWNrT2Zmc2V0OiBmdW5jdGlvbihvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5jaGVja0luZGV4KHRoaXMuaW5kZXggKyBvZmZzZXQpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCB0aGUgc3BlY2lmZWQgaW5kZXggd2lsbCBub3QgYmUgdG9vIGZhci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3SW5kZXggdGhlIGluZGV4IHRvIGNoZWNrLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5cbiAgICAgKi9cbiAgICBjaGVja0luZGV4OiBmdW5jdGlvbihuZXdJbmRleCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPCB0aGlzLnplcm8gKyBuZXdJbmRleCB8fCBuZXdJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gXCIgKyB0aGlzLmxlbmd0aCArIFwiLCBhc2tlZCBpbmRleCA9IFwiICsgKG5ld0luZGV4KSArIFwiKS4gQ29ycnVwdGVkIHppcCA/XCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdJbmRleCBUaGUgbmV3IGluZGV4LlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgbmV3IGluZGV4IGlzIG91dCBvZiB0aGUgZGF0YS5cbiAgICAgKi9cbiAgICBzZXRJbmRleDogZnVuY3Rpb24obmV3SW5kZXgpIHtcbiAgICAgICAgdGhpcy5jaGVja0luZGV4KG5ld0luZGV4KTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG5ld0luZGV4O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogU2tpcCB0aGUgbmV4dCBuIGJ5dGVzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIG5ldyBpbmRleCBpcyBvdXQgb2YgdGhlIGRhdGEuXG4gICAgICovXG4gICAgc2tpcDogZnVuY3Rpb24obikge1xuICAgICAgICB0aGlzLnNldEluZGV4KHRoaXMuaW5kZXggKyBuKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYnl0ZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpIHRoZSBpbmRleCB0byB1c2UuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBhIGJ5dGUuXG4gICAgICovXG4gICAgYnl0ZUF0OiBmdW5jdGlvbihpKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmV4dCBudW1iZXIgd2l0aCBhIGdpdmVuIGJ5dGUgc2l6ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgY29ycmVzcG9uZGluZyBudW1iZXIuXG4gICAgICovXG4gICAgcmVhZEludDogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgICAgIGZvciAoaSA9IHRoaXMuaW5kZXggKyBzaXplIC0gMTsgaSA+PSB0aGlzLmluZGV4OyBpLS0pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgKyB0aGlzLmJ5dGVBdChpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgc3RyaW5nIHdpdGggYSBnaXZlbiBieXRlIHNpemUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nLlxuICAgICAqL1xuICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsIHRoaXMucmVhZERhdGEoc2l6ZSkpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHJhdyBkYXRhIHdpdGhvdXQgY29udmVyc2lvbiwgPHNpemU+IGJ5dGVzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSByYXcgZGF0YSwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuXG4gICAgICovXG4gICAgcmVhZERhdGE6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9uc1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgYSB6aXAgc2lnbmF0dXJlICg0IGJ5dGVzKS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnIHRoZSBzaWduYXR1cmUgdG8gZmluZC5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cmVuY2UsIC0xIGlmIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBsYXN0SW5kZXhPZlNpZ25hdHVyZTogZnVuY3Rpb24oc2lnKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIHNpZ25hdHVyZSAoNCBieXRlcykgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGNvbXBhcmUgaXQgd2l0aCBzaWcuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNpZyB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIG1hdGNoZXMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICByZWFkQW5kQ2hlY2tTaWduYXR1cmU6IGZ1bmN0aW9uKHNpZykge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgZGF0ZS5cbiAgICAgKiBAcmV0dXJuIHtEYXRlfSB0aGUgZGF0ZS5cbiAgICAgKi9cbiAgICByZWFkRGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkb3N0aW1lID0gdGhpcy5yZWFkSW50KDQpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoXG4gICAgICAgICgoZG9zdGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODAsIC8vIHllYXJcbiAgICAgICAgKChkb3N0aW1lID4+IDIxKSAmIDB4MGYpIC0gMSwgLy8gbW9udGhcbiAgICAgICAgKGRvc3RpbWUgPj4gMTYpICYgMHgxZiwgLy8gZGF5XG4gICAgICAgIChkb3N0aW1lID4+IDExKSAmIDB4MWYsIC8vIGhvdXJcbiAgICAgICAgKGRvc3RpbWUgPj4gNSkgJiAweDNmLCAvLyBtaW51dGVcbiAgICAgICAgKGRvc3RpbWUgJiAweDFmKSA8PCAxKSk7IC8vIHNlY29uZFxuICAgIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IERhdGFSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVWludDhBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vVWludDhBcnJheVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gTm9kZUJ1ZmZlclJlYWRlcihkYXRhKSB7XG4gICAgVWludDhBcnJheVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xufVxudXRpbHMuaW5oZXJpdHMoTm9kZUJ1ZmZlclJlYWRlciwgVWludDhBcnJheVJlYWRlcik7XG5cbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWREYXRhXG4gKi9cbk5vZGVCdWZmZXJSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBOb2RlQnVmZmVyUmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERhdGFSZWFkZXIgPSByZXF1aXJlKCcuL0RhdGFSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIFN0cmluZ1JlYWRlcihkYXRhKSB7XG4gICAgRGF0YVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xufVxudXRpbHMuaW5oZXJpdHMoU3RyaW5nUmVhZGVyLCBEYXRhUmVhZGVyKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmJ5dGVBdFxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLmJ5dGVBdCA9IGZ1bmN0aW9uKGkpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy56ZXJvICsgaSk7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmVcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZSA9IGZ1bmN0aW9uKHNpZykge1xuICAgIHJldHVybiB0aGlzLmRhdGEubGFzdEluZGV4T2Yoc2lnKSAtIHRoaXMuemVybztcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmVcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5yZWFkQW5kQ2hlY2tTaWduYXR1cmUgPSBmdW5jdGlvbiAoc2lnKSB7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnJlYWREYXRhKDQpO1xuICAgIHJldHVybiBzaWcgPT09IGRhdGE7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIC8vIHRoaXMgd2lsbCB3b3JrIGJlY2F1c2UgdGhlIGNvbnN0cnVjdG9yIGFwcGxpZWQgdGhlIFwiJiAweGZmXCIgbWFzay5cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZ1JlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vQXJyYXlSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIFVpbnQ4QXJyYXlSZWFkZXIoZGF0YSkge1xuICAgIEFycmF5UmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG59XG51dGlscy5pbmhlcml0cyhVaW50OEFycmF5UmVhZGVyLCBBcnJheVJlYWRlcik7XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5VaW50OEFycmF5UmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIGlmKHNpemUgPT09IDApIHtcbiAgICAgICAgLy8gaW4gSUUxMCwgd2hlbiB1c2luZyBzdWJhcnJheShpZHgsIGlkeCksIHdlIGdldCB0aGUgYXJyYXkgWzB4MDBdIGluc3RlYWQgb2YgW10uXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBVaW50OEFycmF5UmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuLi9zdXBwb3J0Jyk7XG52YXIgQXJyYXlSZWFkZXIgPSByZXF1aXJlKCcuL0FycmF5UmVhZGVyJyk7XG52YXIgU3RyaW5nUmVhZGVyID0gcmVxdWlyZSgnLi9TdHJpbmdSZWFkZXInKTtcbnZhciBOb2RlQnVmZmVyUmVhZGVyID0gcmVxdWlyZSgnLi9Ob2RlQnVmZmVyUmVhZGVyJyk7XG52YXIgVWludDhBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vVWludDhBcnJheVJlYWRlcicpO1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlYWRlciBhZGFwdGVkIHRvIHRoZSBkYXRhLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGRhdGEgdG8gcmVhZC5cbiAqIEByZXR1cm4ge0RhdGFSZWFkZXJ9IHRoZSBkYXRhIHJlYWRlci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciB0eXBlID0gdXRpbHMuZ2V0VHlwZU9mKGRhdGEpO1xuICAgIHV0aWxzLmNoZWNrU3VwcG9ydCh0eXBlKTtcbiAgICBpZiAodHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAhc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RyaW5nUmVhZGVyKGRhdGEpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlQnVmZmVyUmVhZGVyKGRhdGEpO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheVJlYWRlcih1dGlscy50cmFuc2Zvcm1UbyhcInVpbnQ4YXJyYXlcIiwgZGF0YSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFycmF5UmVhZGVyKHV0aWxzLnRyYW5zZm9ybVRvKFwiYXJyYXlcIiwgZGF0YSkpO1xufTtcblxuLy8gdmltOiBzZXQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6XG4iLCIndXNlIHN0cmljdCc7XG5leHBvcnRzLkxPQ0FMX0ZJTEVfSEVBREVSID0gXCJQS1xceDAzXFx4MDRcIjtcbmV4cG9ydHMuQ0VOVFJBTF9GSUxFX0hFQURFUiA9IFwiUEtcXHgwMVxceDAyXCI7XG5leHBvcnRzLkNFTlRSQUxfRElSRUNUT1JZX0VORCA9IFwiUEtcXHgwNVxceDA2XCI7XG5leHBvcnRzLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IgPSBcIlBLXFx4MDZcXHgwN1wiO1xuZXhwb3J0cy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQgPSBcIlBLXFx4MDZcXHgwNlwiO1xuZXhwb3J0cy5EQVRBX0RFU0NSSVBUT1IgPSBcIlBLXFx4MDdcXHgwOFwiO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBBIHdvcmtlciB3aGljaCBjb252ZXJ0IGNodW5rcyB0byBhIHNwZWNpZmllZCB0eXBlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gZGVzdFR5cGUgdGhlIGRlc3RpbmF0aW9uIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIENvbnZlcnRXb3JrZXIoZGVzdFR5cGUpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJDb252ZXJ0V29ya2VyIHRvIFwiICsgZGVzdFR5cGUpO1xuICAgIHRoaXMuZGVzdFR5cGUgPSBkZXN0VHlwZTtcbn1cbnV0aWxzLmluaGVyaXRzKENvbnZlcnRXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuQ29udmVydFdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5wdXNoKHtcbiAgICAgICAgZGF0YSA6IHV0aWxzLnRyYW5zZm9ybVRvKHRoaXMuZGVzdFR5cGUsIGNodW5rLmRhdGEpLFxuICAgICAgICBtZXRhIDogY2h1bmsubWV0YVxuICAgIH0pO1xufTtcbm1vZHVsZS5leHBvcnRzID0gQ29udmVydFdvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcbnZhciBjcmMzMiA9IHJlcXVpcmUoJy4uL2NyYzMyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIEEgd29ya2VyIHdoaWNoIGNhbGN1bGF0ZSB0aGUgY3JjMzIgb2YgdGhlIGRhdGEgZmxvd2luZyB0aHJvdWdoLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIENyYzMyUHJvYmUoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiQ3JjMzJQcm9iZVwiKTtcbn1cbnV0aWxzLmluaGVyaXRzKENyYzMyUHJvYmUsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuQ3JjMzJQcm9iZS5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5zdHJlYW1JbmZvLmNyYzMyID0gY3JjMzIoY2h1bmsuZGF0YSwgdGhpcy5zdHJlYW1JbmZvLmNyYzMyIHx8IDApO1xuICAgIHRoaXMucHVzaChjaHVuayk7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBDcmMzMlByb2JlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBBIHdvcmtlciB3aGljaCBjYWxjdWxhdGUgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZGF0YSBmbG93aW5nIHRocm91Z2guXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wTmFtZSB0aGUgbmFtZSB1c2VkIHRvIGV4cG9zZSB0aGUgbGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIERhdGFMZW5ndGhQcm9iZShwcm9wTmFtZSkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkRhdGFMZW5ndGhQcm9iZSBmb3IgXCIgKyBwcm9wTmFtZSk7XG4gICAgdGhpcy5wcm9wTmFtZSA9IHByb3BOYW1lO1xuICAgIHRoaXMud2l0aFN0cmVhbUluZm8ocHJvcE5hbWUsIDApO1xufVxudXRpbHMuaW5oZXJpdHMoRGF0YUxlbmd0aFByb2JlLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cbkRhdGFMZW5ndGhQcm9iZS5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgaWYoY2h1bmspIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXSB8fCAwO1xuICAgICAgICB0aGlzLnN0cmVhbUluZm9bdGhpcy5wcm9wTmFtZV0gPSBsZW5ndGggKyBjaHVuay5kYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rLmNhbGwodGhpcywgY2h1bmspO1xufTtcbm1vZHVsZS5leHBvcnRzID0gRGF0YUxlbmd0aFByb2JlO1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xuXG4vLyB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNodW5rc1xuLy8gVE9ETyBleHBvc2UgdGhpcyBhcyBhIHB1YmxpYyB2YXJpYWJsZVxudmFyIERFRkFVTFRfQkxPQ0tfU0laRSA9IDE2ICogMTAyNDtcblxuLyoqXG4gKiBBIHdvcmtlciB0aGF0IHJlYWRzIGEgY29udGVudCBhbmQgZW1pdHMgY2h1bmtzLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1Byb21pc2V9IGRhdGFQIHRoZSBwcm9taXNlIG9mIHRoZSBkYXRhIHRvIHNwbGl0XG4gKi9cbmZ1bmN0aW9uIERhdGFXb3JrZXIoZGF0YVApIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJEYXRhV29ya2VyXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmRhdGFJc1JlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5pbmRleCA9IDA7XG4gICAgdGhpcy5tYXggPSAwO1xuICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgdGhpcy50eXBlID0gXCJcIjtcblxuICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgIGRhdGFQLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgc2VsZi5kYXRhSXNSZWFkeSA9IHRydWU7XG4gICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7XG4gICAgICAgIHNlbGYubWF4ID0gZGF0YSAmJiBkYXRhLmxlbmd0aCB8fCAwO1xuICAgICAgICBzZWxmLnR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSk7XG4gICAgICAgIGlmKCFzZWxmLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICBzZWxmLl90aWNrQW5kUmVwZWF0KCk7XG4gICAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgIH0pO1xufVxuXG51dGlscy5pbmhlcml0cyhEYXRhV29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuY2xlYW5VcFxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5jbGVhblVwID0gZnVuY3Rpb24gKCkge1xuICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKTtcbiAgICB0aGlzLmRhdGEgPSBudWxsO1xufTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucmVzdW1lXG4gKi9cbkRhdGFXb3JrZXIucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdGlja1NjaGVkdWxlZCAmJiB0aGlzLmRhdGFJc1JlYWR5KSB7XG4gICAgICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICB1dGlscy5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LCBbXSwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VyIGEgdGljayBhIHNjaGVkdWxlIGFuIG90aGVyIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi5cbiAqL1xuRGF0YVdvcmtlci5wcm90b3R5cGUuX3RpY2tBbmRSZXBlYXQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl90aWNrU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgaWYodGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl90aWNrKCk7XG4gICAgaWYoIXRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICB1dGlscy5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LCBbXSwgdGhpcyk7XG4gICAgICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgIH1cbn07XG5cbi8qKlxuICogUmVhZCBhbmQgcHVzaCBhIGNodW5rLlxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5fdGljayA9IGZ1bmN0aW9uKCkge1xuXG4gICAgaWYodGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBzaXplID0gREVGQVVMVF9CTE9DS19TSVpFO1xuICAgIHZhciBkYXRhID0gbnVsbCwgbmV4dEluZGV4ID0gTWF0aC5taW4odGhpcy5tYXgsIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICBpZiAodGhpcy5pbmRleCA+PSB0aGlzLm1heCkge1xuICAgICAgICAvLyBFT0ZcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmRhdGEuc3Vic3RyaW5nKHRoaXMuaW5kZXgsIG5leHRJbmRleCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ1aW50OGFycmF5XCI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLmluZGV4LCBuZXh0SW5kZXgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgICAgIGNhc2UgXCJub2RlYnVmZmVyXCI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLmluZGV4LCBuZXh0SW5kZXgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleCA9IG5leHRJbmRleDtcbiAgICAgICAgcmV0dXJuIHRoaXMucHVzaCh7XG4gICAgICAgICAgICBkYXRhIDogZGF0YSxcbiAgICAgICAgICAgIG1ldGEgOiB7XG4gICAgICAgICAgICAgICAgcGVyY2VudCA6IHRoaXMubWF4ID8gdGhpcy5pbmRleCAvIHRoaXMubWF4ICogMTAwIDogMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQSB3b3JrZXIgdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHBhc3NpbmcgY2h1bmtzIHRvIHRoZSBuZXh0IG9uZS4gVGhpcyBpcyBsaWtlXG4gKiBhIG5vZGVqcyBzdHJlYW0gYnV0IHdpdGggc29tZSBkaWZmZXJlbmNlcy4gT24gdGhlIGdvb2Qgc2lkZSA6XG4gKiAtIGl0IHdvcmtzIG9uIElFIDYtOSB3aXRob3V0IGFueSBpc3N1ZSAvIHBvbHlmaWxsXG4gKiAtIGl0IHdlaWdodHMgbGVzcyB0aGFuIHRoZSBmdWxsIGRlcGVuZGVuY2llcyBidW5kbGVkIHdpdGggYnJvd3NlcmlmeVxuICogLSBpdCBmb3J3YXJkcyBlcnJvcnMgKG5vIG5lZWQgdG8gZGVjbGFyZSBhbiBlcnJvciBoYW5kbGVyIEVWRVJZV0hFUkUpXG4gKlxuICogQSBjaHVuayBpcyBhbiBvYmplY3Qgd2l0aCAyIGF0dHJpYnV0ZXMgOiBgbWV0YWAgYW5kIGBkYXRhYC4gVGhlIGZvcm1lciBpcyBhblxuICogb2JqZWN0IGNvbnRhaW5pbmcgYW55dGhpbmcgKGBwZXJjZW50YCBmb3IgZXhhbXBsZSksIHNlZSBlYWNoIHdvcmtlciBmb3IgbW9yZVxuICogZGV0YWlscy4gVGhlIGxhdHRlciBpcyB0aGUgcmVhbCBkYXRhIChTdHJpbmcsIFVpbnQ4QXJyYXksIGV0YykuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc3RyZWFtIChtYWlubHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzKVxuICovXG5mdW5jdGlvbiBHZW5lcmljV29ya2VyKG5hbWUpIHtcbiAgICAvLyB0aGUgbmFtZSBvZiB0aGUgd29ya2VyXG4gICAgdGhpcy5uYW1lID0gbmFtZSB8fCBcImRlZmF1bHRcIjtcbiAgICAvLyBhbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgd29ya2VycyBjaGFpblxuICAgIHRoaXMuc3RyZWFtSW5mbyA9IHt9O1xuICAgIC8vIGFuIGVycm9yIHdoaWNoIGhhcHBlbmVkIHdoZW4gdGhlIHdvcmtlciB3YXMgcGF1c2VkXG4gICAgdGhpcy5nZW5lcmF0ZWRFcnJvciA9IG51bGw7XG4gICAgLy8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgdG8gYmUgbWVyZ2VkIGJ5IHRoaXMgd29ya2VyIGludG8gdGhlIGdlbmVyYWwgbWV0YWRhdGFcbiAgICB0aGlzLmV4dHJhU3RyZWFtSW5mbyA9IHt9O1xuICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBwYXVzZWQgKGFuZCBzaG91bGQgbm90IGRvIGFueXRoaW5nKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG4gICAgLy8gdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIGZpbmlzaGVkIChhbmQgc2hvdWxkIG5vdCBkbyBhbnl0aGluZyksIGZhbHNlIG90aGVyd2lzZVxuICAgIHRoaXMuaXNGaW5pc2hlZCA9IGZhbHNlO1xuICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBsb2NrZWQgdG8gcHJldmVudCBmdXJ0aGVyIHN0cnVjdHVyZSB1cGRhdGVzIChwaXBlKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgdGhpcy5pc0xvY2tlZCA9IGZhbHNlO1xuICAgIC8vIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSB7XG4gICAgICAgICdkYXRhJzpbXSxcbiAgICAgICAgJ2VuZCc6W10sXG4gICAgICAgICdlcnJvcic6W11cbiAgICB9O1xuICAgIC8vIHRoZSBwcmV2aW91cyB3b3JrZXIsIGlmIGFueVxuICAgIHRoaXMucHJldmlvdXMgPSBudWxsO1xufVxuXG5HZW5lcmljV29ya2VyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBQdXNoIGEgY2h1bmsgdG8gdGhlIG5leHQgd29ya2Vycy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2h1bmsgdGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKi9cbiAgICBwdXNoIDogZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIHRoaXMuZW1pdChcImRhdGFcIiwgY2h1bmspO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRW5kIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgZW5kZWQgdGhlIHdvcmtlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGVuZCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgICAgICAgdGhpcy5jbGVhblVwKCk7XG4gICAgICAgICAgICB0aGlzLmlzRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEVuZCB0aGUgc3RyZWFtIHdpdGggYW4gZXJyb3IuXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZSB0aGUgZXJyb3Igd2hpY2ggY2F1c2VkIHRoZSBwcmVtYXR1cmUgZW5kLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBjYWxsIGVuZGVkIHRoZSB3b3JrZXIgd2l0aCBhbiBlcnJvciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGVycm9yIDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5pc1BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWRFcnJvciA9IGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzRmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlKTtcblxuICAgICAgICAgICAgLy8gaW4gdGhlIHdvcmtlcnMgY2hhaW4gZXhwbG9kZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgY2hhaW4sXG4gICAgICAgICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgd2lsbCBnbyBkb3dud2FyZCBidXQgd2UgYWxzbyBuZWVkIHRvIG5vdGlmeVxuICAgICAgICAgICAgLy8gd29ya2VycyB1cHdhcmQgdGhhdCB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvci5cbiAgICAgICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNsZWFuVXAoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNhbGxiYWNrIG9uIGFuIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCAoZGF0YSwgZW5kLCBlcnJvcilcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWRcbiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgY3VycmVudCBvYmplY3QgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIG9uIDogZnVuY3Rpb24gKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyc1tuYW1lXS5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDbGVhbiBhbnkgcmVmZXJlbmNlcyB3aGVuIGEgd29ya2VyIGlzIGVuZGluZy5cbiAgICAgKi9cbiAgICBjbGVhblVwIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0cmVhbUluZm8gPSB0aGlzLmdlbmVyYXRlZEVycm9yID0gdGhpcy5leHRyYVN0cmVhbUluZm8gPSBudWxsO1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgYW4gZXZlbnQuIFRoaXMgd2lsbCBjYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sgd2l0aCB0aGUgcHJvdmlkZWQgYXJnLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCAoZGF0YSwgZW5kLCBlcnJvcilcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYXJnIHRoZSBhcmd1bWVudCB0byBjYWxsIHRoZSBjYWxsYmFjayB3aXRoLlxuICAgICAqL1xuICAgIGVtaXQgOiBmdW5jdGlvbiAobmFtZSwgYXJnKSB7XG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbbmFtZV0pIHtcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnNbbmFtZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnNbbmFtZV1baV0uY2FsbCh0aGlzLCBhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGFpbiBhIHdvcmtlciB3aXRoIGFuIG90aGVyLlxuICAgICAqIEBwYXJhbSB7V29ya2VyfSBuZXh0IHRoZSB3b3JrZXIgcmVjZWl2aW5nIGV2ZW50cyBmcm9tIHRoZSBjdXJyZW50IG9uZS5cbiAgICAgKiBAcmV0dXJuIHt3b3JrZXJ9IHRoZSBuZXh0IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgcGlwZSA6IGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXh0LnJlZ2lzdGVyUHJldmlvdXModGhpcyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTYW1lIGFzIGBwaXBlYCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAgICAqIFVzaW5nIGFuIEFQSSB3aXRoIGBwaXBlKG5leHQpYCBpcyB2ZXJ5IGVhc3kuXG4gICAgICogSW1wbGVtZW50aW5nIHRoZSBBUEkgd2l0aCB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgbmV4dCBvbmUgcmVnaXN0ZXJpbmdcbiAgICAgKiBhIHNvdXJjZSBpcyBlYXNpZXIsIHNlZSB0aGUgWmlwRmlsZVdvcmtlci5cbiAgICAgKiBAcGFyYW0ge1dvcmtlcn0gcHJldmlvdXMgdGhlIHByZXZpb3VzIHdvcmtlciwgc2VuZGluZyBldmVudHMgdG8gdGhpcyBvbmVcbiAgICAgKiBAcmV0dXJuIHtXb3JrZXJ9IHRoZSBjdXJyZW50IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgcmVnaXN0ZXJQcmV2aW91cyA6IGZ1bmN0aW9uIChwcmV2aW91cykge1xuICAgICAgICBpZiAodGhpcy5pc0xvY2tlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0cmVhbSAnXCIgKyB0aGlzICsgXCInIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaGFyaW5nIHRoZSBzdHJlYW1JbmZvLi4uXG4gICAgICAgIHRoaXMuc3RyZWFtSW5mbyA9IHByZXZpb3VzLnN0cmVhbUluZm87XG4gICAgICAgIC8vIC4uLiBhbmQgYWRkaW5nIG91ciBvd24gYml0c1xuICAgICAgICB0aGlzLm1lcmdlU3RyZWFtSW5mbygpO1xuICAgICAgICB0aGlzLnByZXZpb3VzID0gIHByZXZpb3VzO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHByZXZpb3VzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgICAgICBzZWxmLnByb2Nlc3NDaHVuayhjaHVuayk7XG4gICAgICAgIH0pO1xuICAgICAgICBwcmV2aW91cy5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5lbmQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHByZXZpb3VzLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgc3RyZWFtIHNvIGl0IGRvZXNuJ3Qgc2VuZCBldmVudHMgYW55bW9yZS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCBwYXVzZWQgdGhlIHdvcmtlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHBhdXNlIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZih0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlc3VtZSBhIHBhdXNlZCBzdHJlYW0uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgcmVzdW1lZCB0aGUgd29ya2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcmVzdW1lIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZighdGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gaWYgdHJ1ZSwgdGhlIHdvcmtlciB0cmllZCB0byByZXN1bWUgYnV0IGZhaWxlZFxuICAgICAgICB2YXIgd2l0aEVycm9yID0gZmFsc2U7XG4gICAgICAgIGlmKHRoaXMuZ2VuZXJhdGVkRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IodGhpcy5nZW5lcmF0ZWRFcnJvcik7XG4gICAgICAgICAgICB3aXRoRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMucmVzdW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXdpdGhFcnJvcjtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEZsdXNoIGFueSByZW1haW5pbmcgYnl0ZXMgYXMgdGhlIHN0cmVhbSBpcyBlbmRpbmcuXG4gICAgICovXG4gICAgZmx1c2ggOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIGEgY2h1bmsuIFRoaXMgaXMgdXN1YWxseSB0aGUgbWV0aG9kIG92ZXJyaWRkZW4uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNodW5rIHRoZSBjaHVuayB0byBwcm9jZXNzLlxuICAgICAqL1xuICAgIHByb2Nlc3NDaHVuayA6IGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgICAgIHRoaXMucHVzaChjaHVuayk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBZGQgYSBrZXkvdmFsdWUgdG8gYmUgYWRkZWQgaW4gdGhlIHdvcmtlcnMgY2hhaW4gc3RyZWFtSW5mbyBvbmNlIGFjdGl2YXRlZC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgdG8gdXNlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIHRoZSBhc3NvY2lhdGVkIHZhbHVlXG4gICAgICogQHJldHVybiB7V29ya2VyfSB0aGUgY3VycmVudCB3b3JrZXIgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIHdpdGhTdHJlYW1JbmZvIDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHRyYVN0cmVhbUluZm9ba2V5XSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm1lcmdlU3RyZWFtSW5mbygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIE1lcmdlIHRoaXMgd29ya2VyJ3Mgc3RyZWFtSW5mbyBpbnRvIHRoZSBjaGFpbidzIHN0cmVhbUluZm8uXG4gICAgICovXG4gICAgbWVyZ2VTdHJlYW1JbmZvIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IodmFyIGtleSBpbiB0aGlzLmV4dHJhU3RyZWFtSW5mbykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmV4dHJhU3RyZWFtSW5mby5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUluZm9ba2V5XSA9IHRoaXMuZXh0cmFTdHJlYW1JbmZvW2tleV07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTG9jayB0aGUgc3RyZWFtIHRvIHByZXZlbnQgZnVydGhlciB1cGRhdGVzIG9uIHRoZSB3b3JrZXJzIGNoYWluLlxuICAgICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGFsbCBjYWxscyB0byBwaXBlIHdpbGwgZmFpbC5cbiAgICAgKi9cbiAgICBsb2NrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9ja2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3RyZWFtICdcIiArIHRoaXMgKyBcIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzTG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMubG9jaygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogUHJldHR5IHByaW50IHRoZSB3b3JrZXJzIGNoYWluLlxuICAgICAqL1xuICAgIHRvU3RyaW5nIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWUgPSBcIldvcmtlciBcIiArIHRoaXMubmFtZTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzICsgXCIgLT4gXCIgKyBtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gR2VuZXJpY1dvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBDb252ZXJ0V29ya2VyID0gcmVxdWlyZSgnLi9Db252ZXJ0V29ya2VyJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4uL2Jhc2U2NCcpO1xudmFyIE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIgPSByZXF1aXJlKCcuLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcicpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4uL2V4dGVybmFsXCIpO1xuXG4vKipcbiAqIEFwcGx5IHRoZSBmaW5hbCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZGF0YS4gSWYgdGhlIHVzZXIgd2FudHMgYSBCbG9iIGZvclxuICogZXhhbXBsZSwgaXQncyBlYXNpZXIgdG8gd29yayB3aXRoIGFuIFU4aW50QXJyYXkgYW5kIGZpbmFsbHkgZG8gdGhlXG4gKiBBcnJheUJ1ZmZlci9CbG9iIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgbmFtZSBvZiB0aGUgZmluYWwgdHlwZVxuICogQHBhcmFtIHtTdHJpbmd8VWludDhBcnJheXxCdWZmZXJ9IGNvbnRlbnQgdGhlIGNvbnRlbnQgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1N0cmluZ30gbWltZVR5cGUgdGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgaWYgYXBwbGljYWJsZS5cbiAqIEByZXR1cm4ge1N0cmluZ3xVaW50OEFycmF5fEFycmF5QnVmZmVyfEJ1ZmZlcnxCbG9ifSB0aGUgY29udGVudCBpbiB0aGUgcmlnaHQgZm9ybWF0LlxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1aaXBPdXRwdXQodHlwZSwgY29udGVudCwgbWltZVR5cGUpIHtcbiAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICBjYXNlIFwiYmxvYlwiIDpcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5uZXdCbG9iKHV0aWxzLnRyYW5zZm9ybVRvKFwiYXJyYXlidWZmZXJcIiwgY29udGVudCksIG1pbWVUeXBlKTtcbiAgICAgICAgY2FzZSBcImJhc2U2NFwiIDpcbiAgICAgICAgICAgIHJldHVybiBiYXNlNjQuZW5jb2RlKGNvbnRlbnQpO1xuICAgICAgICBkZWZhdWx0IDpcbiAgICAgICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1Ubyh0eXBlLCBjb250ZW50KTtcbiAgICB9XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGUgYW4gYXJyYXkgb2YgZGF0YSBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBkYXRhIGluIHRoZSBnaXZlbiBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl9IGRhdGFBcnJheSB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSBjaHVua3MgdG8gY29uY2F0ZW5hdGVcbiAqIEByZXR1cm4ge1N0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIGNvbmNhdGVuYXRlZCBkYXRhXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhc2tlZCB0eXBlIGlzIHVuc3VwcG9ydGVkXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdCAodHlwZSwgZGF0YUFycmF5KSB7XG4gICAgdmFyIGksIGluZGV4ID0gMCwgcmVzID0gbnVsbCwgdG90YWxMZW5ndGggPSAwO1xuICAgIGZvcihpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b3RhbExlbmd0aCArPSBkYXRhQXJyYXlbaV0ubGVuZ3RoO1xuICAgIH1cbiAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICByZXR1cm4gZGF0YUFycmF5LmpvaW4oXCJcIik7XG4gICAgICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgZGF0YUFycmF5KTtcbiAgICAgICAgY2FzZSBcInVpbnQ4YXJyYXlcIjpcbiAgICAgICAgICAgIHJlcyA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlcy5zZXQoZGF0YUFycmF5W2ldLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gZGF0YUFycmF5W2ldLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIGNhc2UgXCJub2RlYnVmZmVyXCI6XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChkYXRhQXJyYXkpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29uY2F0IDogdW5zdXBwb3J0ZWQgdHlwZSAnXCIgICsgdHlwZSArIFwiJ1wiKTtcbiAgICB9XG59XG5cbi8qKlxuICogTGlzdGVuIGEgU3RyZWFtSGVscGVyLCBhY2N1bXVsYXRlIGl0cyBjb250ZW50IGFuZCBjb25jYXRlbmF0ZSBpdCBpbnRvIGFcbiAqIGNvbXBsZXRlIGJsb2NrLlxuICogQHBhcmFtIHtTdHJlYW1IZWxwZXJ9IGhlbHBlciB0aGUgaGVscGVyIHRvIHVzZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZUNhbGxiYWNrIGEgY2FsbGJhY2sgY2FsbGVkIG9uIGVhY2ggdXBkYXRlLiBDYWxsZWRcbiAqIHdpdGggb25lIGFyZyA6XG4gKiAtIHRoZSBtZXRhZGF0YSBsaW5rZWQgdG8gdGhlIHVwZGF0ZSByZWNlaXZlZC5cbiAqIEByZXR1cm4gUHJvbWlzZSB0aGUgcHJvbWlzZSBmb3IgdGhlIGFjY3VtdWxhdGlvbi5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZShoZWxwZXIsIHVwZGF0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3Qpe1xuICAgICAgICB2YXIgZGF0YUFycmF5ID0gW107XG4gICAgICAgIHZhciBjaHVua1R5cGUgPSBoZWxwZXIuX2ludGVybmFsVHlwZSxcbiAgICAgICAgICAgIHJlc3VsdFR5cGUgPSBoZWxwZXIuX291dHB1dFR5cGUsXG4gICAgICAgICAgICBtaW1lVHlwZSA9IGhlbHBlci5fbWltZVR5cGU7XG4gICAgICAgIGhlbHBlclxuICAgICAgICAub24oJ2RhdGEnLCBmdW5jdGlvbiAoZGF0YSwgbWV0YSkge1xuICAgICAgICAgICAgZGF0YUFycmF5LnB1c2goZGF0YSk7XG4gICAgICAgICAgICBpZih1cGRhdGVDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUNhbGxiYWNrKG1ldGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBkYXRhQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ2VuZCcsIGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJhbnNmb3JtWmlwT3V0cHV0KHJlc3VsdFR5cGUsIGNvbmNhdChjaHVua1R5cGUsIGRhdGFBcnJheSksIG1pbWVUeXBlKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YUFycmF5ID0gW107XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bWUoKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBbiBoZWxwZXIgdG8gZWFzaWx5IHVzZSB3b3JrZXJzIG91dHNpZGUgb2YgSlNaaXAuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7V29ya2VyfSB3b3JrZXIgdGhlIHdvcmtlciB0byB3cmFwXG4gKiBAcGFyYW0ge1N0cmluZ30gb3V0cHV0VHlwZSB0aGUgdHlwZSBvZiBkYXRhIGV4cGVjdGVkIGJ5IHRoZSB1c2VcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lVHlwZSB0aGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBpZiBhcHBsaWNhYmxlLlxuICovXG5mdW5jdGlvbiBTdHJlYW1IZWxwZXIod29ya2VyLCBvdXRwdXRUeXBlLCBtaW1lVHlwZSkge1xuICAgIHZhciBpbnRlcm5hbFR5cGUgPSBvdXRwdXRUeXBlO1xuICAgIHN3aXRjaChvdXRwdXRUeXBlKSB7XG4gICAgICAgIGNhc2UgXCJibG9iXCI6XG4gICAgICAgIGNhc2UgXCJhcnJheWJ1ZmZlclwiOlxuICAgICAgICAgICAgaW50ZXJuYWxUeXBlID0gXCJ1aW50OGFycmF5XCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XG4gICAgICAgICAgICBpbnRlcm5hbFR5cGUgPSBcInN0cmluZ1wiO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICAvLyB0aGUgdHlwZSB1c2VkIGludGVybmFsbHlcbiAgICAgICAgdGhpcy5faW50ZXJuYWxUeXBlID0gaW50ZXJuYWxUeXBlO1xuICAgICAgICAvLyB0aGUgdHlwZSB1c2VkIHRvIG91dHB1dCByZXN1bHRzXG4gICAgICAgIHRoaXMuX291dHB1dFR5cGUgPSBvdXRwdXRUeXBlO1xuICAgICAgICAvLyB0aGUgbWltZSB0eXBlXG4gICAgICAgIHRoaXMuX21pbWVUeXBlID0gbWltZVR5cGU7XG4gICAgICAgIHV0aWxzLmNoZWNrU3VwcG9ydChpbnRlcm5hbFR5cGUpO1xuICAgICAgICB0aGlzLl93b3JrZXIgPSB3b3JrZXIucGlwZShuZXcgQ29udmVydFdvcmtlcihpbnRlcm5hbFR5cGUpKTtcbiAgICAgICAgLy8gdGhlIGxhc3Qgd29ya2VycyBjYW4gYmUgcmV3aXJlZCB3aXRob3V0IGlzc3VlcyBidXQgd2UgbmVlZCB0b1xuICAgICAgICAvLyBwcmV2ZW50IGFueSB1cGRhdGVzIG9uIHByZXZpb3VzIHdvcmtlcnMuXG4gICAgICAgIHdvcmtlci5sb2NrKCk7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG5ldyBHZW5lcmljV29ya2VyKFwiZXJyb3JcIik7XG4gICAgICAgIHRoaXMuX3dvcmtlci5lcnJvcihlKTtcbiAgICB9XG59XG5cblN0cmVhbUhlbHBlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogTGlzdGVuIGEgU3RyZWFtSGVscGVyLCBhY2N1bXVsYXRlIGl0cyBjb250ZW50IGFuZCBjb25jYXRlbmF0ZSBpdCBpbnRvIGFcbiAgICAgKiBjb21wbGV0ZSBibG9jay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYiB0aGUgdXBkYXRlIGNhbGxiYWNrLlxuICAgICAqIEByZXR1cm4gUHJvbWlzZSB0aGUgcHJvbWlzZSBmb3IgdGhlIGFjY3VtdWxhdGlvbi5cbiAgICAgKi9cbiAgICBhY2N1bXVsYXRlIDogZnVuY3Rpb24gKHVwZGF0ZUNiKSB7XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRlKHRoaXMsIHVwZGF0ZUNiKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxpc3RlbmVyIG9uIGFuIGV2ZW50IHRyaWdnZXJlZCBvbiBhIHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZ0IHRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIHRoZSBsaXN0ZW5lclxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIGN1cnJlbnQgaGVscGVyLlxuICAgICAqL1xuICAgIG9uIDogZnVuY3Rpb24gKGV2dCwgZm4pIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGlmKGV2dCA9PT0gXCJkYXRhXCIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5vbihldnQsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoc2VsZiwgY2h1bmsuZGF0YSwgY2h1bmsubWV0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5vbihldnQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB1dGlscy5kZWxheShmbiwgYXJndW1lbnRzLCBzZWxmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVzdW1lIHRoZSBmbG93IG9mIGNodW5rcy5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBjdXJyZW50IGhlbHBlci5cbiAgICAgKi9cbiAgICByZXN1bWUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHV0aWxzLmRlbGF5KHRoaXMuX3dvcmtlci5yZXN1bWUsIFtdLCB0aGlzLl93b3JrZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFBhdXNlIHRoZSBmbG93IG9mIGNodW5rcy5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBjdXJyZW50IGhlbHBlci5cbiAgICAgKi9cbiAgICBwYXVzZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fd29ya2VyLnBhdXNlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgbm9kZWpzIHN0cmVhbSBmb3IgdGhpcyBoZWxwZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2IgdGhlIHVwZGF0ZSBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJuIHtOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyfSB0aGUgbm9kZWpzIHN0cmVhbS5cbiAgICAgKi9cbiAgICB0b05vZGVqc1N0cmVhbSA6IGZ1bmN0aW9uICh1cGRhdGVDYikge1xuICAgICAgICB1dGlscy5jaGVja1N1cHBvcnQoXCJub2Rlc3RyZWFtXCIpO1xuICAgICAgICBpZiAodGhpcy5fb3V0cHV0VHlwZSAhPT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgICAgIC8vIGFuIG9iamVjdCBzdHJlYW0gY29udGFpbmluZyBibG9iL2FycmF5YnVmZmVyL3VpbnQ4YXJyYXkvc3RyaW5nXG4gICAgICAgICAgICAvLyBpcyBzdHJhbmdlIGFuZCBJIGRvbid0IGtub3cgaWYgaXQgd291bGQgYmUgdXNlZnVsLlxuICAgICAgICAgICAgLy8gSSB5b3UgZmluZCB0aGlzIGNvbW1lbnQgYW5kIGhhdmUgYSBnb29kIHVzZWNhc2UsIHBsZWFzZSBvcGVuIGFcbiAgICAgICAgICAgIC8vIGJ1ZyByZXBvcnQgIVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuX291dHB1dFR5cGUgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbWV0aG9kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyKHRoaXMsIHtcbiAgICAgICAgICAgIG9iamVjdE1vZGUgOiB0aGlzLl9vdXRwdXRUeXBlICE9PSBcIm5vZGVidWZmZXJcIlxuICAgICAgICB9LCB1cGRhdGVDYik7XG4gICAgfVxufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmVhbUhlbHBlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5iYXNlNjQgPSB0cnVlO1xuZXhwb3J0cy5hcnJheSA9IHRydWU7XG5leHBvcnRzLnN0cmluZyA9IHRydWU7XG5leHBvcnRzLmFycmF5YnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBVaW50OEFycmF5ICE9PSBcInVuZGVmaW5lZFwiO1xuZXhwb3J0cy5ub2RlYnVmZmVyID0gdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIjtcbi8vIGNvbnRhaW5zIHRydWUgaWYgSlNaaXAgY2FuIHJlYWQvZ2VuZXJhdGUgVWludDhBcnJheSwgZmFsc2Ugb3RoZXJ3aXNlLlxuZXhwb3J0cy51aW50OGFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09IFwidW5kZWZpbmVkXCI7XG5cbmlmICh0eXBlb2YgQXJyYXlCdWZmZXIgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBleHBvcnRzLmJsb2IgPSBmYWxzZTtcbn1cbmVsc2Uge1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgdHJ5IHtcbiAgICAgICAgZXhwb3J0cy5ibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYXBwbGljYXRpb24vemlwXCJcbiAgICAgICAgfSkuc2l6ZSA9PT0gMDtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBCdWlsZGVyID0gd2luZG93LkJsb2JCdWlsZGVyIHx8IHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlciB8fCB3aW5kb3cuTW96QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1TQmxvYkJ1aWxkZXI7XG4gICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7XG4gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIpO1xuICAgICAgICAgICAgZXhwb3J0cy5ibG9iID0gYnVpbGRlci5nZXRCbG9iKCdhcHBsaWNhdGlvbi96aXAnKS5zaXplID09PSAwO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBleHBvcnRzLmJsb2IgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0cy5ub2Rlc3RyZWFtID0gISFyZXF1aXJlKFwiLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlclwiKS5wcm90b3R5cGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKCcuL25vZGVqc1V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjb21lIGZyb20gcGFrbywgZnJvbSBwYWtvL2xpYi91dGlscy9zdHJpbmdzXG4gKiByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBwYWtvIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyBBcnJheSgyNTYpO1xuZm9yICh2YXIgaT0wOyBpPDI1NjsgaSsrKSB7XG4gIF91dGY4bGVuW2ldID0gKGkgPj0gMjUyID8gNiA6IGkgPj0gMjQ4ID8gNSA6IGkgPj0gMjQwID8gNCA6IGkgPj0gMjI0ID8gMyA6IGkgPj0gMTkyID8gMiA6IDEpO1xufVxuX3V0ZjhsZW5bMjU0XT1fdXRmOGxlblsyNTRdPTE7IC8vIEludmFsaWQgc2VxdWVuY2Ugc3RhcnRcblxuLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxudmFyIHN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICAgIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICAgICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcysxIDwgc3RyX2xlbikpIHtcbiAgICAgICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MrMSk7XG4gICAgICAgICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgICAgICAgICAgbV9wb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICAgIH1cblxuICAgIC8vIGFsbG9jYXRlIGJ1ZmZlclxuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnVmX2xlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYnVmID0gbmV3IEFycmF5KGJ1Zl9sZW4pO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnRcbiAgICBmb3IgKGk9MCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgICAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zKzEgPCBzdHJfbGVuKSkge1xuICAgICAgICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcysxKTtcbiAgICAgICAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgICAgICAgICBtX3BvcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gYztcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgIC8qIHR3byBieXRlcyAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSAweEMwIHwgKGMgPj4+IDYpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhmMCB8IChjID4+PiAxOCk7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gMTIgJiAweDNmKTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIENhbGN1bGF0ZSBtYXggcG9zc2libGUgcG9zaXRpb24gaW4gdXRmOCBidWZmZXIsXG4vLyB0aGF0IHdpbGwgbm90IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlXG4vLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLlxuLy9cbi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheVxuLy8gbWF4ICAgLSBsZW5ndGggbGltaXQgKG1hbmRhdG9yeSk7XG52YXIgdXRmOGJvcmRlciA9IGZ1bmN0aW9uKGJ1ZiwgbWF4KSB7XG4gICAgdmFyIHBvcztcblxuICAgIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICAgIGlmIChtYXggPiBidWYubGVuZ3RoKSB7IG1heCA9IGJ1Zi5sZW5ndGg7IH1cblxuICAgIC8vIGdvIGJhY2sgZnJvbSBsYXN0IHBvc2l0aW9uLCB1bnRpbCBzdGFydCBvZiBzZXF1ZW5jZSBmb3VuZFxuICAgIHBvcyA9IG1heC0xO1xuICAgIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gICAgLy8gRnVja3VwIC0gdmVyeSBzbWFsbCBhbmQgYnJva2VuIHNlcXVlbmNlLFxuICAgIC8vIHJldHVybiBtYXgsIGJlY2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LlxuICAgIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAgIC8vIElmIHdlIGNhbWUgdG8gc3RhcnQgb2YgYnVmZmVyIC0gdGhhdCBtZWFucyB2dWZmZXIgaXMgdG9vIHNtYWxsLFxuICAgIC8vIHJldHVybiBtYXggdG9vLlxuICAgIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gICAgcmV0dXJuIChwb3MgKyBfdXRmOGxlbltidWZbcG9zXV0gPiBtYXgpID8gcG9zIDogbWF4O1xufTtcblxuLy8gY29udmVydCBhcnJheSB0byBzdHJpbmdcbnZhciBidWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICAgIHZhciBzdHIsIGksIG91dCwgYywgY19sZW47XG4gICAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG5cbiAgICAvLyBSZXNlcnZlIG1heCBwb3NzaWJsZSBsZW5ndGggKDIgd29yZHMgcGVyIGNoYXIpXG4gICAgLy8gTkI6IGJ5IHVua25vd24gcmVhc29ucywgQXJyYXkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZm9yXG4gICAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgICB2YXIgdXRmMTZidWYgPSBuZXcgQXJyYXkobGVuKjIpO1xuXG4gICAgZm9yIChvdXQ9MCwgaT0wOyBpPGxlbjspIHtcbiAgICAgICAgYyA9IGJ1ZltpKytdO1xuICAgICAgICAvLyBxdWljayBwcm9jZXNzIGFzY2lpXG4gICAgICAgIGlmIChjIDwgMHg4MCkgeyB1dGYxNmJ1ZltvdXQrK10gPSBjOyBjb250aW51ZTsgfVxuXG4gICAgICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgICAgIC8vIHNraXAgNSAmIDYgYnl0ZSBjb2Rlc1xuICAgICAgICBpZiAoY19sZW4gPiA0KSB7IHV0ZjE2YnVmW291dCsrXSA9IDB4ZmZmZDsgaSArPSBjX2xlbi0xOyBjb250aW51ZTsgfVxuXG4gICAgICAgIC8vIGFwcGx5IG1hc2sgb24gZmlyc3QgYnl0ZVxuICAgICAgICBjICY9IGNfbGVuID09PSAyID8gMHgxZiA6IGNfbGVuID09PSAzID8gMHgwZiA6IDB4MDc7XG4gICAgICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICAgICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuKSB7XG4gICAgICAgICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTtcbiAgICAgICAgICAgIGNfbGVuLS07XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgICAgIGlmIChjX2xlbiA+IDEpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBjb250aW51ZTsgfVxuXG4gICAgICAgIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNocmlua0J1Zih1dGYxNmJ1Ziwgb3V0KVxuICAgIGlmICh1dGYxNmJ1Zi5sZW5ndGggIT09IG91dCkge1xuICAgICAgICBpZih1dGYxNmJ1Zi5zdWJhcnJheSkge1xuICAgICAgICAgICAgdXRmMTZidWYgPSB1dGYxNmJ1Zi5zdWJhcnJheSgwLCBvdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXRmMTZidWYubGVuZ3RoID0gb3V0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdXRmMTZidWYpO1xuICAgIHJldHVybiB1dGlscy5hcHBseUZyb21DaGFyQ29kZSh1dGYxNmJ1Zik7XG59O1xuXG5cbi8vIFRoYXQncyBhbGwgZm9yIHRoZSBwYWtvIGZ1bmN0aW9ucy5cblxuXG4vKipcbiAqIFRyYW5zZm9ybSBhIGphdmFzY3JpcHQgc3RyaW5nIGludG8gYW4gYXJyYXkgKHR5cGVkIGlmIHBvc3NpYmxlKSBvZiBieXRlcyxcbiAqIFVURi04IGVuY29kZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gZW5jb2RlXG4gKiBAcmV0dXJuIHtBcnJheXxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIFVURi04IGVuY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnRzLnV0ZjhlbmNvZGUgPSBmdW5jdGlvbiB1dGY4ZW5jb2RlKHN0cikge1xuICAgIGlmIChzdXBwb3J0Lm5vZGVidWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihzdHIsIFwidXRmLThcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZzJidWYoc3RyKTtcbn07XG5cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSBieXRlcyBhcnJheSAob3IgYSByZXByZXNlbnRhdGlvbikgcmVwcmVzZW50aW5nIGFuIFVURi04IGVuY29kZWRcbiAqIHN0cmluZyBpbnRvIGEgamF2YXNjcmlwdCBzdHJpbmcuXG4gKiBAcGFyYW0ge0FycmF5fFVpbnQ4QXJyYXl8QnVmZmVyfSBidWYgdGhlIGRhdGEgZGUgZGVjb2RlXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBkZWNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0cy51dGY4ZGVjb2RlID0gZnVuY3Rpb24gdXRmOGRlY29kZShidWYpIHtcbiAgICBpZiAoc3VwcG9ydC5ub2RlYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1UbyhcIm5vZGVidWZmZXJcIiwgYnVmKS50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgIH1cblxuICAgIGJ1ZiA9IHV0aWxzLnRyYW5zZm9ybVRvKHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiLCBidWYpO1xuXG4gICAgcmV0dXJuIGJ1ZjJzdHJpbmcoYnVmKTtcbn07XG5cbi8qKlxuICogQSB3b3JrZXIgdG8gZGVjb2RlIHV0ZjggZW5jb2RlZCBiaW5hcnkgY2h1bmtzIGludG8gc3RyaW5nIGNodW5rcy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBVdGY4RGVjb2RlV29ya2VyKCkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcInV0Zi04IGRlY29kZVwiKTtcbiAgICAvLyB0aGUgbGFzdCBieXRlcyBpZiBhIGNodW5rIGRpZG4ndCBlbmQgd2l0aCBhIGNvbXBsZXRlIGNvZGVwb2ludC5cbiAgICB0aGlzLmxlZnRPdmVyID0gbnVsbDtcbn1cbnV0aWxzLmluaGVyaXRzKFV0ZjhEZWNvZGVXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuVXRmOERlY29kZVdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG5cbiAgICB2YXIgZGF0YSA9IHV0aWxzLnRyYW5zZm9ybVRvKHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiLCBjaHVuay5kYXRhKTtcblxuICAgIC8vIDFzdCBzdGVwLCByZS11c2Ugd2hhdCdzIGxlZnQgb2YgdGhlIHByZXZpb3VzIGNodW5rXG4gICAgaWYgKHRoaXMubGVmdE92ZXIgJiYgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpIHtcbiAgICAgICAgaWYoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNEYXRhID0gZGF0YTtcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShwcmV2aW91c0RhdGEubGVuZ3RoICsgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpO1xuICAgICAgICAgICAgZGF0YS5zZXQodGhpcy5sZWZ0T3ZlciwgMCk7XG4gICAgICAgICAgICBkYXRhLnNldChwcmV2aW91c0RhdGEsIHRoaXMubGVmdE92ZXIubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLmxlZnRPdmVyLmNvbmNhdChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlZnRPdmVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEJvdW5kYXJ5ID0gdXRmOGJvcmRlcihkYXRhKTtcbiAgICB2YXIgdXNhYmxlRGF0YSA9IGRhdGE7XG4gICAgaWYgKG5leHRCb3VuZGFyeSAhPT0gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICAgICAgdXNhYmxlRGF0YSA9IGRhdGEuc3ViYXJyYXkoMCwgbmV4dEJvdW5kYXJ5KTtcbiAgICAgICAgICAgIHRoaXMubGVmdE92ZXIgPSBkYXRhLnN1YmFycmF5KG5leHRCb3VuZGFyeSwgZGF0YS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXNhYmxlRGF0YSA9IGRhdGEuc2xpY2UoMCwgbmV4dEJvdW5kYXJ5KTtcbiAgICAgICAgICAgIHRoaXMubGVmdE92ZXIgPSBkYXRhLnNsaWNlKG5leHRCb3VuZGFyeSwgZGF0YS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKHtcbiAgICAgICAgZGF0YSA6IGV4cG9ydHMudXRmOGRlY29kZSh1c2FibGVEYXRhKSxcbiAgICAgICAgbWV0YSA6IGNodW5rLm1ldGFcbiAgICB9KTtcbn07XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmZsdXNoXG4gKi9cblV0ZjhEZWNvZGVXb3JrZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKHRoaXMubGVmdE92ZXIgJiYgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGEgOiBleHBvcnRzLnV0ZjhkZWNvZGUodGhpcy5sZWZ0T3ZlciksXG4gICAgICAgICAgICBtZXRhIDoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubGVmdE92ZXIgPSBudWxsO1xuICAgIH1cbn07XG5leHBvcnRzLlV0ZjhEZWNvZGVXb3JrZXIgPSBVdGY4RGVjb2RlV29ya2VyO1xuXG4vKipcbiAqIEEgd29ya2VyIHRvIGVuZGNvZGUgc3RyaW5nIGNodW5rcyBpbnRvIHV0ZjggZW5jb2RlZCBiaW5hcnkgY2h1bmtzLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFV0ZjhFbmNvZGVXb3JrZXIoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwidXRmLTggZW5jb2RlXCIpO1xufVxudXRpbHMuaW5oZXJpdHMoVXRmOEVuY29kZVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5VdGY4RW5jb2RlV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLnB1c2goe1xuICAgICAgICBkYXRhIDogZXhwb3J0cy51dGY4ZW5jb2RlKGNodW5rLmRhdGEpLFxuICAgICAgICBtZXRhIDogY2h1bmsubWV0YVxuICAgIH0pO1xufTtcbmV4cG9ydHMuVXRmOEVuY29kZVdvcmtlciA9IFV0ZjhFbmNvZGVXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnLi9iYXNlNjQnKTtcbnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoJy4vbm9kZWpzVXRpbHMnKTtcbnZhciBhc2FwID0gcmVxdWlyZSgnYXNhcCcpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG5cblxuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIHRoYXQgcGFzcyBhcyBhIFwiYmluYXJ5IHN0cmluZ1wiOiBpdCBzaG91bGQgcmVwcmVzZW50IGEgYnl0ZVxuICogYXJyYXkgYnV0IG1heSBoYXZlID4gMjU1IGNoYXIgY29kZXMuIEJlIHN1cmUgdG8gdGFrZSBvbmx5IHRoZSBmaXJzdCBieXRlXG4gKiBhbmQgcmV0dXJucyB0aGUgYnl0ZSBhcnJheS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHtBcnJheXxVaW50OEFycmF5fSB0aGUgc3RyaW5nIGluIGEgYmluYXJ5IGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nMmJpbmFyeShzdHIpIHtcbiAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHN0ci5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2Uoc3RyLCByZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBibG9iIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgYW5kIHRoZSBnaXZlbiB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ9IHBhcnQgdGhlIGNvbnRlbnQgdG8gcHV0IGluIHRoZSBibG9iLiBETyBOT1QgdXNlXG4gKiBhbiBVaW50OEFycmF5IGJlY2F1c2UgdGhlIHN0b2NrIGJyb3dzZXIgb2YgYW5kcm9pZCA0IHdvbid0IGFjY2VwdCBpdCAoaXRcbiAqIHdpbGwgYmUgc2lsZW50bHkgY29udmVydGVkIHRvIGEgc3RyaW5nLCBcIltvYmplY3QgVWludDhBcnJheV1cIikuXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgbWltZSB0eXBlIG9mIHRoZSBibG9iLlxuICogQHJldHVybiB7QmxvYn0gdGhlIGNyZWF0ZWQgYmxvYi5cbiAqL1xuZXhwb3J0cy5uZXdCbG9iID0gZnVuY3Rpb24ocGFydCwgdHlwZSkge1xuICAgIGV4cG9ydHMuY2hlY2tTdXBwb3J0KFwiYmxvYlwiKTtcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIEJsb2IgY29uc3RydWN0b3JcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtwYXJ0XSwge1xuICAgICAgICAgICAgdHlwZTogdHlwZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZGVwcmVjYXRlZCwgYnJvd3NlciBvbmx5LCBvbGQgd2F5XG4gICAgICAgICAgICB2YXIgQnVpbGRlciA9IHdpbmRvdy5CbG9iQnVpbGRlciB8fCB3aW5kb3cuV2ViS2l0QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1vekJsb2JCdWlsZGVyIHx8IHdpbmRvdy5NU0Jsb2JCdWlsZGVyO1xuICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpO1xuICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocGFydCk7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRCbG9iKHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgIC8vIHdlbGwsIGZ1Y2sgPyFcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZyA6IGNhbid0IGNvbnN0cnVjdCB0aGUgQmxvYi5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cblxufTtcbi8qKlxuICogVGhlIGlkZW50aXR5IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0IHRoZSBpbnB1dC5cbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIHNhbWUgaW5wdXQuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0O1xufVxuXG4vKipcbiAqIEZpbGwgaW4gYW4gYXJyYXkgd2l0aCBhIHN0cmluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB1c2UuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gZmlsbCBpbiAod2lsbCBiZSBtdXRhdGVkKS5cbiAqIEByZXR1cm4ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgdXBkYXRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9BcnJheUxpa2Uoc3RyLCBhcnJheSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGFycmF5W2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQW4gaGVscGVyIGZvciB0aGUgZnVuY3Rpb24gYXJyYXlMaWtlVG9TdHJpbmcuXG4gKiBUaGlzIGNvbnRhaW5zIHN0YXRpYyBpbmZvcm1hdGlvbnMgYW5kIGZ1bmN0aW9ucyB0aGF0XG4gKiBjYW4gYmUgb3B0aW1pemVkIGJ5IHRoZSBicm93c2VyIEpJVCBjb21waWxlci5cbiAqL1xudmFyIGFycmF5VG9TdHJpbmdIZWxwZXIgPSB7XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGFuIGFycmF5IG9mIGludCBpbnRvIGEgc3RyaW5nLCBjaHVuayBieSBjaHVuay5cbiAgICAgKiBTZWUgdGhlIHBlcmZvcm1hbmNlcyBub3RlcyBvbiBhcnJheUxpa2VUb1N0cmluZy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gdHJhbnNmb3JtLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGNodW5rIHRoZSBjaHVuayBzaXplLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdGluZyBzdHJpbmcuXG4gICAgICogQHRocm93cyBFcnJvciBpZiB0aGUgY2h1bmsgaXMgdG9vIGJpZyBmb3IgdGhlIHN0YWNrLlxuICAgICAqL1xuICAgIHN0cmluZ2lmeUJ5Q2h1bms6IGZ1bmN0aW9uKGFycmF5LCB0eXBlLCBjaHVuaykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW10sIGsgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIC8vIHNob3J0Y3V0XG4gICAgICAgIGlmIChsZW4gPD0gY2h1bmspIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoayA8IGxlbikge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiYXJyYXlcIiB8fCB0eXBlID09PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkuc2xpY2UoaywgTWF0aC5taW4oayArIGNodW5rLCBsZW4pKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheS5zdWJhcnJheShrLCBNYXRoLm1pbihrICsgY2h1bmssIGxlbikpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrICs9IGNodW5rO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuam9pbihcIlwiKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENhbGwgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBldmVyeSBpdGVtIGluIHRoZSBhcnJheS5cbiAgICAgKiBUaGlzIGlzIHRoZSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggZ2VuZXJhdGUgQSBMT1Qgb2YgaW50ZXJtZWRpYXRlIHN0cmluZy5cbiAgICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gZXZlcnl0aGluZyBlbHNlIGZhaWwuXG4gICAgICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXkgdGhlIGFycmF5IHRvIHRyYW5zZm9ybS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSByZXN1bHQuXG4gICAgICovXG4gICAgc3RyaW5naWZ5QnlDaGFyOiBmdW5jdGlvbihhcnJheSl7XG4gICAgICAgIHZhciByZXN1bHRTdHIgPSBcIlwiO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycmF5W2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0U3RyO1xuICAgIH0sXG4gICAgYXBwbHlDYW5CZVVzZWQgOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0cnVlIGlmIHRoZSBicm93c2VyIGFjY2VwdHMgdG8gdXNlIFN0cmluZy5mcm9tQ2hhckNvZGUgb24gVWludDhBcnJheVxuICAgICAgICAgKi9cbiAgICAgICAgdWludDhhcnJheSA6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0LnVpbnQ4YXJyYXkgJiYgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSkubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRydWUgaWYgdGhlIGJyb3dzZXIgYWNjZXB0cyB0byB1c2UgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBub2RlanMgQnVmZmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgbm9kZWJ1ZmZlciA6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0Lm5vZGVidWZmZXIgJiYgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBub2RlanNVdGlscy5uZXdCdWZmZXIoMSkpLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICB9XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBhcnJheS1saWtlIG9iamVjdCB0byBhIHN0cmluZy5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZVRvU3RyaW5nKGFycmF5KSB7XG4gICAgLy8gUGVyZm9ybWFuY2VzIG5vdGVzIDpcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkpIGlzIHRoZSBmYXN0ZXN0LCBzZWVcbiAgICAvLyBzZWUgaHR0cDovL2pzcGVyZi5jb20vY29udmVydGluZy1hLXVpbnQ4YXJyYXktdG8tYS1zdHJpbmcvMlxuICAgIC8vIGJ1dCB0aGUgc3RhY2sgaXMgbGltaXRlZCAoYW5kIHdlIGNhbiBnZXQgaHVnZSBhcnJheXMgISkuXG4gICAgLy9cbiAgICAvLyByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhcnJheVtpXSk7IGdlbmVyYXRlIHRvbyBtYW55IHN0cmluZ3MgIVxuICAgIC8vXG4gICAgLy8gVGhpcyBjb2RlIGlzIGluc3BpcmVkIGJ5IGh0dHA6Ly9qc3BlcmYuY29tL2FycmF5YnVmZmVyLXRvLXN0cmluZy1hcHBseS1wZXJmb3JtYW5jZS8yXG4gICAgLy8gVE9ETyA6IHdlIG5vdyBoYXZlIHdvcmtlcnMgdGhhdCBzcGxpdCB0aGUgd29yay4gRG8gd2Ugc3RpbGwgbmVlZCB0aGF0ID9cbiAgICB2YXIgY2h1bmsgPSA2NTUzNixcbiAgICAgICAgdHlwZSA9IGV4cG9ydHMuZ2V0VHlwZU9mKGFycmF5KSxcbiAgICAgICAgY2FuVXNlQXBwbHkgPSB0cnVlO1xuICAgIGlmICh0eXBlID09PSBcInVpbnQ4YXJyYXlcIikge1xuICAgICAgICBjYW5Vc2VBcHBseSA9IGFycmF5VG9TdHJpbmdIZWxwZXIuYXBwbHlDYW5CZVVzZWQudWludDhhcnJheTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwibm9kZWJ1ZmZlclwiKSB7XG4gICAgICAgIGNhblVzZUFwcGx5ID0gYXJyYXlUb1N0cmluZ0hlbHBlci5hcHBseUNhbkJlVXNlZC5ub2RlYnVmZmVyO1xuICAgIH1cblxuICAgIGlmIChjYW5Vc2VBcHBseSkge1xuICAgICAgICB3aGlsZSAoY2h1bmsgPiAxKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvU3RyaW5nSGVscGVyLnN0cmluZ2lmeUJ5Q2h1bmsoYXJyYXksIHR5cGUsIGNodW5rKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjaHVuayA9IE1hdGguZmxvb3IoY2h1bmsgLyAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5vIGFwcGx5IG9yIGNodW5rIGVycm9yIDogc2xvdyBhbmQgcGFpbmZ1bCBhbGdvcml0aG1cbiAgICAvLyBkZWZhdWx0IGJyb3dzZXIgb24gYW5kcm9pZCA0LipcbiAgICByZXR1cm4gYXJyYXlUb1N0cmluZ0hlbHBlci5zdHJpbmdpZnlCeUNoYXIoYXJyYXkpO1xufVxuXG5leHBvcnRzLmFwcGx5RnJvbUNoYXJDb2RlID0gYXJyYXlMaWtlVG9TdHJpbmc7XG5cblxuLyoqXG4gKiBDb3B5IHRoZSBkYXRhIGZyb20gYW4gYXJyYXktbGlrZSB0byBhbiBvdGhlciBhcnJheS1saWtlLlxuICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXlGcm9tIHRoZSBvcmlnaW4gYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheVRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGljaCB3aWxsIGJlIG11dGF0ZWQuXG4gKiBAcmV0dXJuIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIHVwZGF0ZWQgZGVzdGluYXRpb24gYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZVRvQXJyYXlMaWtlKGFycmF5RnJvbSwgYXJyYXlUbykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlGcm9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFycmF5VG9baV0gPSBhcnJheUZyb21baV07XG4gICAgfVxuICAgIHJldHVybiBhcnJheVRvO1xufVxuXG4vLyBhIG1hdHJpeCBjb250YWluaW5nIGZ1bmN0aW9ucyB0byB0cmFuc2Zvcm0gZXZlcnl0aGluZyBpbnRvIGV2ZXJ5dGhpbmcuXG52YXIgdHJhbnNmb3JtID0ge307XG5cbi8vIHN0cmluZyB0byA/XG50cmFuc2Zvcm1bXCJzdHJpbmdcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogaWRlbnRpdHksXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVtcInN0cmluZ1wiXVtcInVpbnQ4YXJyYXlcIl0oaW5wdXQpLmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBVaW50OEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbm9kZWpzVXRpbHMubmV3QnVmZmVyKGlucHV0Lmxlbmd0aCkpO1xuICAgIH1cbn07XG5cbi8vIGFycmF5IHRvID9cbnRyYW5zZm9ybVtcImFycmF5XCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogaWRlbnRpdHksXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKG5ldyBVaW50OEFycmF5KGlucHV0KSkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShpbnB1dCk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihpbnB1dCk7XG4gICAgfVxufTtcblxuLy8gYXJyYXlidWZmZXIgdG8gP1xudHJhbnNmb3JtW1wiYXJyYXlidWZmZXJcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvU3RyaW5nKG5ldyBVaW50OEFycmF5KGlucHV0KSk7XG4gICAgfSxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShuZXcgVWludDhBcnJheShpbnB1dCksIG5ldyBBcnJheShpbnB1dC5ieXRlTGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGlkZW50aXR5LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaW5wdXQpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBub2RlanNVdGlscy5uZXdCdWZmZXIobmV3IFVpbnQ4QXJyYXkoaW5wdXQpKTtcbiAgICB9XG59O1xuXG4vLyB1aW50OGFycmF5IHRvID9cbnRyYW5zZm9ybVtcInVpbnQ4YXJyYXlcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogYXJyYXlMaWtlVG9TdHJpbmcsXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0LmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBpZGVudGl0eSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihpbnB1dCk7XG4gICAgfVxufTtcblxuLy8gbm9kZWJ1ZmZlciB0byA/XG50cmFuc2Zvcm1bXCJub2RlYnVmZmVyXCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKGlucHV0LCBuZXcgQXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1bXCJub2RlYnVmZmVyXCJdW1widWludDhhcnJheVwiXShpbnB1dCkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShpbnB1dCwgbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogaWRlbnRpdHlcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIGlucHV0IGludG8gYW55IHR5cGUuXG4gKiBUaGUgc3VwcG9ydGVkIG91dHB1dCB0eXBlIGFyZSA6IHN0cmluZywgYXJyYXksIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLCBub2RlYnVmZmVyLlxuICogSWYgbm8gb3V0cHV0IHR5cGUgaXMgc3BlY2lmaWVkLCB0aGUgdW5tb2RpZmllZCBpbnB1dCB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIHtTdHJpbmd9IG91dHB1dFR5cGUgdGhlIG91dHB1dCB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGlucHV0IHRoZSBpbnB1dCB0byBjb252ZXJ0LlxuICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIG91dHB1dCB0eXBlLlxuICovXG5leHBvcnRzLnRyYW5zZm9ybVRvID0gZnVuY3Rpb24ob3V0cHV0VHlwZSwgaW5wdXQpIHtcbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgIC8vIHVuZGVmaW5lZCwgbnVsbCwgZXRjXG4gICAgICAgIC8vIGFuIGVtcHR5IHN0cmluZyB3b24ndCBoYXJtLlxuICAgICAgICBpbnB1dCA9IFwiXCI7XG4gICAgfVxuICAgIGlmICghb3V0cHV0VHlwZSkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIGV4cG9ydHMuY2hlY2tTdXBwb3J0KG91dHB1dFR5cGUpO1xuICAgIHZhciBpbnB1dFR5cGUgPSBleHBvcnRzLmdldFR5cGVPZihpbnB1dCk7XG4gICAgdmFyIHJlc3VsdCA9IHRyYW5zZm9ybVtpbnB1dFR5cGVdW291dHB1dFR5cGVdKGlucHV0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGlucHV0LlxuICogVGhlIHR5cGUgd2lsbCBiZSBpbiBhIGZvcm1hdCB2YWxpZCBmb3IgSlNaaXAudXRpbHMudHJhbnNmb3JtVG8gOiBzdHJpbmcsIGFycmF5LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCB0aGUgaW5wdXQgdG8gaWRlbnRpZnkuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSAobG93ZXJjYXNlKSB0eXBlIG9mIHRoZSBpbnB1dC5cbiAqL1xuZXhwb3J0cy5nZXRUeXBlT2YgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlciAmJiBub2RlanNVdGlscy5pc0J1ZmZlcihpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIFwibm9kZWJ1ZmZlclwiO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5ICYmIGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gXCJ1aW50OGFycmF5XCI7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0LmFycmF5YnVmZmVyICYmIGlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIFwiYXJyYXlidWZmZXJcIjtcbiAgICB9XG59O1xuXG4vKipcbiAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgdG8gY2hlY2suXG4gKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgdHlwZS5cbiAqL1xuZXhwb3J0cy5jaGVja1N1cHBvcnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgdmFyIHN1cHBvcnRlZCA9IHN1cHBvcnRbdHlwZS50b0xvd2VyQ2FzZSgpXTtcbiAgICBpZiAoIXN1cHBvcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZSArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybVwiKTtcbiAgICB9XG59O1xuXG5leHBvcnRzLk1BWF9WQUxVRV8xNkJJVFMgPSA2NTUzNTtcbmV4cG9ydHMuTUFYX1ZBTFVFXzMyQklUUyA9IC0xOyAvLyB3ZWxsLCBcIlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcIiBpcyBwYXJzZWQgYXMgLTFcblxuLyoqXG4gKiBQcmV0dGlmeSBhIHN0cmluZyByZWFkIGFzIGJpbmFyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byBwcmV0dGlmeS5cbiAqIEByZXR1cm4ge3N0cmluZ30gYSBwcmV0dHkgc3RyaW5nLlxuICovXG5leHBvcnRzLnByZXR0eSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciByZXMgPSAnJyxcbiAgICAgICAgY29kZSwgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgKHN0ciB8fCBcIlwiKS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHJlcyArPSAnXFxcXHgnICsgKGNvZGUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyBjb2RlLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBEZWZlciB0aGUgY2FsbCBvZiBhIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgYXN5bmNocm9ub3VzbHkuXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIHRoZSBhcmd1bWVudHMgdG8gZ2l2ZSB0byB0aGUgY2FsbGJhY2suXG4gKi9cbmV4cG9ydHMuZGVsYXkgPSBmdW5jdGlvbihjYWxsYmFjaywgYXJncywgc2VsZikge1xuICAgIGFzYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsYmFjay5hcHBseShzZWxmIHx8IG51bGwsIGFyZ3MgfHwgW10pO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBFeHRlbmRzIGEgcHJvdG90eXBlIHdpdGggYW4gb3RoZXIsIHdpdGhvdXQgY2FsbGluZyBhIGNvbnN0cnVjdG9yIHdpdGhcbiAqIHNpZGUgZWZmZWN0cy4gSW5zcGlyZWQgYnkgbm9kZWpzJyBgdXRpbHMuaW5oZXJpdHNgXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdG9yIHRoZSBjb25zdHJ1Y3RvciB0byBhdWdtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdXBlckN0b3IgdGhlIHBhcmVudCBjb25zdHJ1Y3RvciB0byB1c2VcbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IGZ1bmN0aW9uIChjdG9yLCBzdXBlckN0b3IpIHtcbiAgICB2YXIgT2JqID0gZnVuY3Rpb24oKSB7fTtcbiAgICBPYmoucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBPYmooKTtcbn07XG5cbi8qKlxuICogTWVyZ2UgdGhlIG9iamVjdHMgcGFzc2VkIGFzIHBhcmFtZXRlcnMgaW50byBhIG5ldyBvbmUuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsuLi5PYmplY3R9IHZhcl9hcmdzIEFsbCBvYmplY3RzIHRvIG1lcmdlLlxuICogQHJldHVybiB7T2JqZWN0fSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgZGF0YSBvZiB0aGUgb3RoZXJzLlxuICovXG5leHBvcnRzLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHQgPSB7fSwgaSwgYXR0cjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IC8vIGFyZ3VtZW50cyBpcyBub3QgZW51bWVyYWJsZSBpbiBzb21lIGJyb3dzZXJzXG4gICAgICAgIGZvciAoYXR0ciBpbiBhcmd1bWVudHNbaV0pIHtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0uaGFzT3duUHJvcGVydHkoYXR0cikgJiYgdHlwZW9mIHJlc3VsdFthdHRyXSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdFthdHRyXSA9IGFyZ3VtZW50c1tpXVthdHRyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYXJiaXRyYXJ5IGNvbnRlbnQgaW50byBhIFByb21pc2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBhIG5hbWUgZm9yIHRoZSBjb250ZW50IGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGEgdGhlIGNvbnRlbnQgdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNCaW5hcnkgdHJ1ZSBpZiB0aGUgY29udGVudCBpcyBub3QgYW4gdW5pY29kZSBzdHJpbmdcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNPcHRpbWl6ZWRCaW5hcnlTdHJpbmcgdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRlbnQgb25seSBoYXMgb25lIGJ5dGUgcGVyIGNoYXJhY3Rlci5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNCYXNlNjQgdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRlbnQgaXMgZW5jb2RlZCB3aXRoIGJhc2U2NC5cbiAqIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSBpbiBhIGZvcm1hdCB1c2FibGUgYnkgSlNaaXAuXG4gKi9cbmV4cG9ydHMucHJlcGFyZUNvbnRlbnQgPSBmdW5jdGlvbihuYW1lLCBpbnB1dERhdGEsIGlzQmluYXJ5LCBpc09wdGltaXplZEJpbmFyeVN0cmluZywgaXNCYXNlNjQpIHtcblxuICAgIHZhciBwcm9taXNlID0gbnVsbDtcbiAgICBpZiAoc3VwcG9ydC5ibG9iICYmIGlucHV0RGF0YSBpbnN0YW5jZW9mIEJsb2IgJiYgdHlwZW9mIEZpbGVSZWFkZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcHJvbWlzZSA9IG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZS50YXJnZXQuZXJyb3IpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpbnB1dERhdGEpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiBkYXRhIGlzIGFscmVhZHkgYSBwcm9taXNlLCB0aGlzIGZsYXR0ZW4gaXQuXG4gICAgICAgIHByb21pc2UgPSBleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUoaW5wdXREYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdmFyIGRhdGFUeXBlID0gZXhwb3J0cy5nZXRUeXBlT2YoZGF0YSk7XG5cbiAgICAgICAgaWYgKCFkYXRhVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4dGVybmFsLlByb21pc2UucmVqZWN0KFxuICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcIlRoZSBkYXRhIG9mICdcIiArIG5hbWUgKyBcIicgaXMgaW4gYW4gdW5zdXBwb3J0ZWQgZm9ybWF0ICFcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIDogaXQncyB3YXkgZWFzaWVyIHRvIHdvcmsgd2l0aCBVaW50OEFycmF5IHRoYW4gd2l0aCBBcnJheUJ1ZmZlclxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09IFwiYXJyYXlidWZmZXJcIikge1xuICAgICAgICAgICAgZGF0YSA9IGV4cG9ydHMudHJhbnNmb3JtVG8oXCJ1aW50OGFycmF5XCIsIGRhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBpZiAoaXNCYXNlNjQpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gYmFzZTY0LmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzQmluYXJ5KSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW1pemVkQmluYXJ5U3RyaW5nID09PSB0cnVlIG1lYW5zIHRoYXQgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBmaWx0ZXJlZCB3aXRoIGEgMHhGRiBtYXNrXG4gICAgICAgICAgICAgICAgaWYgKGlzT3B0aW1pemVkQmluYXJ5U3RyaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdHJpbmcsIG5vdCBpbiBhIGJhc2U2NCBmb3JtYXQuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJlIHN1cmUgdGhhdCB0aGlzIGlzIGEgY29ycmVjdCBcImJpbmFyeSBzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3RyaW5nMmJpbmFyeShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlYWRlckZvciA9IHJlcXVpcmUoJy4vcmVhZGVyL3JlYWRlckZvcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHNpZyA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG52YXIgWmlwRW50cnkgPSByZXF1aXJlKCcuL3ppcEVudHJ5Jyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbi8vICBjbGFzcyBaaXBFbnRyaWVzIHt7e1xuLyoqXG4gKiBBbGwgdGhlIGVudHJpZXMgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gbG9hZE9wdGlvbnMgT3B0aW9ucyBmb3IgbG9hZGluZyB0aGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBaaXBFbnRyaWVzKGxvYWRPcHRpb25zKSB7XG4gICAgdGhpcy5maWxlcyA9IFtdO1xuICAgIHRoaXMubG9hZE9wdGlvbnMgPSBsb2FkT3B0aW9ucztcbn1cblppcEVudHJpZXMucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENoZWNrIHRoYXQgdGhlIHJlYWRlciBpcyBvbiB0aGUgc3BlZmljaWVkIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRTaWduYXR1cmUgdGhlIGV4cGVjdGVkIHNpZ25hdHVyZS5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgaXQgaXMgYW4gb3RoZXIgc2lnbmF0dXJlLlxuICAgICAqL1xuICAgIGNoZWNrU2lnbmF0dXJlOiBmdW5jdGlvbihleHBlY3RlZFNpZ25hdHVyZSkge1xuICAgICAgICBpZiAoIXRoaXMucmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZShleHBlY3RlZFNpZ25hdHVyZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZGVyLmluZGV4IC09IDQ7XG4gICAgICAgICAgICB2YXIgc2lnbmF0dXJlID0gdGhpcy5yZWFkZXIucmVhZFN0cmluZyg0KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgb3IgYnVnIDogdW5leHBlY3RlZCBzaWduYXR1cmUgXCIgKyBcIihcIiArIHV0aWxzLnByZXR0eShzaWduYXR1cmUpICsgXCIsIGV4cGVjdGVkIFwiICsgdXRpbHMucHJldHR5KGV4cGVjdGVkU2lnbmF0dXJlKSArIFwiKVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHNpZ25hdHVyZSBpcyBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFza2VkSW5kZXggdGhlIGluZGV4IHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlIHRvIGV4cGVjdC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBzaWduYXR1cmUgaXMgaGVyZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzU2lnbmF0dXJlOiBmdW5jdGlvbihhc2tlZEluZGV4LCBleHBlY3RlZFNpZ25hdHVyZSkge1xuICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gdGhpcy5yZWFkZXIuaW5kZXg7XG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGFza2VkSW5kZXgpO1xuICAgICAgICB2YXIgc2lnbmF0dXJlID0gdGhpcy5yZWFkZXIucmVhZFN0cmluZyg0KTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHNpZ25hdHVyZSA9PT0gZXhwZWN0ZWRTaWduYXR1cmU7XG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGN1cnJlbnRJbmRleCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIHJlYWRCbG9ja0VuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZGlza051bWJlciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHMgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJTaXplID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcblxuICAgICAgICB0aGlzLnppcENvbW1lbnRMZW5ndGggPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAvLyB3YXJuaW5nIDogdGhlIGVuY29kaW5nIGRlcGVuZHMgb2YgdGhlIHN5c3RlbSBsb2NhbGVcbiAgICAgICAgLy8gT24gYSBsaW51eCBtYWNoaW5lIHdpdGggTEFORz1lbl9VUy51dGY4LCB0aGlzIGZpZWxkIGlzIHV0ZjggZW5jb2RlZC5cbiAgICAgICAgLy8gT24gYSB3aW5kb3dzIG1hY2hpbmUsIHRoaXMgZmllbGQgaXMgZW5jb2RlZCB3aXRoIHRoZSBsb2NhbGl6ZWQgd2luZG93cyBjb2RlIHBhZ2UuXG4gICAgICAgIHZhciB6aXBDb21tZW50ID0gdGhpcy5yZWFkZXIucmVhZERhdGEodGhpcy56aXBDb21tZW50TGVuZ3RoKTtcbiAgICAgICAgdmFyIGRlY29kZVBhcmFtVHlwZSA9IHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiO1xuICAgICAgICAvLyBUbyBnZXQgY29uc2lzdGVudCBiZWhhdmlvciB3aXRoIHRoZSBnZW5lcmF0aW9uIHBhcnQsIHdlIHdpbGwgYXNzdW1lIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyB1dGY4IGVuY29kZWQgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UuXG4gICAgICAgIHZhciBkZWNvZGVDb250ZW50ID0gdXRpbHMudHJhbnNmb3JtVG8oZGVjb2RlUGFyYW1UeXBlLCB6aXBDb21tZW50KTtcbiAgICAgICAgdGhpcy56aXBDb21tZW50ID0gdGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShkZWNvZGVDb250ZW50KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiB0aGUgWmlwIDY0IGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqIE5vdCBtZXJnZWQgd2l0aCB0aGUgbWV0aG9kIHJlYWRFbmRPZkNlbnRyYWwgOlxuICAgICAqIFRoZSBlbmQgb2YgY2VudHJhbCBjYW4gY29leGlzdCB3aXRoIGl0cyBaaXA2NCBicm90aGVyLFxuICAgICAqIEkgZG9uJ3Qgd2FudCB0byByZWFkIHRoZSB3cm9uZyBudW1iZXIgb2YgYnl0ZXMgIVxuICAgICAqL1xuICAgIHJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLnJlYWRlci5za2lwKDQpO1xuICAgICAgICAvLyB0aGlzLnZlcnNpb25NYWRlQnkgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDIpO1xuICAgICAgICAvLyB0aGlzLnZlcnNpb25OZWVkZWQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmRpc2tOdW1iZXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2sgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyU2l6ZSA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpck9mZnNldCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG5cbiAgICAgICAgdGhpcy56aXA2NEV4dGVuc2libGVEYXRhID0ge307XG4gICAgICAgIHZhciBleHRyYURhdGFTaXplID0gdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUgLSA0NCxcbiAgICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWU7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGV4dHJhRGF0YVNpemUpIHtcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZSA9IHRoaXMucmVhZGVyLnJlYWREYXRhKGV4dHJhRmllbGRMZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy56aXA2NEV4dGVuc2libGVEYXRhW2V4dHJhRmllbGRJZF0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGV4dHJhRmllbGRWYWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW5kIG9mIHRoZSBaaXAgNjQgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvci5cbiAgICAgKi9cbiAgICByZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmRpc2tXaXRoWmlwNjRDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmRpc2tzQ291bnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICBpZiAodGhpcy5kaXNrc0NvdW50ID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVsdGktdm9sdW1lcyB6aXAgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGxvY2FsIGZpbGVzLCBiYXNlZCBvbiB0aGUgb2Zmc2V0IHJlYWQgaW4gdGhlIGNlbnRyYWwgcGFydC5cbiAgICAgKi9cbiAgICByZWFkTG9jYWxGaWxlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpLCBmaWxlO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbaV07XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChmaWxlLmxvY2FsSGVhZGVyT2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbiAgICAgICAgICAgIGZpbGUucmVhZExvY2FsUGFydCh0aGlzLnJlYWRlcik7XG4gICAgICAgICAgICBmaWxlLmhhbmRsZVVURjgoKTtcbiAgICAgICAgICAgIGZpbGUucHJvY2Vzc0F0dHJpYnV0ZXMoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZENlbnRyYWxEaXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZmlsZTtcblxuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLmNlbnRyYWxEaXJPZmZzZXQpO1xuICAgICAgICB3aGlsZSAodGhpcy5yZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlKHNpZy5DRU5UUkFMX0ZJTEVfSEVBREVSKSkge1xuICAgICAgICAgICAgZmlsZSA9IG5ldyBaaXBFbnRyeSh7XG4gICAgICAgICAgICAgICAgemlwNjQ6IHRoaXMuemlwNjRcbiAgICAgICAgICAgIH0sIHRoaXMubG9hZE9wdGlvbnMpO1xuICAgICAgICAgICAgZmlsZS5yZWFkQ2VudHJhbFBhcnQodGhpcy5yZWFkZXIpO1xuICAgICAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2VudHJhbERpclJlY29yZHMgIT09IHRoaXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jZW50cmFsRGlyUmVjb3JkcyAhPT0gMCAmJiB0aGlzLmZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGV4cGVjdGVkIHNvbWUgcmVjb3JkcyBidXQgY291bGRuJ3QgZmluZCBBTlkuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyByZWFsbHkgc3VzcGljaW91cywgYXMgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCBvciBidWc6IGV4cGVjdGVkIFwiICsgdGhpcy5jZW50cmFsRGlyUmVjb3JkcyArIFwiIHJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdCBcIiArIHRoaXMuZmlsZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgc29tZSByZWNvcmRzIGJ1dCBub3QgYWxsLlxuICAgICAgICAgICAgICAgIC8vIFNvbWV0aGluZyBpcyB3cm9uZyBidXQgd2UgZ290IHNvbWV0aGluZyBmb3IgdGhlIHVzZXI6IG5vIGVycm9yIGhlcmUuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKFwiZXhwZWN0ZWRcIiwgdGhpcy5jZW50cmFsRGlyUmVjb3JkcywgXCJyZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3RcIiwgdGhpcy5maWxlcy5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZEVuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZW50IGlzIGEgdHJ1bmNhdGVkIHppcCBvciBjb21wbGV0ZSBnYXJiYWdlLlxuICAgICAgICAgICAgLy8gQSBcIkxPQ0FMX0ZJTEVfSEVBREVSXCIgaXMgbm90IHJlcXVpcmVkIGF0IHRoZSBiZWdpbm5pbmcgKGF1dG9cbiAgICAgICAgICAgIC8vIGV4dHJhY3RpYmxlIHppcCBmb3IgZXhhbXBsZSkgYnV0IGl0IGNhbiBnaXZlIGEgZ29vZCBoaW50LlxuICAgICAgICAgICAgLy8gSWYgYW4gYWpheCByZXF1ZXN0IHdhcyB1c2VkIHdpdGhvdXQgcmVzcG9uc2VUeXBlLCB3ZSB3aWxsIGFsc29cbiAgICAgICAgICAgIC8vIGdldCB1bnJlYWRhYmxlIGRhdGEuXG4gICAgICAgICAgICB2YXIgaXNHYXJiYWdlID0gIXRoaXMuaXNTaWduYXR1cmUoMCwgc2lnLkxPQ0FMX0ZJTEVfSEVBREVSKTtcblxuICAgICAgICAgICAgaWYgKGlzR2FyYmFnZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IDogaXMgdGhpcyBhIHppcCBmaWxlID8gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklmIGl0IGlzLCBzZWUgaHR0cDovL3N0dWsuZ2l0aHViLmlvL2pzemlwL2RvY3VtZW50YXRpb24vaG93dG8vcmVhZF96aXAuaHRtbFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgob2Zmc2V0KTtcbiAgICAgICAgdmFyIGVuZE9mQ2VudHJhbERpck9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgdGhpcy5yZWFkQmxvY2tFbmRPZkNlbnRyYWwoKTtcblxuXG4gICAgICAgIC8qIGV4dHJhY3QgZnJvbSB0aGUgemlwIHNwZWMgOlxuICAgICAgICAgICAgNCkgIElmIG9uZSBvZiB0aGUgZmllbGRzIGluIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICByZWNvcmQgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVxdWlyZWQgZGF0YSwgdGhlIGZpZWxkXG4gICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNldCB0byAtMSAoMHhGRkZGIG9yIDB4RkZGRkZGRkYpIGFuZCB0aGVcbiAgICAgICAgICAgICAgICBaSVA2NCBmb3JtYXQgcmVjb3JkIHNob3VsZCBiZSBjcmVhdGVkLlxuICAgICAgICAgICAgNSkgIFRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkIGFuZCB0aGVcbiAgICAgICAgICAgICAgICBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciByZWNvcmQgbXVzdFxuICAgICAgICAgICAgICAgIHJlc2lkZSBvbiB0aGUgc2FtZSBkaXNrIHdoZW4gc3BsaXR0aW5nIG9yIHNwYW5uaW5nXG4gICAgICAgICAgICAgICAgYW4gYXJjaGl2ZS5cbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLmRpc2tOdW1iZXIgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLnppcDY0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIFdhcm5pbmcgOiB0aGUgemlwNjQgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZCwgYnV0IE9OTFkgaWYgdGhlIDY0Yml0cyBpbnRlZ2VyIHJlYWQgZnJvbVxuICAgICAgICAgICAgdGhlIHppcCBmaWxlIGNhbiBmaXQgaW50byBhIDMyYml0cyBpbnRlZ2VyLiBUaGlzIGNhbm5vdCBiZSBzb2x2ZWQgOiBKYXZhc2NyaXB0IHJlcHJlc2VudHNcbiAgICAgICAgICAgIGFsbCBudW1iZXJzIGFzIDY0LWJpdCBkb3VibGUgcHJlY2lzaW9uIElFRUUgNzU0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMuXG4gICAgICAgICAgICBTbywgd2UgaGF2ZSA1M2JpdHMgZm9yIGludGVnZXJzIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMgdHJlYXQgZXZlcnl0aGluZyBhcyAzMmJpdHMuXG4gICAgICAgICAgICBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvQml0d2lzZV9PcGVyYXRvcnNcbiAgICAgICAgICAgIGFuZCBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRUNNQS0yNjIucGRmIHNlY3Rpb24gOC41XG4gICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAvLyBzaG91bGQgbG9vayBmb3IgYSB6aXA2NCBFT0NEIGxvY2F0b3JcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKTtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNhbid0IGZpbmQgdGhlIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgob2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3IoKTtcblxuICAgICAgICAgICAgLy8gbm93IHRoZSB6aXA2NCBFT0NEIHJlY29yZFxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2lnbmF0dXJlKHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciwgc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCkpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgbm90IHdoZXJlIGV4cGVjdGVkLlwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY2FuJ3QgZmluZCB0aGUgWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcik7XG4gICAgICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5jZW50cmFsRGlyT2Zmc2V0ICsgdGhpcy5jZW50cmFsRGlyU2l6ZTtcbiAgICAgICAgaWYgKHRoaXMuemlwNjQpIHtcbiAgICAgICAgICAgIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0ICs9IDIwOyAvLyBlbmQgb2YgY2VudHJhbCBkaXIgNjQgbG9jYXRvclxuICAgICAgICAgICAgZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQgKz0gMTIgLyogc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBsZWFkaW5nIDEyIGJ5dGVzICovICsgdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXh0cmFCeXRlcyA9IGVuZE9mQ2VudHJhbERpck9mZnNldCAtIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0O1xuXG4gICAgICAgIGlmIChleHRyYUJ5dGVzID4gMCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKGV4dHJhQnl0ZXMsIFwiZXh0cmEgYnl0ZXMgYXQgYmVnaW5uaW5nIG9yIHdpdGhpbiB6aXBmaWxlXCIpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaWduYXR1cmUoZW5kT2ZDZW50cmFsRGlyT2Zmc2V0LCBzaWcuQ0VOVFJBTF9GSUxFX0hFQURFUikpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgb2Zmc2V0cyBzZWVtIHdyb25nLCBidXQgd2UgaGF2ZSBzb21ldGhpbmcgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuXG4gICAgICAgICAgICAgICAgLy8gU2/igKYgd2Uga2VlcCBpdC5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIG9mZnNldCBpcyB3cm9uZywgdXBkYXRlIHRoZSBcInplcm9cIiBvZiB0aGUgcmVhZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIGlmIGRhdGEgaGFzIGJlZW4gcHJlcGVuZGVkIChjcnggZmlsZXMgZm9yIGV4YW1wbGUpXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkZXIuemVybyA9IGV4dHJhQnl0ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXA6IG1pc3NpbmcgXCIgKyBNYXRoLmFicyhleHRyYUJ5dGVzKSArIFwiIGJ5dGVzLlwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcHJlcGFyZVJlYWRlcjogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlckZvcihkYXRhKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgYSB6aXAgZmlsZSBhbmQgY3JlYXRlIFppcEVudHJpZXMuXG4gICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGJpbmFyeSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgemlwIGZpbGUuXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB0aGlzLnByZXBhcmVSZWFkZXIoZGF0YSk7XG4gICAgICAgIHRoaXMucmVhZEVuZE9mQ2VudHJhbCgpO1xuICAgICAgICB0aGlzLnJlYWRDZW50cmFsRGlyKCk7XG4gICAgICAgIHRoaXMucmVhZExvY2FsRmlsZXMoKTtcbiAgICB9XG59O1xuLy8gfX19IGVuZCBvZiBaaXBFbnRyaWVzXG5tb2R1bGUuZXhwb3J0cyA9IFppcEVudHJpZXM7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVhZGVyRm9yID0gcmVxdWlyZSgnLi9yZWFkZXIvcmVhZGVyRm9yJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgQ29tcHJlc3NlZE9iamVjdCA9IHJlcXVpcmUoJy4vY29tcHJlc3NlZE9iamVjdCcpO1xudmFyIGNyYzMyZm4gPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIGNvbXByZXNzaW9ucyA9IHJlcXVpcmUoJy4vY29tcHJlc3Npb25zJyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuXG52YXIgTUFERV9CWV9ET1MgPSAweDAwO1xudmFyIE1BREVfQllfVU5JWCA9IDB4MDM7XG5cbi8qKlxuICogRmluZCBhIGNvbXByZXNzaW9uIHJlZ2lzdGVyZWQgaW4gSlNaaXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcHJlc3Npb25NZXRob2QgdGhlIG1ldGhvZCBtYWdpYyB0byBmaW5kLlxuICogQHJldHVybiB7T2JqZWN0fG51bGx9IHRoZSBKU1ppcCBjb21wcmVzc2lvbiBvYmplY3QsIG51bGwgaWYgbm9uZSBmb3VuZC5cbiAqL1xudmFyIGZpbmRDb21wcmVzc2lvbiA9IGZ1bmN0aW9uKGNvbXByZXNzaW9uTWV0aG9kKSB7XG4gICAgZm9yICh2YXIgbWV0aG9kIGluIGNvbXByZXNzaW9ucykge1xuICAgICAgICBpZiAoIWNvbXByZXNzaW9ucy5oYXNPd25Qcm9wZXJ0eShtZXRob2QpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHJlc3Npb25zW21ldGhvZF0ubWFnaWMgPT09IGNvbXByZXNzaW9uTWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcHJlc3Npb25zW21ldGhvZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG4vLyBjbGFzcyBaaXBFbnRyeSB7e3tcbi8qKlxuICogQW4gZW50cnkgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9mIHRoZSBjdXJyZW50IGZpbGUuXG4gKiBAcGFyYW0ge09iamVjdH0gbG9hZE9wdGlvbnMgT3B0aW9ucyBmb3IgbG9hZGluZyB0aGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBaaXBFbnRyeShvcHRpb25zLCBsb2FkT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2FkT3B0aW9ucyA9IGxvYWRPcHRpb25zO1xufVxuWmlwRW50cnkucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIHNheSBpZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc0VuY3J5cHRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGJpdCAxIGlzIHNldFxuICAgICAgICByZXR1cm4gKHRoaXMuYml0RmxhZyAmIDB4MDAwMSkgPT09IDB4MDAwMTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIHNheSBpZiB0aGUgZmlsZSBoYXMgdXRmLTggZmlsZW5hbWUvY29tbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBmaWxlbmFtZS9jb21tZW50IGlzIGluIHV0Zi04LCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgdXNlVVRGODogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGJpdCAxMSBpcyBzZXRcbiAgICAgICAgcmV0dXJuICh0aGlzLmJpdEZsYWcgJiAweDA4MDApID09PSAweDA4MDA7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBsb2NhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkTG9jYWxQYXJ0OiBmdW5jdGlvbihyZWFkZXIpIHtcbiAgICAgICAgdmFyIGNvbXByZXNzaW9uLCBsb2NhbEV4dHJhRmllbGRzTGVuZ3RoO1xuXG4gICAgICAgIC8vIHdlIGFscmVhZHkga25vdyBldmVyeXRoaW5nIGZyb20gdGhlIGNlbnRyYWwgZGlyICFcbiAgICAgICAgLy8gSWYgdGhlIGNlbnRyYWwgZGlyIGRhdGEgYXJlIGZhbHNlLCB3ZSBhcmUgZG9vbWVkLlxuICAgICAgICAvLyBPbiB0aGUgYnJpZ2h0IHNpZGUsIHRoZSBsb2NhbCBwYXJ0IGlzIHNjYXJ5ICA6IHppcDY0LCBkYXRhIGRlc2NyaXB0b3JzLCBib3RoLCBldGMuXG4gICAgICAgIC8vIFRoZSBsZXNzIGRhdGEgd2UgZ2V0IGhlcmUsIHRoZSBtb3JlIHJlbGlhYmxlIHRoaXMgc2hvdWxkIGJlLlxuICAgICAgICAvLyBMZXQncyBza2lwIHRoZSB3aG9sZSBoZWFkZXIgYW5kIGRhc2ggdG8gdGhlIGRhdGEgIVxuICAgICAgICByZWFkZXIuc2tpcCgyMik7XG4gICAgICAgIC8vIGluIHNvbWUgemlwIGNyZWF0ZWQgb24gd2luZG93cywgdGhlIGZpbGVuYW1lIHN0b3JlZCBpbiB0aGUgY2VudHJhbCBkaXIgY29udGFpbnMgXFwgaW5zdGVhZCBvZiAvLlxuICAgICAgICAvLyBTdHJhbmdlbHksIHRoZSBmaWxlbmFtZSBoZXJlIGlzIE9LLlxuICAgICAgICAvLyBJIHdvdWxkIGxvdmUgdG8gdHJlYXQgdGhlc2UgemlwIGZpbGVzIGFzIGNvcnJ1cHRlZCAoc2VlIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL0ZBUS5odG1sI2JhY2tzbGFzaGVzXG4gICAgICAgIC8vIG9yIEFQUE5PVEUjNC40LjE3LjEsIFwiQWxsIHNsYXNoZXMgTVVTVCBiZSBmb3J3YXJkIHNsYXNoZXMgJy8nXCIpIGJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2YgYmFkIHppcCBnZW5lcmF0b3JzLi4uXG4gICAgICAgIC8vIFNlYXJjaCBcInVuemlwIG1pc21hdGNoaW5nIFwibG9jYWxcIiBmaWxlbmFtZSBjb250aW51aW5nIHdpdGggXCJjZW50cmFsXCIgZmlsZW5hbWUgdmVyc2lvblwiIG9uXG4gICAgICAgIC8vIHRoZSBpbnRlcm5ldC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSSB0aGluayBJIHNlZSB0aGUgbG9naWMgaGVyZSA6IHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGRpc3BsYXlcbiAgICAgICAgLy8gY29udGVudCBhbmQgdGhlIGxvY2FsIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGV4dHJhY3QgdGhlIGZpbGVzLiBNaXhpbmcgLyBhbmQgXFxcbiAgICAgICAgLy8gbWF5IGJlIHVzZWQgdG8gZGlzcGxheSBcXCB0byB3aW5kb3dzIHVzZXJzIGFuZCB1c2UgLyB3aGVuIGV4dHJhY3RpbmcgdGhlIGZpbGVzLlxuICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIGxlYWQgYWxzbyB0byBzb21lIGlzc3VlcyA6IGh0dHA6Ly9zZWNsaXN0cy5vcmcvZnVsbGRpc2Nsb3N1cmUvMjAwOS9TZXAvMzk0XG4gICAgICAgIHRoaXMuZmlsZU5hbWVMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgbG9jYWxFeHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpOyAvLyBjYW4ndCBiZSBzdXJlIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgY2VudHJhbCBkaXJcbiAgICAgICAgLy8gdGhlIGZpbGVOYW1lIGlzIHN0b3JlZCBhcyBiaW5hcnkgZGF0YSwgdGhlIGhhbmRsZVVURjggbWV0aG9kIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBlbmNvZGluZy5cbiAgICAgICAgdGhpcy5maWxlTmFtZSA9IHJlYWRlci5yZWFkRGF0YSh0aGlzLmZpbGVOYW1lTGVuZ3RoKTtcbiAgICAgICAgcmVhZGVyLnNraXAobG9jYWxFeHRyYUZpZWxkc0xlbmd0aCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3NlZFNpemUgPT09IC0xIHx8IHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZyBvciBjb3JydXB0ZWQgemlwIDogZGlkbid0IGdldCBlbm91Z2ggaW5mb3JtYXRpb25zIGZyb20gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IFwiICsgXCIoY29tcHJlc3NlZFNpemUgPT09IC0xIHx8IHVuY29tcHJlc3NlZFNpemUgPT09IC0xKVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXByZXNzaW9uID0gZmluZENvbXByZXNzaW9uKHRoaXMuY29tcHJlc3Npb25NZXRob2QpO1xuICAgICAgICBpZiAoY29tcHJlc3Npb24gPT09IG51bGwpIHsgLy8gbm8gY29tcHJlc3Npb24gZm91bmRcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjb21wcmVzc2lvbiBcIiArIHV0aWxzLnByZXR0eSh0aGlzLmNvbXByZXNzaW9uTWV0aG9kKSArIFwiIHVua25vd24gKGlubmVyIGZpbGUgOiBcIiArIHV0aWxzLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsIHRoaXMuZmlsZU5hbWUpICsgXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVjb21wcmVzc2VkID0gbmV3IENvbXByZXNzZWRPYmplY3QodGhpcy5jb21wcmVzc2VkU2l6ZSwgdGhpcy51bmNvbXByZXNzZWRTaXplLCB0aGlzLmNyYzMyLCBjb21wcmVzc2lvbiwgcmVhZGVyLnJlYWREYXRhKHRoaXMuY29tcHJlc3NlZFNpemUpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkQ2VudHJhbFBhcnQ6IGZ1bmN0aW9uKHJlYWRlcikge1xuICAgICAgICB0aGlzLnZlcnNpb25NYWRlQnkgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgcmVhZGVyLnNraXAoMik7XG4gICAgICAgIC8vIHRoaXMudmVyc2lvbk5lZWRlZCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmJpdEZsYWcgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5jb21wcmVzc2lvbk1ldGhvZCA9IHJlYWRlci5yZWFkU3RyaW5nKDIpO1xuICAgICAgICB0aGlzLmRhdGUgPSByZWFkZXIucmVhZERhdGUoKTtcbiAgICAgICAgdGhpcy5jcmMzMiA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB2YXIgZmlsZU5hbWVMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5leHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmZpbGVDb21tZW50TGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza051bWJlclN0YXJ0ID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5sb2NhbEhlYWRlck9mZnNldCA9IHJlYWRlci5yZWFkSW50KDQpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzRW5jcnlwdGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuY3J5cHRlZCB6aXAgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aWxsIGJlIHJlYWQgaW4gdGhlIGxvY2FsIHBhcnQsIHNlZSB0aGUgY29tbWVudHMgdGhlcmVcbiAgICAgICAgcmVhZGVyLnNraXAoZmlsZU5hbWVMZW5ndGgpO1xuICAgICAgICB0aGlzLnJlYWRFeHRyYUZpZWxkcyhyZWFkZXIpO1xuICAgICAgICB0aGlzLnBhcnNlWklQNjRFeHRyYUZpZWxkKHJlYWRlcik7XG4gICAgICAgIHRoaXMuZmlsZUNvbW1lbnQgPSByZWFkZXIucmVhZERhdGEodGhpcy5maWxlQ29tbWVudExlbmd0aCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgYW5kIGdldCB0aGUgdW5peC9kb3MgcGVybWlzc2lvbnMuXG4gICAgICovXG4gICAgcHJvY2Vzc0F0dHJpYnV0ZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSBudWxsO1xuICAgICAgICB0aGlzLmRvc1Blcm1pc3Npb25zID0gbnVsbDtcbiAgICAgICAgdmFyIG1hZGVCeSA9IHRoaXMudmVyc2lvbk1hZGVCeSA+PiA4O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgdGhlIERPUyBkaXJlY3RvcnkgZmxhZyBzZXQuXG4gICAgICAgIC8vIFdlIGxvb2sgZm9yIGl0IGluIHRoZSBET1MgYW5kIFVOSVggcGVybWlzc2lvbnNcbiAgICAgICAgLy8gYnV0IHNvbWUgdW5rbm93biBwbGF0Zm9ybSBjb3VsZCBzZXQgaXQgYXMgYSBjb21wYXRpYmlsaXR5IGZsYWcuXG4gICAgICAgIHRoaXMuZGlyID0gdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgwMDEwID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgIGlmKG1hZGVCeSA9PT0gTUFERV9CWV9ET1MpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IDYgYml0cyAoMCB0byA1KVxuICAgICAgICAgICAgdGhpcy5kb3NQZXJtaXNzaW9ucyA9IHRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyAmIDB4M0Y7XG4gICAgICAgIH1cblxuICAgICAgICBpZihtYWRlQnkgPT09IE1BREVfQllfVU5JWCkge1xuICAgICAgICAgICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSAodGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4RkZGRjtcbiAgICAgICAgICAgIC8vIHRoZSBvY3RhbCBwZXJtaXNzaW9ucyBhcmUgaW4gKHRoaXMudW5peFBlcm1pc3Npb25zICYgMHgwMUZGKS50b1N0cmluZyg4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZhaWwgc2FmZSA6IGlmIHRoZSBuYW1lIGVuZHMgd2l0aCBhIC8gaXQgcHJvYmFibHkgbWVhbnMgYSBmb2xkZXJcbiAgICAgICAgaWYgKCF0aGlzLmRpciAmJiB0aGlzLmZpbGVOYW1lU3RyLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgICAgICAgICB0aGlzLmRpciA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgdGhlIFpJUDY0IGV4dHJhIGZpZWxkIGFuZCBtZXJnZSB0aGUgaW5mbyBpbiB0aGUgY3VycmVudCBaaXBFbnRyeS5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICBwYXJzZVpJUDY0RXh0cmFGaWVsZDogZnVuY3Rpb24ocmVhZGVyKSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLmV4dHJhRmllbGRzWzB4MDAwMV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNob3VsZCBiZSBzb21ldGhpbmcsIHByZXBhcmluZyB0aGUgZXh0cmEgcmVhZGVyXG4gICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih0aGlzLmV4dHJhRmllbGRzWzB4MDAwMV0udmFsdWUpO1xuXG4gICAgICAgIC8vIEkgcmVhbGx5IGhvcGUgdGhhdCB0aGVzZSA2NGJpdHMgaW50ZWdlciBjYW4gZml0IGluIDMyIGJpdHMgaW50ZWdlciwgYmVjYXVzZSBqc1xuICAgICAgICAvLyB3b24ndCBsZXQgdXMgaGF2ZSBtb3JlLlxuICAgICAgICBpZiAodGhpcy51bmNvbXByZXNzZWRTaXplID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLnVuY29tcHJlc3NlZFNpemUgPSBleHRyYVJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbXByZXNzZWRTaXplID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gZXh0cmFSZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sb2NhbEhlYWRlck9mZnNldCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUykge1xuICAgICAgICAgICAgdGhpcy5sb2NhbEhlYWRlck9mZnNldCA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGlza051bWJlclN0YXJ0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2tOdW1iZXJTdGFydCA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGNlbnRyYWwgcGFydCBvZiBhIHppcCBmaWxlIGFuZCBhZGQgdGhlIGluZm8gaW4gdGhpcyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRlciB0byB1c2UuXG4gICAgICovXG4gICAgcmVhZEV4dHJhRmllbGRzOiBmdW5jdGlvbihyZWFkZXIpIHtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRlci5pbmRleCArIHRoaXMuZXh0cmFGaWVsZHNMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkSWQsXG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoLFxuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5leHRyYUZpZWxkcykge1xuICAgICAgICAgICAgdGhpcy5leHRyYUZpZWxkcyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHJlYWRlci5pbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgZXh0cmFGaWVsZElkID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWUgPSByZWFkZXIucmVhZERhdGEoZXh0cmFGaWVsZExlbmd0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuZXh0cmFGaWVsZHNbZXh0cmFGaWVsZElkXSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXh0cmFGaWVsZFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBcHBseSBhbiBVVEY4IHRyYW5zZm9ybWF0aW9uIGlmIG5lZWRlZC5cbiAgICAgKi9cbiAgICBoYW5kbGVVVEY4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGRlY29kZVBhcmFtVHlwZSA9IHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiO1xuICAgICAgICBpZiAodGhpcy51c2VVVEY4KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVTdHIgPSB1dGY4LnV0ZjhkZWNvZGUodGhpcy5maWxlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLmZpbGVDb21tZW50U3RyID0gdXRmOC51dGY4ZGVjb2RlKHRoaXMuZmlsZUNvbW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHVwYXRoID0gdGhpcy5maW5kRXh0cmFGaWVsZFVuaWNvZGVQYXRoKCk7XG4gICAgICAgICAgICBpZiAodXBhdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVOYW1lU3RyID0gdXBhdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFTQ0lJIHRleHQgb3IgdW5zdXBwb3J0ZWQgY29kZSBwYWdlXG4gICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lQnl0ZUFycmF5ID0gIHV0aWxzLnRyYW5zZm9ybVRvKGRlY29kZVBhcmFtVHlwZSwgdGhpcy5maWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZVN0ciA9IHRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoZmlsZU5hbWVCeXRlQXJyYXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdWNvbW1lbnQgPSB0aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQoKTtcbiAgICAgICAgICAgIGlmICh1Y29tbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB1Y29tbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQVNDSUkgdGV4dCBvciB1bnN1cHBvcnRlZCBjb2RlIHBhZ2VcbiAgICAgICAgICAgICAgICB2YXIgY29tbWVudEJ5dGVBcnJheSA9ICB1dGlscy50cmFuc2Zvcm1UbyhkZWNvZGVQYXJhbVR5cGUsIHRoaXMuZmlsZUNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB0aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKGNvbW1lbnRCeXRlQXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIHVuaWNvZGUgcGF0aCBkZWNsYXJlZCBpbiB0aGUgZXh0cmEgZmllbGQsIGlmIGFueS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmljb2RlIHBhdGgsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdXBhdGhGaWVsZCA9IHRoaXMuZXh0cmFGaWVsZHNbMHg3MDc1XTtcbiAgICAgICAgaWYgKHVwYXRoRmllbGQpIHtcbiAgICAgICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih1cGF0aEZpZWxkLnZhbHVlKTtcblxuICAgICAgICAgICAgLy8gd3JvbmcgdmVyc2lvblxuICAgICAgICAgICAgaWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGNyYyBvZiB0aGUgZmlsZW5hbWUgY2hhbmdlZCwgdGhpcyBmaWVsZCBpcyBvdXQgb2YgZGF0ZS5cbiAgICAgICAgICAgIGlmIChjcmMzMmZuKHRoaXMuZmlsZU5hbWUpICE9PSBleHRyYVJlYWRlci5yZWFkSW50KDQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1dGY4LnV0ZjhkZWNvZGUoZXh0cmFSZWFkZXIucmVhZERhdGEodXBhdGhGaWVsZC5sZW5ndGggLSA1KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIHVuaWNvZGUgY29tbWVudCBkZWNsYXJlZCBpbiB0aGUgZXh0cmEgZmllbGQsIGlmIGFueS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmljb2RlIGNvbW1lbnQsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdWNvbW1lbnRGaWVsZCA9IHRoaXMuZXh0cmFGaWVsZHNbMHg2Mzc1XTtcbiAgICAgICAgaWYgKHVjb21tZW50RmllbGQpIHtcbiAgICAgICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih1Y29tbWVudEZpZWxkLnZhbHVlKTtcblxuICAgICAgICAgICAgLy8gd3JvbmcgdmVyc2lvblxuICAgICAgICAgICAgaWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGNyYyBvZiB0aGUgY29tbWVudCBjaGFuZ2VkLCB0aGlzIGZpZWxkIGlzIG91dCBvZiBkYXRlLlxuICAgICAgICAgICAgaWYgKGNyYzMyZm4odGhpcy5maWxlQ29tbWVudCkgIT09IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHV0ZjgudXRmOGRlY29kZShleHRyYVJlYWRlci5yZWFkRGF0YSh1Y29tbWVudEZpZWxkLmxlbmd0aCAtIDUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBaaXBFbnRyeTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFN0cmVhbUhlbHBlciA9IHJlcXVpcmUoJy4vc3RyZWFtL1N0cmVhbUhlbHBlcicpO1xudmFyIERhdGFXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhV29ya2VyJyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIENvbXByZXNzZWRPYmplY3QgPSByZXF1aXJlKCcuL2NvbXByZXNzZWRPYmplY3QnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIEEgc2ltcGxlIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlIGluIHRoZSB6aXAgZmlsZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyBvZiB0aGUgZmlsZVxuICovXG52YXIgWmlwT2JqZWN0ID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgb3B0aW9ucykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kaXIgPSBvcHRpb25zLmRpcjtcbiAgICB0aGlzLmRhdGUgPSBvcHRpb25zLmRhdGU7XG4gICAgdGhpcy5jb21tZW50ID0gb3B0aW9ucy5jb21tZW50O1xuICAgIHRoaXMudW5peFBlcm1pc3Npb25zID0gb3B0aW9ucy51bml4UGVybWlzc2lvbnM7XG4gICAgdGhpcy5kb3NQZXJtaXNzaW9ucyA9IG9wdGlvbnMuZG9zUGVybWlzc2lvbnM7XG5cbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl9kYXRhQmluYXJ5ID0gb3B0aW9ucy5iaW5hcnk7XG4gICAgLy8ga2VlcCBvbmx5IHRoZSBjb21wcmVzc2lvblxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgY29tcHJlc3Npb24gOiBvcHRpb25zLmNvbXByZXNzaW9uLFxuICAgICAgICBjb21wcmVzc2lvbk9wdGlvbnMgOiBvcHRpb25zLmNvbXByZXNzaW9uT3B0aW9uc1xuICAgIH07XG59O1xuXG5aaXBPYmplY3QucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBpbnRlcm5hbCBzdHJlYW0gZm9yIHRoZSBjb250ZW50IG9mIHRoaXMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIGVhY2ggY2h1bmsuXG4gICAgICogQHJldHVybiBTdHJlYW1IZWxwZXIgdGhlIHN0cmVhbS5cbiAgICAgKi9cbiAgICBpbnRlcm5hbFN0cmVhbTogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIG91dHB1dFR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhciBhc2tVbmljb2RlU3RyaW5nID0gb3V0cHV0VHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBvdXRwdXRUeXBlID09PSBcInRleHRcIjtcbiAgICAgICAgaWYgKG91dHB1dFR5cGUgPT09IFwiYmluYXJ5c3RyaW5nXCIgfHwgb3V0cHV0VHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBcInN0cmluZ1wiO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9kZWNvbXByZXNzV29ya2VyKCk7XG5cbiAgICAgICAgdmFyIGlzVW5pY29kZVN0cmluZyA9ICF0aGlzLl9kYXRhQmluYXJ5O1xuXG4gICAgICAgIGlmIChpc1VuaWNvZGVTdHJpbmcgJiYgIWFza1VuaWNvZGVTdHJpbmcpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5waXBlKG5ldyB1dGY4LlV0ZjhFbmNvZGVXb3JrZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuaWNvZGVTdHJpbmcgJiYgYXNrVW5pY29kZVN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOERlY29kZVdvcmtlcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU3RyZWFtSGVscGVyKHJlc3VsdCwgb3V0cHV0VHlwZSwgXCJcIik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmUgdGhlIGNvbnRlbnQgaW4gdGhlIGFza2VkIHR5cGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIHJlc3VsdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblVwZGF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCBpbnRlcm5hbCB1cGRhdGUuXG4gICAgICogQHJldHVybiBQcm9taXNlIHRoZSBwcm9taXNlIG9mIHRoZSByZXN1bHQuXG4gICAgICovXG4gICAgYXN5bmM6IGZ1bmN0aW9uICh0eXBlLCBvblVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFN0cmVhbSh0eXBlKS5hY2N1bXVsYXRlKG9uVXBkYXRlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZSB0aGUgY29udGVudCBhcyBhIG5vZGVqcyBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgZWFjaCBjaHVuay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblVwZGF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCBpbnRlcm5hbCB1cGRhdGUuXG4gICAgICogQHJldHVybiBTdHJlYW0gdGhlIHN0cmVhbS5cbiAgICAgKi9cbiAgICBub2RlU3RyZWFtOiBmdW5jdGlvbiAodHlwZSwgb25VcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxTdHJlYW0odHlwZSB8fCBcIm5vZGVidWZmZXJcIikudG9Ob2RlanNTdHJlYW0ob25VcGRhdGUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB3b3JrZXIgZm9yIHRoZSBjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb24gdGhlIGNvbXByZXNzaW9uIG9iamVjdCB0byB1c2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbXByZXNzaW9uT3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBjb21wcmVzc2luZy5cbiAgICAgKiBAcmV0dXJuIFdvcmtlciB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIC8vIF9jb21wcmVzc1dvcmtlcjogZnVuY3Rpb24gKGNvbXByZXNzaW9uLCBjb21wcmVzc2lvbk9wdGlvbnMpIHtcbiAgICAvLyAgICAgaWYgKFxuICAgIC8vICAgICAgICAgdGhpcy5fZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QgJiZcbiAgICAvLyAgICAgICAgIHRoaXMuX2RhdGEuY29tcHJlc3Npb24ubWFnaWMgPT09IGNvbXByZXNzaW9uLm1hZ2ljXG4gICAgLy8gICAgICkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0Q29tcHJlc3NlZFdvcmtlcigpO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTtcbiAgICAvLyAgICAgICAgIGlmKCF0aGlzLl9kYXRhQmluYXJ5KSB7XG4gICAgLy8gICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOEVuY29kZVdvcmtlcigpKTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIHJldHVybiBDb21wcmVzc2VkT2JqZWN0LmNyZWF0ZVdvcmtlckZyb20ocmVzdWx0LCBjb21wcmVzc2lvbiwgY29tcHJlc3Npb25PcHRpb25zKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH0sXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgd29ya2VyIGZvciB0aGUgZGVjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJuIFdvcmtlciB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIF9kZWNvbXByZXNzV29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdldENvbnRlbnRXb3JrZXIoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kYXRhIGluc3RhbmNlb2YgR2VuZXJpY1dvcmtlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGFXb3JrZXIodGhpcy5fZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgcmVtb3ZlZE1ldGhvZHMgPSBbXCJhc1RleHRcIiwgXCJhc0JpbmFyeVwiLCBcImFzTm9kZUJ1ZmZlclwiLCBcImFzVWludDhBcnJheVwiLCBcImFzQXJyYXlCdWZmZXJcIl07XG52YXIgcmVtb3ZlZEZuID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xufTtcblxuZm9yKHZhciBpID0gMDsgaSA8IHJlbW92ZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgWmlwT2JqZWN0LnByb3RvdHlwZVtyZW1vdmVkTWV0aG9kc1tpXV0gPSByZW1vdmVkRm47XG59XG5tb2R1bGUuZXhwb3J0cyA9IFppcE9iamVjdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyByYXdBc2FwIHByb3ZpZGVzIGV2ZXJ5dGhpbmcgd2UgbmVlZCBleGNlcHQgZXhjZXB0aW9uIG1hbmFnZW1lbnQuXG52YXIgcmF3QXNhcCA9IHJlcXVpcmUoXCIuL3Jhd1wiKTtcbi8vIFJhd1Rhc2tzIGFyZSByZWN5Y2xlZCB0byByZWR1Y2UgR0MgY2h1cm4uXG52YXIgZnJlZVRhc2tzID0gW107XG4vLyBXZSBxdWV1ZSBlcnJvcnMgdG8gZW5zdXJlIHRoZXkgYXJlIHRocm93biBpbiByaWdodCBvcmRlciAoRklGTykuXG4vLyBBcnJheS1hcy1xdWV1ZSBpcyBnb29kIGVub3VnaCBoZXJlLCBzaW5jZSB3ZSBhcmUganVzdCBkZWFsaW5nIHdpdGggZXhjZXB0aW9ucy5cbnZhciBwZW5kaW5nRXJyb3JzID0gW107XG52YXIgcmVxdWVzdEVycm9yVGhyb3cgPSByYXdBc2FwLm1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcih0aHJvd0ZpcnN0RXJyb3IpO1xuXG5mdW5jdGlvbiB0aHJvd0ZpcnN0RXJyb3IoKSB7XG4gICAgaWYgKHBlbmRpbmdFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IHBlbmRpbmdFcnJvcnMuc2hpZnQoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2FsbHMgYSB0YXNrIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgcmV0dXJuaW5nLCBpbiBpdHMgb3duIGV2ZW50LCB3aXRoIHByaW9yaXR5XG4gKiBvdmVyIG90aGVyIGV2ZW50cyBsaWtlIGFuaW1hdGlvbiwgcmVmbG93LCBhbmQgcmVwYWludC4gQW4gZXJyb3IgdGhyb3duIGZyb20gYW5cbiAqIGV2ZW50IHdpbGwgbm90IGludGVycnVwdCwgbm9yIGV2ZW4gc3Vic3RhbnRpYWxseSBzbG93IGRvd24gdGhlIHByb2Nlc3Npbmcgb2ZcbiAqIG90aGVyIGV2ZW50cywgYnV0IHdpbGwgYmUgcmF0aGVyIHBvc3Rwb25lZCB0byBhIGxvd2VyIHByaW9yaXR5IGV2ZW50LlxuICogQHBhcmFtIHt7Y2FsbH19IHRhc2sgQSBjYWxsYWJsZSBvYmplY3QsIHR5cGljYWxseSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm9cbiAqIGFyZ3VtZW50cy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBhc2FwO1xuZnVuY3Rpb24gYXNhcCh0YXNrKSB7XG4gICAgdmFyIHJhd1Rhc2s7XG4gICAgaWYgKGZyZWVUYXNrcy5sZW5ndGgpIHtcbiAgICAgICAgcmF3VGFzayA9IGZyZWVUYXNrcy5wb3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByYXdUYXNrID0gbmV3IFJhd1Rhc2soKTtcbiAgICB9XG4gICAgcmF3VGFzay50YXNrID0gdGFzaztcbiAgICByYXdBc2FwKHJhd1Rhc2spO1xufVxuXG4vLyBXZSB3cmFwIHRhc2tzIHdpdGggcmVjeWNsYWJsZSB0YXNrIG9iamVjdHMuICBBIHRhc2sgb2JqZWN0IGltcGxlbWVudHNcbi8vIGBjYWxsYCwganVzdCBsaWtlIGEgZnVuY3Rpb24uXG5mdW5jdGlvbiBSYXdUYXNrKCkge1xuICAgIHRoaXMudGFzayA9IG51bGw7XG59XG5cbi8vIFRoZSBzb2xlIHB1cnBvc2Ugb2Ygd3JhcHBpbmcgdGhlIHRhc2sgaXMgdG8gY2F0Y2ggdGhlIGV4Y2VwdGlvbiBhbmQgcmVjeWNsZVxuLy8gdGhlIHRhc2sgb2JqZWN0IGFmdGVyIGl0cyBzaW5nbGUgdXNlLlxuUmF3VGFzay5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICB0aGlzLnRhc2suY2FsbCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChhc2FwLm9uZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaG9vayBleGlzdHMgcHVyZWx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgICAgICAgICAgLy8gSXRzIG5hbWUgd2lsbCBiZSBwZXJpb2RpY2FsbHkgcmFuZG9taXplZCB0byBicmVhayBhbnkgY29kZSB0aGF0XG4gICAgICAgICAgICAvLyBkZXBlbmRzIG9uIGl0cyBleGlzdGVuY2UuXG4gICAgICAgICAgICBhc2FwLm9uZXJyb3IoZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSW4gYSB3ZWIgYnJvd3NlciwgZXhjZXB0aW9ucyBhcmUgbm90IGZhdGFsLiBIb3dldmVyLCB0byBhdm9pZFxuICAgICAgICAgICAgLy8gc2xvd2luZyBkb3duIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIHRhc2tzLCB3ZSByZXRocm93IHRoZSBlcnJvciBpbiBhXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB0dXJuLlxuICAgICAgICAgICAgcGVuZGluZ0Vycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICAgIHJlcXVlc3RFcnJvclRocm93KCk7XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnRhc2sgPSBudWxsO1xuICAgICAgICBmcmVlVGFza3NbZnJlZVRhc2tzLmxlbmd0aF0gPSB0aGlzO1xuICAgIH1cbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gVXNlIHRoZSBmYXN0ZXN0IG1lYW5zIHBvc3NpYmxlIHRvIGV4ZWN1dGUgYSB0YXNrIGluIGl0cyBvd24gdHVybiwgd2l0aFxuLy8gcHJpb3JpdHkgb3ZlciBvdGhlciBldmVudHMgaW5jbHVkaW5nIElPLCBhbmltYXRpb24sIHJlZmxvdywgYW5kIHJlZHJhd1xuLy8gZXZlbnRzIGluIGJyb3dzZXJzLlxuLy9cbi8vIEFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYSB0YXNrIHdpbGwgcGVybWFuZW50bHkgaW50ZXJydXB0IHRoZSBwcm9jZXNzaW5nIG9mXG4vLyBzdWJzZXF1ZW50IHRhc2tzLiBUaGUgaGlnaGVyIGxldmVsIGBhc2FwYCBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgaWYgYW5cbi8vIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgYSB0YXNrLCB0aGF0IHRoZSB0YXNrIHF1ZXVlIHdpbGwgY29udGludWUgZmx1c2hpbmcgYXNcbi8vIHNvb24gYXMgcG9zc2libGUsIGJ1dCBpZiB5b3UgdXNlIGByYXdBc2FwYCBkaXJlY3RseSwgeW91IGFyZSByZXNwb25zaWJsZSB0b1xuLy8gZWl0aGVyIGVuc3VyZSB0aGF0IG5vIGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHlvdXIgdGFzaywgb3IgdG8gbWFudWFsbHlcbi8vIGNhbGwgYHJhd0FzYXAucmVxdWVzdEZsdXNoYCBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLlxubW9kdWxlLmV4cG9ydHMgPSByYXdBc2FwO1xuZnVuY3Rpb24gcmF3QXNhcCh0YXNrKSB7XG4gICAgaWYgKCFxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmVxdWVzdEZsdXNoKCk7XG4gICAgICAgIGZsdXNoaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRXF1aXZhbGVudCB0byBwdXNoLCBidXQgYXZvaWRzIGEgZnVuY3Rpb24gY2FsbC5cbiAgICBxdWV1ZVtxdWV1ZS5sZW5ndGhdID0gdGFzaztcbn1cblxudmFyIHF1ZXVlID0gW107XG4vLyBPbmNlIGEgZmx1c2ggaGFzIGJlZW4gcmVxdWVzdGVkLCBubyBmdXJ0aGVyIGNhbGxzIHRvIGByZXF1ZXN0Rmx1c2hgIGFyZVxuLy8gbmVjZXNzYXJ5IHVudGlsIHRoZSBuZXh0IGBmbHVzaGAgY29tcGxldGVzLlxudmFyIGZsdXNoaW5nID0gZmFsc2U7XG4vLyBgcmVxdWVzdEZsdXNoYCBpcyBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBtZXRob2QgdGhhdCBhdHRlbXB0cyB0byBraWNrXG4vLyBvZmYgYSBgZmx1c2hgIGV2ZW50IGFzIHF1aWNrbHkgYXMgcG9zc2libGUuIGBmbHVzaGAgd2lsbCBhdHRlbXB0IHRvIGV4aGF1c3Rcbi8vIHRoZSBldmVudCBxdWV1ZSBiZWZvcmUgeWllbGRpbmcgdG8gdGhlIGJyb3dzZXIncyBvd24gZXZlbnQgbG9vcC5cbnZhciByZXF1ZXN0Rmx1c2g7XG4vLyBUaGUgcG9zaXRpb24gb2YgdGhlIG5leHQgdGFzayB0byBleGVjdXRlIGluIHRoZSB0YXNrIHF1ZXVlLiBUaGlzIGlzXG4vLyBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0byBgZmx1c2hgIHNvIHRoYXQgaXQgY2FuIGJlIHJlc3VtZWQgaWZcbi8vIGEgdGFzayB0aHJvd3MgYW4gZXhjZXB0aW9uLlxudmFyIGluZGV4ID0gMDtcbi8vIElmIGEgdGFzayBzY2hlZHVsZXMgYWRkaXRpb25hbCB0YXNrcyByZWN1cnNpdmVseSwgdGhlIHRhc2sgcXVldWUgY2FuIGdyb3dcbi8vIHVuYm91bmRlZC4gVG8gcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvbiwgdGhlIHRhc2sgcXVldWUgd2lsbCBwZXJpb2RpY2FsbHlcbi8vIHRydW5jYXRlIGFscmVhZHktY29tcGxldGVkIHRhc2tzLlxudmFyIGNhcGFjaXR5ID0gMTAyNDtcblxuLy8gVGhlIGZsdXNoIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbGwgdGFza3MgdGhhdCBoYXZlIGJlZW4gc2NoZWR1bGVkIHdpdGhcbi8vIGByYXdBc2FwYCB1bmxlc3MgYW5kIHVudGlsIG9uZSBvZiB0aG9zZSB0YXNrcyB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuLy8gSWYgYSB0YXNrIHRocm93cyBhbiBleGNlcHRpb24sIGBmbHVzaGAgZW5zdXJlcyB0aGF0IGl0cyBzdGF0ZSB3aWxsIHJlbWFpblxuLy8gY29uc2lzdGVudCBhbmQgd2lsbCByZXN1bWUgd2hlcmUgaXQgbGVmdCBvZmYgd2hlbiBjYWxsZWQgYWdhaW4uXG4vLyBIb3dldmVyLCBgZmx1c2hgIGRvZXMgbm90IG1ha2UgYW55IGFycmFuZ2VtZW50cyB0byBiZSBjYWxsZWQgYWdhaW4gaWYgYW5cbi8vIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG5mdW5jdGlvbiBmbHVzaCgpIHtcbiAgICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IGluZGV4O1xuICAgICAgICAvLyBBZHZhbmNlIHRoZSBpbmRleCBiZWZvcmUgY2FsbGluZyB0aGUgdGFzay4gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbFxuICAgICAgICAvLyBiZWdpbiBmbHVzaGluZyBvbiB0aGUgbmV4dCB0YXNrIHRoZSB0YXNrIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgaW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIHF1ZXVlW2N1cnJlbnRJbmRleF0uY2FsbCgpO1xuICAgICAgICAvLyBQcmV2ZW50IGxlYWtpbmcgbWVtb3J5IGZvciBsb25nIGNoYWlucyBvZiByZWN1cnNpdmUgY2FsbHMgdG8gYGFzYXBgLlxuICAgICAgICAvLyBJZiB3ZSBjYWxsIGBhc2FwYCB3aXRoaW4gdGFza3Mgc2NoZWR1bGVkIGJ5IGBhc2FwYCwgdGhlIHF1ZXVlIHdpbGxcbiAgICAgICAgLy8gZ3JvdywgYnV0IHRvIGF2b2lkIGFuIE8obikgd2FsayBmb3IgZXZlcnkgdGFzayB3ZSBleGVjdXRlLCB3ZSBkb24ndFxuICAgICAgICAvLyBzaGlmdCB0YXNrcyBvZmYgdGhlIHF1ZXVlIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGV4ZWN1dGVkLlxuICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBwZXJpb2RpY2FsbHkgc2hpZnQgMTAyNCB0YXNrcyBvZmYgdGhlIHF1ZXVlLlxuICAgICAgICBpZiAoaW5kZXggPiBjYXBhY2l0eSkge1xuICAgICAgICAgICAgLy8gTWFudWFsbHkgc2hpZnQgYWxsIHZhbHVlcyBzdGFydGluZyBhdCB0aGUgaW5kZXggYmFjayB0byB0aGVcbiAgICAgICAgICAgIC8vIGJlZ2lubmluZyBvZiB0aGUgcXVldWUuXG4gICAgICAgICAgICBmb3IgKHZhciBzY2FuID0gMCwgbmV3TGVuZ3RoID0gcXVldWUubGVuZ3RoIC0gaW5kZXg7IHNjYW4gPCBuZXdMZW5ndGg7IHNjYW4rKykge1xuICAgICAgICAgICAgICAgIHF1ZXVlW3NjYW5dID0gcXVldWVbc2NhbiArIGluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlLmxlbmd0aCAtPSBpbmRleDtcbiAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgIGluZGV4ID0gMDtcbiAgICBmbHVzaGluZyA9IGZhbHNlO1xufVxuXG4vLyBgcmVxdWVzdEZsdXNoYCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHN0cmF0ZWd5IGJhc2VkIG9uIGRhdGEgY29sbGVjdGVkIGZyb21cbi8vIGV2ZXJ5IGF2YWlsYWJsZSBTYXVjZUxhYnMgU2VsZW5pdW0gd2ViIGRyaXZlciB3b3JrZXIgYXQgdGltZSBvZiB3cml0aW5nLlxuLy8gaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMW1HLTVVWUd1cDVxeEdkRU1Xa2hQNkJXQ3owNTNOVWIyRTFRb1VUVTE2dUEvZWRpdCNnaWQ9NzgzNzI0NTkzXG5cbi8vIFNhZmFyaSA2IGFuZCA2LjEgZm9yIGRlc2t0b3AsIGlQYWQsIGFuZCBpUGhvbmUgYXJlIHRoZSBvbmx5IGJyb3dzZXJzIHRoYXRcbi8vIGhhdmUgV2ViS2l0TXV0YXRpb25PYnNlcnZlciBidXQgbm90IHVuLXByZWZpeGVkIE11dGF0aW9uT2JzZXJ2ZXIuXG4vLyBNdXN0IHVzZSBgZ2xvYmFsYCBvciBgc2VsZmAgaW5zdGVhZCBvZiBgd2luZG93YCB0byB3b3JrIGluIGJvdGggZnJhbWVzIGFuZCB3ZWJcbi8vIHdvcmtlcnMuIGBnbG9iYWxgIGlzIGEgcHJvdmlzaW9uIG9mIEJyb3dzZXJpZnksIE1yLCBNcnMsIG9yIE1vcC5cblxuLyogZ2xvYmFscyBzZWxmICovXG52YXIgc2NvcGUgPSB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogc2VsZjtcbnZhciBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IHNjb3BlLk11dGF0aW9uT2JzZXJ2ZXIgfHwgc2NvcGUuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuLy8gTXV0YXRpb25PYnNlcnZlcnMgYXJlIGRlc2lyYWJsZSBiZWNhdXNlIHRoZXkgaGF2ZSBoaWdoIHByaW9yaXR5IGFuZCB3b3JrXG4vLyByZWxpYWJseSBldmVyeXdoZXJlIHRoZXkgYXJlIGltcGxlbWVudGVkLlxuLy8gVGhleSBhcmUgaW1wbGVtZW50ZWQgaW4gYWxsIG1vZGVybiBicm93c2Vycy5cbi8vXG4vLyAtIEFuZHJvaWQgNC00LjNcbi8vIC0gQ2hyb21lIDI2LTM0XG4vLyAtIEZpcmVmb3ggMTQtMjlcbi8vIC0gSW50ZXJuZXQgRXhwbG9yZXIgMTFcbi8vIC0gaVBhZCBTYWZhcmkgNi03LjFcbi8vIC0gaVBob25lIFNhZmFyaSA3LTcuMVxuLy8gLSBTYWZhcmkgNi03XG5pZiAodHlwZW9mIEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXF1ZXN0Rmx1c2ggPSBtYWtlUmVxdWVzdENhbGxGcm9tTXV0YXRpb25PYnNlcnZlcihmbHVzaCk7XG5cbi8vIE1lc3NhZ2VDaGFubmVscyBhcmUgZGVzaXJhYmxlIGJlY2F1c2UgdGhleSBnaXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIEhUTUxcbi8vIHRhc2sgcXVldWUsIGFyZSBpbXBsZW1lbnRlZCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMCwgU2FmYXJpIDUuMC0xLCBhbmQgT3BlcmFcbi8vIDExLTEyLCBhbmQgaW4gd2ViIHdvcmtlcnMgaW4gbWFueSBlbmdpbmVzLlxuLy8gQWx0aG91Z2ggbWVzc2FnZSBjaGFubmVscyB5aWVsZCB0byBhbnkgcXVldWVkIHJlbmRlcmluZyBhbmQgSU8gdGFza3MsIHRoZXlcbi8vIHdvdWxkIGJlIGJldHRlciB0aGFuIGltcG9zaW5nIHRoZSA0bXMgZGVsYXkgb2YgdGltZXJzLlxuLy8gSG93ZXZlciwgdGhleSBkbyBub3Qgd29yayByZWxpYWJseSBpbiBJbnRlcm5ldCBFeHBsb3JlciBvciBTYWZhcmkuXG5cbi8vIEludGVybmV0IEV4cGxvcmVyIDEwIGlzIHRoZSBvbmx5IGJyb3dzZXIgdGhhdCBoYXMgc2V0SW1tZWRpYXRlIGJ1dCBkb2VzXG4vLyBub3QgaGF2ZSBNdXRhdGlvbk9ic2VydmVycy5cbi8vIEFsdGhvdWdoIHNldEltbWVkaWF0ZSB5aWVsZHMgdG8gdGhlIGJyb3dzZXIncyByZW5kZXJlciwgaXQgd291bGQgYmVcbi8vIHByZWZlcnJhYmxlIHRvIGZhbGxpbmcgYmFjayB0byBzZXRUaW1lb3V0IHNpbmNlIGl0IGRvZXMgbm90IGhhdmVcbi8vIHRoZSBtaW5pbXVtIDRtcyBwZW5hbHR5LlxuLy8gVW5mb3J0dW5hdGVseSB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgYnVnIGluIEludGVybmV0IEV4cGxvcmVyIDEwIE1vYmlsZSAoYW5kXG4vLyBEZXNrdG9wIHRvIGEgbGVzc2VyIGV4dGVudCkgdGhhdCByZW5kZXJzIGJvdGggc2V0SW1tZWRpYXRlIGFuZFxuLy8gTWVzc2FnZUNoYW5uZWwgdXNlbGVzcyBmb3IgdGhlIHB1cnBvc2VzIG9mIEFTQVAuXG4vLyBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL3EvaXNzdWVzLzM5NlxuXG4vLyBUaW1lcnMgYXJlIGltcGxlbWVudGVkIHVuaXZlcnNhbGx5LlxuLy8gV2UgZmFsbCBiYWNrIHRvIHRpbWVycyBpbiB3b3JrZXJzIGluIG1vc3QgZW5naW5lcywgYW5kIGluIGZvcmVncm91bmRcbi8vIGNvbnRleHRzIGluIHRoZSBmb2xsb3dpbmcgYnJvd3NlcnMuXG4vLyBIb3dldmVyLCBub3RlIHRoYXQgZXZlbiB0aGlzIHNpbXBsZSBjYXNlIHJlcXVpcmVzIG51YW5jZXMgdG8gb3BlcmF0ZSBpbiBhXG4vLyBicm9hZCBzcGVjdHJ1bSBvZiBicm93c2Vycy5cbi8vXG4vLyAtIEZpcmVmb3ggMy0xM1xuLy8gLSBJbnRlcm5ldCBFeHBsb3JlciA2LTlcbi8vIC0gaVBhZCBTYWZhcmkgNC4zXG4vLyAtIEx5bnggMi44Ljdcbn0gZWxzZSB7XG4gICAgcmVxdWVzdEZsdXNoID0gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKGZsdXNoKTtcbn1cblxuLy8gYHJlcXVlc3RGbHVzaGAgcmVxdWVzdHMgdGhhdCB0aGUgaGlnaCBwcmlvcml0eSBldmVudCBxdWV1ZSBiZSBmbHVzaGVkIGFzXG4vLyBzb29uIGFzIHBvc3NpYmxlLlxuLy8gVGhpcyBpcyB1c2VmdWwgdG8gcHJldmVudCBhbiBlcnJvciB0aHJvd24gaW4gYSB0YXNrIGZyb20gc3RhbGxpbmcgdGhlIGV2ZW50XG4vLyBxdWV1ZSBpZiB0aGUgZXhjZXB0aW9uIGhhbmRsZWQgYnkgTm9kZS5qc+KAmXNcbi8vIGBwcm9jZXNzLm9uKFwidW5jYXVnaHRFeGNlcHRpb25cIilgIG9yIGJ5IGEgZG9tYWluLlxucmF3QXNhcC5yZXF1ZXN0Rmx1c2ggPSByZXF1ZXN0Rmx1c2g7XG5cbi8vIFRvIHJlcXVlc3QgYSBoaWdoIHByaW9yaXR5IGV2ZW50LCB3ZSBpbmR1Y2UgYSBtdXRhdGlvbiBvYnNlcnZlciBieSB0b2dnbGluZ1xuLy8gdGhlIHRleHQgb2YgYSB0ZXh0IG5vZGUgYmV0d2VlbiBcIjFcIiBhbmQgXCItMVwiLlxuZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbU11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spIHtcbiAgICB2YXIgdG9nZ2xlID0gMTtcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7Y2hhcmFjdGVyRGF0YTogdHJ1ZX0pO1xuICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAgICAgICAgdG9nZ2xlID0gLXRvZ2dsZTtcbiAgICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlO1xuICAgIH07XG59XG5cbi8vIFRoZSBtZXNzYWdlIGNoYW5uZWwgdGVjaG5pcXVlIHdhcyBkaXNjb3ZlcmVkIGJ5IE1hbHRlIFVibCBhbmQgd2FzIHRoZVxuLy8gb3JpZ2luYWwgZm91bmRhdGlvbiBmb3IgdGhpcyBsaWJyYXJ5LlxuLy8gaHR0cDovL3d3dy5ub25ibG9ja2luZy5pby8yMDExLzA2L3dpbmRvd25leHR0aWNrLmh0bWxcblxuLy8gU2FmYXJpIDYuMC41IChhdCBsZWFzdCkgaW50ZXJtaXR0ZW50bHkgZmFpbHMgdG8gY3JlYXRlIG1lc3NhZ2UgcG9ydHMgb24gYVxuLy8gcGFnZSdzIGZpcnN0IGxvYWQuIFRoYW5rZnVsbHksIHRoaXMgdmVyc2lvbiBvZiBTYWZhcmkgc3VwcG9ydHNcbi8vIE11dGF0aW9uT2JzZXJ2ZXJzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGZhbGwgYmFjayBpbiB0aGF0IGNhc2UuXG5cbi8vIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21NZXNzYWdlQ2hhbm5lbChjYWxsYmFjaykge1xuLy8gICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4vLyAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbi8vICAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4vLyAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4vLyAgICAgfTtcbi8vIH1cblxuLy8gRm9yIHJlYXNvbnMgZXhwbGFpbmVkIGFib3ZlLCB3ZSBhcmUgYWxzbyB1bmFibGUgdG8gdXNlIGBzZXRJbW1lZGlhdGVgXG4vLyB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcy5cbi8vIEV2ZW4gaWYgd2Ugd2VyZSwgdGhlcmUgaXMgYW5vdGhlciBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAuXG4vLyBJdCBpcyBub3Qgc3VmZmljaWVudCB0byBhc3NpZ24gYHNldEltbWVkaWF0ZWAgdG8gYHJlcXVlc3RGbHVzaGAgYmVjYXVzZVxuLy8gYHNldEltbWVkaWF0ZWAgbXVzdCBiZSBjYWxsZWQgKmJ5IG5hbWUqIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSB3cmFwcGVkIGluIGFcbi8vIGNsb3N1cmUuXG4vLyBOZXZlciBmb3JnZXQuXG5cbi8vIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21TZXRJbW1lZGlhdGUoY2FsbGJhY2spIHtcbi8vICAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4vLyAgICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4vLyAgICAgfTtcbi8vIH1cblxuLy8gU2FmYXJpIDYuMCBoYXMgYSBwcm9ibGVtIHdoZXJlIHRpbWVycyB3aWxsIGdldCBsb3N0IHdoaWxlIHRoZSB1c2VyIGlzXG4vLyBzY3JvbGxpbmcuIFRoaXMgcHJvYmxlbSBkb2VzIG5vdCBpbXBhY3QgQVNBUCBiZWNhdXNlIFNhZmFyaSA2LjAgc3VwcG9ydHNcbi8vIG11dGF0aW9uIG9ic2VydmVycywgc28gdGhhdCBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIGluc3RlYWQuXG4vLyBIb3dldmVyLCBpZiB3ZSBldmVyIGVsZWN0IHRvIHVzZSB0aW1lcnMgaW4gU2FmYXJpLCB0aGUgcHJldmFsZW50IHdvcmstYXJvdW5kXG4vLyBpcyB0byBhZGQgYSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIgdGhhdCBjYWxscyBmb3IgYSBmbHVzaC5cblxuLy8gYHNldFRpbWVvdXRgIGRvZXMgbm90IGNhbGwgdGhlIHBhc3NlZCBjYWxsYmFjayBpZiB0aGUgZGVsYXkgaXMgbGVzcyB0aGFuXG4vLyBhcHByb3hpbWF0ZWx5IDcgaW4gd2ViIHdvcmtlcnMgaW4gRmlyZWZveCA4IHRocm91Z2ggMTgsIGFuZCBzb21ldGltZXMgbm90XG4vLyBldmVuIHRoZW4uXG5cbmZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcihjYWxsYmFjaykge1xuICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAgICAgICAgLy8gV2UgZGlzcGF0Y2ggYSB0aW1lb3V0IHdpdGggYSBzcGVjaWZpZWQgZGVsYXkgb2YgMCBmb3IgZW5naW5lcyB0aGF0XG4gICAgICAgIC8vIGNhbiByZWxpYWJseSBhY2NvbW1vZGF0ZSB0aGF0IHJlcXVlc3QuIFRoaXMgd2lsbCB1c3VhbGx5IGJlIHNuYXBwZWRcbiAgICAgICAgLy8gdG8gYSA0IG1pbGlzZWNvbmQgZGVsYXksIGJ1dCBvbmNlIHdlJ3JlIGZsdXNoaW5nLCB0aGVyZSdzIG5vIGRlbGF5XG4gICAgICAgIC8vIGJldHdlZW4gZXZlbnRzLlxuICAgICAgICB2YXIgdGltZW91dEhhbmRsZSA9IHNldFRpbWVvdXQoaGFuZGxlVGltZXIsIDApO1xuICAgICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGlzIHRpbWVyIGdldHMgZnJlcXVlbnRseSBkcm9wcGVkIGluIEZpcmVmb3hcbiAgICAgICAgLy8gd29ya2Vycywgd2UgZW5saXN0IGFuIGludGVydmFsIGhhbmRsZSB0aGF0IHdpbGwgdHJ5IHRvIGZpcmVcbiAgICAgICAgLy8gYW4gZXZlbnQgMjAgdGltZXMgcGVyIHNlY29uZCB1bnRpbCBpdCBzdWNjZWVkcy5cbiAgICAgICAgdmFyIGludGVydmFsSGFuZGxlID0gc2V0SW50ZXJ2YWwoaGFuZGxlVGltZXIsIDUwKTtcblxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVUaW1lcigpIHtcbiAgICAgICAgICAgIC8vIFdoaWNoZXZlciB0aW1lciBzdWNjZWVkcyB3aWxsIGNhbmNlbCBib3RoIHRpbWVycyBhbmRcbiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIGNhbGxiYWNrLlxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbEhhbmRsZSk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLy8gVGhpcyBpcyBmb3IgYGFzYXAuanNgIG9ubHkuXG4vLyBJdHMgbmFtZSB3aWxsIGJlIHBlcmlvZGljYWxseSByYW5kb21pemVkIHRvIGJyZWFrIGFueSBjb2RlIHRoYXQgZGVwZW5kcyBvblxuLy8gaXRzIGV4aXN0ZW5jZS5cbnJhd0FzYXAubWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyID0gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyO1xuXG4vLyBBU0FQIHdhcyBvcmlnaW5hbGx5IGEgbmV4dFRpY2sgc2hpbSBpbmNsdWRlZCBpbiBRLiBUaGlzIHdhcyBmYWN0b3JlZCBvdXRcbi8vIGludG8gdGhpcyBBU0FQIHBhY2thZ2UuIEl0IHdhcyBsYXRlciBhZGFwdGVkIHRvIFJTVlAgd2hpY2ggbWFkZSBmdXJ0aGVyXG4vLyBhbWVuZG1lbnRzLiBUaGVzZSBkZWNpc2lvbnMsIHBhcnRpY3VsYXJseSB0byBtYXJnaW5hbGl6ZSBNZXNzYWdlQ2hhbm5lbCBhbmRcbi8vIHRvIGNhcHR1cmUgdGhlIE11dGF0aW9uT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24gaW4gYSBjbG9zdXJlLCB3ZXJlIGludGVncmF0ZWRcbi8vIGJhY2sgaW50byBBU0FQIHByb3Blci5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL3JzdnAuanMvYmxvYi9jZGRmNzIzMjU0NmE5Y2Y4NTg1MjRiNzVjZGU2ZjllZGY3MjYyMGE3L2xpYi9yc3ZwL2FzYXAuanNcbiIsIi8vIFRvcCBsZXZlbCBmaWxlIGlzIGp1c3QgYSBtaXhpbiBvZiBzdWJtb2R1bGVzICYgY29uc3RhbnRzXG4ndXNlIHN0cmljdCc7XG5cbnZhciBhc3NpZ24gICAgPSByZXF1aXJlKCcuL2xpYi91dGlscy9jb21tb24nKS5hc3NpZ247XG5cbnZhciBkZWZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9kZWZsYXRlJyk7XG52YXIgaW5mbGF0ZSAgID0gcmVxdWlyZSgnLi9saWIvaW5mbGF0ZScpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vbGliL3psaWIvY29uc3RhbnRzJyk7XG5cbnZhciBwYWtvID0ge307XG5cbmFzc2lnbihwYWtvLCBkZWZsYXRlLCBpbmZsYXRlLCBjb25zdGFudHMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBha287XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHpsaWJfZGVmbGF0ZSA9IHJlcXVpcmUoJy4vemxpYi9kZWZsYXRlJyk7XG52YXIgdXRpbHMgICAgICAgID0gcmVxdWlyZSgnLi91dGlscy9jb21tb24nKTtcbnZhciBzdHJpbmdzICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL3N0cmluZ3MnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcblxudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbnZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuXG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cbnZhciBaX0RFRkFVTFRfU1RSQVRFR1kgICAgPSAwO1xuXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qKlxuICogY2xhc3MgRGVmbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2RlZmxhdGVdXSxcbiAqIFtbZGVmbGF0ZVJhd11dIGFuZCBbW2d6aXBdXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIERlZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0RlZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRlbi5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5XG4gKlxuICogQ29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbRGVmbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbRGVmbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pICBvciBpZiB5b3VcbiAqIHB1c2ggYSBjaHVuayB3aXRoIGV4cGxpY2l0IGZsdXNoIChjYWxsIFtbRGVmbGF0ZSNwdXNoXV0gd2l0aFxuICogYFpfU1lOQ19GTFVTSGAgcGFyYW0pLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUuZXJyIC0+IE51bWJlclxuICpcbiAqIEVycm9yIGNvZGUgYWZ0ZXIgZGVmbGF0ZSBmaW5pc2hlZC4gMCAoWl9PSykgb24gc3VjY2Vzcy5cbiAqIFlvdSB3aWxsIG5vdCBuZWVkIGl0IGluIHJlYWwgbGlmZSwgYmVjYXVzZSBkZWZsYXRlIGVycm9yc1xuICogYXJlIHBvc3NpYmxlIG9ubHkgb24gd3Jvbmcgb3B0aW9ucyBvciBiYWQgYG9uRGF0YWAgLyBgb25FbmRgXG4gKiBjdXN0b20gaGFuZGxlcnMuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tEZWZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBEZWZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGRlZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgbGV2ZWxgXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgbWVtTGV2ZWxgXG4gKiAtIGBzdHJhdGVneWBcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGRlZmxhdGVcbiAqIC0gYGd6aXBgIChCb29sZWFuKSAtIGNyZWF0ZSBnemlwIHdyYXBwZXJcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIFwiYmluYXJ5IHN0cmluZ1wiXG4gKiAgICAoZWFjaCBjaGFyIGNvZGUgWzAuLjI1NV0pXG4gKiAtIGBoZWFkZXJgIChPYmplY3QpIC0gY3VzdG9tIGhlYWRlciBmb3IgZ3ppcFxuICogICAtIGB0ZXh0YCAoQm9vbGVhbikgLSB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0XG4gKiAgIC0gYHRpbWVgIChOdW1iZXIpIC0gbW9kaWZpY2F0aW9uIHRpbWUsIHVuaXggdGltZXN0YW1wXG4gKiAgIC0gYG9zYCAoTnVtYmVyKSAtIG9wZXJhdGlvbiBzeXN0ZW0gY29kZVxuICogICAtIGBleHRyYWAgKEFycmF5KSAtIGFycmF5IG9mIGJ5dGVzIHdpdGggZXh0cmEgZGF0YSAobWF4IDY1NTM2KVxuICogICAtIGBuYW1lYCAoU3RyaW5nKSAtIGZpbGUgbmFtZSAoYmluYXJ5IHN0cmluZylcbiAqICAgLSBgY29tbWVudGAgKFN0cmluZykgLSBjb21tZW50IChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBoY3JjYCAoQm9vbGVhbikgLSB0cnVlIGlmIGhlYWRlciBjcmMgc2hvdWxkIGJlIGFkZGVkXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGNodW5rMSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSlcbiAqICAgLCBjaHVuazIgPSBVaW50OEFycmF5KFsxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOV0pO1xuICpcbiAqIHZhciBkZWZsYXRlID0gbmV3IHBha28uRGVmbGF0ZSh7IGxldmVsOiAzfSk7XG4gKlxuICogZGVmbGF0ZS5wdXNoKGNodW5rMSwgZmFsc2UpO1xuICogZGVmbGF0ZS5wdXNoKGNodW5rMiwgdHJ1ZSk7ICAvLyB0cnVlIC0+IGxhc3QgY2h1bmtcbiAqXG4gKiBpZiAoZGVmbGF0ZS5lcnIpIHsgdGhyb3cgbmV3IEVycm9yKGRlZmxhdGUuZXJyKTsgfVxuICpcbiAqIGNvbnNvbGUubG9nKGRlZmxhdGUucmVzdWx0KTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gRGVmbGF0ZShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWZsYXRlKSkgcmV0dXJuIG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIHRoaXMub3B0aW9ucyA9IHV0aWxzLmFzc2lnbih7XG4gICAgbGV2ZWw6IFpfREVGQVVMVF9DT01QUkVTU0lPTixcbiAgICBtZXRob2Q6IFpfREVGTEFURUQsXG4gICAgY2h1bmtTaXplOiAxNjM4NCxcbiAgICB3aW5kb3dCaXRzOiAxNSxcbiAgICBtZW1MZXZlbDogOCxcbiAgICBzdHJhdGVneTogWl9ERUZBVUxUX1NUUkFURUdZLFxuICAgIHRvOiAnJ1xuICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICB2YXIgb3B0ID0gdGhpcy5vcHRpb25zO1xuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+IDApKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmIChvcHQuZ3ppcCAmJiAob3B0LndpbmRvd0JpdHMgPiAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAxNjtcbiAgfVxuXG4gIHRoaXMuZXJyICAgID0gMDsgICAgICAvLyBlcnJvciBjb2RlLCBpZiBoYXBwZW5zICgwID0gWl9PSylcbiAgdGhpcy5tc2cgICAgPSAnJzsgICAgIC8vIGVycm9yIG1lc3NhZ2VcbiAgdGhpcy5lbmRlZCAgPSBmYWxzZTsgIC8vIHVzZWQgdG8gYXZvaWQgbXVsdGlwbGUgb25FbmQoKSBjYWxsc1xuICB0aGlzLmNodW5rcyA9IFtdOyAgICAgLy8gY2h1bmtzIG9mIGNvbXByZXNzZWQgZGF0YVxuXG4gIHRoaXMuc3RybSA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUluaXQyKFxuICAgIHRoaXMuc3RybSxcbiAgICBvcHQubGV2ZWwsXG4gICAgb3B0Lm1ldGhvZCxcbiAgICBvcHQud2luZG93Qml0cyxcbiAgICBvcHQubWVtTGV2ZWwsXG4gICAgb3B0LnN0cmF0ZWd5XG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gWl9PSykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gIH1cblxuICBpZiAob3B0LmhlYWRlcikge1xuICAgIHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSwgb3B0LmhlYWRlcik7XG4gIH1cblxuICBpZiAob3B0LmRpY3Rpb25hcnkpIHtcbiAgICB2YXIgZGljdDtcbiAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBvcHQuZGljdGlvbmFyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguXG4gICAgICBkaWN0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICBkaWN0ID0gbmV3IFVpbnQ4QXJyYXkob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWN0ID0gb3B0LmRpY3Rpb25hcnk7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdCk7XG5cbiAgICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICAgIH1cblxuICAgIHRoaXMuX2RpY3Rfc2V0ID0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIERlZmxhdGUjcHVzaChkYXRhWywgbW9kZV0pIC0+IEJvb2xlYW5cbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxBcnJheUJ1ZmZlcnxTdHJpbmcpOiBpbnB1dCBkYXRhLiBTdHJpbmdzIHdpbGwgYmVcbiAqICAgY29udmVydGVkIHRvIHV0ZjggYnl0ZSBzZXF1ZW5jZS5cbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFuc2ggWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBkZWZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tEZWZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBjb21wcmVzc2VkIGNodW5rcy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4gVGhlIGxhc3QgZGF0YSBibG9jayBtdXN0IGhhdmVcbiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nIGJ1ZmZlcnMgYW5kIGNhbGxcbiAqIFtbRGVmbGF0ZSNvbkVuZF1dLiBGb3IgaW50ZXJpbSBleHBsaWNpdCBmbHVzaGVzICh3aXRob3V0IGVuZGluZyB0aGUgc3RyZWFtKSB5b3VcbiAqIGNhbiB1c2UgbW9kZSBaX1NZTkNfRkxVU0gsIGtlZXBpbmcgdGhlIGNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbRGVmbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGFycmF5IGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIKTtcblxuICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBJZiB3ZSBuZWVkIHRvIGNvbXByZXNzIHRleHQsIGNoYW5nZSBlbmNvZGluZyB0byB1dGY4LlxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZShzdHJtLCBfbW9kZSk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgIT09IFpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBaX0ZJTklTSCB8fCBfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSkpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMub25EYXRhKHN0cmluZ3MuYnVmMmJpbnN0cmluZyh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gd2hpbGUgKChzdHJtLmF2YWlsX2luID4gMCB8fCBzdHJtLmF2YWlsX291dCA9PT0gMCkgJiYgc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQpO1xuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IFpfRklOSVNIKSB7XG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChaX09LKTtcbiAgICBzdHJtLmF2YWlsX291dCA9IDA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBvdXB1dCBkYXRhLiBUeXBlIG9mIGFycmF5IGRlcGVuZHNcbiAqICAgb24ganMgZW5naW5lIHN1cHBvcnQuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsIGVhY2ggY2h1bmtcbiAqICAgd2lsbCBiZSBzdHJpbmcuXG4gKlxuICogQnkgZGVmYXVsdCwgc3RvcmVzIGRhdGEgYmxvY2tzIGluIGBjaHVua3NbXWAgcHJvcGVydHkgYW5kIGdsdWVcbiAqIHRob3NlIGluIGBvbkVuZGAuIE92ZXJyaWRlIHRoaXMgaGFuZGxlciwgaWYgeW91IG5lZWQgYW5vdGhlciBiZWhhdmlvdXIuXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG59O1xuXG5cbi8qKlxuICogRGVmbGF0ZSNvbkVuZChzdGF0dXMpIC0+IFZvaWRcbiAqIC0gc3RhdHVzIChOdW1iZXIpOiBkZWZsYXRlIHN0YXR1cy4gMCAoWl9PSykgb24gc3VjY2VzcyxcbiAqICAgb3RoZXIgaWYgbm90LlxuICpcbiAqIENhbGxlZCBvbmNlIGFmdGVyIHlvdSB0ZWxsIGRlZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHV0aWxzLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpO1xuICAgIH1cbiAgfVxuICB0aGlzLmNodW5rcyA9IFtdO1xuICB0aGlzLmVyciA9IHN0YXR1cztcbiAgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnO1xufTtcblxuXG4vKipcbiAqIGRlZmxhdGUoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENvbXByZXNzIGBkYXRhYCB3aXRoIGRlZmxhdGUgYWxnb3JpdGhtIGFuZCBgb3B0aW9uc2AuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gbGV2ZWxcbiAqIC0gd2luZG93Qml0c1xuICogLSBtZW1MZXZlbFxuICogLSBzdHJhdGVneVxuICogLSBkaWN0aW9uYXJ5XG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgZGF0YSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSk7XG4gKlxuICogY29uc29sZS5sb2cocGFrby5kZWZsYXRlKGRhdGEpKTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgZGVmbGF0b3IgPSBuZXcgRGVmbGF0ZShvcHRpb25zKTtcblxuICBkZWZsYXRvci5wdXNoKGlucHV0LCB0cnVlKTtcblxuICAvLyBUaGF0IHdpbGwgbmV2ZXIgaGFwcGVucywgaWYgeW91IGRvbid0IGNoZWF0IHdpdGggb3B0aW9ucyA6KVxuICBpZiAoZGVmbGF0b3IuZXJyKSB7IHRocm93IGRlZmxhdG9yLm1zZzsgfVxuXG4gIHJldHVybiBkZWZsYXRvci5yZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBkZWZsYXRlUmF3KGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gZGVmbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiBnemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCBvZlxuICogZGVmbGF0ZSBvbmUuXG4gKiovXG5mdW5jdGlvbiBnemlwKGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLmd6aXAgPSB0cnVlO1xuICByZXR1cm4gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuZXhwb3J0cy5EZWZsYXRlID0gRGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZSA9IGRlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGVSYXcgPSBkZWZsYXRlUmF3O1xuZXhwb3J0cy5nemlwID0gZ3ppcDtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9pbmZsYXRlID0gcmVxdWlyZSgnLi96bGliL2luZmxhdGUnKTtcbnZhciB1dGlscyAgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL2NvbW1vbicpO1xudmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIGMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9jb25zdGFudHMnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xudmFyIEdaaGVhZGVyICAgICA9IHJlcXVpcmUoJy4vemxpYi9nemhlYWRlcicpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIGNsYXNzIEluZmxhdGVcbiAqXG4gKiBHZW5lcmljIEpTLXN0eWxlIHdyYXBwZXIgZm9yIHpsaWIgY2FsbHMuIElmIHlvdSBkb24ndCBuZWVkXG4gKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNlIG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tpbmZsYXRlXV1cbiAqIGFuZCBbW2luZmxhdGVSYXddXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIGluZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0luZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRlbi5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICpcbiAqIFVuY29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbSW5mbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbSW5mbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBpbmZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogU2hvdWxkIGJlIGNoZWNrZWQgaWYgYnJva2VuIGRhdGEgcG9zc2libGUuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tJbmZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBJbmZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGluZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgd2luZG93Qml0c2BcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGluZmxhdGVcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICogQnkgZGVmYXVsdCwgd2hlbiBubyBvcHRpb25zIHNldCwgYXV0b2RldGVjdCBkZWZsYXRlL2d6aXAgZGF0YSBmb3JtYXQgdmlhXG4gKiB3cmFwcGVyIGhlYWRlci5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGluZmxhdGUgPSBuZXcgcGFrby5JbmZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBpbmZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBpbmZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChpbmZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoaW5mbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coaW5mbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBJbmZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGUpKSByZXR1cm4gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDAsXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgLy8gRm9yY2Ugd2luZG93IHNpemUgZm9yIGByYXdgIGRhdGEsIGlmIG5vdCBzZXQgZGlyZWN0bHksXG4gIC8vIGJlY2F1c2Ugd2UgaGF2ZSBubyBoZWFkZXIgZm9yIGF1dG9kZXRlY3QuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgICBpZiAob3B0LndpbmRvd0JpdHMgPT09IDApIHsgb3B0LndpbmRvd0JpdHMgPSAtMTU7IH1cbiAgfVxuXG4gIC8vIElmIGB3aW5kb3dCaXRzYCBub3QgZGVmaW5lZCAoYW5kIG1vZGUgbm90IHJhdykgLSBzZXQgYXV0b2RldGVjdCBmbGFnIGZvciBnemlwL2RlZmxhdGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikgJiZcbiAgICAgICEob3B0aW9ucyAmJiBvcHRpb25zLndpbmRvd0JpdHMpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgKz0gMzI7XG4gIH1cblxuICAvLyBHemlwIGhlYWRlciBoYXMgbm8gaW5mbyBhYm91dCB3aW5kb3dzIHNpemUsIHdlIGNhbiBkbyBhdXRvZGV0ZWN0IG9ubHlcbiAgLy8gZm9yIGRlZmxhdGUuIFNvLCBpZiB3aW5kb3cgc2l6ZSBub3Qgc2V0LCBmb3JjZSBpdCB0byBtYXggd2hlbiBnemlwIHBvc3NpYmxlXG4gIGlmICgob3B0LndpbmRvd0JpdHMgPiAxNSkgJiYgKG9wdC53aW5kb3dCaXRzIDwgNDgpKSB7XG4gICAgLy8gYml0IDMgKDE2KSAtPiBnemlwcGVkIGRhdGFcbiAgICAvLyBiaXQgNCAoMzIpIC0+IGF1dG9kZXRlY3QgZ3ppcC9kZWZsYXRlXG4gICAgaWYgKChvcHQud2luZG93Qml0cyAmIDE1KSA9PT0gMCkge1xuICAgICAgb3B0LndpbmRvd0JpdHMgfD0gMTU7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtICAgPSBuZXcgWlN0cmVhbSgpO1xuICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDtcblxuICB2YXIgc3RhdHVzICA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC53aW5kb3dCaXRzXG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIHRoaXMuaGVhZGVyID0gbmV3IEdaaGVhZGVyKCk7XG5cbiAgemxpYl9pbmZsYXRlLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLCB0aGlzLmhlYWRlcik7XG59XG5cbi8qKlxuICogSW5mbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGFcbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFuc2ggWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBpbmZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tJbmZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBvdXRwdXQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZVxuICogbW9kZSBaX0ZJTklTSCAob3IgYHRydWVgKS4gVGhhdCB3aWxsIGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tJbmZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdVxuICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgZGVjb21wcmVzc2lvbiBjb250ZXh0LlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0luZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIGBVaW50OEFycmF5YCBvbiBpbnB1dCBmb3IgYmVzdCBzcGVlZCAob3V0cHV0XG4gKiBmb3JtYXQgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSkuIEFsc28sIGRvbid0IHNraXAgbGFzdCBwYXJhbSBhbmQgYWx3YXlzXG4gKiB1c2UgdGhlIHNhbWUgdHlwZSBpbiB5b3VyIGNvZGUgKGJvb2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuXG4gKlxuICogRm9yIHJlZ3VsYXIgYEFycmF5YC1zIG1ha2Ugc3VyZSBhbGwgZWxlbWVudHMgYXJlIFswLi4yNTVdLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBwdXNoKGNodW5rLCBmYWxzZSk7IC8vIHB1c2ggb25lIG9mIGRhdGEgY2h1bmtzXG4gKiAuLi5cbiAqIHB1c2goY2h1bmssIHRydWUpOyAgLy8gcHVzaCBsYXN0IGNodW5rXG4gKiBgYGBcbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkge1xuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgdmFyIGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7XG4gIHZhciBkaWN0aW9uYXJ5ID0gdGhpcy5vcHRpb25zLmRpY3Rpb25hcnk7XG4gIHZhciBzdGF0dXMsIF9tb2RlO1xuICB2YXIgbmV4dF9vdXRfdXRmOCwgdGFpbCwgdXRmOHN0cjtcbiAgdmFyIGRpY3Q7XG5cbiAgLy8gRmxhZyB0byBwcm9wZXJseSBwcm9jZXNzIFpfQlVGX0VSUk9SIG9uIHRlc3RpbmcgaW5mbGF0ZSBjYWxsXG4gIC8vIHdoZW4gd2UgY2hlY2sgdGhhdCBhbGwgb3V0cHV0IGRhdGEgd2FzIGZsdXNoZWQuXG4gIHZhciBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IGMuWl9GSU5JU0ggOiBjLlpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIE9ubHkgYmluYXJ5IHN0cmluZ3MgY2FuIGJlIGRlY29tcHJlc3NlZCBvbiBwcmFjdGljZVxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLmJpbnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cblxuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHN0cm0sIGMuWl9OT19GTFVTSCk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9ORUVEX0RJQ1QgJiYgZGljdGlvbmFyeSkge1xuICAgICAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICAgICAgaWYgKHR5cGVvZiBkaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBkaWN0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKGRpY3Rpb25hcnkpO1xuICAgICAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShkaWN0aW9uYXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpY3QgPSBkaWN0aW9uYXJ5O1xuICAgICAgfVxuXG4gICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9CVUZfRVJST1IgJiYgYWxsb3dCdWZFcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdHVzID0gYy5aX09LO1xuICAgICAgYWxsb3dCdWZFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RybS5uZXh0X291dCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBjLlpfRklOSVNIIHx8IF9tb2RlID09PSBjLlpfU1lOQ19GTFVTSCkpKSB7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcblxuICAgICAgICAgIG5leHRfb3V0X3V0ZjggPSBzdHJpbmdzLnV0Zjhib3JkZXIoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpO1xuXG4gICAgICAgICAgdGFpbCA9IHN0cm0ubmV4dF9vdXQgLSBuZXh0X291dF91dGY4O1xuICAgICAgICAgIHV0ZjhzdHIgPSBzdHJpbmdzLmJ1ZjJzdHJpbmcoc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgpO1xuXG4gICAgICAgICAgLy8gbW92ZSB0YWlsXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHRhaWw7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemUgLSB0YWlsO1xuICAgICAgICAgIGlmICh0YWlsKSB7IHV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LCBzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCwgdGFpbCwgMCk7IH1cblxuICAgICAgICAgIHRoaXMub25EYXRhKHV0ZjhzdHIpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXaGVuIG5vIG1vcmUgaW5wdXQgZGF0YSwgd2Ugc2hvdWxkIGNoZWNrIHRoYXQgaW50ZXJuYWwgaW5mbGF0ZSBidWZmZXJzXG4gICAgLy8gYXJlIGZsdXNoZWQuIFRoZSBvbmx5IHdheSB0byBkbyBpdCB3aGVuIGF2YWlsX291dCA9IDAgLSBydW4gb25lIG1vcmVcbiAgICAvLyBpbmZsYXRlIHBhc3MuIEJ1dCBpZiBvdXRwdXQgZGF0YSBub3QgZXhpc3RzLCBpbmZsYXRlIHJldHVybiBaX0JVRl9FUlJPUi5cbiAgICAvLyBIZXJlIHdlIHNldCBmbGFnIHRvIHByb2Nlc3MgdGhpcyBlcnJvciBwcm9wZXJseS5cbiAgICAvL1xuICAgIC8vIE5PVEUuIERlZmxhdGUgZG9lcyBub3QgcmV0dXJuIGVycm9yIGluIHRoaXMgY2FzZSBhbmQgZG9lcyBub3QgbmVlZHMgc3VjaFxuICAgIC8vIGxvZ2ljLlxuICAgIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gdHJ1ZTtcbiAgICB9XG5cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EKTtcblxuICBpZiAoc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCkge1xuICAgIF9tb2RlID0gYy5aX0ZJTklTSDtcbiAgfVxuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IGMuWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBjLlpfT0s7XG4gIH1cblxuICAvLyBjYWxsYmFjayBpbnRlcmltIHJlc3VsdHMgaWYgWl9TWU5DX0ZMVVNILlxuICBpZiAoX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChjLlpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGluZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIGVpdGhlciBhZnRlciB5b3UgdGVsbCBpbmZsYXRlIHRoYXQgdGhlIGlucHV0IHN0cmVhbSBpc1xuICogY29tcGxldGUgKFpfRklOSVNIKSBvciBzaG91bGQgYmUgZmx1c2hlZCAoWl9TWU5DX0ZMVVNIKVxuICogb3IgaWYgYW4gZXJyb3IgaGFwcGVuZWQuIEJ5IGRlZmF1bHQgLSBqb2luIGNvbGxlY3RlZCBjaHVua3MsXG4gKiBmcmVlIG1lbW9yeSBhbmQgZmlsbCBgcmVzdWx0c2AgLyBgZXJyYCBwcm9wZXJ0aWVzLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IGMuWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBHbHVlICYgY29udmVydCBoZXJlLCB1bnRpbCB3ZSB0ZWFjaCBwYWtvIHRvIHNlbmRcbiAgICAgIC8vIHV0ZjggYWxsaWduZWQgc3RyaW5ncyB0byBvbkRhdGFcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogaW5mbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBEZWNvbXByZXNzIGBkYXRhYCB3aXRoIGluZmxhdGUvdW5nemlwIGFuZCBgb3B0aW9uc2AuIEF1dG9kZXRlY3RcbiAqIGZvcm1hdCB2aWEgd3JhcHBlciBoZWFkZXIgYnkgZGVmYXVsdC4gVGhhdCdzIHdoeSB3ZSBkb24ndCBwcm92aWRlXG4gKiBzZXBhcmF0ZSBgdW5nemlwYCBtZXRob2QuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gd2luZG93Qml0c1xuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIFN1Z2FyIChvcHRpb25zKTpcbiAqXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5XG4gKiAgIG5lZ2F0aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS5cbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBpbnB1dCA9IHBha28uZGVmbGF0ZShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIG91dHB1dDtcbiAqXG4gKiB0cnkge1xuICogICBvdXRwdXQgPSBwYWtvLmluZmxhdGUoaW5wdXQpO1xuICogfSBjYXRjaCAoZXJyKVxuICogICBjb25zb2xlLmxvZyhlcnIpO1xuICogfVxuICogYGBgXG4gKiovXG5mdW5jdGlvbiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBpbmZsYXRvciA9IG5ldyBJbmZsYXRlKG9wdGlvbnMpO1xuXG4gIGluZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChpbmZsYXRvci5lcnIpIHsgdGhyb3cgaW5mbGF0b3IubXNnOyB9XG5cbiAgcmV0dXJuIGluZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGluZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tpbmZsYXRlXV0sIGJ1dCBjcmVhdGVzIHJhdyBkYXRhLCB3aXRob3V0IHdyYXBwZXJcbiAqIChoZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS5cbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMucmF3ID0gdHJ1ZTtcbiAgcmV0dXJuIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogdW5nemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIEp1c3Qgc2hvcnRjdXQgdG8gW1tpbmZsYXRlXV0sIGJlY2F1c2UgaXQgYXV0b2RldGVjdHMgZm9ybWF0XG4gKiBieSBoZWFkZXIuY29udGVudC4gRG9uZSBmb3IgY29udmVuaWVuY2UuXG4gKiovXG5cblxuZXhwb3J0cy5JbmZsYXRlID0gSW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVSYXcgPSBpbmZsYXRlUmF3O1xuZXhwb3J0cy51bmd6aXAgID0gaW5mbGF0ZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgVFlQRURfT0sgPSAgKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKTtcblxuXG5leHBvcnRzLmFzc2lnbiA9IGZ1bmN0aW9uIChvYmogLypmcm9tMSwgZnJvbTIsIGZyb20zLCAuLi4qLykge1xuICB2YXIgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHdoaWxlIChzb3VyY2VzLmxlbmd0aCkge1xuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7XG4gICAgaWYgKCFzb3VyY2UpIHsgY29udGludWU7IH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzb3VyY2UgKyAnbXVzdCBiZSBub24tb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcCBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgb2JqW3BdID0gc291cmNlW3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG5cbi8vIHJlZHVjZSBidWZmZXIgc2l6ZSwgYXZvaWRpbmcgbWVtIGNvcHlcbmV4cG9ydHMuc2hyaW5rQnVmID0gZnVuY3Rpb24gKGJ1Ziwgc2l6ZSkge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gc2l6ZSkgeyByZXR1cm4gYnVmOyB9XG4gIGlmIChidWYuc3ViYXJyYXkpIHsgcmV0dXJuIGJ1Zi5zdWJhcnJheSgwLCBzaXplKTsgfVxuICBidWYubGVuZ3RoID0gc2l6ZTtcbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxudmFyIGZuVHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBpZiAoc3JjLnN1YmFycmF5ICYmIGRlc3Quc3ViYXJyYXkpIHtcbiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNfb2Zmcywgc3JjX29mZnMgKyBsZW4pLCBkZXN0X29mZnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBvcmRpbmFyeSBhcnJheVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHZhciBpLCBsLCBsZW4sIHBvcywgY2h1bmssIHJlc3VsdDtcblxuICAgIC8vIGNhbGN1bGF0ZSBkYXRhIGxlbmd0aFxuICAgIGxlbiA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGxlbiArPSBjaHVua3NbaV0ubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIGpvaW4gY2h1bmtzXG4gICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICBwb3MgPSAwO1xuICAgIGZvciAoaSA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjaHVuayA9IGNodW5rc1tpXTtcbiAgICAgIHJlc3VsdC5zZXQoY2h1bmssIHBvcyk7XG4gICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBmblVudHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gICAgfVxuICB9LFxuICAvLyBKb2luIGFycmF5IG9mIGNodW5rcyB0byBzaW5nbGUgYXJyYXkuXG4gIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uIChjaHVua3MpIHtcbiAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBjaHVua3MpO1xuICB9XG59O1xuXG5cbi8vIEVuYWJsZS9EaXNhYmxlIHR5cGVkIGFycmF5cyB1c2UsIGZvciB0ZXN0aW5nXG4vL1xuZXhwb3J0cy5zZXRUeXBlZCA9IGZ1bmN0aW9uIChvbikge1xuICBpZiAob24pIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gVWludDhBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjE2ID0gVWludDE2QXJyYXk7XG4gICAgZXhwb3J0cy5CdWYzMiA9IEludDMyQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5UeXBlZCk7XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5CdWY4ICA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5VbnR5cGVkKTtcbiAgfVxufTtcblxuZXhwb3J0cy5zZXRUeXBlZChUWVBFRF9PSyk7XG4iLCIvLyBTdHJpbmcgZW5jb2RlL2RlY29kZSBoZWxwZXJzXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxuXG4vLyBRdWljayBjaGVjayBpZiB3ZSBjYW4gdXNlIGZhc3QgYXJyYXkgdG8gYmluIHN0cmluZyBjb252ZXJzaW9uXG4vL1xuLy8gLSBhcHBseShBcnJheSkgY2FuIGZhaWwgb24gQW5kcm9pZCAyLjJcbi8vIC0gYXBwbHkoVWludDhBcnJheSkgY2FuIGZhaWwgb24gaU9TIDUuMSBTYWZhcnlcbi8vXG52YXIgU1RSX0FQUExZX09LID0gdHJ1ZTtcbnZhciBTVFJfQVBQTFlfVUlBX09LID0gdHJ1ZTtcblxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBbIDAgXSk7IH0gY2F0Y2ggKF9fKSB7IFNUUl9BUFBMWV9PSyA9IGZhbHNlOyB9XG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KDEpKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX1VJQV9PSyA9IGZhbHNlOyB9XG5cblxuLy8gVGFibGUgd2l0aCB1dGY4IGxlbmd0aHMgKGNhbGN1bGF0ZWQgYnkgZmlyc3QgYnl0ZSBvZiBzZXF1ZW5jZSlcbi8vIE5vdGUsIHRoYXQgNSAmIDYtYnl0ZSB2YWx1ZXMgYW5kIHNvbWUgNC1ieXRlIHZhbHVlcyBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGluIEpTLFxuLy8gYmVjYXVzZSBtYXggcG9zc2libGUgY29kZXBvaW50IGlzIDB4MTBmZmZmXG52YXIgX3V0ZjhsZW4gPSBuZXcgdXRpbHMuQnVmOCgyNTYpO1xuZm9yICh2YXIgcSA9IDA7IHEgPCAyNTY7IHErKykge1xuICBfdXRmOGxlbltxXSA9IChxID49IDI1MiA/IDYgOiBxID49IDI0OCA/IDUgOiBxID49IDI0MCA/IDQgOiBxID49IDIyNCA/IDMgOiBxID49IDE5MiA/IDIgOiAxKTtcbn1cbl91dGY4bGVuWzI1NF0gPSBfdXRmOGxlblsyNTRdID0gMTsgLy8gSW52YWxpZCBzZXF1ZW5jZSBzdGFydFxuXG5cbi8vIGNvbnZlcnQgc3RyaW5nIHRvIGFycmF5ICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgLy8gY291bnQgYmluYXJ5IHNpemVcbiAgZm9yIChtX3BvcyA9IDA7IG1fcG9zIDwgc3RyX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgYnVmX2xlbiArPSBjIDwgMHg4MCA/IDEgOiBjIDwgMHg4MDAgPyAyIDogYyA8IDB4MTAwMDAgPyAzIDogNDtcbiAgfVxuXG4gIC8vIGFsbG9jYXRlIGJ1ZmZlclxuICBidWYgPSBuZXcgdXRpbHMuQnVmOChidWZfbGVuKTtcblxuICAvLyBjb252ZXJ0XG4gIGZvciAoaSA9IDAsIG1fcG9zID0gMDsgaSA8IGJ1Zl9sZW47IG1fcG9zKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHtcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTtcbiAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgIG1fcG9zKys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgIGJ1ZltpKytdID0gYztcbiAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgLyogdHdvIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4QzAgfCAoYyA+Pj4gNik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIC8qIHRocmVlIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4RTAgfCAoYyA+Pj4gMTIpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhmMCB8IChjID4+PiAxOCk7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gMTIgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWY7XG59O1xuXG4vLyBIZWxwZXIgKHVzZWQgaW4gMiBwbGFjZXMpXG5mdW5jdGlvbiBidWYyYmluc3RyaW5nKGJ1ZiwgbGVuKSB7XG4gIC8vIHVzZSBmYWxsYmFjayBmb3IgYmlnIGFycmF5cyB0byBhdm9pZCBzdGFjayBvdmVyZmxvd1xuICBpZiAobGVuIDwgNjU1MzcpIHtcbiAgICBpZiAoKGJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfVUlBX09LKSB8fCAoIWJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfT0spKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB1dGlscy5zaHJpbmtCdWYoYnVmLCBsZW4pKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuLy8gQ29udmVydCBieXRlIGFycmF5IHRvIGJpbmFyeSBzdHJpbmdcbmV4cG9ydHMuYnVmMmJpbnN0cmluZyA9IGZ1bmN0aW9uIChidWYpIHtcbiAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcoYnVmLCBidWYubGVuZ3RoKTtcbn07XG5cblxuLy8gQ29udmVydCBiaW5hcnkgc3RyaW5nICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuYmluc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KHN0ci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnVmLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYnVmW2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxuLy8gY29udmVydCBhcnJheSB0byBzdHJpbmdcbmV4cG9ydHMuYnVmMnN0cmluZyA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgaSwgb3V0LCBjLCBjX2xlbjtcbiAgdmFyIGxlbiA9IG1heCB8fCBidWYubGVuZ3RoO1xuXG4gIC8vIFJlc2VydmUgbWF4IHBvc3NpYmxlIGxlbmd0aCAoMiB3b3JkcyBwZXIgY2hhcilcbiAgLy8gTkI6IGJ5IHVua25vd24gcmVhc29ucywgQXJyYXkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZm9yXG4gIC8vICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5IHRoYW4gVWludDE2QXJyYXkuXG4gIHZhciB1dGYxNmJ1ZiA9IG5ldyBBcnJheShsZW4gKiAyKTtcblxuICBmb3IgKG91dCA9IDAsIGkgPSAwOyBpIDwgbGVuOykge1xuICAgIGMgPSBidWZbaSsrXTtcbiAgICAvLyBxdWljayBwcm9jZXNzIGFzY2lpXG4gICAgaWYgKGMgPCAweDgwKSB7IHV0ZjE2YnVmW291dCsrXSA9IGM7IGNvbnRpbnVlOyB9XG5cbiAgICBjX2xlbiA9IF91dGY4bGVuW2NdO1xuICAgIC8vIHNraXAgNSAmIDYgYnl0ZSBjb2Rlc1xuICAgIGlmIChjX2xlbiA+IDQpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBpICs9IGNfbGVuIC0gMTsgY29udGludWU7IH1cblxuICAgIC8vIGFwcGx5IG1hc2sgb24gZmlyc3QgYnl0ZVxuICAgIGMgJj0gY19sZW4gPT09IDIgPyAweDFmIDogY19sZW4gPT09IDMgPyAweDBmIDogMHgwNztcbiAgICAvLyBqb2luIHRoZSByZXN0XG4gICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuKSB7XG4gICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTtcbiAgICAgIGNfbGVuLS07XG4gICAgfVxuXG4gICAgLy8gdGVybWluYXRlZCBieSBlbmQgb2Ygc3RyaW5nP1xuICAgIGlmIChjX2xlbiA+IDEpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBjb250aW51ZTsgfVxuXG4gICAgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSBjO1xuICAgIH0gZWxzZSB7XG4gICAgICBjIC09IDB4MTAwMDA7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGQ4MDAgfCAoKGMgPj4gMTApICYgMHgzZmYpO1xuICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkYzAwIHwgKGMgJiAweDNmZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcodXRmMTZidWYsIG91dCk7XG59O1xuXG5cbi8vIENhbGN1bGF0ZSBtYXggcG9zc2libGUgcG9zaXRpb24gaW4gdXRmOCBidWZmZXIsXG4vLyB0aGF0IHdpbGwgbm90IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlXG4vLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLlxuLy9cbi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheVxuLy8gbWF4ICAgLSBsZW5ndGggbGltaXQgKG1hbmRhdG9yeSk7XG5leHBvcnRzLnV0Zjhib3JkZXIgPSBmdW5jdGlvbiAoYnVmLCBtYXgpIHtcbiAgdmFyIHBvcztcblxuICBtYXggPSBtYXggfHwgYnVmLmxlbmd0aDtcbiAgaWYgKG1heCA+IGJ1Zi5sZW5ndGgpIHsgbWF4ID0gYnVmLmxlbmd0aDsgfVxuXG4gIC8vIGdvIGJhY2sgZnJvbSBsYXN0IHBvc2l0aW9uLCB1bnRpbCBzdGFydCBvZiBzZXF1ZW5jZSBmb3VuZFxuICBwb3MgPSBtYXggLSAxO1xuICB3aGlsZSAocG9zID49IDAgJiYgKGJ1Zltwb3NdICYgMHhDMCkgPT09IDB4ODApIHsgcG9zLS07IH1cblxuICAvLyBGdWNrdXAgLSB2ZXJ5IHNtYWxsIGFuZCBicm9rZW4gc2VxdWVuY2UsXG4gIC8vIHJldHVybiBtYXgsIGJlY2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LlxuICBpZiAocG9zIDwgMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgLy8gSWYgd2UgY2FtZSB0byBzdGFydCBvZiBidWZmZXIgLSB0aGF0IG1lYW5zIHZ1ZmZlciBpcyB0b28gc21hbGwsXG4gIC8vIHJldHVybiBtYXggdG9vLlxuICBpZiAocG9zID09PSAwKSB7IHJldHVybiBtYXg7IH1cblxuICByZXR1cm4gKHBvcyArIF91dGY4bGVuW2J1Zltwb3NdXSA+IG1heCkgPyBwb3MgOiBtYXg7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiBhZGxlcjMyIHRha2VzIDEyJSBmb3IgbGV2ZWwgMCBhbmQgMiUgZm9yIGxldmVsIDYuXG4vLyBJdCBkb2Vzbid0IHdvcnRoIHRvIG1ha2UgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25hIGFzIGluIG9yaWdpbmFsLlxuLy8gU21hbGwgc2l6ZSBpcyBwcmVmZXJhYmxlLlxuXG5mdW5jdGlvbiBhZGxlcjMyKGFkbGVyLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciBzMSA9IChhZGxlciAmIDB4ZmZmZikgfDAsXG4gICAgICBzMiA9ICgoYWRsZXIgPj4+IDE2KSAmIDB4ZmZmZikgfDAsXG4gICAgICBuID0gMDtcblxuICB3aGlsZSAobGVuICE9PSAwKSB7XG4gICAgLy8gU2V0IGxpbWl0IH4gdHdpY2UgbGVzcyB0aGFuIDU1NTIsIHRvIGtlZXBcbiAgICAvLyBzMiBpbiAzMS1iaXRzLCBiZWNhdXNlIHdlIGZvcmNlIHNpZ25lZCBpbnRzLlxuICAgIC8vIGluIG90aGVyIGNhc2UgJT0gd2lsbCBmYWlsLlxuICAgIG4gPSBsZW4gPiAyMDAwID8gMjAwMCA6IGxlbjtcbiAgICBsZW4gLT0gbjtcblxuICAgIGRvIHtcbiAgICAgIHMxID0gKHMxICsgYnVmW3BvcysrXSkgfDA7XG4gICAgICBzMiA9IChzMiArIHMxKSB8MDtcbiAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgczEgJT0gNjU1MjE7XG4gICAgczIgJT0gNjU1MjE7XG4gIH1cblxuICByZXR1cm4gKHMxIHwgKHMyIDw8IDE2KSkgfDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBhZGxlcjMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbiAgWl9OT19GTFVTSDogICAgICAgICAwLFxuICBaX1BBUlRJQUxfRkxVU0g6ICAgIDEsXG4gIFpfU1lOQ19GTFVTSDogICAgICAgMixcbiAgWl9GVUxMX0ZMVVNIOiAgICAgICAzLFxuICBaX0ZJTklTSDogICAgICAgICAgIDQsXG4gIFpfQkxPQ0s6ICAgICAgICAgICAgNSxcbiAgWl9UUkVFUzogICAgICAgICAgICA2LFxuXG4gIC8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAgKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gICovXG4gIFpfT0s6ICAgICAgICAgICAgICAgMCxcbiAgWl9TVFJFQU1fRU5EOiAgICAgICAxLFxuICBaX05FRURfRElDVDogICAgICAgIDIsXG4gIFpfRVJSTk86ICAgICAgICAgICAtMSxcbiAgWl9TVFJFQU1fRVJST1I6ICAgIC0yLFxuICBaX0RBVEFfRVJST1I6ICAgICAgLTMsXG4gIC8vWl9NRU1fRVJST1I6ICAgICAtNCxcbiAgWl9CVUZfRVJST1I6ICAgICAgIC01LFxuICAvL1pfVkVSU0lPTl9FUlJPUjogLTYsXG5cbiAgLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4gIFpfTk9fQ09NUFJFU1NJT046ICAgICAgICAgMCxcbiAgWl9CRVNUX1NQRUVEOiAgICAgICAgICAgICAxLFxuICBaX0JFU1RfQ09NUFJFU1NJT046ICAgICAgIDksXG4gIFpfREVGQVVMVF9DT01QUkVTU0lPTjogICAtMSxcblxuXG4gIFpfRklMVEVSRUQ6ICAgICAgICAgICAgICAgMSxcbiAgWl9IVUZGTUFOX09OTFk6ICAgICAgICAgICAyLFxuICBaX1JMRTogICAgICAgICAgICAgICAgICAgIDMsXG4gIFpfRklYRUQ6ICAgICAgICAgICAgICAgICAgNCxcbiAgWl9ERUZBVUxUX1NUUkFURUdZOiAgICAgICAwLFxuXG4gIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbiAgWl9CSU5BUlk6ICAgICAgICAgICAgICAgICAwLFxuICBaX1RFWFQ6ICAgICAgICAgICAgICAgICAgIDEsXG4gIC8vWl9BU0NJSTogICAgICAgICAgICAgICAgMSwgLy8gPSBaX1RFWFQgKGRlcHJlY2F0ZWQpXG4gIFpfVU5LTk9XTjogICAgICAgICAgICAgICAgMixcblxuICAvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbiAgWl9ERUZMQVRFRDogICAgICAgICAgICAgICA4XG4gIC8vWl9OVUxMOiAgICAgICAgICAgICAgICAgbnVsbCAvLyBVc2UgLTEgb3IgbnVsbCBpbmxpbmUsIGRlcGVuZGluZyBvbiB2YXIgdHlwZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogd2UgY2FuJ3QgZ2V0IHNpZ25pZmljYW50IHNwZWVkIGJvb3N0IGhlcmUuXG4vLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzXG4vLyBhbmQgYXJyYXkgdG9vbHMgZGVwZW5kZW5jaWVzLlxuXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgMjU2OyBuKyspIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykge1xuICAgICAgYyA9ICgoYyAmIDEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciB0ID0gY3JjVGFibGUsXG4gICAgICBlbmQgPSBwb3MgKyBsZW47XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjcmMzMjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciB0cmVlcyAgID0gcmVxdWlyZSgnLi90cmVlcycpO1xudmFyIGFkbGVyMzIgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIG1zZyAgICAgPSByZXF1aXJlKCcuL21lc3NhZ2VzJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xudmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xuLy92YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG4vL3ZhciBaX05FRURfRElDVCAgICAgPSAyO1xuLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7XG52YXIgWl9TVFJFQU1fRVJST1IgID0gLTI7XG52YXIgWl9EQVRBX0VSUk9SICAgID0gLTM7XG4vL3ZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG5cbi8qIGNvbXByZXNzaW9uIGxldmVscyAqL1xuLy92YXIgWl9OT19DT01QUkVTU0lPTiAgICAgID0gMDtcbi8vdmFyIFpfQkVTVF9TUEVFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0JFU1RfQ09NUFJFU1NJT04gICAgPSA5O1xudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG5cbnZhciBaX0ZJTFRFUkVEICAgICAgICAgICAgPSAxO1xudmFyIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7XG52YXIgWl9STEUgICAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbi8vdmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG4vL3ZhciBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy92YXIgWl9BU0NJSSAgICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgTUFYX01FTV9MRVZFTCA9IDk7XG4vKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi9cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9NRU1fTEVWRUwgPSA4O1xuXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG52YXIgTF9DT0RFUyAgICAgICA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUztcbi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xudmFyIEhFQVBfU0laRSAgICAgPSAyICogTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xudmFyIE1BWF9CSVRTICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBNSU5fTUFUQ0ggPSAzO1xudmFyIE1BWF9NQVRDSCA9IDI1ODtcbnZhciBNSU5fTE9PS0FIRUFEID0gKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpO1xuXG52YXIgUFJFU0VUX0RJQ1QgPSAweDIwO1xuXG52YXIgSU5JVF9TVEFURSA9IDQyO1xudmFyIEVYVFJBX1NUQVRFID0gNjk7XG52YXIgTkFNRV9TVEFURSA9IDczO1xudmFyIENPTU1FTlRfU1RBVEUgPSA5MTtcbnZhciBIQ1JDX1NUQVRFID0gMTAzO1xudmFyIEJVU1lfU1RBVEUgPSAxMTM7XG52YXIgRklOSVNIX1NUQVRFID0gNjY2O1xuXG52YXIgQlNfTkVFRF9NT1JFICAgICAgPSAxOyAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi9cbnZhciBCU19CTE9DS19ET05FICAgICA9IDI7IC8qIGJsb2NrIGZsdXNoIHBlcmZvcm1lZCAqL1xudmFyIEJTX0ZJTklTSF9TVEFSVEVEID0gMzsgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi9cbnZhciBCU19GSU5JU0hfRE9ORSAgICA9IDQ7IC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi9cblxudmFyIE9TX0NPREUgPSAweDAzOyAvLyBVbml4IDopIC4gRG9uJ3QgZGV0ZWN0LCB1c2UgdGhpcyBkZWZhdWx0LlxuXG5mdW5jdGlvbiBlcnIoc3RybSwgZXJyb3JDb2RlKSB7XG4gIHN0cm0ubXNnID0gbXNnW2Vycm9yQ29kZV07XG4gIHJldHVybiBlcnJvckNvZGU7XG59XG5cbmZ1bmN0aW9uIHJhbmsoZikge1xuICByZXR1cm4gKChmKSA8PCAxKSAtICgoZikgPiA0ID8gOSA6IDApO1xufVxuXG5mdW5jdGlvbiB6ZXJvKGJ1ZikgeyB2YXIgbGVuID0gYnVmLmxlbmd0aDsgd2hpbGUgKC0tbGVuID49IDApIHsgYnVmW2xlbl0gPSAwOyB9IH1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzXG4gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0XG4gKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+b3V0cHV0IGJ1ZmZlciBhbmQgY29weWluZyBpbnRvIGl0LlxuICogKFNlZSBhbHNvIHJlYWRfYnVmKCkpLlxuICovXG5mdW5jdGlvbiBmbHVzaF9wZW5kaW5nKHN0cm0pIHtcbiAgdmFyIHMgPSBzdHJtLnN0YXRlO1xuXG4gIC8vX3RyX2ZsdXNoX2JpdHMocyk7XG4gIHZhciBsZW4gPSBzLnBlbmRpbmc7XG4gIGlmIChsZW4gPiBzdHJtLmF2YWlsX291dCkge1xuICAgIGxlbiA9IHN0cm0uYXZhaWxfb3V0O1xuICB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHMucGVuZGluZ19idWYsIHMucGVuZGluZ19vdXQsIGxlbiwgc3RybS5uZXh0X291dCk7XG4gIHN0cm0ubmV4dF9vdXQgKz0gbGVuO1xuICBzLnBlbmRpbmdfb3V0ICs9IGxlbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gbGVuO1xuICBzdHJtLmF2YWlsX291dCAtPSBsZW47XG4gIHMucGVuZGluZyAtPSBsZW47XG4gIGlmIChzLnBlbmRpbmcgPT09IDApIHtcbiAgICBzLnBlbmRpbmdfb3V0ID0gMDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocywgbGFzdCkge1xuICB0cmVlcy5fdHJfZmx1c2hfYmxvY2socywgKHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSksIHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0LCBsYXN0KTtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIGZsdXNoX3BlbmRpbmcocy5zdHJtKTtcbn1cblxuXG5mdW5jdGlvbiBwdXRfYnl0ZShzLCBiKSB7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci5cbiAqIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzdGF0ZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpblxuICogcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIHB1dFNob3J0TVNCKHMsIGIpIHtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7XG4vLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKGIgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiICYgMHhmZjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLCB1cGRhdGUgdGhlIGFkbGVyMzJcbiAqIGFuZCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIEFsbCBkZWZsYXRlKCkgaW5wdXQgZ29lcyB0aHJvdWdoXG4gKiB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdCB0byBhdm9pZFxuICogYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPmlucHV0IGJ1ZmZlciBhbmQgY29weWluZyBmcm9tIGl0LlxuICogKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRfYnVmKHN0cm0sIGJ1Ziwgc3RhcnQsIHNpemUpIHtcbiAgdmFyIGxlbiA9IHN0cm0uYXZhaWxfaW47XG5cbiAgaWYgKGxlbiA+IHNpemUpIHsgbGVuID0gc2l6ZTsgfVxuICBpZiAobGVuID09PSAwKSB7IHJldHVybiAwOyB9XG5cbiAgc3RybS5hdmFpbF9pbiAtPSBsZW47XG5cbiAgLy8gem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7XG4gIHV0aWxzLmFycmF5U2V0KGJ1Ziwgc3RybS5pbnB1dCwgc3RybS5uZXh0X2luLCBsZW4sIHN0YXJ0KTtcbiAgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMSkge1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBlbHNlIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDIpIHtcbiAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiArPSBsZW47XG4gIHN0cm0udG90YWxfaW4gKz0gbGVuO1xuXG4gIHJldHVybiBsZW47XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmRcbiAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCxcbiAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXNcbiAqIGdhcmJhZ2UuXG4gKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50XG4gKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLlxuICovXG5mdW5jdGlvbiBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkge1xuICB2YXIgY2hhaW5fbGVuZ3RoID0gcy5tYXhfY2hhaW5fbGVuZ3RoOyAgICAgIC8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqL1xuICB2YXIgc2NhbiA9IHMuc3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovXG4gIHZhciBtYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi9cbiAgdmFyIGJlc3RfbGVuID0gcy5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqL1xuICB2YXIgbmljZV9tYXRjaCA9IHMubmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqL1xuICB2YXIgbGltaXQgPSAocy5zdHJzdGFydCA+IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSA/XG4gICAgICBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwLypOSUwqLztcblxuICB2YXIgX3dpbiA9IHMud2luZG93OyAvLyBzaG9ydGN1dFxuXG4gIHZhciB3bWFzayA9IHMud19tYXNrO1xuICB2YXIgcHJldiAgPSBzLnByZXY7XG5cbiAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSxcbiAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC5cbiAgICovXG5cbiAgdmFyIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gIHZhciBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgdmFyIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG5cbiAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuXG4gICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICAvLyBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgXCJDb2RlIHRvbyBjbGV2ZXJcIik7XG5cbiAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi9cbiAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7XG4gICAgY2hhaW5fbGVuZ3RoID4+PSAyO1xuICB9XG4gIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnlcbiAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuXG4gICAqL1xuICBpZiAobmljZV9tYXRjaCA+IHMubG9va2FoZWFkKSB7IG5pY2VfbWF0Y2ggPSBzLmxvb2thaGVhZDsgfVxuXG4gIC8vIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsIFwibmVlZCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIC8vIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgXCJubyBmdXR1cmVcIik7XG4gICAgbWF0Y2ggPSBjdXJfbWF0Y2g7XG5cbiAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2VcbiAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyLiAgTm90ZSB0aGF0IHRoZSBjaGVja3MgYmVsb3dcbiAgICAgKiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IG9jY3VyIG9jY2FzaW9uYWxseSBmb3IgcGVyZm9ybWFuY2VcbiAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZFxuICAgICAqIGNvbmRpdGlvbmFsIGp1bXBzIHdpbGwgYmUgbWFkZSB0aGF0IGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMuXG4gICAgICogSG93ZXZlciB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBsaW1pdGVkIHRvIHRoZSBsb29rYWhlYWQsIHNvXG4gICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuXG4gICAgICovXG5cbiAgICBpZiAoX3dpblttYXRjaCArIGJlc3RfbGVuXSAgICAgIT09IHNjYW5fZW5kICB8fFxuICAgICAgICBfd2luW21hdGNoICsgYmVzdF9sZW4gLSAxXSAhPT0gc2Nhbl9lbmQxIHx8XG4gICAgICAgIF93aW5bbWF0Y2hdICAgICAgICAgICAgICAgICE9PSBfd2luW3NjYW5dIHx8XG4gICAgICAgIF93aW5bKyttYXRjaF0gICAgICAgICAgICAgICE9PSBfd2luW3NjYW4gKyAxXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGVcbiAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKVxuICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5XG4gICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdFxuICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LlxuICAgICAqL1xuICAgIHNjYW4gKz0gMjtcbiAgICBtYXRjaCsrO1xuICAgIC8vIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsIFwibWF0Y2hbMl0/XCIpO1xuXG4gICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjtcbiAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC5cbiAgICAgKi9cbiAgICBkbyB7XG4gICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICB9IHdoaWxlIChfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG5cbiAgICAvLyBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG5cbiAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDtcblxuICAgIGlmIChsZW4gPiBiZXN0X2xlbikge1xuICAgICAgcy5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDtcbiAgICAgIGJlc3RfbGVuID0gbGVuO1xuICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc2Nhbl9lbmQxICA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gICAgICBzY2FuX2VuZCAgID0gX3dpbltzY2FuICsgYmVzdF9sZW5dO1xuICAgIH1cbiAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0ICYmIC0tY2hhaW5fbGVuZ3RoICE9PSAwKTtcblxuICBpZiAoYmVzdF9sZW4gPD0gcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gYmVzdF9sZW47XG4gIH1cbiAgcmV0dXJuIHMubG9va2FoZWFkO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC5cbiAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC5cbiAqXG4gKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQURcbiAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFEXG4gKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmVcbiAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sXG4gKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS5cbiAqL1xuZnVuY3Rpb24gZmlsbF93aW5kb3cocykge1xuICB2YXIgX3dfc2l6ZSA9IHMud19zaXplO1xuICB2YXIgcCwgbiwgbSwgbW9yZSwgc3RyO1xuXG4gIC8vQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsIFwiYWxyZWFkeSBlbm91Z2ggbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICBtb3JlID0gcy53aW5kb3dfc2l6ZSAtIHMubG9va2FoZWFkIC0gcy5zdHJzdGFydDtcblxuICAgIC8vIEpTIGludHMgaGF2ZSAzMiBiaXQsIGJsb2NrIGJlbG93IG5vdCBuZWVkZWRcbiAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqL1xuICAgIC8vaWYgKHNpemVvZihpbnQpIDw9IDIpIHtcbiAgICAvLyAgICBpZiAobW9yZSA9PSAwICYmIHMtPnN0cnN0YXJ0ID09IDAgJiYgcy0+bG9va2FoZWFkID09IDApIHtcbiAgICAvLyAgICAgICAgbW9yZSA9IHdzaXplO1xuICAgIC8vXG4gICAgLy8gIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkge1xuICAgIC8vICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWZcbiAgICAvLyAgICAgICAgICogc3Ryc3RhcnQgPT0gMCAmJiBsb29rYWhlYWQgPT0gMSAoaW5wdXQgZG9uZSBhIGJ5dGUgYXQgdGltZSlcbiAgICAvLyAgICAgICAgICovXG4gICAgLy8gICAgICAgIG1vcmUtLTtcbiAgICAvLyAgICB9XG4gICAgLy99XG5cblxuICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsXG4gICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCA+PSBfd19zaXplICsgKF93X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuXG4gICAgICB1dGlscy5hcnJheVNldChzLndpbmRvdywgcy53aW5kb3csIF93X3NpemUsIF93X3NpemUsIDApO1xuICAgICAgcy5tYXRjaF9zdGFydCAtPSBfd19zaXplO1xuICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplO1xuICAgICAgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi9cbiAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTtcblxuICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzXG4gICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDBcbiAgICAgICB0byBrZWVwIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RlbnQgaWYgd2Ugc3dpdGNoIGJhY2sgdG8gbGV2ZWwgPiAwXG4gICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mXG4gICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLilcbiAgICAgICAqL1xuXG4gICAgICBuID0gcy5oYXNoX3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMuaGVhZFstLXBdO1xuICAgICAgICBzLmhlYWRbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG4gPSBfd19zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLnByZXZbLS1wXTtcbiAgICAgICAgcy5wcmV2W3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0XG4gICAgICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuXG4gICAgICAgICAqL1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbW9yZSArPSBfd19zaXplO1xuICAgIH1cbiAgICBpZiAocy5zdHJtLmF2YWlsX2luID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzpcbiAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJlxuICAgICAqICAgIG1vcmUgPT0gd2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydFxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKVxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMlxuICAgICAqIEluIHRoZSBCSUdfTUVNIG9yIE1NQVAgY2FzZSAobm90IHlldCBzdXBwb3J0ZWQpLFxuICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmXG4gICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC5cbiAgICAgKiBPdGhlcndpc2UsIHdpbmRvd19zaXplID09IDIqV1NJWkUgc28gbW9yZSA+PSAyLlxuICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi5cbiAgICAgKi9cbiAgICAvL0Fzc2VydChtb3JlID49IDIsIFwibW9yZSA8IDJcIik7XG4gICAgbiA9IHJlYWRfYnVmKHMuc3RybSwgcy53aW5kb3csIHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCwgbW9yZSk7XG4gICAgcy5sb29rYWhlYWQgKz0gbjtcblxuICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0ID49IE1JTl9NQVRDSCkge1xuICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0O1xuICAgICAgcy5pbnNfaCA9IHMud2luZG93W3N0cl07XG5cbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgMV0pICYgcy5oYXNoX21hc2s7XG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgIENhbGwgdXBkYXRlX2hhc2goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgd2hpbGUgKHMuaW5zZXJ0KSB7XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgICBzdHIrKztcbiAgICAgICAgcy5pbnNlcnQtLTtcbiAgICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPCBNSU5fTUFUQ0gpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsXG4gICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLlxuICAgICAqL1xuXG4gIH0gd2hpbGUgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLnN0cm0uYXZhaWxfaW4gIT09IDApO1xuXG4gIC8qIElmIHRoZSBXSU5fSU5JVCBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgaGF2ZSBuZXZlciBiZWVuXG4gICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZlxuICAgKiB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgKG9yIHVuaW5pdGlhbGlzZWQgYXMgSnVsaWFuIHdyaXRlcykgYnl0ZXMgYnlcbiAgICogdGhlIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMuICBVcGRhdGUgdGhlIGhpZ2ggd2F0ZXIgbWFyayBmb3IgdGhlIG5leHRcbiAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAqIHJvdXRpbmVzIGFsbG93IHNjYW5uaW5nIHRvIHN0cnN0YXJ0ICsgTUFYX01BVENILCBpZ25vcmluZyBsb29rYWhlYWQuXG4gICAqL1xuLy8gIGlmIChzLmhpZ2hfd2F0ZXIgPCBzLndpbmRvd19zaXplKSB7XG4vLyAgICB2YXIgY3VyciA9IHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZDtcbi8vICAgIHZhciBpbml0ID0gMDtcbi8vXG4vLyAgICBpZiAocy5oaWdoX3dhdGVyIDwgY3Vycikge1xuLy8gICAgICAvKiBQcmV2aW91cyBoaWdoIHdhdGVyIG1hcmsgYmVsb3cgY3VycmVudCBkYXRhIC0tIHplcm8gV0lOX0lOSVRcbi8vICAgICAgICogYnl0ZXMgb3IgdXAgdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gcy53aW5kb3dfc2l6ZSAtIGN1cnI7XG4vLyAgICAgIGlmIChpbml0ID4gV0lOX0lOSVQpXG4vLyAgICAgICAgaW5pdCA9IFdJTl9JTklUO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBjdXJyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgPSBjdXJyICsgaW5pdDtcbi8vICAgIH1cbi8vICAgIGVsc2UgaWYgKHMtPmhpZ2hfd2F0ZXIgPCAodWxnKWN1cnIgKyBXSU5fSU5JVCkge1xuLy8gICAgICAvKiBIaWdoIHdhdGVyIG1hcmsgYXQgb3IgYWJvdmUgY3VycmVudCBkYXRhLCBidXQgYmVsb3cgY3VycmVudCBkYXRhXG4vLyAgICAgICAqIHBsdXMgV0lOX0lOSVQgLS0gemVybyBvdXQgdG8gY3VycmVudCBkYXRhIHBsdXMgV0lOX0lOSVQsIG9yIHVwXG4vLyAgICAgICAqIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLlxuLy8gICAgICAgKi9cbi8vICAgICAgaW5pdCA9ICh1bGcpY3VyciArIFdJTl9JTklUIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgaWYgKGluaXQgPiBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXIpXG4vLyAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgcy0+aGlnaF93YXRlciwgKHVuc2lnbmVkKWluaXQpO1xuLy8gICAgICBzLT5oaWdoX3dhdGVyICs9IGluaXQ7XG4vLyAgICB9XG4vLyAgfVxuLy9cbi8vICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQsXG4vLyAgICBcIm5vdCBlbm91Z2ggcm9vbSBmb3Igc2VhcmNoXCIpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuXG4gKiB0aGUgY3VycmVudCBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IHNpbmNlXG4gKiB1bmNvbXByZXNzaWJsZSBkYXRhIGlzIHByb2JhYmx5IG5vdCB1c2VmdWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZFxuICogb25seSBmb3IgdGhlIGxldmVsPTAgY29tcHJlc3Npb24gb3B0aW9uLlxuICogTk9URTogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGF2b2lkIGV4dHJhIGNvcHlpbmcgZnJvbVxuICogd2luZG93IHRvIHBlbmRpbmdfYnVmLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3N0b3JlZChzLCBmbHVzaCkge1xuICAvKiBTdG9yZWQgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDB4ZmZmZiBieXRlcywgcGVuZGluZ19idWYgaXMgbGltaXRlZFxuICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjpcbiAgICovXG4gIHZhciBtYXhfYmxvY2tfc2l6ZSA9IDB4ZmZmZjtcblxuICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7XG4gICAgbWF4X2Jsb2NrX3NpemUgPSBzLnBlbmRpbmdfYnVmX3NpemUgLSA1O1xuICB9XG5cbiAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IDEpIHtcblxuICAgICAgLy9Bc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHxcbiAgICAgIC8vICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsIFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIGlmICghKHMuc3Ryc3RhcnQgPCBzLndfc2l6ZSArIChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHx8XG4vLyAgICAgICAgcy5ibG9ja19zdGFydCA+PSBzLndfc2l6ZSkpIHtcbi8vICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIH1cblxuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDAgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cblxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG4gICAgLy9Bc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsIFwiYmxvY2sgZ29uZVwiKTtcbi8vICAgIGlmIChzLmJsb2NrX3N0YXJ0IDwgMCkgdGhyb3cgbmV3IEVycm9yKFwiYmxvY2sgZ29uZVwiKTtcblxuICAgIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7XG4gICAgcy5sb29rYWhlYWQgPSAwO1xuXG4gICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovXG4gICAgdmFyIG1heF9zdGFydCA9IHMuYmxvY2tfc3RhcnQgKyBtYXhfYmxvY2tfc2l6ZTtcblxuICAgIGlmIChzLnN0cnN0YXJ0ID09PSAwIHx8IHMuc3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7XG4gICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqL1xuICAgICAgcy5sb29rYWhlYWQgPSBzLnN0cnN0YXJ0IC0gbWF4X3N0YXJ0O1xuICAgICAgcy5zdHJzdGFydCA9IG1heF9zdGFydDtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG5cblxuICAgIH1cbiAgICAvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWVcbiAgICAgKiBuZWdhdGl2ZSBhbmQgdGhlIGRhdGEgd2lsbCBiZSBnb25lOlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCA+PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cblxuICBzLmluc2VydCA9IDA7XG5cbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG5cbiAgaWYgKHMuc3Ryc3RhcnQgPiBzLmJsb2NrX3N0YXJ0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX05FRURfTU9SRTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wcmVzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSBjdXJyZW50XG4gKiBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBhbmQgaW5zZXJ0c1xuICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0cmluZ3Mgb3IgZm9yIHNob3J0XG4gKiBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfZmFzdChzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgLyogaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlXG4gICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSFxuICAgICAqL1xuICAgIGlmIChoYXNoX2hlYWQgIT09IDAvKk5JTCovICYmICgocy5zdHJzdGFydCAtIGhhc2hfaGVhZCkgPD0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cbiAgICB9XG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy8gY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGgpOyAvLyBmb3IgZGVidWcgb25seVxuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcblxuICAgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgICogaXMgbm90IHRvbyBsYXJnZS4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IHMubWF4X2xhenlfbWF0Y2gvKm1heF9pbnNlcnRfbGVuZ3RoKi8gJiYgcy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmVcbiAgICAgICAgICAgKiBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLlxuICAgICAgICAgICAqL1xuICAgICAgICB9IHdoaWxlICgtLXMubWF0Y2hfbGVuZ3RoICE9PSAwKTtcbiAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgfSBlbHNlXG4gICAgICB7XG4gICAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICAgICAgcy5pbnNfaCA9IHMud2luZG93W3Muc3Ryc3RhcnRdO1xuICAgICAgICAvKiBVUERBVEVfSEFTSChzLCBzLmluc19oLCBzLndpbmRvd1tzLnN0cnN0YXJ0KzFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICAgIC8qIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90XG4gICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMud2luZG93W3Muc3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gKChzLnN0cnN0YXJ0IDwgKE1JTl9NQVRDSCAtIDEpKSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxKTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenlcbiAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXNcbiAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgICAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIHZhciBtYXhfaW5zZXJ0O1xuXG4gIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICovXG4gICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoO1xuICAgIHMucHJldl9tYXRjaCA9IHMubWF0Y2hfc3RhcnQ7XG4gICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgcy5wcmV2X2xlbmd0aCA8IHMubWF4X2xhenlfbWF0Y2ggJiZcbiAgICAgICAgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKS8qTUFYX0RJU1QocykqLykge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG5cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSA1ICYmXG4gICAgICAgICAocy5zdHJhdGVneSA9PT0gWl9GSUxURVJFRCB8fCAocy5tYXRjaF9sZW5ndGggPT09IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCA+IDQwOTYvKlRPT19GQVIqLykpKSB7XG5cbiAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZVxuICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LlxuICAgICAgICAgKi9cbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBhdCB0aGUgcHJldmlvdXMgc3RlcCBhbmQgdGhlIGN1cnJlbnRcbiAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOlxuICAgICAqL1xuICAgIGlmIChzLnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLm1hdGNoX2xlbmd0aCA8PSBzLnByZXZfbGVuZ3RoKSB7XG4gICAgICBtYXhfaW5zZXJ0ID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkIC0gTUlOX01BVENIO1xuICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovXG5cbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydC0xLCBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGgpO1xuXG4gICAgICAvKioqX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7XG4gICAgICAvKiBJbnNlcnQgaW4gaGFzaCB0YWJsZSBhbGwgc3RyaW5ncyB1cCB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaC5cbiAgICAgICAqIHN0cnN0YXJ0LTEgYW5kIHN0cnN0YXJ0IGFyZSBhbHJlYWR5IGluc2VydGVkLiBJZiB0aGVyZSBpcyBub3RcbiAgICAgICAqIGVub3VnaCBsb29rYWhlYWQsIHRoZSBsYXN0IHR3byBzdHJpbmdzIGFyZSBub3QgaW5zZXJ0ZWQgaW5cbiAgICAgICAqIHRoZSBoYXNoIHRhYmxlLlxuICAgICAgICovXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLnByZXZfbGVuZ3RoIC0gMTtcbiAgICAgIHMucHJldl9sZW5ndGggLT0gMjtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKCsrcy5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICgtLXMucHJldl9sZW5ndGggIT09IDApO1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuXG4gICAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgICAgfVxuICAgICAgICAvKioqL1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkge1xuICAgICAgLyogSWYgdGhlcmUgd2FzIG5vIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvbiwgb3V0cHV0IGFcbiAgICAgICAqIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2hcbiAgICAgICAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhlIHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuXG4gICAgICAgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DS19PTkxZKHMsIDApICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIC8qKiovXG4gICAgICB9XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvclxuICAgICAgICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChmbHVzaCAhPSBaX05PX0ZMVVNILCBcIm5vIGZsdXNoP1wiKTtcbiAgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pO1xuXG4gICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICB9XG4gIHMuaW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSCAtIDEgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGb3IgWl9STEUsIHNpbXBseSBsb29rIGZvciBydW5zIG9mIGJ5dGVzLCBnZW5lcmF0ZSBtYXRjaGVzIG9ubHkgb2YgZGlzdGFuY2VcbiAqIG9uZS4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuICAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZlxuICogZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gWl9STEUuKVxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3JsZShzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuICB2YXIgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovXG4gIHZhciBzY2FuLCBzdHJlbmQ7ICAgICAgLyogc2NhbiBnb2VzIHVwIHRvIHN0cmVuZCBmb3IgbGVuZ3RoIG9mIHJ1biAqL1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7XG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBsb25nZXN0IHJ1biwgcGx1cyBvbmUgZm9yIHRoZSB1bnJvbGxlZCBsb29wLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8PSBNQVhfTUFUQ0gpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0ID4gMCkge1xuICAgICAgc2NhbiA9IHMuc3Ryc3RhcnQgLSAxO1xuICAgICAgcHJldiA9IF93aW5bc2Nhbl07XG4gICAgICBpZiAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0pIHtcbiAgICAgICAgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgICAgICB9IHdoaWxlIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID4gcy5sb29rYWhlYWQpIHtcbiAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IHMubG9va2FoZWFkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL0Fzc2VydChzY2FuIDw9IHMtPndpbmRvdysodUludCkocy0+d2luZG93X3NpemUtMSksIFwid2lsZCBzY2FuXCIpO1xuICAgIH1cblxuICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBlbWl0IGxpdGVyYWwgKi9cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMuc3Ryc3RhcnQgLSAxLCBzLm1hdGNoX2xlbmd0aCk7XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3QocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gMDtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX0hVRkZNQU5fT05MWSwgZG8gbm90IGxvb2sgZm9yIG1hdGNoZXMuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLlxuICogKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2YgZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gSHVmZm1hbi4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfaHVmZihzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGxpdGVyYWwgdG8gd3JpdGUuICovXG4gICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogT3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG4gICAgcy5sb29rYWhlYWQtLTtcbiAgICBzLnN0cnN0YXJ0Kys7XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvblxuICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvXG4gKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmVcbiAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy5cbiAqL1xuZnVuY3Rpb24gQ29uZmlnKGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbiwgZnVuYykge1xuICB0aGlzLmdvb2RfbGVuZ3RoID0gZ29vZF9sZW5ndGg7XG4gIHRoaXMubWF4X2xhenkgPSBtYXhfbGF6eTtcbiAgdGhpcy5uaWNlX2xlbmd0aCA9IG5pY2VfbGVuZ3RoO1xuICB0aGlzLm1heF9jaGFpbiA9IG1heF9jaGFpbjtcbiAgdGhpcy5mdW5jID0gZnVuYztcbn1cblxudmFyIGNvbmZpZ3VyYXRpb25fdGFibGU7XG5cbmNvbmZpZ3VyYXRpb25fdGFibGUgPSBbXG4gIC8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi9cbiAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksICAgICAgICAgIC8qIDAgc3RvcmUgb25seSAqL1xuICBuZXcgQ29uZmlnKDQsIDQsIDgsIDQsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAgLyogMSBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAgLyogMiAqL1xuICBuZXcgQ29uZmlnKDQsIDYsIDMyLCAzMiwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgLyogMyAqL1xuXG4gIG5ldyBDb25maWcoNCwgNCwgMTYsIDE2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAgICAvKiA0IGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAzMiwgMzIsIGRlZmxhdGVfc2xvdyksICAgICAgICAgLyogNSAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNiAqL1xuICBuZXcgQ29uZmlnKDgsIDMyLCAxMjgsIDI1NiwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNyAqL1xuICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwgICAgLyogOCAqL1xuICBuZXcgQ29uZmlnKDMyLCAyNTgsIDI1OCwgNDA5NiwgZGVmbGF0ZV9zbG93KSAgICAgLyogOSBtYXggY29tcHJlc3Npb24gKi9cbl07XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSBcImxvbmdlc3QgbWF0Y2hcIiByb3V0aW5lcyBmb3IgYSBuZXcgemxpYiBzdHJlYW1cbiAqL1xuZnVuY3Rpb24gbG1faW5pdChzKSB7XG4gIHMud2luZG93X3NpemUgPSAyICogcy53X3NpemU7XG5cbiAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOlxuICAgKi9cbiAgcy5tYXhfbGF6eV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2xhenk7XG4gIHMuZ29vZF9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZ29vZF9sZW5ndGg7XG4gIHMubmljZV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubmljZV9sZW5ndGg7XG4gIHMubWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2NoYWluO1xuXG4gIHMuc3Ryc3RhcnQgPSAwO1xuICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLmluc2VydCA9IDA7XG4gIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgcy5pbnNfaCA9IDA7XG59XG5cblxuZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCkge1xuICB0aGlzLnN0cm0gPSBudWxsOyAgICAgICAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovXG4gIHRoaXMuc3RhdHVzID0gMDsgICAgICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovXG4gIHRoaXMucGVuZGluZ19idWYgPSBudWxsOyAgICAgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovXG4gIHRoaXMucGVuZGluZ19idWZfc2l6ZSA9IDA7ICAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovXG4gIHRoaXMucGVuZGluZ19vdXQgPSAwOyAgICAgICAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqL1xuICB0aGlzLnBlbmRpbmcgPSAwOyAgICAgICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuZ3poZWFkID0gbnVsbDsgICAgICAgICAvKiBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiB0byB3cml0ZSAqL1xuICB0aGlzLmd6aW5kZXggPSAwOyAgICAgICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi9cbiAgdGhpcy5tZXRob2QgPSBaX0RFRkxBVEVEOyAvKiBjYW4gb25seSBiZSBERUZMQVRFRCAqL1xuICB0aGlzLmxhc3RfZmx1c2ggPSAtMTsgICAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovXG5cbiAgdGhpcy53X3NpemUgPSAwOyAgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovXG4gIHRoaXMud19iaXRzID0gMDsgIC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqL1xuICB0aGlzLndfbWFzayA9IDA7ICAvKiB3X3NpemUgLSAxICovXG5cbiAgdGhpcy53aW5kb3cgPSBudWxsO1xuICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdyxcbiAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemVcbiAgICogYnl0ZXMuIFdpdGggdGhpcyBvcmdhbml6YXRpb24sIG1hdGNoZXMgYXJlIGxpbWl0ZWQgdG8gYSBkaXN0YW5jZSBvZlxuICAgKiB3U2l6ZS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXNcbiAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuXG4gICAqL1xuXG4gIHRoaXMud2luZG93X3NpemUgPSAwO1xuICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlclxuICAgKiBpcyBkaXJlY3RseSB1c2VkIGFzIHNsaWRpbmcgd2luZG93LlxuICAgKi9cblxuICB0aGlzLnByZXYgPSBudWxsO1xuICAvKiBMaW5rIHRvIG9sZGVyIHN0cmluZyB3aXRoIHNhbWUgaGFzaCBpbmRleC4gVG8gbGltaXQgdGhlIHNpemUgb2YgdGhpc1xuICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLlxuICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy5cbiAgICovXG5cbiAgdGhpcy5oZWFkID0gbnVsbDsgICAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqL1xuXG4gIHRoaXMuaW5zX2ggPSAwOyAgICAgICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqL1xuICB0aGlzLmhhc2hfc2l6ZSA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi9cbiAgdGhpcy5oYXNoX2JpdHMgPSAwOyAgIC8qIGxvZzIoaGFzaF9zaXplKSAqL1xuICB0aGlzLmhhc2hfbWFzayA9IDA7ICAgLyogaGFzaF9zaXplLTEgKi9cblxuICB0aGlzLmhhc2hfc2hpZnQgPSAwO1xuICAvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dFxuICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3RcbiAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6XG4gICAqICAgaGFzaF9zaGlmdCAqIE1JTl9NQVRDSCA+PSBoYXNoX2JpdHNcbiAgICovXG5cbiAgdGhpcy5ibG9ja19zdGFydCA9IDA7XG4gIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0c1xuICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLlxuICAgKi9cblxuICB0aGlzLm1hdGNoX2xlbmd0aCA9IDA7ICAgICAgLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi9cbiAgdGhpcy5wcmV2X21hdGNoID0gMDsgICAgICAgIC8qIHByZXZpb3VzIG1hdGNoICovXG4gIHRoaXMubWF0Y2hfYXZhaWxhYmxlID0gMDsgICAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovXG4gIHRoaXMuc3Ryc3RhcnQgPSAwOyAgICAgICAgICAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovXG4gIHRoaXMubWF0Y2hfc3RhcnQgPSAwOyAgICAgICAvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi9cbiAgdGhpcy5sb29rYWhlYWQgPSAwOyAgICAgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi9cblxuICB0aGlzLnByZXZfbGVuZ3RoID0gMDtcbiAgLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzXG4gICAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLlxuICAgKi9cblxuICB0aGlzLm1heF9jaGFpbl9sZW5ndGggPSAwO1xuICAvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpc1xuICAgKiBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlXG4gICAqIHNwZWVkLlxuICAgKi9cblxuICB0aGlzLm1heF9sYXp5X21hdGNoID0gMDtcbiAgLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseVxuICAgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvblxuICAgKiBsZXZlbHMgPj0gNC5cbiAgICovXG4gIC8vIFRoYXQncyBhbGlhcyB0byBtYXhfbGF6eV9tYXRjaCwgZG9uJ3QgdXNlIGRpcmVjdGx5XG4gIC8vdGhpcy5tYXhfaW5zZXJ0X2xlbmd0aCA9IDA7XG4gIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90XG4gICAqIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy5cbiAgICovXG5cbiAgdGhpcy5sZXZlbCA9IDA7ICAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAoMS4uOSkgKi9cbiAgdGhpcy5zdHJhdGVneSA9IDA7ICAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovXG5cbiAgdGhpcy5nb29kX21hdGNoID0gMDtcbiAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovXG5cbiAgdGhpcy5uaWNlX21hdGNoID0gMDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqL1xuXG4gICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi9cblxuICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5nICovXG5cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fbHRyZWVbSEVBUF9TSVpFXTsgICAvKiBsaXRlcmFsIGFuZCBsZW5ndGggdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovXG5cbiAgLy8gVXNlIGZsYXQgYXJyYXkgb2YgRE9VQkxFIHNpemUsIHdpdGggaW50ZXJsZWF2ZWQgZmF0YSxcbiAgLy8gYmVjYXVzZSBKUyBkb2VzIG5vdCBzdXBwb3J0IGVmZmVjdGl2ZVxuICB0aGlzLmR5bl9sdHJlZSAgPSBuZXcgdXRpbHMuQnVmMTYoSEVBUF9TSVpFICogMik7XG4gIHRoaXMuZHluX2R0cmVlICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIERfQ09ERVMgKyAxKSAqIDIpO1xuICB0aGlzLmJsX3RyZWUgICAgPSBuZXcgdXRpbHMuQnVmMTYoKDIgKiBCTF9DT0RFUyArIDEpICogMik7XG4gIHplcm8odGhpcy5keW5fbHRyZWUpO1xuICB6ZXJvKHRoaXMuZHluX2R0cmVlKTtcbiAgemVybyh0aGlzLmJsX3RyZWUpO1xuXG4gIHRoaXMubF9kZXNjICAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi9cbiAgdGhpcy5kX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi9cbiAgdGhpcy5ibF9kZXNjICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGJpdCBsZW5ndGggdHJlZSAqL1xuXG4gIC8vdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdO1xuICB0aGlzLmJsX2NvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWF9CSVRTICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vaW50IGhlYXBbMipMX0NPREVTKzFdOyAgICAgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB0aGlzLmhlYXAgPSBuZXcgdXRpbHMuQnVmMTYoMiAqIExfQ09ERVMgKyAxKTsgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB6ZXJvKHRoaXMuaGVhcCk7XG5cbiAgdGhpcy5oZWFwX2xlbiA9IDA7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovXG4gIHRoaXMuaGVhcF9tYXggPSAwOyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi9cbiAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy5cbiAgICovXG5cbiAgdGhpcy5kZXB0aCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAvL3VjaCBkZXB0aFsyKkxfQ09ERVMrMV07XG4gIHplcm8odGhpcy5kZXB0aCk7XG4gIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3lcbiAgICovXG5cbiAgdGhpcy5sX2J1ZiA9IDA7ICAgICAgICAgIC8qIGJ1ZmZlciBpbmRleCBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqL1xuXG4gIHRoaXMubGl0X2J1ZnNpemUgPSAwO1xuICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yXG4gICAqIGxpbWl0aW5nIGxpdF9idWZzaXplIHRvIDY0SzpcbiAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVyc1xuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0XG4gICAqICAgICBkYXRhIGlzIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlblxuICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3JcbiAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKVxuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW5cbiAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS5cbiAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLlxuICAgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0XG4gICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yXG4gICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnlcbiAgICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlXG4gICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmdcbiAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS5cbiAgICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNFxuICAgKi9cblxuICB0aGlzLmxhc3RfbGl0ID0gMDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG5cbiAgdGhpcy5kX2J1ZiA9IDA7XG4gIC8qIEJ1ZmZlciBpbmRleCBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmVcbiAgICogdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUbyB1c2UgZGlmZmVyZW50IGxlbmd0aHMsIGFuIGV4dHJhIGZsYWdcbiAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LlxuICAgKi9cblxuICB0aGlzLm9wdF9sZW4gPSAwOyAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovXG4gIHRoaXMuc3RhdGljX2xlbiA9IDA7ICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqL1xuICB0aGlzLm1hdGNoZXMgPSAwOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqL1xuICB0aGlzLmluc2VydCA9IDA7ICAgICAgICAvKiBieXRlcyBhdCBlbmQgb2Ygd2luZG93IGxlZnQgdG8gaW5zZXJ0ICovXG5cblxuICB0aGlzLmJpX2J1ZiA9IDA7XG4gIC8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0XG4gICAqIHNpZ25pZmljYW50IGJpdHMpLlxuICAgKi9cbiAgdGhpcy5iaV92YWxpZCA9IDA7XG4gIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdFxuICAgKiBhcmUgYWx3YXlzIHplcm8uXG4gICAqL1xuXG4gIC8vIFVzZWQgZm9yIHdpbmRvdyBtZW1vcnkgaW5pdC4gV2Ugc2FmZWx5IGlnbm9yZSBpdCBmb3IgSlMuIFRoYXQgbWFrZXNcbiAgLy8gc2Vuc2Ugb25seSBmb3IgcG9pbnRlcnMgYW5kIG1lbW9yeSBjaGVjayB0b29scy5cbiAgLy90aGlzLmhpZ2hfd2F0ZXIgPSAwO1xuICAvKiBIaWdoIHdhdGVyIG1hcmsgb2Zmc2V0IGluIHdpbmRvdyBmb3IgaW5pdGlhbGl6ZWQgYnl0ZXMgLS0gYnl0ZXMgYWJvdmVcbiAgICogdGhpcyBhcmUgc2V0IHRvIHplcm8gaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHdhcm5pbmdzIHdoZW5cbiAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZW5cbiAgICogdXBkYXRlZCB0byB0aGUgbmV3IGhpZ2ggd2F0ZXIgbWFyay5cbiAgICovXG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gMDtcbiAgc3RybS5kYXRhX3R5cGUgPSBaX1VOS05PV047XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHMucGVuZGluZyA9IDA7XG4gIHMucGVuZGluZ19vdXQgPSAwO1xuXG4gIGlmIChzLndyYXAgPCAwKSB7XG4gICAgcy53cmFwID0gLXMud3JhcDtcbiAgICAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqL1xuICB9XG4gIHMuc3RhdHVzID0gKHMud3JhcCA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFKTtcbiAgc3RybS5hZGxlciA9IChzLndyYXAgPT09IDIpID9cbiAgICAwICAvLyBjcmMzMigwLCBaX05VTEwsIDApXG4gIDpcbiAgICAxOyAvLyBhZGxlcjMyKDAsIFpfTlVMTCwgMClcbiAgcy5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSDtcbiAgdHJlZXMuX3RyX2luaXQocyk7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciByZXQgPSBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuICBpZiAocmV0ID09PSBaX09LKSB7XG4gICAgbG1faW5pdChzdHJtLnN0YXRlKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVTZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIGlmIChzdHJtLnN0YXRlLndyYXAgIT09IDIpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0cm0uc3RhdGUuZ3poZWFkID0gaGVhZDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkge1xuICBpZiAoIXN0cm0pIHsgLy8gPT09IFpfTlVMTFxuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICB2YXIgd3JhcCA9IDE7XG5cbiAgaWYgKGxldmVsID09PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIHtcbiAgICBsZXZlbCA9IDY7XG4gIH1cblxuICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovXG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAod2luZG93Qml0cyA+IDE1KSB7XG4gICAgd3JhcCA9IDI7ICAgICAgICAgICAvKiB3cml0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCAqL1xuICAgIHdpbmRvd0JpdHMgLT0gMTY7XG4gIH1cblxuXG4gIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPT0gWl9ERUZMQVRFRCB8fFxuICAgIHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8XG4gICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cblxuICBpZiAod2luZG93Qml0cyA9PT0gOCkge1xuICAgIHdpbmRvd0JpdHMgPSA5O1xuICB9XG4gIC8qIHVudGlsIDI1Ni1ieXRlIHdpbmRvdyBidWcgZml4ZWQgKi9cblxuICB2YXIgcyA9IG5ldyBEZWZsYXRlU3RhdGUoKTtcblxuICBzdHJtLnN0YXRlID0gcztcbiAgcy5zdHJtID0gc3RybTtcblxuICBzLndyYXAgPSB3cmFwO1xuICBzLmd6aGVhZCA9IG51bGw7XG4gIHMud19iaXRzID0gd2luZG93Qml0cztcbiAgcy53X3NpemUgPSAxIDw8IHMud19iaXRzO1xuICBzLndfbWFzayA9IHMud19zaXplIC0gMTtcblxuICBzLmhhc2hfYml0cyA9IG1lbUxldmVsICsgNztcbiAgcy5oYXNoX3NpemUgPSAxIDw8IHMuaGFzaF9iaXRzO1xuICBzLmhhc2hfbWFzayA9IHMuaGFzaF9zaXplIC0gMTtcbiAgcy5oYXNoX3NoaWZ0ID0gfn4oKHMuaGFzaF9iaXRzICsgTUlOX01BVENIIC0gMSkgLyBNSU5fTUFUQ0gpO1xuXG4gIHMud2luZG93ID0gbmV3IHV0aWxzLkJ1Zjgocy53X3NpemUgKiAyKTtcbiAgcy5oZWFkID0gbmV3IHV0aWxzLkJ1ZjE2KHMuaGFzaF9zaXplKTtcbiAgcy5wcmV2ID0gbmV3IHV0aWxzLkJ1ZjE2KHMud19zaXplKTtcblxuICAvLyBEb24ndCBuZWVkIG1lbSBpbml0IG1hZ2ljIGZvciBKUy5cbiAgLy9zLmhpZ2hfd2F0ZXIgPSAwOyAgLyogbm90aGluZyB3cml0dGVuIHRvIHMtPndpbmRvdyB5ZXQgKi9cblxuICBzLmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi9cblxuICBzLnBlbmRpbmdfYnVmX3NpemUgPSBzLmxpdF9idWZzaXplICogNDtcblxuICAvL292ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpO1xuICAvL3MtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTtcbiAgcy5wZW5kaW5nX2J1ZiA9IG5ldyB1dGlscy5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSk7XG5cbiAgLy8gSXQgaXMgb2Zmc2V0IGZyb20gYHMucGVuZGluZ19idWZgIChzaXplIGlzIGBzLmxpdF9idWZzaXplICogMmApXG4gIC8vcy0+ZF9idWYgPSBvdmVybGF5ICsgcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7XG4gIHMuZF9idWYgPSAxICogcy5saXRfYnVmc2l6ZTtcblxuICAvL3MtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7XG4gIHMubF9idWYgPSAoMSArIDIpICogcy5saXRfYnVmc2l6ZTtcblxuICBzLmxldmVsID0gbGV2ZWw7XG4gIHMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgcy5tZXRob2QgPSBtZXRob2Q7XG5cbiAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIHtcbiAgcmV0dXJuIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgWl9ERUZMQVRFRCwgTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kpO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIG9sZF9mbHVzaCwgcztcbiAgdmFyIGJlZywgdmFsOyAvLyBmb3IgZ3ppcCBoZWFkZXIgd3JpdGUgb25seVxuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fFxuICAgIGZsdXNoID4gWl9CTE9DSyB8fCBmbHVzaCA8IDApIHtcbiAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUikgOiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuXG4gIGlmICghc3RybS5vdXRwdXQgfHxcbiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB8fFxuICAgICAgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT09IFpfRklOSVNIKSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IFpfQlVGX0VSUk9SIDogWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgcy5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovXG4gIG9sZF9mbHVzaCA9IHMubGFzdF9mbHVzaDtcbiAgcy5sYXN0X2ZsdXNoID0gZmx1c2g7XG5cbiAgLyogV3JpdGUgdGhlIGhlYWRlciAqL1xuICBpZiAocy5zdGF0dXMgPT09IElOSVRfU1RBVEUpIHtcblxuICAgIGlmIChzLndyYXAgPT09IDIpIHsgLy8gR1pJUCBoZWFkZXJcbiAgICAgIHN0cm0uYWRsZXIgPSAwOyAgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgIHB1dF9ieXRlKHMsIDMxKTtcbiAgICAgIHB1dF9ieXRlKHMsIDEzOSk7XG4gICAgICBwdXRfYnl0ZShzLCA4KTtcbiAgICAgIGlmICghcy5nemhlYWQpIHsgLy8gcy0+Z3poZWFkID09IFpfTlVMTFxuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGV4dCA/IDEgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzLmd6aGVhZC5oY3JjID8gMiA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5leHRyYSA/IDAgOiA0KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQubmFtZSA/IDAgOiA4KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQuY29tbWVudCA/IDAgOiAxNilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDgpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDE2KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAyNCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5vcyAmIDB4ZmYpO1xuICAgICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZik7XG4gICAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZywgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBFWFRSQV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSAvLyBERUZMQVRFIGhlYWRlclxuICAgIHtcbiAgICAgIHZhciBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy53X2JpdHMgLSA4KSA8PCA0KSkgPDwgODtcbiAgICAgIHZhciBsZXZlbF9mbGFncyA9IC0xO1xuXG4gICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPCA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA9PT0gNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDM7XG4gICAgICB9XG4gICAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpO1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHsgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOyB9XG4gICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpO1xuXG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpO1xuXG4gICAgICAvKiBTYXZlIHRoZSBhZGxlcjMyIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeTogKi9cbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gMTsgLy8gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTtcbiAgICB9XG4gIH1cblxuLy8jaWZkZWYgR1pJUFxuICBpZiAocy5zdGF0dXMgPT09IEVYVFJBX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmV4dHJhLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cblxuICAgICAgd2hpbGUgKHMuZ3ppbmRleCA8IChzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmZmYpKSB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmFbcy5nemluZGV4XSAmIDB4ZmYpO1xuICAgICAgICBzLmd6aW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3ppbmRleCA9PT0gcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gTkFNRV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5uYW1lLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBDT01NRU5UX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmNvbW1lbnQvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5jb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgaWYgKHMucGVuZGluZyArIDIgPiBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyIDw9IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgICAgIHN0cm0uYWRsZXIgPSAwOyAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgIH1cbiAgfVxuLy8jZW5kaWZcblxuICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovXG4gIGlmIChzLnBlbmRpbmcgIT09IDApIHtcbiAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aFxuICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmRcbiAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLFxuICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2VcbiAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZTpcbiAgICAgICAqL1xuICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICByZXR1cm4gWl9PSztcbiAgICB9XG5cbiAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmVcbiAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcFxuICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi5cbiAgICAgKi9cbiAgfSBlbHNlIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHJhbmsoZmx1c2gpIDw9IHJhbmsob2xkX2ZsdXNoKSAmJlxuICAgIGZsdXNoICE9PSBaX0ZJTklTSCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogVXNlciBtdXN0IG5vdCBwcm92aWRlIG1vcmUgaW5wdXQgYWZ0ZXIgdGhlIGZpcnN0IEZJTklTSDogKi9cbiAgaWYgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLlxuICAgKi9cbiAgaWYgKHN0cm0uYXZhaWxfaW4gIT09IDAgfHwgcy5sb29rYWhlYWQgIT09IDAgfHxcbiAgICAoZmx1c2ggIT09IFpfTk9fRkxVU0ggJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkpIHtcbiAgICB2YXIgYnN0YXRlID0gKHMuc3RyYXRlZ3kgPT09IFpfSFVGRk1BTl9PTkxZKSA/IGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgOlxuICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfUkxFID8gZGVmbGF0ZV9ybGUocywgZmx1c2gpIDpcbiAgICAgICAgY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5mdW5jKHMsIGZsdXNoKSk7XG5cbiAgICBpZiAoYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9ET05FKSB7XG4gICAgICBzLnN0YXR1cyA9IEZJTklTSF9TVEFURTtcbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfTkVFRF9NT1JFIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQpIHtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgICAgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICB9XG4gICAgICByZXR1cm4gWl9PSztcbiAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGxcbiAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlXG4gICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW5cbiAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvXG4gICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3RcbiAgICAgICAqIG9uZSBlbXB0eSBibG9jay5cbiAgICAgICAqL1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19CTE9DS19ET05FKSB7XG4gICAgICBpZiAoZmx1c2ggPT09IFpfUEFSVElBTF9GTFVTSCkge1xuICAgICAgICB0cmVlcy5fdHJfYWxpZ24ocyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChmbHVzaCAhPT0gWl9CTE9DSykgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi9cblxuICAgICAgICB0cmVlcy5fdHJfc3RvcmVkX2Jsb2NrKHMsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWRcbiAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZsYXRlX3N5bmMoKS5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9GVUxMX0ZMVVNIKSB7XG4gICAgICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovICAgICAgICAgICAgIC8qIGZvcmdldCBoaXN0b3J5ICovXG4gICAgICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5pbnNlcnQgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICAgIHJldHVybiBaX09LO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL0Fzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCBcImJ1ZzJcIik7XG4gIC8vaWYgKHN0cm0uYXZhaWxfb3V0IDw9IDApIHsgdGhyb3cgbmV3IEVycm9yKFwiYnVnMlwiKTt9XG5cbiAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCkgeyByZXR1cm4gWl9PSzsgfVxuICBpZiAocy53cmFwIDw9IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VORDsgfVxuXG4gIC8qIFdyaXRlIHRoZSB0cmFpbGVyICovXG4gIGlmIChzLndyYXAgPT09IDIpIHtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAyNCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLnRvdGFsX2luICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAyNCkgJiAweGZmKTtcbiAgfVxuICBlbHNlXG4gIHtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gIH1cblxuICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAvKiBJZiBhdmFpbF9vdXQgaXMgemVybywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCBkZWZsYXRlIGFnYWluXG4gICAqIHRvIGZsdXNoIHRoZSByZXN0LlxuICAgKi9cbiAgaWYgKHMud3JhcCA+IDApIHsgcy53cmFwID0gLXMud3JhcDsgfVxuICAvKiB3cml0ZSB0aGUgdHJhaWxlciBvbmx5IG9uY2UhICovXG4gIHJldHVybiBzLnBlbmRpbmcgIT09IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlRW5kKHN0cm0pIHtcbiAgdmFyIHN0YXR1cztcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSBJTklUX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBFWFRSQV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gTkFNRV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQ09NTUVOVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gSENSQ19TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQlVTWV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRklOSVNIX1NUQVRFXG4gICkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG5cbiAgcmV0dXJuIHN0YXR1cyA9PT0gQlVTWV9TVEFURSA/IGVycihzdHJtLCBaX0RBVEFfRVJST1IpIDogWl9PSztcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlXG4gKiBzZXF1ZW5jZSB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgcztcbiAgdmFyIHN0ciwgbjtcbiAgdmFyIHdyYXA7XG4gIHZhciBhdmFpbDtcbiAgdmFyIG5leHQ7XG4gIHZhciBpbnB1dDtcbiAgdmFyIHRtcERpY3Q7XG5cbiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzID0gc3RybS5zdGF0ZTtcbiAgd3JhcCA9IHMud3JhcDtcblxuICBpZiAod3JhcCA9PT0gMiB8fCAod3JhcCA9PT0gMSAmJiBzLnN0YXR1cyAhPT0gSU5JVF9TVEFURSkgfHwgcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiB3aGVuIHVzaW5nIHpsaWIgd3JhcHBlcnMsIGNvbXB1dGUgQWRsZXItMzIgZm9yIHByb3ZpZGVkIGRpY3Rpb25hcnkgKi9cbiAgaWYgKHdyYXAgPT09IDEpIHtcbiAgICAvKiBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBzdHJtLmFkbGVyID0gYWRsZXIzMihzdHJtLmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgfVxuXG4gIHMud3JhcCA9IDA7ICAgLyogYXZvaWQgY29tcHV0aW5nIEFkbGVyLTMyIGluIHJlYWRfYnVmICovXG5cbiAgLyogaWYgZGljdGlvbmFyeSB3b3VsZCBmaWxsIHdpbmRvdywganVzdCByZXBsYWNlIHRoZSBoaXN0b3J5ICovXG4gIGlmIChkaWN0TGVuZ3RoID49IHMud19zaXplKSB7XG4gICAgaWYgKHdyYXAgPT09IDApIHsgICAgICAgICAgICAvKiBhbHJlYWR5IGVtcHR5IG90aGVyd2lzZSAqL1xuICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG4gICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgcy5pbnNlcnQgPSAwO1xuICAgIH1cbiAgICAvKiB1c2UgdGhlIHRhaWwgKi9cbiAgICAvLyBkaWN0aW9uYXJ5ID0gZGljdGlvbmFyeS5zbGljZShkaWN0TGVuZ3RoIC0gcy53X3NpemUpO1xuICAgIHRtcERpY3QgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSk7XG4gICAgdXRpbHMuYXJyYXlTZXQodG1wRGljdCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCAtIHMud19zaXplLCBzLndfc2l6ZSwgMCk7XG4gICAgZGljdGlvbmFyeSA9IHRtcERpY3Q7XG4gICAgZGljdExlbmd0aCA9IHMud19zaXplO1xuICB9XG4gIC8qIGluc2VydCBkaWN0aW9uYXJ5IGludG8gd2luZG93IGFuZCBoYXNoICovXG4gIGF2YWlsID0gc3RybS5hdmFpbF9pbjtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBzdHJtLmF2YWlsX2luID0gZGljdExlbmd0aDtcbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5pbnB1dCA9IGRpY3Rpb25hcnk7XG4gIGZpbGxfd2luZG93KHMpO1xuICB3aGlsZSAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgc3RyID0gcy5zdHJzdGFydDtcbiAgICBuID0gcy5sb29rYWhlYWQgLSAoTUlOX01BVENIIC0gMSk7XG4gICAgZG8ge1xuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG5cbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjtcbiAgICAgIHN0cisrO1xuICAgIH0gd2hpbGUgKC0tbik7XG4gICAgcy5zdHJzdGFydCA9IHN0cjtcbiAgICBzLmxvb2thaGVhZCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgZmlsbF93aW5kb3cocyk7XG4gIH1cbiAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIHMuaW5zZXJ0ID0gcy5sb29rYWhlYWQ7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmlucHV0ID0gaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBhdmFpbDtcbiAgcy53cmFwID0gd3JhcDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZXhwb3J0cy5kZWZsYXRlSW5pdCA9IGRlZmxhdGVJbml0O1xuZXhwb3J0cy5kZWZsYXRlSW5pdDIgPSBkZWZsYXRlSW5pdDI7XG5leHBvcnRzLmRlZmxhdGVSZXNldCA9IGRlZmxhdGVSZXNldDtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0S2VlcCA9IGRlZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmRlZmxhdGVTZXRIZWFkZXIgPSBkZWZsYXRlU2V0SGVhZGVyO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZUVuZCA9IGRlZmxhdGVFbmQ7XG5leHBvcnRzLmRlZmxhdGVTZXREaWN0aW9uYXJ5ID0gZGVmbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmRlZmxhdGVJbmZvID0gJ3Bha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuZGVmbGF0ZUJvdW5kID0gZGVmbGF0ZUJvdW5kO1xuZXhwb3J0cy5kZWZsYXRlQ29weSA9IGRlZmxhdGVDb3B5O1xuZXhwb3J0cy5kZWZsYXRlUGFyYW1zID0gZGVmbGF0ZVBhcmFtcztcbmV4cG9ydHMuZGVmbGF0ZVBlbmRpbmcgPSBkZWZsYXRlUGVuZGluZztcbmV4cG9ydHMuZGVmbGF0ZVByaW1lID0gZGVmbGF0ZVByaW1lO1xuZXhwb3J0cy5kZWZsYXRlVHVuZSA9IGRlZmxhdGVUdW5lO1xuKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5mdW5jdGlvbiBHWmhlYWRlcigpIHtcbiAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqL1xuICB0aGlzLnRleHQgICAgICAgPSAwO1xuICAvKiBtb2RpZmljYXRpb24gdGltZSAqL1xuICB0aGlzLnRpbWUgICAgICAgPSAwO1xuICAvKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLnhmbGFncyAgICAgPSAwO1xuICAvKiBvcGVyYXRpbmcgc3lzdGVtICovXG4gIHRoaXMub3MgICAgICAgICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi9cbiAgdGhpcy5leHRyYSAgICAgID0gbnVsbDtcbiAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICh2YWxpZCBpZiBleHRyYSAhPSBaX05VTEwpICovXG4gIHRoaXMuZXh0cmFfbGVuICA9IDA7IC8vIEFjdHVhbGx5LCB3ZSBkb24ndCBuZWVkIGl0IGluIEpTLFxuICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbGVhdmUgZm9yIGZldyBjb2RlIG1vZGlmaWNhdGlvbnNcblxuICAvL1xuICAvLyBTZXR1cCBsaW1pdHMgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5XG4gIC8vIGZvciBpbmZsYXRlIHVzZSBjb25zdGFudCBsaW1pdCBpbiA2NTUzNiBieXRlc1xuICAvL1xuXG4gIC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMuZXh0cmFfbWF4ICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi9cbiAgdGhpcy5uYW1lICAgICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5uYW1lX21heCAgID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKi9cbiAgdGhpcy5jb21tZW50ICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5jb21tX21heCAgID0gMDtcbiAgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi9cbiAgdGhpcy5oY3JjICAgICAgID0gMDtcbiAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLmRvbmUgICAgICAgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHWmhlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gU2VlIHN0YXRlIGRlZnMgZnJvbSBpbmZsYXRlLmpzXG52YXIgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xuXG4vKlxuICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZ1xuICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzXG4gICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLlxuICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvclxuICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZVxuICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuXG5cbiAgIEVudHJ5IGFzc3VtcHRpb25zOlxuXG4gICAgICAgIHN0YXRlLm1vZGUgPT09IExFTlxuICAgICAgICBzdHJtLmF2YWlsX2luID49IDZcbiAgICAgICAgc3RybS5hdmFpbF9vdXQgPj0gMjU4XG4gICAgICAgIHN0YXJ0ID49IHN0cm0uYXZhaWxfb3V0XG4gICAgICAgIHN0YXRlLmJpdHMgPCA4XG5cbiAgIE9uIHJldHVybiwgc3RhdGUubW9kZSBpcyBvbmUgb2Y6XG5cbiAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0XG4gICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrXG4gICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhXG5cbiAgIE5vdGVzOlxuXG4gICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGVcbiAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLFxuICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy5cbiAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkXG4gICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLlxuXG4gICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4XG4gICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KClcbiAgICAgIHJlcXVpcmVzIHN0cm0uYXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvclxuICAgICAgb3V0cHV0IHNwYWNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkge1xuICB2YXIgc3RhdGU7XG4gIHZhciBfaW47ICAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmlucHV0ICovXG4gIHZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBoYXZlIGVub3VnaCBpbnB1dCB3aGlsZSBpbiA8IGxhc3QgKi9cbiAgdmFyIF9vdXQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBiZWc7ICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBvdXQgPCBlbmQsIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgKi9cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIHZhciBkbWF4OyAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gemxpYiBoZWFkZXIgKi9cbi8vI2VuZGlmXG4gIHZhciB3c2l6ZTsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdmFyIHdoYXZlOyAgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdmFyIHduZXh0OyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICAvLyBVc2UgYHNfd2luZG93YCBpbnN0ZWFkIGB3aW5kb3dgLCBhdm9pZCBjb25mbGljdCB3aXRoIGluc3RydW1lbnRhdGlvbiB0b29sc1xuICB2YXIgc193aW5kb3c7ICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovXG4gIHZhciBob2xkOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmhvbGQgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uYml0cyAqL1xuICB2YXIgbGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5sZW5jb2RlICovXG4gIHZhciBkY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmRpc3Rjb2RlICovXG4gIHZhciBsbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi9cbiAgdmFyIGRtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovXG4gIHZhciBoZXJlOyAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZWQgdGFibGUgZW50cnkgKi9cbiAgdmFyIG9wOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCwgdW51c2VkIGJ5dGVzICovXG4gIHZhciBkaXN0OyAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqL1xuICB2YXIgZnJvbTsgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovXG4gIHZhciBmcm9tX3NvdXJjZTtcblxuXG4gIHZhciBpbnB1dCwgb3V0cHV0OyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG5cbiAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi9cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICAvL2hlcmUgPSBzdGF0ZS5oZXJlO1xuICBfaW4gPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7XG4gIF9vdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTtcbiAgZW5kID0gX291dCArIChzdHJtLmF2YWlsX291dCAtIDI1Nyk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICBkbWF4ID0gc3RhdGUuZG1heDtcbi8vI2VuZGlmXG4gIHdzaXplID0gc3RhdGUud3NpemU7XG4gIHdoYXZlID0gc3RhdGUud2hhdmU7XG4gIHduZXh0ID0gc3RhdGUud25leHQ7XG4gIHNfd2luZG93ID0gc3RhdGUud2luZG93O1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIGxjb2RlID0gc3RhdGUubGVuY29kZTtcbiAgZGNvZGUgPSBzdGF0ZS5kaXN0Y29kZTtcbiAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7XG4gIGRtYXNrID0gKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMTtcblxuXG4gIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaFxuICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqL1xuXG4gIHRvcDpcbiAgZG8ge1xuICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgIH1cblxuICAgIGhlcmUgPSBsY29kZVtob2xkICYgbG1hc2tdO1xuXG4gICAgZG9sZW46XG4gICAgZm9yICg7OykgeyAvLyBHb3RvIGVtdWxhdGlvblxuICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICBob2xkID4+Pj0gb3A7XG4gICAgICBiaXRzIC09IG9wO1xuICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuICAgICAgaWYgKG9wID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIG91dHB1dFtfb3V0KytdID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqL1xuICAgICAgICBsZW4gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICBpZiAob3ApIHtcbiAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW4gKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBsZW4pKTtcbiAgICAgICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGhlcmUgPSBkY29kZVtob2xkICYgZG1hc2tdO1xuXG4gICAgICAgIGRvZGlzdDpcbiAgICAgICAgZm9yICg7OykgeyAvLyBnb3RvIGVtdWxhdGlvblxuICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcblxuICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi9cbiAgICAgICAgICAgIGRpc3QgPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgICAgIGlmIChkaXN0ID4gZG1heCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBkaXN0KSk7XG4gICAgICAgICAgICBvcCA9IF9vdXQgLSBiZWc7ICAgICAgICAgICAgICAgIC8qIG1heCBkaXN0YW5jZSBpbiBvdXRwdXQgKi9cbiAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgICAgICB9XG5cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gb3AgLSB3aGF2ZSkge1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgIGxlbiAtPSBvcCAtIHdoYXZlO1xuLy8gICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpO1xuLy8gICAgICAgICAgICAgICAgaWYgKG9wID09PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmcm9tID0gMDsgLy8gd2luZG93IGluZGV4XG4gICAgICAgICAgICAgIGZyb21fc291cmNlID0gc193aW5kb3c7XG4gICAgICAgICAgICAgIGlmICh3bmV4dCA9PT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24gY2FzZSAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHduZXh0IDwgb3ApIHsgICAgICAvKiB3cmFwIGFyb3VuZCB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gZW5kIG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSAwO1xuICAgICAgICAgICAgICAgICAgaWYgKHduZXh0IDwgbGVuKSB7ICAvKiBzb21lIGZyb20gc3RhcnQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICAgIG9wID0gd25leHQ7XG4gICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogY29udGlndW91cyBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgICAgIC8qIGNvcHkgZGlyZWN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGxlbmd0aCBpcyB0aHJlZSAqL1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTtcbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAvKiAybmQgbGV2ZWwgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICAgICAgaGVyZSA9IGRjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgICAgICBjb250aW51ZSBkb2Rpc3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgaGVyZSA9IGxjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgIGNvbnRpbnVlIGRvbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuXG4gICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgIH1cbiAgfSB3aGlsZSAoX2luIDwgbGFzdCAmJiBfb3V0IDwgZW5kKTtcblxuICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi9cbiAgbGVuID0gYml0cyA+PiAzO1xuICBfaW4gLT0gbGVuO1xuICBiaXRzIC09IGxlbiA8PCAzO1xuICBob2xkICY9ICgxIDw8IGJpdHMpIC0gMTtcblxuICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJldHVybiAqL1xuICBzdHJtLm5leHRfaW4gPSBfaW47XG4gIHN0cm0ubmV4dF9vdXQgPSBfb3V0O1xuICBzdHJtLmF2YWlsX2luID0gKF9pbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBfaW4pIDogNSAtIChfaW4gLSBsYXN0KSk7XG4gIHN0cm0uYXZhaWxfb3V0ID0gKF9vdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gX291dCkgOiAyNTcgLSAoX291dCAtIGVuZCkpO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIHJldHVybjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzICAgICAgICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciBhZGxlcjMyICAgICAgID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICAgICAgICA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciBpbmZsYXRlX2Zhc3QgID0gcmVxdWlyZSgnLi9pbmZmYXN0Jyk7XG52YXIgaW5mbGF0ZV90YWJsZSA9IHJlcXVpcmUoJy4vaW5mdHJlZXMnKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbi8vdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG4vL3ZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbi8vdmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xudmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbnZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cblxuLyogU1RBVEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyICAgIEhFQUQgPSAxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi9cbnZhciAgICBGTEFHUyA9IDI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi9cbnZhciAgICBUSU1FID0gMzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovXG52YXIgICAgT1MgPSA0OyAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqL1xudmFyICAgIEVYTEVOID0gNTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovXG52YXIgICAgRVhUUkEgPSA2OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqL1xudmFyICAgIE5BTUUgPSA3OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqL1xudmFyICAgIENPTU1FTlQgPSA4OyAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi9cbnZhciAgICBIQ1JDID0gOTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi9cbnZhciAgICBESUNUSUQgPSAxMDsgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqL1xudmFyICAgIERJQ1QgPSAxMTsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi9cbnZhciAgICAgICAgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cbnZhciAgICAgICAgVFlQRURPID0gMTM7ICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi9cbnZhciAgICAgICAgU1RPUkVEID0gMTQ7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG52YXIgICAgICAgIENPUFlfID0gMTU7ICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICBDT1BZID0gMTY7ICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi9cbnZhciAgICAgICAgVEFCTEUgPSAxNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBMRU5MRU5TID0gMTg7ICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgIENPREVMRU5TID0gMTk7ICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgICAgIExFTl8gPSAyMDsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICAgICAgTEVOID0gMjE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi9cbnZhciAgICAgICAgICAgIExFTkVYVCA9IDIyOyAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgRElTVCA9IDIzOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbnZhciAgICAgICAgICAgIERJU1RFWFQgPSAyNDsgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBNQVRDSCA9IDI1OyAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovXG52YXIgICAgICAgICAgICBMSVQgPSAyNjsgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbnZhciAgICBDSEVDSyA9IDI3OyAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovXG52YXIgICAgTEVOR1RIID0gMjg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovXG52YXIgICAgRE9ORSA9IDI5OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBNRU0gPSAzMTsgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBTWU5DID0gMzI7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7XG5cblxuZnVuY3Rpb24genN3YXAzMihxKSB7XG4gIHJldHVybiAgKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICAgICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAgICAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAgICAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufVxuXG5cbmZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5tb2RlID0gMDsgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7ICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi9cbiAgdGhpcy5mbGFncyA9IDA7ICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi9cbiAgdGhpcy5kbWF4ID0gMDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqL1xuXG4gIC8qIHNsaWRpbmcgd2luZG93ICovXG4gIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqL1xuICB0aGlzLndzaXplID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHRoaXMud2hhdmUgPSAwOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHRoaXMud25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdGhpcy53aW5kb3cgPSBudWxsOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7ICAgICAgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5iaXRzID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi9cbiAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmRpc3QgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG4gIHRoaXMuaGF2ZSA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyB1dGlscy5CdWYxNigzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyB1dGlscy5CdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuZHluID0gbnVsbDsgICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5kaXN0ZHluID0gbnVsbDsgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLnNhbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovXG4gIHRoaXMuYmFjayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi9cbiAgdGhpcy53YXMgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi9cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwO1xuICBzdHJtLm1zZyA9ICcnOyAvKlpfTlVMTCovXG4gIGlmIChzdGF0ZS53cmFwKSB7ICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi9cbiAgICBzdHJtLmFkbGVyID0gc3RhdGUud3JhcCAmIDE7XG4gIH1cbiAgc3RhdGUubW9kZSA9IEhFQUQ7XG4gIHN0YXRlLmxhc3QgPSAwO1xuICBzdGF0ZS5oYXZlZGljdCA9IDA7XG4gIHN0YXRlLmRtYXggPSAzMjc2ODtcbiAgc3RhdGUuaGVhZCA9IG51bGwvKlpfTlVMTCovO1xuICBzdGF0ZS5ob2xkID0gMDtcbiAgc3RhdGUuYml0cyA9IDA7XG4gIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9ESVNUUyk7XG5cbiAgc3RhdGUuc2FuZSA9IDE7XG4gIHN0YXRlLmJhY2sgPSAtMTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiByZXNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0YXRlLndzaXplID0gMDtcbiAgc3RhdGUud2hhdmUgPSAwO1xuICBzdGF0ZS53bmV4dCA9IDA7XG4gIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgd3JhcDtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGdldCB0aGUgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogZXh0cmFjdCB3cmFwIHJlcXVlc3QgZnJvbSB3aW5kb3dCaXRzIHBhcmFtZXRlciAqL1xuICBpZiAod2luZG93Qml0cyA8IDApIHtcbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgd3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTtcbiAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7XG4gICAgICB3aW5kb3dCaXRzICY9IDE1O1xuICAgIH1cbiAgfVxuXG4gIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqL1xuICBpZiAod2luZG93Qml0cyAmJiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHJldDtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgLy9zdHJtLm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovXG5cbiAgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7XG5cbiAgLy9pZiAoc3RhdGUgPT09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IGFsbG9jYXRlZFxcblwiKSk7XG4gIHN0cm0uc3RhdGUgPSBzdGF0ZTtcbiAgc3RhdGUud2luZG93ID0gbnVsbC8qWl9OVUxMKi87XG4gIHJldCA9IGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cyk7XG4gIGlmIChyZXQgIT09IFpfT0spIHtcbiAgICBzdHJtLnN0YXRlID0gbnVsbC8qWl9OVUxMKi87XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQoc3RybSkge1xuICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7XG59XG5cblxuLypcbiBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvXG4gZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLlxuIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGVcbiBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kXG4gdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW5cbiBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmVcbiB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luXG4gbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS5cbiAqL1xudmFyIHZpcmdpbiA9IHRydWU7XG5cbnZhciBsZW5maXgsIGRpc3RmaXg7IC8vIFdlIGhhdmUgbm8gcG9pbnRlcnMgaW4gSlMsIHNvIGtlZXAgdGFibGVzIHNlcGFyYXRlXG5cbmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7XG4gIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovXG4gIGlmICh2aXJnaW4pIHtcbiAgICB2YXIgc3ltO1xuXG4gICAgbGVuZml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyB1dGlscy5CdWYzMigzMik7XG5cbiAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gOTsgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cblxuICAgIGluZmxhdGVfdGFibGUoTEVOUywgIHN0YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAgIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTtcblxuICAgIC8qIGRpc3RhbmNlIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMzIpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA1OyB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgICBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7XG5cbiAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqL1xuICAgIHZpcmdpbiA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDtcbiAgc3RhdGUubGVuYml0cyA9IDk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gZGlzdGZpeDtcbiAgc3RhdGUuZGlzdGJpdHMgPSA1O1xufVxuXG5cbi8qXG4gVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZVxuIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWRcbiB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzXG4gaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LlxuIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5XG4gaXMgbG9hZGVkLlxuXG4gUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZFxuIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3dcbiB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZlxuIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci5cbiBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLlxuICovXG5mdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3JjLCBlbmQsIGNvcHkpIHtcbiAgdmFyIGRpc3Q7XG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqL1xuICBpZiAoc3RhdGUud2luZG93ID09PSBudWxsKSB7XG4gICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IDA7XG5cbiAgICBzdGF0ZS53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzdGF0ZS53c2l6ZSk7XG4gIH1cblxuICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi9cbiAgaWYgKGNvcHkgPj0gc3RhdGUud3NpemUpIHtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gc3RhdGUud3NpemUsIHN0YXRlLndzaXplLCAwKTtcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBkaXN0ID0gc3RhdGUud3NpemUgLSBzdGF0ZS53bmV4dDtcbiAgICBpZiAoZGlzdCA+IGNvcHkpIHtcbiAgICAgIGRpc3QgPSBjb3B5O1xuICAgIH1cbiAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7XG4gICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGRpc3QsIHN0YXRlLnduZXh0KTtcbiAgICBjb3B5IC09IGRpc3Q7XG4gICAgaWYgKGNvcHkpIHtcbiAgICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBjb3B5LCBjb3B5KTtcbiAgICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBjb3B5LCAwKTtcbiAgICAgIHN0YXRlLnduZXh0ID0gY29weTtcbiAgICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3RhdGUud25leHQgKz0gZGlzdDtcbiAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHsgc3RhdGUud25leHQgPSAwOyB9XG4gICAgICBpZiAoc3RhdGUud2hhdmUgPCBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53aGF2ZSArPSBkaXN0OyB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIGlucHV0LCBvdXRwdXQ7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBidWZmZXJzXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGlucHV0IElOREVYICovXG4gIHZhciBwdXQ7ICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG91dHB1dCBJTkRFWCAqL1xuICB2YXIgaGF2ZSwgbGVmdDsgICAgICAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqL1xuICB2YXIgX2luLCBfb3V0OyAgICAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgY29weTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuICB2YXIgaGVyZSA9IDA7ICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqL1xuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsgLy8gcGFrZWQgXCJoZXJlXCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgLy92YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovXG4gIHZhciBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOyAvLyBwYWtlZCBcImxhc3RcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqL1xuICB2YXIgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi9cbiAgdmFyIGhidWYgPSBuZXcgdXRpbHMuQnVmOCg0KTsgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi9cbiAgdmFyIG9wdHM7XG5cbiAgdmFyIG47IC8vIHRlbXBvcmFyeSB2YXIgZm9yIE5FRURfQklUU1xuXG4gIHZhciBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqL1xuICAgIFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdO1xuXG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgeyBzdGF0ZS5tb2RlID0gVFlQRURPOyB9ICAgIC8qIHNraXAgY2hlY2sgKi9cblxuXG4gIC8vLS0tIExPQUQoKSAtLS1cbiAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAvLy0tLVxuXG4gIF9pbiA9IGhhdmU7XG4gIF9vdXQgPSBsZWZ0O1xuICByZXQgPSBaX09LO1xuXG4gIGluZl9sZWF2ZTogLy8gZ290byBlbXVsYXRpb25cbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoc3RhdGUubW9kZSkge1xuICAgIGNhc2UgSEVBRDpcbiAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpO1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgJiYgaG9sZCA9PT0gMHg4YjFmKSB7ICAvKiBnemlwIGhlYWRlciAqL1xuICAgICAgICBzdGF0ZS5jaGVjayA9IDAvKmNyYzMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgLy89PT0vL1xuXG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRkxBR1M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZmxhZ3MgPSAwOyAgICAgICAgICAgLyogZXhwZWN0IHpsaWIgaGVhZGVyICovXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi9cbiAgICAgICAgKCgoaG9sZCAmIDB4ZmYpLypCSVRTKDgpKi8gPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgaGVhZGVyIGNoZWNrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICBiaXRzIC09IDQ7XG4gICAgICAvLy0tLS8vXG4gICAgICBsZW4gPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA4O1xuICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7XG4gICAgICAgIHN0YXRlLndiaXRzID0gbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUud2JpdHMpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCB3aW5kb3cgc2l6ZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuO1xuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXFxuXCIpKTtcbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgIHN0YXRlLm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBicmVhaztcbiAgICBjYXNlIEZMQUdTOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkO1xuICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweGUwMDApIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSAoKGhvbGQgPj4gOCkgJiAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUSU1FOlxuICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkM0KHN0YXRlLmNoZWNrLCBob2xkKVxuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBoYnVmWzJdID0gKGhvbGQgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhidWZbM10gPSAoaG9sZCA+Pj4gMjQpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgNCwgMCk7XG4gICAgICAgIC8vPT09XG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE9TOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICBzdGF0ZS5oZWFkLm9zID0gKGhvbGQgPj4gOCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIEVYTEVOOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkO1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbGVuID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbnVsbC8qWl9OVUxMKi87XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBFWFRSQTpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgLy8gVXNlIHVudHlwZWQgYXJyYXkgZm9yIG1vcmUgY29udmVuaWVuZCBwcm9jZXNzaW5nIGxhdGVyXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBuZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXRpbHMuYXJyYXlTZXQoXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsXG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCBpcyBsaW1pdGVkIHRvIDY1NTM2IGJ5dGVzXG4gICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgIGNvcHksXG4gICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovXG4gICAgICAgICAgICAgIGxlblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vem1lbWNweShzdGF0ZS5oZWFkLmV4dHJhICsgbGVuLCBuZXh0LFxuICAgICAgICAgICAgLy8gICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCA/XG4gICAgICAgICAgICAvLyAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gTkFNRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE5BTUU6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA4MDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLy8gVE9ETzogMiBvciAxIGJ5dGVzP1xuICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQubmFtZV9tYXgqLykpIHtcbiAgICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5uYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gQ09NTUVOVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPTU1FTlQ6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDEwMDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5jb21tX21heCovKSkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgSENSQzpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDB4ZmZmZikpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdoZWFkZXIgY3JjIG1pc21hdGNoJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gKChzdGF0ZS5mbGFncyA+PiA5KSAmIDEpO1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBESUNUSUQ6XG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSB6c3dhcDMyKGhvbGQpO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gRElDVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERJQ1Q6XG4gICAgICBpZiAoc3RhdGUuaGF2ZWRpY3QgPT09IDApIHtcbiAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgIC8vLS0tXG4gICAgICAgIHJldHVybiBaX05FRURfRElDVDtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgVFlQRTpcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9CTE9DSyB8fCBmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIFRZUEVETzpcbiAgICAgIGlmIChzdGF0ZS5sYXN0KSB7XG4gICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICBiaXRzIC09IGJpdHMgJiA3O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBDSEVDSztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLz09PSBORUVEQklUUygzKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubGFzdCA9IChob2xkICYgMHgwMSkvKkJJVFMoMSkqLztcbiAgICAgIC8vLS0tIERST1BCSVRTKDEpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gMTtcbiAgICAgIGJpdHMgLT0gMTtcbiAgICAgIC8vLS0tLy9cblxuICAgICAgc3dpdGNoICgoaG9sZCAmIDB4MDMpLypCSVRTKDIpKi8pIHtcbiAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkIGJsb2NrICovXG4gICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykge1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVEFCTEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJsb2NrIHR5cGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgfVxuICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgYml0cyAtPSAyO1xuICAgICAgLy8tLS0vL1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBTVE9SRUQ6XG4gICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi9cbiAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAvLy0tLS8vXG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9PSAoKGhvbGQgPj4+IDE2KSBeIDB4ZmZmZikpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3Rocyc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZCAmIDB4ZmZmZjtcbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxcblwiLFxuICAgICAgLy8gICAgICAgIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gQ09QWV87XG4gICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT1BZXzpcbiAgICAgIHN0YXRlLm1vZGUgPSBDT1BZO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgQ09QWTpcbiAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICBpZiAoY29weSkge1xuICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgIGlmIChjb3B5ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvLy0tLSB6bWVtY3B5KHB1dCwgbmV4dCwgY29weSk7IC0tLVxuICAgICAgICB1dGlscy5hcnJheVNldChvdXRwdXQsIGlucHV0LCBuZXh0LCBjb3B5LCBwdXQpO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgIHB1dCArPSBjb3B5O1xuICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcXG5cIikpO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFRBQkxFOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTQpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubmxlbiA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDI1NztcbiAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNTtcbiAgICAgIGJpdHMgLT0gNTtcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLm5kaXN0ID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMTtcbiAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNTtcbiAgICAgIGJpdHMgLT0gNTtcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgNDtcbiAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNDtcbiAgICAgIGJpdHMgLT0gNDtcbiAgICAgIC8vLS0tLy9cbi8vI2lmbmRlZiBQS1pJUF9CVUdfV09SS0FST1VORFxuICAgICAgaWYgKHN0YXRlLm5sZW4gPiAyODYgfHwgc3RhdGUubmRpc3QgPiAzMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICd0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuLy8jZW5kaWZcbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcXG5cIikpO1xuICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTkxFTlM6XG4gICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7XG4gICAgICAgIHN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV0gPSAwO1xuICAgICAgfVxuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICAgICAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcbiAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5bjtcbiAgICAgIHN0YXRlLmxlbmJpdHMgPSA3O1xuXG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS5sZW5zLCAwLCAxOSwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29kZSBsZW5ndGhzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcXG5cIikpO1xuICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gQ09ERUxFTlM7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT0RFTEVOUzpcbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGhlcmVfdmFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChoZXJlX3ZhbCA9PT0gMTYpIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDIpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDI7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxlbiA9IHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSAtIDFdO1xuICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDMpOy8vQklUUygyKTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaGVyZV92YWwgPT09IDE3KSB7XG4gICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTtcbiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzO1xuICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDcpOy8vQklUUygzKTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICAgIGJpdHMgLT0gMztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTtcbiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3O1xuICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgY29weSA9IDExICsgKGhvbGQgJiAweDdmKTsvL0JJVFMoNyk7XG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyg3KSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IDc7XG4gICAgICAgICAgICBiaXRzIC09IDc7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5oYXZlICsgY29weSA+IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlIChjb3B5LS0pIHtcbiAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGxlbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogaGFuZGxlIGVycm9yIGJyZWFrcyBpbiB3aGlsZSAqL1xuICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkgeyBicmVhazsgfVxuXG4gICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi9cbiAgICAgIGlmIChzdGF0ZS5sZW5zWzI1Nl0gPT09IDApIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzIC0tIG5vdGU6IGRvIG5vdCBjaGFuZ2UgdGhlIGxlbmJpdHMgb3IgZGlzdGJpdHNcbiAgICAgICAgIHZhbHVlcyBoZXJlICg5IGFuZCA2KSB3aXRob3V0IHJlYWRpbmcgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi9cbiAgICAgIHN0YXRlLmxlbmJpdHMgPSA5O1xuXG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLmxlbnMsIDAsIHN0YXRlLm5sZW4sIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5kaXN0Yml0cyA9IDY7XG4gICAgICAvL3N0YXRlLmRpc3Rjb2RlLmNvcHkoc3RhdGUuY29kZXMpO1xuICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW47XG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5kaXN0Yml0cyB9O1xuICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy8gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2VzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgJ2luZmxhdGU6ICAgICAgIGNvZGVzIG9rXFxuJykpO1xuICAgICAgc3RhdGUubW9kZSA9IExFTl87XG4gICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU5fOlxuICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTjpcbiAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHtcbiAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgIC8vLS0tXG4gICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBfb3V0KTtcbiAgICAgICAgLy8tLS0gTE9BRCgpIC0tLVxuICAgICAgICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICAgICAgICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgICAgICAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICAgICAgICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICAgICAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gICAgICAgIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICAgICAgICBob2xkID0gc3RhdGUuaG9sZDtcbiAgICAgICAgYml0cyA9IHN0YXRlLmJpdHM7XG4gICAgICAgIC8vLS0tXG5cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHtcbiAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5iYWNrID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsgIC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmJiAoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgfVxuICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICBzdGF0ZS5sZW5ndGggPSBoZXJlX3ZhbDtcbiAgICAgIGlmIChoZXJlX29wID09PSAwKSB7XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMSVQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhlcmVfb3AgJiAzMikge1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1O1xuICAgICAgc3RhdGUubW9kZSA9IExFTkVYVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTkVYVDpcbiAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxlbmd0aCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICB9XG4gICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgIHN0YXRlLndhcyA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIHN0YXRlLm1vZGUgPSBESVNUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElTVDpcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5kaXN0Yml0cykqL1xuICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5vZmZzZXQgPSBoZXJlX3ZhbDtcbiAgICAgIHN0YXRlLmV4dHJhID0gKGhlcmVfb3ApICYgMTU7XG4gICAgICBzdGF0ZS5tb2RlID0gRElTVEVYVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERJU1RFWFQ6XG4gICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5vZmZzZXQgKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgfVxuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBzdGF0ZS5kbWF4KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4vLyNlbmRpZlxuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBzdGF0ZS5vZmZzZXQpKTtcbiAgICAgIHN0YXRlLm1vZGUgPSBNQVRDSDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE1BVENIOlxuICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICBjb3B5ID0gX291dCAtIGxlZnQ7XG4gICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gY29weSkgeyAgICAgICAgIC8qIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgY29weSA9IHN0YXRlLm9mZnNldCAtIGNvcHk7XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgIFRyYWNlKChzdGRlcnIsIFwiaW5mbGF0ZS5jIHRvbyBmYXJcXG5cIikpO1xuLy8gICAgICAgICAgY29weSAtPSBzdGF0ZS53aGF2ZTtcbi8vICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbi8vICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuLy8gICAgICAgICAgbGVmdCAtPSBjb3B5O1xuLy8gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4vLyAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgIG91dHB1dFtwdXQrK10gPSAwO1xuLy8gICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbi8vICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuLy8gICAgICAgICAgYnJlYWs7XG4vLyNlbmRpZlxuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUud25leHQpIHtcbiAgICAgICAgICBjb3B5IC09IHN0YXRlLnduZXh0O1xuICAgICAgICAgIGZyb20gPSBzdGF0ZS53c2l6ZSAtIGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4gICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93O1xuICAgICAgfVxuICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqL1xuICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLm9mZnNldDtcbiAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICBkbyB7XG4gICAgICAgIG91dHB1dFtwdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbiAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBMSVQ6XG4gICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIG91dHB1dFtwdXQrK10gPSBzdGF0ZS5sZW5ndGg7XG4gICAgICBsZWZ0LS07XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBDSEVDSzpcbiAgICAgIGlmIChzdGF0ZS53cmFwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAvLyBVc2UgJ3wnIGluc2RlYWQgb2YgJysnIHRvIG1ha2Ugc3VyZSB0aGF0IHJlc3VsdCBpcyBzaWduZWRcbiAgICAgICAgICBob2xkIHw9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBfb3V0IC09IGxlZnQ7XG4gICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gICAgICAgIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gICAgICAgIGlmIChfb3V0KSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID1cbiAgICAgICAgICAgICAgLypVUERBVEUoc3RhdGUuY2hlY2ssIHB1dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAgICAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSk7XG5cbiAgICAgICAgfVxuICAgICAgICBfb3V0ID0gbGVmdDtcbiAgICAgICAgLy8gTkI6IGNyYzMyIHN0b3JlZCBhcyBzaWduZWQgMzItYml0IGludCwgenN3YXAzMiByZXR1cm5zIHNpZ25lZCB0b29cbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyA/IGhvbGQgOiB6c3dhcDMyKGhvbGQpKSAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgZGF0YSBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOR1RIO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOR1RIOlxuICAgICAgaWYgKHN0YXRlLndyYXAgJiYgc3RhdGUuZmxhZ3MpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUudG90YWwgJiAweGZmZmZmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBsZW5ndGggY2hlY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBsZW5ndGggbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBET05FO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRE9ORTpcbiAgICAgIHJldCA9IFpfU1RSRUFNX0VORDtcbiAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICBjYXNlIEJBRDpcbiAgICAgIHJldCA9IFpfREFUQV9FUlJPUjtcbiAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICBjYXNlIE1FTTpcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICBjYXNlIFNZTkM6XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgICB9XG4gIH1cblxuICAvLyBpbmZfbGVhdmUgPC0gaGVyZSBpcyByZWFsIHBsYWNlIGZvciBcImdvdG8gaW5mX2xlYXZlXCIsIGVtdWxhdGVkIHZpYSBcImJyZWFrIGluZl9sZWF2ZVwiXG5cbiAgLypcbiAgICAgUmV0dXJuIGZyb20gaW5mbGF0ZSgpLCB1cGRhdGluZyB0aGUgdG90YWwgY291bnRzIGFuZCB0aGUgY2hlY2sgdmFsdWUuXG4gICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXJcbiAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuXG4gICAgIE5vdGU6IGEgbWVtb3J5IGVycm9yIGZyb20gaW5mbGF0ZSgpIGlzIG5vbi1yZWNvdmVyYWJsZS5cbiAgICovXG5cbiAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIC8vLS0tXG5cbiAgaWYgKHN0YXRlLndzaXplIHx8IChfb3V0ICE9PSBzdHJtLmF2YWlsX291dCAmJiBzdGF0ZS5tb2RlIDwgQkFEICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPCBDSEVDSyB8fCBmbHVzaCAhPT0gWl9GSU5JU0gpKSkge1xuICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQsIF9vdXQgLSBzdHJtLmF2YWlsX291dCkpIHtcbiAgICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgfVxuICB9XG4gIF9pbiAtPSBzdHJtLmF2YWlsX2luO1xuICBfb3V0IC09IHN0cm0uYXZhaWxfb3V0O1xuICBzdHJtLnRvdGFsX2luICs9IF9pbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgaWYgKHN0YXRlLndyYXAgJiYgX291dCkge1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBzdHJtLm5leHRfb3V0IC0gX291dCwgX291dCk7Ki9cbiAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpKTtcbiAgfVxuICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IExFTl8gfHwgc3RhdGUubW9kZSA9PT0gQ09QWV8gPyAyNTYgOiAwKTtcbiAgaWYgKCgoX2luID09PSAwICYmIF9vdXQgPT09IDApIHx8IGZsdXNoID09PSBaX0ZJTklTSCkgJiYgcmV0ID09PSBaX09LKSB7XG4gICAgcmV0ID0gWl9CVUZfRVJST1I7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUVuZChzdHJtKSB7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIC8qfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUud2luZG93KSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuICBzdHJtLnN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICB2YXIgc3RhdGU7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmICgoc3RhdGUud3JhcCAmIDIpID09PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuXG4gIC8qIHNhdmUgaGVhZGVyIHN0cnVjdHVyZSAqL1xuICBzdGF0ZS5oZWFkID0gaGVhZDtcbiAgaGVhZC5kb25lID0gZmFsc2U7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHN0YXRlO1xuICB2YXIgZGljdGlkO1xuICB2YXIgcmV0O1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSAvKiA9PSBaX05VTEwgKi8gfHwgIXN0cm0uc3RhdGUgLyogPT0gWl9OVUxMICovKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKHN0YXRlLndyYXAgIT09IDAgJiYgc3RhdGUubW9kZSAhPT0gRElDVCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWRlbnRpZmllciAqL1xuICBpZiAoc3RhdGUubW9kZSA9PT0gRElDVCkge1xuICAgIGRpY3RpZCA9IDE7IC8qIGFkbGVyMzIoMCwgbnVsbCwgMCkqL1xuICAgIC8qIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7XG4gICAgfVxuICB9XG4gIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgdXNpbmcgdXBkYXRld2luZG93KCksIHdoaWNoIHdpbGwgYW1lbmQgdGhlXG4gICBleGlzdGluZyBkaWN0aW9uYXJ5IGlmIGFwcHJvcHJpYXRlICovXG4gIHJldCA9IHVwZGF0ZXdpbmRvdyhzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCBkaWN0TGVuZ3RoKTtcbiAgaWYgKHJldCkge1xuICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICB9XG4gIHN0YXRlLmhhdmVkaWN0ID0gMTtcbiAgLy8gVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBkaWN0aW9uYXJ5IHNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5leHBvcnRzLmluZmxhdGVSZXNldCA9IGluZmxhdGVSZXNldDtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0MiA9IGluZmxhdGVSZXNldDI7XG5leHBvcnRzLmluZmxhdGVSZXNldEtlZXAgPSBpbmZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5pbmZsYXRlSW5pdCA9IGluZmxhdGVJbml0O1xuZXhwb3J0cy5pbmZsYXRlSW5pdDIgPSBpbmZsYXRlSW5pdDI7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlRW5kID0gaW5mbGF0ZUVuZDtcbmV4cG9ydHMuaW5mbGF0ZUdldEhlYWRlciA9IGluZmxhdGVHZXRIZWFkZXI7XG5leHBvcnRzLmluZmxhdGVTZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVJbmZvID0gJ3Bha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuaW5mbGF0ZUNvcHkgPSBpbmZsYXRlQ29weTtcbmV4cG9ydHMuaW5mbGF0ZUdldERpY3Rpb25hcnkgPSBpbmZsYXRlR2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZU1hcmsgPSBpbmZsYXRlTWFyaztcbmV4cG9ydHMuaW5mbGF0ZVByaW1lID0gaW5mbGF0ZVByaW1lO1xuZXhwb3J0cy5pbmZsYXRlU3luYyA9IGluZmxhdGVTeW5jO1xuZXhwb3J0cy5pbmZsYXRlU3luY1BvaW50ID0gaW5mbGF0ZVN5bmNQb2ludDtcbmV4cG9ydHMuaW5mbGF0ZVVuZGVybWluZSA9IGluZmxhdGVVbmRlcm1pbmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xuXG52YXIgTUFYQklUUyA9IDE1O1xudmFyIEVOT1VHSF9MRU5TID0gODUyO1xudmFyIEVOT1VHSF9ESVNUUyA9IDU5Mjtcbi8vdmFyIEVOT1VHSCA9IChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxudmFyIGxiYXNlID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqL1xuICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLFxuICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMFxuXTtcblxudmFyIGxleHQgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCxcbiAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDcyLCA3OFxuXTtcblxudmFyIGRiYXNlID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovXG4gIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MyxcbiAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LFxuICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwXG5dO1xuXG52YXIgZGV4dCA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsXG4gIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LFxuICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0XG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfdGFibGUodHlwZSwgbGVucywgbGVuc19pbmRleCwgY29kZXMsIHRhYmxlLCB0YWJsZV9pbmRleCwgd29yaywgb3B0cylcbntcbiAgdmFyIGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvL2hlcmUgPSBvcHRzLmhlcmU7IC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqL1xuXG4gIHZhciBsZW4gPSAwOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovXG4gIHZhciBzeW0gPSAwOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqL1xuICB2YXIgbWluID0gMCwgbWF4ID0gMDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi9cbiAgdmFyIHJvb3QgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi9cbiAgdmFyIGN1cnIgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi9cbiAgdmFyIGRyb3AgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqL1xuICB2YXIgbGVmdCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovXG4gIHZhciB1c2VkID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovXG4gIHZhciBodWZmID0gMDsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqL1xuICB2YXIgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi9cbiAgdmFyIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqL1xuICB2YXIgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi9cbiAgdmFyIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqL1xuICB2YXIgYmFzZSA9IG51bGw7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgYmFzZV9pbmRleCA9IDA7XG4vLyAgdmFyIHNob2V4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi9cbiAgdmFyIGNvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovXG4gIHZhciBvZmZzID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovXG4gIHZhciBleHRyYSA9IG51bGw7XG4gIHZhciBleHRyYV9pbmRleCA9IDA7XG5cbiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7XG5cbiAgLypcbiAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGVcbiAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZVxuICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGVcbiAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyXG4gICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzXG4gICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlclxuICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGhcbiAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHNcbiAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzXG4gICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLlxuXG4gICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpblxuICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy5cbiAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0XG4gICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLlxuXG4gICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsXG4gICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGVcbiAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZFxuICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5XG4gICB0aGUgY2FsbGVyLlxuXG4gICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nXG4gICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnlcbiAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkXG4gICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcy5cbiAgICovXG5cbiAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovXG4gIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgY291bnRbbGVuXSA9IDA7XG4gIH1cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBjb3VudFtsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrO1xuICB9XG5cbiAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi9cbiAgcm9vdCA9IGJpdHM7XG4gIGZvciAobWF4ID0gTUFYQklUUzsgbWF4ID49IDE7IG1heC0tKSB7XG4gICAgaWYgKGNvdW50W21heF0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA+IG1heCkge1xuICAgIHJvb3QgPSBtYXg7XG4gIH1cbiAgaWYgKG1heCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi9cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7ICAvL2hlcmUub3AgPSAodmFyIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxOyAgIC8vaGVyZS5iaXRzID0gKHZhciBjaGFyKTE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7ICAgLy9oZXJlLnZhbCA9ICh2YXIgc2hvcnQpMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG5cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7XG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG4gICAgb3B0cy5iaXRzID0gMTtcbiAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi9cbiAgfVxuICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspIHtcbiAgICBpZiAoY291bnRbbWluXSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290IDwgbWluKSB7XG4gICAgcm9vdCA9IG1pbjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqL1xuICBsZWZ0ID0gMTtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBsZWZ0IDw8PSAxO1xuICAgIGxlZnQgLT0gY291bnRbbGVuXTtcbiAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi9cbiAgfVxuICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT09IENPREVTIHx8IG1heCAhPT0gMSkpIHtcbiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovXG4gIH1cblxuICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqL1xuICBvZmZzWzFdID0gMDtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykge1xuICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dO1xuICB9XG5cbiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqL1xuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGlmIChsZW5zW2xlbnNfaW5kZXggKyBzeW1dICE9PSAwKSB7XG4gICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZ1xuICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmZcbiAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcFxuICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLFxuICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0b1xuICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuXG5cbiAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHNcbiAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4XG4gICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYVxuICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzXG4gICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuXG5cbiAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlXG4gICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aFxuICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmVcbiAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy5cblxuICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGVcbiAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3RcbiAgIHRoZSBjb25zdGFudHMgRU5PVUdIX0xFTlMgYW5kIEVOT1VHSF9ESVNUUyB0byBndWFyZCBhZ2FpbnN0IGNoYW5nZXMgaW5cbiAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4gICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuXG4gICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzXG4gICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzXG4gICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuXG4gICAqL1xuXG4gIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovXG4gIC8vIHBvb3IgbWFuIG9wdGltaXphdGlvbiAtIHVzZSBpZi1lbHNlIGluc3RlYWQgb2Ygc3dpdGNoLFxuICAvLyB0byBhdm9pZCBkZW9wdHMgaW4gb2xkIHY4XG4gIGlmICh0eXBlID09PSBDT0RFUykge1xuICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqL1xuICAgIGVuZCA9IDE5O1xuXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTEVOUykge1xuICAgIGJhc2UgPSBsYmFzZTtcbiAgICBiYXNlX2luZGV4IC09IDI1NztcbiAgICBleHRyYSA9IGxleHQ7XG4gICAgZXh0cmFfaW5kZXggLT0gMjU3O1xuICAgIGVuZCA9IDI1NjtcblxuICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogRElTVFMgKi9cbiAgICBiYXNlID0gZGJhc2U7XG4gICAgZXh0cmEgPSBkZXh0O1xuICAgIGVuZCA9IC0xO1xuICB9XG5cbiAgLyogaW5pdGlhbGl6ZSBvcHRzIGZvciBsb29wICovXG4gIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovXG4gIHN5bSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqL1xuICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi9cbiAgbmV4dCA9IHRhYmxlX2luZGV4OyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovXG4gIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi9cbiAgZHJvcCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyB0byBkcm9wIGZyb20gY29kZSBmb3IgaW5kZXggKi9cbiAgbG93ID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi9cbiAgdXNlZCA9IDEgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqL1xuICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqL1xuXG4gIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqL1xuICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGkgPSAwO1xuICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovXG4gIGZvciAoOzspIHtcbiAgICBpKys7XG4gICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovXG4gICAgaGVyZV9iaXRzID0gbGVuIC0gZHJvcDtcbiAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7XG4gICAgICBoZXJlX29wID0gMDtcbiAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dO1xuICAgIH1cbiAgICBlbHNlIGlmICh3b3JrW3N5bV0gPiBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSBleHRyYVtleHRyYV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgICBoZXJlX3ZhbCA9IGJhc2VbYmFzZV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovXG4gICAgICBoZXJlX3ZhbCA9IDA7XG4gICAgfVxuXG4gICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gZHJvcCk7XG4gICAgZmlsbCA9IDEgPDwgY3VycjtcbiAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqL1xuICAgIGRvIHtcbiAgICAgIGZpbGwgLT0gaW5jcjtcbiAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gKGhlcmVfYml0cyA8PCAyNCkgfCAoaGVyZV9vcCA8PCAxNikgfCBoZXJlX3ZhbCB8MDtcbiAgICB9IHdoaWxlIChmaWxsICE9PSAwKTtcblxuICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIDEpO1xuICAgIHdoaWxlIChodWZmICYgaW5jcikge1xuICAgICAgaW5jciA+Pj0gMTtcbiAgICB9XG4gICAgaWYgKGluY3IgIT09IDApIHtcbiAgICAgIGh1ZmYgJj0gaW5jciAtIDE7XG4gICAgICBodWZmICs9IGluY3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh1ZmYgPSAwO1xuICAgIH1cblxuICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqL1xuICAgIHN5bSsrO1xuICAgIGlmICgtLWNvdW50W2xlbl0gPT09IDApIHtcbiAgICAgIGlmIChsZW4gPT09IG1heCkgeyBicmVhazsgfVxuICAgICAgbGVuID0gbGVuc1tsZW5zX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG5cbiAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi9cbiAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9PSBsb3cpIHtcbiAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqL1xuICAgICAgaWYgKGRyb3AgPT09IDApIHtcbiAgICAgICAgZHJvcCA9IHJvb3Q7XG4gICAgICB9XG5cbiAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi9cbiAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqL1xuXG4gICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi9cbiAgICAgIGN1cnIgPSBsZW4gLSBkcm9wO1xuICAgICAgbGVmdCA9IDEgPDwgY3VycjtcbiAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkge1xuICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkgeyBicmVhazsgfVxuICAgICAgICBjdXJyKys7XG4gICAgICAgIGxlZnQgPDw9IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi9cbiAgICAgIHVzZWQgKz0gMSA8PCBjdXJyO1xuICAgICAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAgICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqL1xuICAgICAgbG93ID0gaHVmZiAmIG1hc2s7XG4gICAgICAvKnRhYmxlLm9wW2xvd10gPSBjdXJyO1xuICAgICAgdGFibGUuYml0c1tsb3ddID0gcm9vdDtcbiAgICAgIHRhYmxlLnZhbFtsb3ddID0gbmV4dCAtIG9wdHMudGFibGVfaW5kZXg7Ki9cbiAgICAgIHRhYmxlW2xvd10gPSAocm9vdCA8PCAyNCkgfCAoY3VyciA8PCAxNikgfCAobmV4dCAtIHRhYmxlX2luZGV4KSB8MDtcbiAgICB9XG4gIH1cblxuICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZVxuICAgYXQgbW9zdCBvbmUgcmVtYWluaW5nIGVudHJ5LCBzaW5jZSBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlLCB0aGVcbiAgIG1heGltdW0gY29kZSBsZW5ndGggdGhhdCB3YXMgYWxsb3dlZCB0byBnZXQgdGhpcyBmYXIgaXMgb25lIGJpdCkgKi9cbiAgaWYgKGh1ZmYgIT09IDApIHtcbiAgICAvL3RhYmxlLm9wW25leHQgKyBodWZmXSA9IDY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbbmV4dCArIGh1ZmZdID0gbGVuIC0gZHJvcDtcbiAgICAvL3RhYmxlLnZhbFtuZXh0ICsgaHVmZl0gPSAwO1xuICAgIHRhYmxlW25leHQgKyBodWZmXSA9ICgobGVuIC0gZHJvcCkgPDwgMjQpIHwgKDY0IDw8IDE2KSB8MDtcbiAgfVxuXG4gIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqL1xuICAvL29wdHMudGFibGVfaW5kZXggKz0gdXNlZDtcbiAgb3B0cy5iaXRzID0gcm9vdDtcbiAgcmV0dXJuIDA7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgMjogICAgICAnbmVlZCBkaWN0aW9uYXJ5JywgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovXG4gIDE6ICAgICAgJ3N0cmVhbSBlbmQnLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqL1xuICAwOiAgICAgICcnLCAgICAgICAgICAgICAgICAgICAgLyogWl9PSyAgICAgICAgICAgICAgMCAgKi9cbiAgJy0xJzogICAnZmlsZSBlcnJvcicsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovXG4gICctMic6ICAgJ3N0cmVhbSBlcnJvcicsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqL1xuICAnLTMnOiAgICdkYXRhIGVycm9yJywgICAgICAgICAgLyogWl9EQVRBX0VSUk9SICAgICgtMykgKi9cbiAgJy00JzogICAnaW5zdWZmaWNpZW50IG1lbW9yeScsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovXG4gICctNSc6ICAgJ2J1ZmZlciBlcnJvcicsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqL1xuICAnLTYnOiAgICdpbmNvbXBhdGlibGUgdmVyc2lvbicgLyogWl9WRVJTSU9OX0VSUk9SICgtNikgKi9cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vdmFyIFpfRklMVEVSRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9IVUZGTUFOX09OTFkgICAgICA9IDI7XG4vL3ZhciBaX1JMRSAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xuLy92YXIgWl9ERUZBVUxUX1NUUkFURUdZICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbnZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xudmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG4vLyBGcm9tIHp1dGlsLmhcblxudmFyIFNUT1JFRF9CTE9DSyA9IDA7XG52YXIgU1RBVElDX1RSRUVTID0gMTtcbnZhciBEWU5fVFJFRVMgICAgPSAyO1xuLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi9cblxudmFyIE1JTl9NQVRDSCAgICA9IDM7XG52YXIgTUFYX01BVENIICAgID0gMjU4O1xuLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqL1xuXG4vLyBGcm9tIGRlZmxhdGUuaFxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS5cbiAqL1xuXG52YXIgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG5cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cblxudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xuXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG5cbnZhciBNQVhfQklUUyAgICAgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIEJ1Zl9zaXplICAgICAgPSAxNjtcbi8qIHNpemUgb2YgYml0IGJ1ZmZlciBpbiBiaV9idWYgKi9cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0YW50c1xuICovXG5cbnZhciBNQVhfQkxfQklUUyA9IDc7XG4vKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovXG5cbnZhciBFTkRfQkxPQ0sgICA9IDI1Njtcbi8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi9cblxudmFyIFJFUF8zXzYgICAgID0gMTY7XG4vKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzNfMTAgICA9IDE3O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzExXzEzOCA9IDE4O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxuLyogZXNsaW50LWRpc2FibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cbnZhciBleHRyYV9sYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXTtcblxudmFyIGV4dHJhX2RiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi9cbiAgWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdO1xuXG52YXIgZXh0cmFfYmxiaXRzID0gIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XTtcblxudmFyIGJsX29yZGVyID1cbiAgWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO1xuLyogZXNsaW50LWVuYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xuXG4vKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nXG4gKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy5cbiAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuXG4gKi9cblxuLy8gV2UgcHJlLWZpbGwgYXJyYXlzIHdpdGggMCB0byBhdm9pZCB1bmluaXRpYWxpemVkIGdhcHNcblxudmFyIERJU1RfQ09ERV9MRU4gPSA1MTI7IC8qIHNlZSBkZWZpbml0aW9uIG9mIGFycmF5IGRpc3RfY29kZSBiZWxvdyAqL1xuXG4vLyAhISEhIFVzZSBmbGF0IGFycmF5IGluc2RlYWQgb2Ygc3RydWN0dXJlLCBGcmVxID0gaSoyLCBMZW4gPSBpKjIrMVxudmFyIHN0YXRpY19sdHJlZSAgPSBuZXcgQXJyYXkoKExfQ09ERVMgKyAyKSAqIDIpO1xuemVybyhzdGF0aWNfbHRyZWUpO1xuLyogVGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUuIFNpbmNlIHRoZSBiaXQgbGVuZ3RocyBhcmUgaW1wb3NlZCwgdGhlcmUgaXMgbm9cbiAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyXG4gKiBUaGUgY29kZXMgMjg2IGFuZCAyODcgYXJlIG5lZWRlZCB0byBidWlsZCBhIGNhbm9uaWNhbCB0cmVlIChzZWUgX3RyX2luaXRcbiAqIGJlbG93KS5cbiAqL1xuXG52YXIgc3RhdGljX2R0cmVlICA9IG5ldyBBcnJheShEX0NPREVTICogMik7XG56ZXJvKHN0YXRpY19kdHJlZSk7XG4vKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlXG4gKiA1IGJpdHMuKVxuICovXG5cbnZhciBfZGlzdF9jb2RlICAgID0gbmV3IEFycmF5KERJU1RfQ09ERV9MRU4pO1xuemVybyhfZGlzdF9jb2RlKTtcbi8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXNcbiAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2ZcbiAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLlxuICovXG5cbnZhciBfbGVuZ3RoX2NvZGUgID0gbmV3IEFycmF5KE1BWF9NQVRDSCAtIE1JTl9NQVRDSCArIDEpO1xuemVybyhfbGVuZ3RoX2NvZGUpO1xuLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9sZW5ndGggICA9IG5ldyBBcnJheShMRU5HVEhfQ09ERVMpO1xuemVybyhiYXNlX2xlbmd0aCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9kaXN0ICAgICA9IG5ldyBBcnJheShEX0NPREVTKTtcbnplcm8oYmFzZV9kaXN0KTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZm9yIGVhY2ggY29kZSAoMCA9IGRpc3RhbmNlIG9mIDEpICovXG5cblxuZnVuY3Rpb24gU3RhdGljVHJlZURlc2Moc3RhdGljX3RyZWUsIGV4dHJhX2JpdHMsIGV4dHJhX2Jhc2UsIGVsZW1zLCBtYXhfbGVuZ3RoKSB7XG5cbiAgdGhpcy5zdGF0aWNfdHJlZSAgPSBzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iaXRzICAgPSBleHRyYV9iaXRzOyAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovXG4gIHRoaXMuZXh0cmFfYmFzZSAgID0gZXh0cmFfYmFzZTsgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovXG4gIHRoaXMuZWxlbXMgICAgICAgID0gZWxlbXM7ICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovXG4gIHRoaXMubWF4X2xlbmd0aCAgID0gbWF4X2xlbmd0aDsgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovXG5cbiAgLy8gc2hvdyBpZiBgc3RhdGljX3RyZWVgIGhhcyBkYXRhIG9yIGR1bW15IC0gbmVlZGVkIGZvciBtb25vbW9ycGhpYyBvYmplY3RzXG4gIHRoaXMuaGFzX3N0cmVlICAgID0gc3RhdGljX3RyZWUgJiYgc3RhdGljX3RyZWUubGVuZ3RoO1xufVxuXG5cbnZhciBzdGF0aWNfbF9kZXNjO1xudmFyIHN0YXRpY19kX2Rlc2M7XG52YXIgc3RhdGljX2JsX2Rlc2M7XG5cblxuZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsIHN0YXRfZGVzYykge1xuICB0aGlzLmR5bl90cmVlID0gZHluX3RyZWU7ICAgICAvKiB0aGUgZHluYW1pYyB0cmVlICovXG4gIHRoaXMubWF4X2NvZGUgPSAwOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsgICAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqL1xufVxuXG5cblxuZnVuY3Rpb24gZF9jb2RlKGRpc3QpIHtcbiAgcmV0dXJuIGRpc3QgPCAyNTYgPyBfZGlzdF9jb2RlW2Rpc3RdIDogX2Rpc3RfY29kZVsyNTYgKyAoZGlzdCA+Pj4gNyldO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uXG4gKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuXG4gKi9cbmZ1bmN0aW9uIHB1dF9zaG9ydChzLCB3KSB7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodykgJiAweGZmKSk7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodXNoKSh3KSA+PiA4KSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodyA+Pj4gOCkgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuXG4gKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy5cbiAqL1xuZnVuY3Rpb24gc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPiAoQnVmX3NpemUgLSBsZW5ndGgpKSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSB2YWx1ZSA+PiAoQnVmX3NpemUgLSBzLmJpX3ZhbGlkKTtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplO1xuICB9IGVsc2Uge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHNlbmRfY29kZShzLCBjLCB0cmVlKSB7XG4gIHNlbmRfYml0cyhzLCB0cmVlW2MgKiAyXS8qLkNvZGUqLywgdHJlZVtjICogMiArIDFdLyouTGVuKi8pO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXJcbiAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSlcbiAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTVcbiAqL1xuZnVuY3Rpb24gYmlfcmV2ZXJzZShjb2RlLCBsZW4pIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGRvIHtcbiAgICByZXMgfD0gY29kZSAmIDE7XG4gICAgY29kZSA+Pj49IDE7XG4gICAgcmVzIDw8PSAxO1xuICB9IHdoaWxlICgtLWxlbiA+IDApO1xuICByZXR1cm4gcmVzID4+PiAxO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuXG4gKi9cbmZ1bmN0aW9uIGJpX2ZsdXNoKHMpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPT09IDE2KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IDA7XG4gICAgcy5iaV92YWxpZCA9IDA7XG5cbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID49IDgpIHtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmICYgMHhmZjtcbiAgICBzLmJpX2J1ZiA+Pj0gODtcbiAgICBzLmJpX3ZhbGlkIC09IDg7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoXG4gKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZFxuICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGVcbiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC5cbiAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXNcbiAqICAgICBub3QgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2JpdGxlbihzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgICAgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIG1heF9jb2RlICAgICAgICA9IGRlc2MubWF4X2NvZGU7XG4gIHZhciBzdHJlZSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGV4dHJhICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2JpdHM7XG4gIHZhciBiYXNlICAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iYXNlO1xuICB2YXIgbWF4X2xlbmd0aCAgICAgID0gZGVzYy5zdGF0X2Rlc2MubWF4X2xlbmd0aDtcbiAgdmFyIGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovXG4gIHZhciBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqL1xuICB2YXIgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi9cbiAgdmFyIGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi9cbiAgdmFyIG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqL1xuXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIHMuYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXlcbiAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuXG4gICAqL1xuICB0cmVlW3MuaGVhcFtzLmhlYXBfbWF4XSAqIDIgKyAxXS8qLkxlbiovID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqL1xuXG4gIGZvciAoaCA9IHMuaGVhcF9tYXggKyAxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHtcbiAgICBuID0gcy5oZWFwW2hdO1xuICAgIGJpdHMgPSB0cmVlW3RyZWVbbiAqIDIgKyAxXS8qLkRhZCovICogMiArIDFdLyouTGVuKi8gKyAxO1xuICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkge1xuICAgICAgYml0cyA9IG1heF9sZW5ndGg7XG4gICAgICBvdmVyZmxvdysrO1xuICAgIH1cbiAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi9cblxuICAgIGlmIChuID4gbWF4X2NvZGUpIHsgY29udGludWU7IH0gLyogbm90IGEgbGVhZiBub2RlICovXG5cbiAgICBzLmJsX2NvdW50W2JpdHNdKys7XG4gICAgeGJpdHMgPSAwO1xuICAgIGlmIChuID49IGJhc2UpIHtcbiAgICAgIHhiaXRzID0gZXh0cmFbbiAtIGJhc2VdO1xuICAgIH1cbiAgICBmID0gdHJlZVtuICogMl0vKi5GcmVxKi87XG4gICAgcy5vcHRfbGVuICs9IGYgKiAoYml0cyArIHhiaXRzKTtcbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdLyouTGVuKi8gKyB4Yml0cyk7XG4gICAgfVxuICB9XG4gIGlmIChvdmVyZmxvdyA9PT0gMCkgeyByZXR1cm47IH1cblxuICAvLyBUcmFjZSgoc3RkZXJyLFwiXFxuYml0IGxlbmd0aCBvdmVyZmxvd1xcblwiKSk7XG4gIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovXG5cbiAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi9cbiAgZG8ge1xuICAgIGJpdHMgPSBtYXhfbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAocy5ibF9jb3VudFtiaXRzXSA9PT0gMCkgeyBiaXRzLS07IH1cbiAgICBzLmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovXG4gICAgcy5ibF9jb3VudFtiaXRzICsgMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqL1xuICAgIHMuYmxfY291bnRbbWF4X2xlbmd0aF0tLTtcbiAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLFxuICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXVxuICAgICAqL1xuICAgIG92ZXJmbG93IC09IDI7XG4gIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7XG5cbiAgLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsXG4gICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuXG4gICAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKVxuICAgKi9cbiAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPT0gMDsgYml0cy0tKSB7XG4gICAgbiA9IHMuYmxfY291bnRbYml0c107XG4gICAgd2hpbGUgKG4gIT09IDApIHtcbiAgICAgIG0gPSBzLmhlYXBbLS1oXTtcbiAgICAgIGlmIChtID4gbWF4X2NvZGUpIHsgY29udGludWU7IH1cbiAgICAgIGlmICh0cmVlW20gKiAyICsgMV0vKi5MZW4qLyAhPT0gYml0cykge1xuICAgICAgICAvLyBUcmFjZSgoc3RkZXJyLFwiY29kZSAlZCBiaXRzICVkLT4lZFxcblwiLCBtLCB0cmVlW21dLkxlbiwgYml0cykpO1xuICAgICAgICBzLm9wdF9sZW4gKz0gKGJpdHMgLSB0cmVlW20gKiAyICsgMV0vKi5MZW4qLykgKiB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICAgICAgdHJlZVttICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgICAgfVxuICAgICAgbi0tO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlXG4gKiBvcHRpbWFsKS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yXG4gKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub25cbiAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KVxuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuLy8gICAgdXNoZiAqYmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqL1xue1xuICB2YXIgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovXG4gIHZhciBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi9cbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqL1xuXG4gIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlc1xuICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC5cbiAgICovXG4gIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMgLSAxXSkgPDwgMTtcbiAgfVxuICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlXG4gICAqIG11c3QgYmUgYWxsIG9uZXMuXG4gICAqL1xuICAvL0Fzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSxcbiAgLy8gICAgICAgIFwiaW5jb25zaXN0ZW50IGJpdCBjb3VudHNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5nZW5fY29kZXM6IG1heF9jb2RlICVkIFwiLCBtYXhfY29kZSkpO1xuXG4gIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICB2YXIgbGVuID0gdHJlZVtuICogMiArIDFdLyouTGVuKi87XG4gICAgaWYgKGxlbiA9PT0gMCkgeyBjb250aW51ZTsgfVxuICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovXG4gICAgdHJlZVtuICogMl0vKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7XG5cbiAgICAvL1RyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsXCJcXG5uICUzZCAlYyBsICUyZCBjICU0eCAoJXgpIFwiLFxuICAgIC8vICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpO1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLlxuICovXG5mdW5jdGlvbiB0cl9zdGF0aWNfaW5pdCgpIHtcbiAgdmFyIG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqL1xuICB2YXIgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqL1xuICB2YXIgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqL1xuICB2YXIgYmxfY291bnQgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy8gZG8gY2hlY2sgaW4gX3RyX2luaXQoKVxuICAvL2lmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47XG5cbiAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqL1xuLyojaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlNcbiAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTtcbiAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7XG4gIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7XG4gIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzO1xuICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzO1xuI2VuZGlmKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovXG4gIGxlbmd0aCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMgLSAxOyBjb2RlKyspIHtcbiAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfbGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAobGVuZ3RoID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogbGVuZ3RoICE9IDI1NlwiKTtcbiAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWRcbiAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2VcbiAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOlxuICAgKi9cbiAgX2xlbmd0aF9jb2RlW2xlbmd0aCAtIDFdID0gY29kZTtcblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi9cbiAgZGlzdCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCAxNjsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTZcIik7XG4gIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqL1xuICBmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNztcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgKGV4dHJhX2RiaXRzW2NvZGVdIC0gNykpOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyXCIpO1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi9cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgbiA9IDA7XG4gIHdoaWxlIChuIDw9IDE0Mykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI1NSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA5O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs5XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI3OSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA3O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs3XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI4Nykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZVxuICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGVcbiAgICogYWxsIG9uZXMpXG4gICAqL1xuICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTICsgMSwgYmxfY291bnQpO1xuXG4gIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDU7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7XG4gIH1cblxuICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2FuIGluaXQgc3RhdGljIHRyZWVzXG4gIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMgKyAxLCBMX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19kX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfYmxfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgICAgICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMpO1xuXG4gIC8vc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLlxuICovXG5mdW5jdGlvbiBpbml0X2Jsb2NrKHMpIHtcbiAgdmFyIG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgeyBzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyAgbisrKSB7IHMuZHluX2R0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIHsgcy5ibF90cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cblxuICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXS8qLkZyZXEqLyA9IDE7XG4gIHMub3B0X2xlbiA9IHMuc3RhdGljX2xlbiA9IDA7XG4gIHMubGFzdF9saXQgPSBzLm1hdGNoZXMgPSAwO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5XG4gKi9cbmZ1bmN0aW9uIGJpX3dpbmR1cChzKVxue1xuICBpZiAocy5iaV92YWxpZCA+IDgpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPiAwKSB7XG4gICAgLy9wdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpO1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWY7XG4gIH1cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0c1xuICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcilcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAgICAqYnVmOyAgICAvKiB0aGUgaW5wdXQgZGF0YSAqL1xuLy91bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovXG4vL2ludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqL1xue1xuICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovXG5cbiAgaWYgKGhlYWRlcikge1xuICAgIHB1dF9zaG9ydChzLCBsZW4pO1xuICAgIHB1dF9zaG9ydChzLCB+bGVuKTtcbiAgfVxuLy8gIHdoaWxlIChsZW4tLSkge1xuLy8gICAgcHV0X2J5dGUocywgKmJ1ZisrKTtcbi8vICB9XG4gIHV0aWxzLmFycmF5U2V0KHMucGVuZGluZ19idWYsIHMud2luZG93LCBidWYsIGxlbiwgcy5wZW5kaW5nKTtcbiAgcy5wZW5kaW5nICs9IGxlbjtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlblxuICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIHtcbiAgdmFyIF9uMiA9IG4gKiAyO1xuICB2YXIgX20yID0gbSAqIDI7XG4gIHJldHVybiAodHJlZVtfbjJdLyouRnJlcSovIDwgdHJlZVtfbTJdLyouRnJlcSovIHx8XG4gICAgICAgICAodHJlZVtfbjJdLyouRnJlcSovID09PSB0cmVlW19tMl0vKi5GcmVxKi8gJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgayxcbiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nXG4gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzXG4gKiB0d28gc29ucykuXG4gKi9cbmZ1bmN0aW9uIHBxZG93bmhlYXAocywgdHJlZSwgaylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqL1xuLy8gICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi9cbntcbiAgdmFyIHYgPSBzLmhlYXBba107XG4gIHZhciBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqL1xuICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7XG4gICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi9cbiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiZcbiAgICAgIHNtYWxsZXIodHJlZSwgcy5oZWFwW2ogKyAxXSwgcy5oZWFwW2pdLCBzLmRlcHRoKSkge1xuICAgICAgaisrO1xuICAgIH1cbiAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqL1xuICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHsgYnJlYWs7IH1cblxuICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovXG4gICAgcy5oZWFwW2tdID0gcy5oZWFwW2pdO1xuICAgIGsgPSBqO1xuXG4gICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqL1xuICAgIGogPDw9IDE7XG4gIH1cbiAgcy5oZWFwW2tdID0gdjtcbn1cblxuXG4vLyBpbmxpbmVkIG1hbnVhbGx5XG4vLyB2YXIgU01BTExFU1QgPSAxO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlc1xuICovXG5mdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY29uc3QgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqL1xuLy8gICAgY29uc3QgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbntcbiAgdmFyIGRpc3Q7ICAgICAgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqL1xuICB2YXIgbHggPSAwOyAgICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cbiAgdmFyIGNvZGU7ICAgICAgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovXG4gIHZhciBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqL1xuXG4gIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7XG4gICAgZG8ge1xuICAgICAgZGlzdCA9IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDJdIDw8IDgpIHwgKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMiArIDFdKTtcbiAgICAgIGxjID0gcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgbHhdO1xuICAgICAgbHgrKztcblxuICAgICAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgICAgLy9UcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLFwiICclYycgXCIsIGxjKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdO1xuICAgICAgICBzZW5kX2NvZGUocywgY29kZSArIExJVEVSQUxTICsgMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTtcbiAgICAgICAgLy9Bc3NlcnQgKGNvZGUgPCBEX0NPREVTLCBcImJhZCBkX2NvZGVcIik7XG5cbiAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUsIGR0cmVlKTsgICAgICAgLyogc2VuZCB0aGUgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqL1xuXG4gICAgICAvKiBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmIGlzIG9rOiAqL1xuICAgICAgLy9Bc3NlcnQoKHVJbnQpKHMtPnBlbmRpbmcpIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LFxuICAgICAgLy8gICAgICAgXCJwZW5kaW5nQnVmIG92ZXJmbG93XCIpO1xuXG4gICAgfSB3aGlsZSAobHggPCBzLmxhc3RfbGl0KTtcbiAgfVxuXG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLlxuICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhcbiAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpc1xuICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfdHJlZShzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgc3RyZWUgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGVsZW1zICAgID0gZGVzYy5zdGF0X2Rlc2MuZWxlbXM7XG4gIHZhciBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqL1xuICB2YXIgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHZhciBub2RlOyAgICAgICAgICAvKiBuZXcgbm9kZSBiZWluZyBjcmVhdGVkICovXG5cbiAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpblxuICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS5cbiAgICogaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHMuaGVhcF9sZW4gPSAwO1xuICBzLmhlYXBfbWF4ID0gSEVBUF9TSVpFO1xuXG4gIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7XG4gICAgaWYgKHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IG1heF9jb2RlID0gbjtcbiAgICAgIHMuZGVwdGhbbl0gPSAwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gMDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLFxuICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmVcbiAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3RcbiAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS5cbiAgICovXG4gIHdoaWxlIChzLmhlYXBfbGVuIDwgMikge1xuICAgIG5vZGUgPSBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7XG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSAxO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAwO1xuICAgIHMub3B0X2xlbi0tO1xuXG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUgKiAyICsgMV0vKi5MZW4qLztcbiAgICB9XG4gICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovXG4gIH1cbiAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlO1xuXG4gIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSxcbiAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6XG4gICAqL1xuICBmb3IgKG4gPSAocy5oZWFwX2xlbiA+PiAxLyppbnQgLzIqLyk7IG4gPj0gMTsgbi0tKSB7IHBxZG93bmhlYXAocywgdHJlZSwgbik7IH1cblxuICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvXG4gICAqIGZyZXF1ZW50IG5vZGVzLlxuICAgKi9cbiAgbm9kZSA9IGVsZW1zOyAgICAgICAgICAgICAgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovXG4gIGRvIHtcbiAgICAvL3BxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovXG4gICAgLyoqKiBwcXJlbW92ZSAqKiovXG4gICAgbiA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBzLmhlYXBbcy5oZWFwX2xlbi0tXTtcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuICAgIC8qKiovXG5cbiAgICBtID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqL1xuXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBtO1xuXG4gICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi9cbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IHRyZWVbbiAqIDJdLyouRnJlcSovICsgdHJlZVttICogMl0vKi5GcmVxKi87XG4gICAgcy5kZXB0aFtub2RlXSA9IChzLmRlcHRoW25dID49IHMuZGVwdGhbbV0gPyBzLmRlcHRoW25dIDogcy5kZXB0aFttXSkgKyAxO1xuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkRhZCovID0gdHJlZVttICogMiArIDFdLyouRGFkKi8gPSBub2RlO1xuXG4gICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi9cbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBub2RlKys7XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcblxuICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpO1xuXG4gIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuXG4gIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3dcbiAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLlxuICAgKi9cbiAgZ2VuX2JpdGxlbihzLCBkZXNjKTtcblxuICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovXG4gIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgcy5ibF9jb3VudCk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzXG4gKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLlxuICovXG5mdW5jdGlvbiBzY2FuX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG4gIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0vKi5MZW4qLyA9IDB4ZmZmZjsgLyogZ3VhcmQgKi9cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8gKz0gY291bnQ7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuXG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7IHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLysrOyB9XG4gICAgICBzLmJsX3RyZWVbUkVQXzNfNiAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8zXzEwICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8xMV8xMzggKiAyXS8qLkZyZXEqLysrO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuXG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluXG4gKiBibF90cmVlLlxuICovXG5mdW5jdGlvbiBzZW5kX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBkbyB7IHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT09IDApO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTtcbiAgICAgICAgY291bnQtLTtcbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgXCIgM182P1wiKTtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMik7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMTEsIDcpO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpblxuICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX2JsX3RyZWUocykge1xuICB2YXIgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICBzY2FuX3RyZWUocywgcy5keW5fbHRyZWUsIHMubF9kZXNjLm1heF9jb2RlKTtcbiAgc2Nhbl90cmVlKHMsIHMuZHluX2R0cmVlLCBzLmRfZGVzYy5tYXhfY29kZSk7XG5cbiAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi9cbiAgYnVpbGRfdHJlZShzLCBzLmJsX2Rlc2MpO1xuICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0XG4gICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuXG4gICAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdFxuICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5c1xuICAgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pXG4gICAqL1xuICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7XG4gICAgaWYgKHMuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF0gKiAyICsgMV0vKi5MZW4qLyAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovXG4gIHMub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZFwiLFxuICAvLyAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpO1xuXG4gIHJldHVybiBtYXhfYmxpbmRleDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZVxuICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuXG4gKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfYWxsX3RyZWVzKHMsIGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi9cbntcbiAgdmFyIHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqL1xuXG4gIC8vQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgXCJub3QgZW5vdWdoIGNvZGVzXCIpO1xuICAvL0Fzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUyxcbiAgLy8gICAgICAgIFwidG9vIG1hbnkgY29kZXNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY291bnRzOiBcIikpO1xuICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCAgIDUpO1xuICBzZW5kX2JpdHMocywgYmxjb2RlcyAtIDQsICA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7XG4gICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb2RlICUyZCBcIiwgYmxfb3JkZXJbcmFua10pKTtcbiAgICBzZW5kX2JpdHMocywgcy5ibF90cmVlW2JsX29yZGVyW3JhbmtdICogMiArIDFdLyouTGVuKi8sIDMpO1xuICB9XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLyogbGl0ZXJhbCB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06XG4gKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6XG4gKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcImJsYWNrIGxpc3RcIiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLlxuICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJ3aGl0ZSBsaXN0XCIgKDkge1RBQn0sIDEwIHtMRn0sIDEzIHtDUn0sIDMyLi4yNTUpLlxuICogLSBCSU5BUlkgb3RoZXJ3aXNlLlxuICogLSBUaGUgZm9sbG93aW5nIHBhcnRpYWxseS1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgZm9ybSBhXG4gKiAgIFwiZ3JheSBsaXN0XCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobTpcbiAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LlxuICovXG5mdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHtcbiAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzXG4gICAqIHNldCBiaXRzIDAuLjYsIDE0Li4yNSwgYW5kIDI4Li4zMVxuICAgKiAweGYzZmZjMDdmID0gYmluYXJ5IDExMTEwMDExMTExMTExMTExMTAwMDAwMDAxMTExMTExXG4gICAqL1xuICB2YXIgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2Y7XG4gIHZhciBuO1xuXG4gIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoXCJibGFjay1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj49IDEpIHtcbiAgICBpZiAoKGJsYWNrX21hc2sgJiAxKSAmJiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSkge1xuICAgICAgcmV0dXJuIFpfQklOQVJZO1xuICAgIH1cbiAgfVxuXG4gIC8qIENoZWNrIGZvciB0ZXh0dWFsIChcIndoaXRlLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgaWYgKHMuZHluX2x0cmVlWzkgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fCBzLmR5bl9sdHJlZVsxMCAqIDJdLyouRnJlcSovICE9PSAwIHx8XG4gICAgICBzLmR5bl9sdHJlZVsxMyAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgcmV0dXJuIFpfVEVYVDtcbiAgfVxuICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTOyBuKyspIHtcbiAgICBpZiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICByZXR1cm4gWl9URVhUO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZXJlIGFyZSBubyBcImJsYWNrLWxpc3RlZFwiIG9yIFwid2hpdGUtbGlzdGVkXCIgYnl0ZXM6XG4gICAqIHRoaXMgc3RyZWFtIGVpdGhlciBpcyBlbXB0eSBvciBoYXMgdG9sZXJhdGVkIChcImdyYXktbGlzdGVkXCIpIGJ5dGVzIG9ubHkuXG4gICAqL1xuICByZXR1cm4gWl9CSU5BUlk7XG59XG5cblxudmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIF90cl9pbml0KHMpXG57XG5cbiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7XG4gICAgdHJfc3RhdGljX2luaXQoKTtcbiAgICBzdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbiAgfVxuXG4gIHMubF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7XG4gIHMuZF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7XG4gIHMuYmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmJsX3RyZWUsIHN0YXRpY19ibF9kZXNjKTtcblxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqL1xuICBpbml0X2Jsb2NrKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHN0b3JlZCBibG9ja1xuICovXG5mdW5jdGlvbiBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsgICAgLyogc2VuZCBibG9jayB0eXBlICovXG4gIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsgLyogd2l0aCBoZWFkZXIgKi9cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuXG4gKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gX3RyX2FsaWduKHMpIHtcbiAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUyA8PCAxLCAzKTtcbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTtcbiAgYmlfZmx1c2gocyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWNcbiAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS5cbiAqL1xuZnVuY3Rpb24gX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7ICAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovXG4gIHZhciBtYXhfYmxpbmRleCA9IDA7ICAgICAgICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqL1xuICBpZiAocy5sZXZlbCA+IDApIHtcblxuICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGJpbmFyeSBvciB0ZXh0ICovXG4gICAgaWYgKHMuc3RybS5kYXRhX3R5cGUgPT09IFpfVU5LTk9XTikge1xuICAgICAgcy5zdHJtLmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7XG4gICAgfVxuXG4gICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcbiAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2ZcbiAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLlxuICAgICAqL1xuXG4gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXhcbiAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7XG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovXG4gICAgb3B0X2xlbmIgPSAocy5vcHRfbGVuICsgMyArIDcpID4+PiAzO1xuICAgIHN0YXRpY19sZW5iID0gKHMuc3RhdGljX2xlbiArIDMgKyA3KSA+Pj4gMztcblxuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1IFwiLFxuICAgIC8vICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sXG4gICAgLy8gICAgICAgIHMtPmxhc3RfbGl0KSk7XG5cbiAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIHsgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsgfVxuXG4gIH0gZWxzZSB7XG4gICAgLy8gQXNzZXJ0KGJ1ZiAhPSAoY2hhciopMCwgXCJsb3N0IGJ1ZlwiKTtcbiAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovXG4gIH1cblxuICBpZiAoKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iKSAmJiAoYnVmICE9PSAtMSkpIHtcbiAgICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovXG5cbiAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLlxuICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2VcbiAgICAgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW5cbiAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG9cbiAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLlxuICAgICAqL1xuICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTtcblxuICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQgfHwgc3RhdGljX2xlbmIgPT09IG9wdF9sZW5iKSB7XG5cbiAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzLmR5bl9sdHJlZSwgcy5keW5fZHRyZWUpO1xuICB9XG4gIC8vIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCBcImJhZCBjb21wcmVzc2VkIHNpemVcIik7XG4gIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CXG4gICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLlxuICAgKi9cbiAgaW5pdF9ibG9jayhzKTtcblxuICBpZiAobGFzdCkge1xuICAgIGJpX3dpbmR1cChzKTtcbiAgfVxuICAvLyBUcmFjZXYoKHN0ZGVycixcIlxcbmNvbXBybGVuICVsdSglbHUpIFwiLCBzLT5jb21wcmVzc2VkX2xlbj4+MyxcbiAgLy8gICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNypsYXN0KSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmXG4gKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIF90cl90YWxseShzLCBkaXN0LCBsYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB1bnNpZ25lZCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbi8vICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqL1xue1xuICAvL3ZhciBvdXRfbGVuZ3RoLCBpbl9sZW5ndGgsIGRjb2RlO1xuXG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyXSAgICAgPSAoZGlzdCA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMiArIDFdID0gZGlzdCAmIDB4ZmY7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgcy5sYXN0X2xpdF0gPSBsYyAmIDB4ZmY7XG4gIHMubGFzdF9saXQrKztcblxuICBpZiAoZGlzdCA9PT0gMCkge1xuICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqL1xuICAgIHMuZHluX2x0cmVlW2xjICogMl0vKi5GcmVxKi8rKztcbiAgfSBlbHNlIHtcbiAgICBzLm1hdGNoZXMrKztcbiAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgLy9Bc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJlxuICAgIC8vICAgICAgICh1c2gpbGMgPD0gKHVzaCkoTUFYX01BVENILU1JTl9NQVRDSCkgJiZcbiAgICAvLyAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgIFwiX3RyX3RhbGx5OiBiYWQgbWF0Y2hcIik7XG5cbiAgICBzLmR5bl9sdHJlZVsoX2xlbmd0aF9jb2RlW2xjXSArIExJVEVSQUxTICsgMSkgKiAyXS8qLkZyZXEqLysrO1xuICAgIHMuZHluX2R0cmVlW2RfY29kZShkaXN0KSAqIDJdLyouRnJlcSovKys7XG4gIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcblxuLy8jaWZkZWYgVFJVTkNBVEVfQkxPQ0tcbi8vICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi9cbi8vICBpZiAoKHMubGFzdF9saXQgJiAweDFmZmYpID09PSAwICYmIHMubGV2ZWwgPiAyKSB7XG4vLyAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi9cbi8vICAgIG91dF9sZW5ndGggPSBzLmxhc3RfbGl0Kjg7XG4vLyAgICBpbl9sZW5ndGggPSBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydDtcbi8vXG4vLyAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7XG4vLyAgICAgIG91dF9sZW5ndGggKz0gcy5keW5fZHRyZWVbZGNvZGUqMl0vKi5GcmVxKi8gKiAoNSArIGV4dHJhX2RiaXRzW2Rjb2RlXSk7XG4vLyAgICB9XG4vLyAgICBvdXRfbGVuZ3RoID4+Pj0gMztcbi8vICAgIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgXCIsXG4vLyAgICAvLyAgICAgICBzLT5sYXN0X2xpdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLFxuLy8gICAgLy8gICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTtcbi8vICAgIGlmIChzLm1hdGNoZXMgPCAocy5sYXN0X2xpdD4+MSkvKmludCAvMiovICYmIG91dF9sZW5ndGggPCAoaW5fbGVuZ3RoPj4xKS8qaW50IC8yKi8pIHtcbi8vICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICB9XG4vLyAgfVxuLy8jZW5kaWZcblxuICByZXR1cm4gKHMubGFzdF9saXQgPT09IHMubGl0X2J1ZnNpemUgLSAxKTtcbiAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLXG4gICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvXG4gICAqIDY0Sy0xIGJ5dGVzLlxuICAgKi9cbn1cblxuZXhwb3J0cy5fdHJfaW5pdCAgPSBfdHJfaW5pdDtcbmV4cG9ydHMuX3RyX3N0b3JlZF9ibG9jayA9IF90cl9zdG9yZWRfYmxvY2s7XG5leHBvcnRzLl90cl9mbHVzaF9ibG9jayAgPSBfdHJfZmx1c2hfYmxvY2s7XG5leHBvcnRzLl90cl90YWxseSA9IF90cl90YWxseTtcbmV4cG9ydHMuX3RyX2FsaWduID0gX3RyX2FsaWduO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIFpTdHJlYW0oKSB7XG4gIC8qIG5leHQgaW5wdXQgYnl0ZSAqL1xuICB0aGlzLmlucHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfaW4gPSAwO1xuICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IGlucHV0ICovXG4gIHRoaXMuYXZhaWxfaW4gPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9pbiA9IDA7XG4gIC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqL1xuICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X291dCA9IDA7XG4gIC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG91dHB1dCAqL1xuICB0aGlzLmF2YWlsX291dCA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovXG4gIHRoaXMudG90YWxfb3V0ID0gMDtcbiAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovXG4gIHRoaXMubXNnID0gJycvKlpfTlVMTCovO1xuICAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi9cbiAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi9cbiAgdGhpcy5kYXRhX3R5cGUgPSAyLypaX1VOS05PV04qLztcbiAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi9cbiAgdGhpcy5hZGxlciA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTtcbiIsIi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfXJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcblxudXRpbC5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxudmFyIGtleXMgPSBvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG5mb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcHJvY2Vzc05leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59IiwiLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB1bmRlZmluZWQ7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNraXBBZGQ7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgc2tpcEFkZCA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIGNodW5rLmxlbmd0aCA9PT0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhZGRUb0Zyb250KSBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIERvbid0IGFkZCB0byB0aGUgYnVmZmVyIGlmIHdlJ3ZlIGRlY29kZWQgdG8gYW4gZW1wdHkgc3RyaW5nIGNodW5rIGFuZFxuICAgICAgLy8gd2UncmUgbm90IGluIG9iamVjdCBtb2RlXG4gICAgICBpZiAoIXNraXBBZGQpIHtcbiAgICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5uZWVkUmVhZGFibGUgfHwgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgcmV0dXJuIDA7XG5cbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKG4gPT09IG51bGwgfHwgaXNOYU4obikpIHtcbiAgICAvLyBvbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyWzBdLmxlbmd0aDtlbHNlIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKSByZXR1cm4gMDtcblxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgdGFyZ2V0IGJ1ZmZlciBsZXZlbCxcbiAgLy8gdGhlbiByYWlzZSB0aGUgd2F0ZXIgbWFyay4gIEJ1bXAgdXAgdG8gdGhlIG5leHQgaGlnaGVzdFxuICAvLyBwb3dlciBvZiAyLCB0byBwcmV2ZW50IGluY3JlYXNpbmcgaXQgZXhjZXNzaXZlbHkgaW4gdGlueVxuICAvLyBhbW91bnRzLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcblxuICAvLyBkb24ndCBoYXZlIHRoYXQgbXVjaC4gIHJldHVybiBudWxsLCB1bmxlc3Mgd2UndmUgZW5kZWQuXG4gIGlmIChuID4gc3RhdGUubGVuZ3RoKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA+IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH1cblxuICBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICBpZiAoZG9SZWFkICYmICFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfVxuXG4gIHN0YXRlLmxlbmd0aCAtPSBuO1xuXG4gIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHByb2Nlc3NOZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwcm9jZXNzTmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0KSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXNbMF0gPT09IGRlc3QgJiYgc3JjLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA9PT0gMSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG4gIC8vIFRoaXMgaXMgYSBicnV0YWxseSB1Z2x5IGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXJcbiAgLy8gaXMgYXR0YWNoZWQgYmVmb3JlIGFueSB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy5cbiAgaWYgKCFkZXN0Ll9ldmVudHMgfHwgIWRlc3QuX2V2ZW50cy5lcnJvcikgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtlbHNlIGlmIChpc0FycmF5KGRlc3QuX2V2ZW50cy5lcnJvcikpIGRlc3QuX2V2ZW50cy5lcnJvci51bnNoaWZ0KG9uZXJyb3IpO2Vsc2UgZGVzdC5fZXZlbnRzLmVycm9yID0gW29uZXJyb3IsIGRlc3QuX2V2ZW50cy5lcnJvcl07XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgZGVzdHNbX2ldLmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgLy8gSWYgbGlzdGVuaW5nIHRvIGRhdGEsIGFuZCBpdCBoYXMgbm90IGV4cGxpY2l0bHkgYmVlbiBwYXVzZWQsXG4gIC8vIHRoZW4gY2FsbCByZXN1bWUgdG8gc3RhcnQgdGhlIGZsb3cgb2YgZGF0YSBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAoZXYgPT09ICdkYXRhJyAmJiBmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgdGhpcy5yZXN1bWUoKTtcbiAgfVxuXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyAmJiAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzc05leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICB9IHdoaWxlIChudWxsICE9PSBjaHVuayAmJiBzdGF0ZS5mbG93aW5nKTtcbiAgfVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbiAoZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICB2YXIgbGlzdCA9IHN0YXRlLmJ1ZmZlcjtcbiAgdmFyIGxlbmd0aCA9IHN0YXRlLmxlbmd0aDtcbiAgdmFyIHN0cmluZ01vZGUgPSAhIXN0YXRlLmRlY29kZXI7XG4gIHZhciBvYmplY3RNb2RlID0gISFzdGF0ZS5vYmplY3RNb2RlO1xuICB2YXIgcmV0O1xuXG4gIC8vIG5vdGhpbmcgaW4gdGhlIGxpc3QsIGRlZmluaXRlbHkgZW1wdHkuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0ID0gbnVsbDtlbHNlIGlmIChvYmplY3RNb2RlKSByZXQgPSBsaXN0LnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBsZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGFycmF5LlxuICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSBsaXN0LmpvaW4oJycpO2Vsc2UgaWYgKGxpc3QubGVuZ3RoID09PSAxKSByZXQgPSBsaXN0WzBdO2Vsc2UgcmV0ID0gQnVmZmVyLmNvbmNhdChsaXN0LCBsZW5ndGgpO1xuICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIGp1c3Qgc29tZSBvZiBpdC5cbiAgICBpZiAobiA8IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBqdXN0IHRha2UgYSBwYXJ0IG9mIHRoZSBmaXJzdCBsaXN0IGl0ZW0uXG4gICAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5ncy5cbiAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgcmV0ID0gYnVmLnNsaWNlKDAsIG4pO1xuICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShuKTtcbiAgICB9IGVsc2UgaWYgKG4gPT09IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBmaXJzdCBsaXN0IGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wbGV4IGNhc2UuXG4gICAgICAvLyB3ZSBoYXZlIGVub3VnaCB0byBjb3ZlciBpdCwgYnV0IGl0IHNwYW5zIHBhc3QgdGhlIGZpcnN0IGJ1ZmZlci5cbiAgICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSAnJztlbHNlIHJldCA9IG5ldyBCdWZmZXIobik7XG5cbiAgICAgIHZhciBjID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsICYmIGMgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICAgIHZhciBjcHkgPSBNYXRoLm1pbihuIC0gYywgYnVmLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHN0cmluZ01vZGUpIHJldCArPSBidWYuc2xpY2UoMCwgY3B5KTtlbHNlIGJ1Zi5jb3B5KHJldCwgYywgMCwgY3B5KTtcblxuICAgICAgICBpZiAoY3B5IDwgYnVmLmxlbmd0aCkgbGlzdFswXSA9IGJ1Zi5zbGljZShjcHkpO2Vsc2UgbGlzdC5zaGlmdCgpO1xuXG4gICAgICAgIGMgKz0gY3B5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoJ2VuZFJlYWRhYmxlIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCIvLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG5cbnZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhUcmFuc2Zvcm0sIER1cGxleCk7XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0aGlzLndyaXRlZW5jb2RpbmcgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MnKSk7XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICBzdHJlYW0uX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpO1xuXG4gIC8vIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaDtcbiAgfVxuXG4gIHRoaXMub25jZSgncHJlZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlcikge1xuICAgICAgZG9uZShzdHJlYW0sIGVyKTtcbiAgICB9KTtlbHNlIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICB2YXIgd3MgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHdzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAodHMudHJhbnNmb3JtaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmcnKTtcblxuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59IiwiLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHByb2Nlc3NOZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGNyZWF0ZSB0aGUgdHdvIG9iamVjdHMgbmVlZGVkIHRvIHN0b3JlIHRoZSBjb3JrZWQgcmVxdWVzdHNcbiAgLy8gdGhleSBhcmUgbm90IGEgbGlua2VkIGxpc3QsIGFzIG5vIG5ldyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlcmVcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiB3cml0YWJsZVN0YXRlR2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0aG91Z2ggdGhleSdyZSBub3RcbiAgLy8gaW5zdGFuY2VvZiBXcml0YWJsZSwgdGhleSdyZSBpbnN0YW5jZW9mIFJlYWRhYmxlLlxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV3JpdGFibGUpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW5ub3QgcGlwZS4gTm90IHJlYWRhYmxlLicpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIHZhciBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcbiAgaWYgKHN5bmMpIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO2Vsc2UgY2IoZXIpO1xuXG4gIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBhc3luY1dyaXRlKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQpIHtcbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3NOZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG5cbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIGVudHJ5ID0gX3RoaXMuZW50cnk7XG4gICAgX3RoaXMuZW50cnkgPSBudWxsO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICAgIGNiKGVycik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gX3RoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IF90aGlzO1xuICAgIH1cbiAgfTtcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cblxuZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO1xuICB9XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gQnVmZmVyLmlzQnVmZmVyO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmICghcHJvY2Vzcy52ZXJzaW9uIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YwLicpID09PSAwIHx8XG4gICAgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLicpID09PSAwICYmIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS44LicpICE9PSAwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gbmV4dFRpY2s7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHByb2Nlc3MubmV4dFRpY2s7XG59XG5cbmZ1bmN0aW9uIG5leHRUaWNrKGZuLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImNhbGxiYWNrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cbiAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBhcmdzLCBpO1xuICBzd2l0Y2ggKGxlbikge1xuICBjYXNlIDA6XG4gIGNhc2UgMTpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmbik7XG4gIGNhc2UgMjpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tPbmUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEpO1xuICAgIH0pO1xuICBjYXNlIDM6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVHdvKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyKTtcbiAgICB9KTtcbiAgY2FzZSA0OlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1RocmVlKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICB9KTtcbiAgZGVmYXVsdDpcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuICAgIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgYXJncy5sZW5ndGgpIHtcbiAgICAgIGFyZ3NbaSsrXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrKCkge1xuICAgICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nXG4gIHx8IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICBjYXNlICdoZXgnOiBjYXNlICd1dGY4JzogY2FzZSAndXRmLTgnOiBjYXNlICdhc2NpaSc6IGNhc2UgJ2JpbmFyeSc6IGNhc2UgJ2Jhc2U2NCc6IGNhc2UgJ3VjczInOiBjYXNlICd1Y3MtMic6IGNhc2UgJ3V0ZjE2bGUnOiBjYXNlICd1dGYtMTZsZSc6IGNhc2UgJ3Jhdyc6IHJldHVybiB0cnVlO1xuICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICAgfVxuXG5cbmZ1bmN0aW9uIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIH1cbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLiBDRVNVLTggaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZSBVVEYtOCBlbmNvZGluZy5cbi8vXG4vLyBAVE9ETyBIYW5kbGluZyBhbGwgZW5jb2RpbmdzIGluc2lkZSBhIHNpbmdsZSBvYmplY3QgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHRcbi8vIHRvIHJlYXNvbiBhYm91dCB0aGlzIGNvZGUsIHNvIGl0IHNob3VsZCBiZSBzcGxpdCB1cCBpbiB0aGUgZnV0dXJlLlxuLy8gQFRPRE8gVGhlcmUgc2hvdWxkIGJlIGEgdXRmOC1zdHJpY3QgZW5jb2RpbmcgdGhhdCByZWplY3RzIGludmFsaWQgVVRGLTggY29kZVxuLy8gcG9pbnRzIGFzIHVzZWQgYnkgQ0VTVS04LlxudmFyIFN0cmluZ0RlY29kZXIgPSBleHBvcnRzLlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5vdWdoIHNwYWNlIHRvIHN0b3JlIGFsbCBieXRlcyBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuIFVURi04IG5lZWRzIDRcbiAgLy8gYnl0ZXMsIGJ1dCBDRVNVLTggbWF5IHJlcXVpcmUgdXAgdG8gNiAoMyBieXRlcyBwZXIgc3Vycm9nYXRlKS5cbiAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IDA7XG4gIC8vIE51bWJlciBvZiBieXRlcyBleHBlY3RlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyTGVuZ3RoID0gMDtcbn07XG5cblxuLy8gd3JpdGUgZGVjb2RlcyB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0IGFzIEpTIHN0cmluZyB0aGF0IGlzXG4vLyBndWFyYW50ZWVkIHRvIG5vdCBjb250YWluIGFueSBwYXJ0aWFsIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gQW55IHBhcnRpYWxcbi8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgYnVmZmVyZWQgdXAsIGFuZCB3aWxsIGJlXG4vLyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgd3JpdGUgYWdhaW4gd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzLlxuLy9cbi8vIE5vdGU6IENvbnZlcnRpbmcgYSBCdWZmZXIgY29udGFpbmluZyBhbiBvcnBoYW4gc3Vycm9nYXRlIHRvIGEgU3RyaW5nXG4vLyBjdXJyZW50bHkgd29ya3MsIGJ1dCBjb252ZXJ0aW5nIGEgU3RyaW5nIHRvIGEgQnVmZmVyICh2aWEgYG5ldyBCdWZmZXJgLCBvclxuLy8gQnVmZmVyI3dyaXRlKSB3aWxsIHJlcGxhY2UgaW5jb21wbGV0ZSBzdXJyb2dhdGVzIHdpdGggdGhlIHVuaWNvZGVcbi8vIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4gU2VlIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMTIxMTczMDA5LyAuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgY2hhclN0ciA9ICcnO1xuICAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgIHZhciBhdmFpbGFibGUgPSAoYnVmZmVyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCkgP1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6XG4gICAgICAgIGJ1ZmZlci5sZW5ndGg7XG5cbiAgICAvLyBhZGQgdGhlIG5ldyBieXRlcyB0byB0aGUgY2hhciBidWZmZXJcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IGF2YWlsYWJsZTtcblxuICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgLy8gc3RpbGwgbm90IGVub3VnaCBjaGFycyBpbiB0aGlzIGJ1ZmZlcj8gd2FpdCBmb3IgbW9yZSAuLi5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXJcbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoYXZhaWxhYmxlLCBidWZmZXIubGVuZ3RoKTtcblxuICAgIC8vIGdldCB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHNwbGl0XG4gICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xuXG4gICAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoYXJTdHI7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIGFuZCBzZXQgY2hhckxlbmd0aCAvIGNoYXJSZWNlaXZlZFxuICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcik7XG5cbiAgdmFyIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG4gIGlmICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBidWZmZXIgdGhlIGluY29tcGxldGUgY2hhcmFjdGVyIGJ5dGVzIHdlIGdvdFxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkLCBlbmQpO1xuICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgfVxuXG4gIGNoYXJTdHIgKz0gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIGVuZCk7XG5cbiAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTtcbiAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGVuZCk7XG4gIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBzaXplO1xuICAgIHRoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgc2l6ZSwgMCwgc2l6ZSk7XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCAwLCBzaXplKTtcbiAgICByZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgfVxuXG4gIC8vIG9yIGp1c3QgZW1pdCB0aGUgY2hhclN0clxuICByZXR1cm4gY2hhclN0cjtcbn07XG5cbi8vIGRldGVjdEluY29tcGxldGVDaGFyIGRldGVybWluZXMgaWYgdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXIgYXRcbi8vIHRoZSBlbmQgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gSWYgc28sIGl0IHNldHMgdGhpcy5jaGFyTGVuZ3RoIHRvIHRoZSBieXRlXG4vLyBsZW5ndGggdGhhdCBjaGFyYWN0ZXIsIGFuZCBzZXRzIHRoaXMuY2hhclJlY2VpdmVkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXNcbi8vIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGFyYWN0ZXIuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gMykgPyAzIDogYnVmZmVyLmxlbmd0aDtcblxuICAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gIC8vIGluY29tcGxldGUgY2hhci5cbiAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07XG5cbiAgICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuXG4gICAgLy8gMTEwWFhYWFhcbiAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMFhYWFhcbiAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMTBYWFhcbiAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gaTtcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgcmVzID0gJyc7XG4gIGlmIChidWZmZXIgJiYgYnVmZmVyLmxlbmd0aClcbiAgICByZXMgPSB0aGlzLndyaXRlKGJ1ZmZlcik7XG5cbiAgaWYgKHRoaXMuY2hhclJlY2VpdmVkKSB7XG4gICAgdmFyIGNyID0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjtcbiAgICB2YXIgZW5jID0gdGhpcy5lbmNvZGluZztcbiAgICByZXMgKz0gYnVmLnNsaWNlKDAsIGNyKS50b1N0cmluZyhlbmMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIHBhc3NUaHJvdWdoV3JpdGUoYnVmZmVyKSB7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAzO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDMgOiAwO1xufVxuIiwiXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGVwcmVjYXRlO1xuXG4vKipcbiAqIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2Uubm9EZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudGhyb3dEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCB0aHJvdyBhbiBFcnJvciB3aGVuIGludm9rZWQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50cmFjZURlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIGludm9rZSBgY29uc29sZS50cmFjZSgpYCBpbnN0ZWFkIG9mIGBjb25zb2xlLmVycm9yKClgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdGhlIGZ1bmN0aW9uIHRvIGRlcHJlY2F0ZVxuICogQHBhcmFtIHtTdHJpbmd9IG1zZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQgdG8gdGhlIGNvbnNvbGUgd2hlbiBgZm5gIGlzIGludm9rZWRcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBuZXcgXCJkZXByZWNhdGVkXCIgdmVyc2lvbiBvZiBgZm5gXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZSAoZm4sIG1zZykge1xuICBpZiAoY29uZmlnKCdub0RlcHJlY2F0aW9uJykpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChjb25maWcoJ3Rocm93RGVwcmVjYXRpb24nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnKCd0cmFjZURlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBgbG9jYWxTdG9yYWdlYCBmb3IgYm9vbGVhbiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBgbmFtZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29uZmlnIChuYW1lKSB7XG4gIC8vIGFjY2Vzc2luZyBnbG9iYWwubG9jYWxTdG9yYWdlIGNhbiB0cmlnZ2VyIGEgRE9NRXhjZXB0aW9uIGluIHNhbmRib3hlZCBpZnJhbWVzXG4gIHRyeSB7XG4gICAgaWYgKCFnbG9iYWwubG9jYWxTdG9yYWdlKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHZhbCA9IGdsb2JhbC5sb2NhbFN0b3JhZ2VbbmFtZV07XG4gIGlmIChudWxsID09IHZhbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xufVxuIiwidmFyIFN0cmVhbSA9IChmdW5jdGlvbiAoKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZSgnc3QnICsgJ3JlYW0nKTsgLy8gaGFjayB0byBmaXggYSBjaXJjdWxhciBkZXBlbmRlbmN5IGlzc3VlIHdoZW4gdXNlZCB3aXRoIGJyb3dzZXJpZnlcbiAgfSBjYXRjaChfKXt9XG59KCkpO1xuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcycpO1xuZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW0gfHwgZXhwb3J0cztcbmV4cG9ydHMuUmVhZGFibGUgPSBleHBvcnRzO1xuZXhwb3J0cy5Xcml0YWJsZSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fd3JpdGFibGUuanMnKTtcbmV4cG9ydHMuRHVwbGV4ID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbmV4cG9ydHMuVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMnKTtcbmV4cG9ydHMuUGFzc1Rocm91Z2ggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIGxpZ2h0d2VpZ2h0IEJ1ZmZlciBzaGltIGZvciBwYmYgYnJvd3NlciBidWlsZFxuLy8gYmFzZWQgb24gY29kZSBmcm9tIGdpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlciAoTUlULWxpY2Vuc2VkKVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJ1ZmZlcjtcblxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0Jyk7XG5cbnZhciBCdWZmZXJNZXRob2RzO1xuXG5mdW5jdGlvbiBCdWZmZXIobGVuZ3RoKSB7XG4gICAgdmFyIGFycjtcbiAgICBpZiAobGVuZ3RoICYmIGxlbmd0aC5sZW5ndGgpIHtcbiAgICAgICAgYXJyID0gbGVuZ3RoO1xuICAgICAgICBsZW5ndGggPSBhcnIubGVuZ3RoO1xuICAgIH1cbiAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoIHx8IDApO1xuICAgIGlmIChhcnIpIGJ1Zi5zZXQoYXJyKTtcblxuICAgIGJ1Zi5yZWFkVUludDMyTEUgPSBCdWZmZXJNZXRob2RzLnJlYWRVSW50MzJMRTtcbiAgICBidWYud3JpdGVVSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVVSW50MzJMRTtcbiAgICBidWYucmVhZEludDMyTEUgPSBCdWZmZXJNZXRob2RzLnJlYWRJbnQzMkxFO1xuICAgIGJ1Zi53cml0ZUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlSW50MzJMRTtcbiAgICBidWYucmVhZEZsb2F0TEUgPSBCdWZmZXJNZXRob2RzLnJlYWRGbG9hdExFO1xuICAgIGJ1Zi53cml0ZUZsb2F0TEUgPSBCdWZmZXJNZXRob2RzLndyaXRlRmxvYXRMRTtcbiAgICBidWYucmVhZERvdWJsZUxFID0gQnVmZmVyTWV0aG9kcy5yZWFkRG91YmxlTEU7XG4gICAgYnVmLndyaXRlRG91YmxlTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlRG91YmxlTEU7XG4gICAgYnVmLnRvU3RyaW5nID0gQnVmZmVyTWV0aG9kcy50b1N0cmluZztcbiAgICBidWYud3JpdGUgPSBCdWZmZXJNZXRob2RzLndyaXRlO1xuICAgIGJ1Zi5zbGljZSA9IEJ1ZmZlck1ldGhvZHMuc2xpY2U7XG4gICAgYnVmLmNvcHkgPSBCdWZmZXJNZXRob2RzLmNvcHk7XG5cbiAgICBidWYuX2lzQnVmZmVyID0gdHJ1ZTtcbiAgICByZXR1cm4gYnVmO1xufVxuXG52YXIgbGFzdFN0ciwgbGFzdFN0ckVuY29kZWQ7XG5cbkJ1ZmZlck1ldGhvZHMgPSB7XG4gICAgcmVhZFVJbnQzMkxFOiBmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgcmV0dXJuICgodGhpc1twb3NdKSB8XG4gICAgICAgICAgICAodGhpc1twb3MgKyAxXSA8PCA4KSB8XG4gICAgICAgICAgICAodGhpc1twb3MgKyAyXSA8PCAxNikpICtcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDNdICogMHgxMDAwMDAwKTtcbiAgICB9LFxuXG4gICAgd3JpdGVVSW50MzJMRTogZnVuY3Rpb24odmFsLCBwb3MpIHtcbiAgICAgICAgdGhpc1twb3NdID0gdmFsO1xuICAgICAgICB0aGlzW3BvcyArIDFdID0gKHZhbCA+Pj4gOCk7XG4gICAgICAgIHRoaXNbcG9zICsgMl0gPSAodmFsID4+PiAxNik7XG4gICAgICAgIHRoaXNbcG9zICsgM10gPSAodmFsID4+PiAyNCk7XG4gICAgfSxcblxuICAgIHJlYWRJbnQzMkxFOiBmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgcmV0dXJuICgodGhpc1twb3NdKSB8XG4gICAgICAgICAgICAodGhpc1twb3MgKyAxXSA8PCA4KSB8XG4gICAgICAgICAgICAodGhpc1twb3MgKyAyXSA8PCAxNikpICtcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDNdIDw8IDI0KTtcbiAgICB9LFxuXG4gICAgcmVhZEZsb2F0TEU6ICBmdW5jdGlvbihwb3MpIHsgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBwb3MsIHRydWUsIDIzLCA0KTsgfSxcbiAgICByZWFkRG91YmxlTEU6IGZ1bmN0aW9uKHBvcykgeyByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIHBvcywgdHJ1ZSwgNTIsIDgpOyB9LFxuXG4gICAgd3JpdGVGbG9hdExFOiAgZnVuY3Rpb24odmFsLCBwb3MpIHsgcmV0dXJuIGllZWU3NTQud3JpdGUodGhpcywgdmFsLCBwb3MsIHRydWUsIDIzLCA0KTsgfSxcbiAgICB3cml0ZURvdWJsZUxFOiBmdW5jdGlvbih2YWwsIHBvcykgeyByZXR1cm4gaWVlZTc1NC53cml0ZSh0aGlzLCB2YWwsIHBvcywgdHJ1ZSwgNTIsIDgpOyB9LFxuXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gICAgICAgIHZhciBzdHIgPSAnJyxcbiAgICAgICAgICAgIHRtcCA9ICcnO1xuXG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odGhpcy5sZW5ndGgsIGVuZCB8fCB0aGlzLmxlbmd0aCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaCA9IHRoaXNbaV07XG4gICAgICAgICAgICBpZiAoY2ggPD0gMHg3Rikge1xuICAgICAgICAgICAgICAgIHN0ciArPSBkZWNvZGVVUklDb21wb25lbnQodG1wKSArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgICAgICAgICAgICAgIHRtcCA9ICcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0bXAgKz0gJyUnICsgY2gudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3RyICs9IGRlY29kZVVSSUNvbXBvbmVudCh0bXApO1xuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfSxcblxuICAgIHdyaXRlOiBmdW5jdGlvbihzdHIsIHBvcykge1xuICAgICAgICB2YXIgYnl0ZXMgPSBzdHIgPT09IGxhc3RTdHIgPyBsYXN0U3RyRW5jb2RlZCA6IGVuY29kZVN0cmluZyhzdHIpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzW3BvcyArIGldID0gYnl0ZXNbaV07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2xpY2U6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCk7XG4gICAgfSxcblxuICAgIGNvcHk6IGZ1bmN0aW9uKGJ1ZiwgcG9zKSB7XG4gICAgICAgIHBvcyA9IHBvcyB8fCAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJ1Zltwb3MgKyBpXSA9IHRoaXNbaV07XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5CdWZmZXJNZXRob2RzLndyaXRlSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVVSW50MzJMRTtcblxuQnVmZmVyLmJ5dGVMZW5ndGggPSBmdW5jdGlvbihzdHIpIHtcbiAgICBsYXN0U3RyID0gc3RyO1xuICAgIGxhc3RTdHJFbmNvZGVkID0gZW5jb2RlU3RyaW5nKHN0cik7XG4gICAgcmV0dXJuIGxhc3RTdHJFbmNvZGVkLmxlbmd0aDtcbn07XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uKGJ1Zikge1xuICAgIHJldHVybiAhIShidWYgJiYgYnVmLl9pc0J1ZmZlcik7XG59O1xuXG5mdW5jdGlvbiBlbmNvZGVTdHJpbmcoc3RyKSB7XG4gICAgdmFyIGxlbmd0aCA9IHN0ci5sZW5ndGgsXG4gICAgICAgIGJ5dGVzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgYywgbGVhZDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKTsgLy8gY29kZSBwb2ludFxuXG4gICAgICAgIGlmIChjID4gMHhEN0ZGICYmIGMgPCAweEUwMDApIHtcblxuICAgICAgICAgICAgaWYgKGxlYWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA8IDB4REMwMCkge1xuICAgICAgICAgICAgICAgICAgICBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gYztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjID0gbGVhZCAtIDB4RDgwMCA8PCAxMCB8IGMgLSAweERDMDAgfCAweDEwMDAwO1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPiAweERCRkYgfHwgKGkgKyAxID09PSBsZW5ndGgpKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgICAgICAgIGVsc2UgbGVhZCA9IGM7XG5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGxlYWQpIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgICBsZWFkID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjIDwgMHg4MCkgYnl0ZXMucHVzaChjKTtcbiAgICAgICAgZWxzZSBpZiAoYyA8IDB4ODAwKSBieXRlcy5wdXNoKGMgPj4gMHg2IHwgMHhDMCwgYyAmIDB4M0YgfCAweDgwKTtcbiAgICAgICAgZWxzZSBpZiAoYyA8IDB4MTAwMDApIGJ5dGVzLnB1c2goYyA+PiAweEMgfCAweEUwLCBjID4+IDB4NiAmIDB4M0YgfCAweDgwLCBjICYgMHgzRiB8IDB4ODApO1xuICAgICAgICBlbHNlIGJ5dGVzLnB1c2goYyA+PiAweDEyIHwgMHhGMCwgYyA+PiAweEMgJiAweDNGIHwgMHg4MCwgYyA+PiAweDYgJiAweDNGIHwgMHg4MCwgYyAmIDB4M0YgfCAweDgwKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBiZjtcblxudmFyIEJ1ZmZlciA9IGdsb2JhbC5CdWZmZXIgfHwgcmVxdWlyZSgnLi9idWZmZXInKTtcblxuZnVuY3Rpb24gUGJmKGJ1Zikge1xuICAgIHRoaXMuYnVmID0gIUJ1ZmZlci5pc0J1ZmZlcihidWYpID8gbmV3IEJ1ZmZlcihidWYgfHwgMCkgOiBidWY7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5idWYubGVuZ3RoO1xufVxuXG5QYmYuVmFyaW50ICA9IDA7IC8vIHZhcmludDogaW50MzIsIGludDY0LCB1aW50MzIsIHVpbnQ2NCwgc2ludDMyLCBzaW50NjQsIGJvb2wsIGVudW1cblBiZi5GaXhlZDY0ID0gMTsgLy8gNjQtYml0OiBkb3VibGUsIGZpeGVkNjQsIHNmaXhlZDY0XG5QYmYuQnl0ZXMgICA9IDI7IC8vIGxlbmd0aC1kZWxpbWl0ZWQ6IHN0cmluZywgYnl0ZXMsIGVtYmVkZGVkIG1lc3NhZ2VzLCBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzXG5QYmYuRml4ZWQzMiA9IDU7IC8vIDMyLWJpdDogZmxvYXQsIGZpeGVkMzIsIHNmaXhlZDMyXG5cbnZhciBTSElGVF9MRUZUXzMyID0gKDEgPDwgMTYpICogKDEgPDwgMTYpLFxuICAgIFNISUZUX1JJR0hUXzMyID0gMSAvIFNISUZUX0xFRlRfMzIsXG4gICAgUE9XXzJfNjMgPSBNYXRoLnBvdygyLCA2Myk7XG5cblBiZi5wcm90b3R5cGUgPSB7XG5cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5idWYgPSBudWxsO1xuICAgIH0sXG5cbiAgICAvLyA9PT0gUkVBRElORyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgcmVhZEZpZWxkczogZnVuY3Rpb24ocmVhZEZpZWxkLCByZXN1bHQsIGVuZCkge1xuICAgICAgICBlbmQgPSBlbmQgfHwgdGhpcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5yZWFkVmFyaW50KCksXG4gICAgICAgICAgICAgICAgdGFnID0gdmFsID4+IDMsXG4gICAgICAgICAgICAgICAgc3RhcnRQb3MgPSB0aGlzLnBvcztcblxuICAgICAgICAgICAgcmVhZEZpZWxkKHRhZywgcmVzdWx0LCB0aGlzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucG9zID09PSBzdGFydFBvcykgdGhpcy5za2lwKHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgcmVhZE1lc3NhZ2U6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRGaWVsZHMocmVhZEZpZWxkLCByZXN1bHQsIHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MpO1xuICAgIH0sXG5cbiAgICByZWFkRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkU0ZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZEludDMyTEUodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICAvLyA2NC1iaXQgaW50IGhhbmRsaW5nIGlzIGJhc2VkIG9uIGdpdGh1Yi5jb20vZHB3L25vZGUtYnVmZmVyLW1vcmUtaW50cyAoTUlULWxpY2Vuc2VkKVxuXG4gICAgcmVhZEZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKSArIHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcyArIDQpICogU0hJRlRfTEVGVF8zMjtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFNGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcykgKyB0aGlzLmJ1Zi5yZWFkSW50MzJMRSh0aGlzLnBvcyArIDQpICogU0hJRlRfTEVGVF8zMjtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZEZsb2F0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRGbG9hdExFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZERvdWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkRG91YmxlTEUodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGJ1ZiA9IHRoaXMuYnVmLFxuICAgICAgICAgICAgdmFsLCBiLCBiMCwgYjEsIGIyLCBiMztcblxuICAgICAgICBiMCA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIwIDwgMHg4MCkgcmV0dXJuIGIwOyAgICAgICAgICAgICAgICAgYjAgPSBiMCAmIDB4N2Y7XG4gICAgICAgIGIxID0gYnVmW3RoaXMucG9zKytdOyBpZiAoYjEgPCAweDgwKSByZXR1cm4gYjAgfCBiMSA8PCA3OyAgICAgICBiMSA9IChiMSAmIDB4N2YpIDw8IDc7XG4gICAgICAgIGIyID0gYnVmW3RoaXMucG9zKytdOyBpZiAoYjIgPCAweDgwKSByZXR1cm4gYjAgfCBiMSB8IGIyIDw8IDE0OyBiMiA9IChiMiAmIDB4N2YpIDw8IDE0O1xuICAgICAgICBiMyA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIzIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgfCBiMiB8IGIzIDw8IDIxO1xuXG4gICAgICAgIHZhbCA9IGIwIHwgYjEgfCBiMiB8IChiMyAmIDB4N2YpIDw8IDIxO1xuXG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCArPSAoYiAmIDB4N2YpICogMHgxMDAwMDAwMDsgICAgICAgICBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCArPSAoYiAmIDB4N2YpICogMHg4MDAwMDAwMDA7ICAgICAgICBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCArPSAoYiAmIDB4N2YpICogMHg0MDAwMDAwMDAwMDsgICAgICBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCArPSAoYiAmIDB4N2YpICogMHgyMDAwMDAwMDAwMDAwOyAgICBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCArPSAoYiAmIDB4N2YpICogMHgxMDAwMDAwMDAwMDAwMDA7ICBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCArPSAoYiAmIDB4N2YpICogMHg4MDAwMDAwMDAwMDAwMDAwOyBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB2YXJpbnQgbm90IG1vcmUgdGhhbiAxMCBieXRlcycpO1xuICAgIH0sXG5cbiAgICByZWFkVmFyaW50NjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnBvcyxcbiAgICAgICAgICAgIHZhbCA9IHRoaXMucmVhZFZhcmludCgpO1xuXG4gICAgICAgIGlmICh2YWwgPCBQT1dfMl82MykgcmV0dXJuIHZhbDtcblxuICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3MgLSAyO1xuICAgICAgICB3aGlsZSAodGhpcy5idWZbcG9zXSA9PT0gMHhmZikgcG9zLS07XG4gICAgICAgIGlmIChwb3MgPCBzdGFydFBvcykgcG9zID0gc3RhcnRQb3M7XG5cbiAgICAgICAgdmFsID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb3MgLSBzdGFydFBvcyArIDE7IGkrKykge1xuICAgICAgICAgICAgdmFyIGIgPSB+dGhpcy5idWZbc3RhcnRQb3MgKyBpXSAmIDB4N2Y7XG4gICAgICAgICAgICB2YWwgKz0gaSA8IDQgPyBiIDw8IGkgKiA3IDogYiAqIE1hdGgucG93KDIsIGkgKiA3KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAtdmFsIC0gMTtcbiAgICB9LFxuXG4gICAgcmVhZFNWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbnVtID0gdGhpcy5yZWFkVmFyaW50KCk7XG4gICAgICAgIHJldHVybiBudW0gJSAyID09PSAxID8gKG51bSArIDEpIC8gLTIgOiBudW0gLyAyOyAvLyB6aWd6YWcgZW5jb2RpbmdcbiAgICB9LFxuXG4gICAgcmVhZEJvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLnJlYWRWYXJpbnQoKSk7XG4gICAgfSxcblxuICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyxcbiAgICAgICAgICAgIHN0ciA9IHRoaXMuYnVmLnRvU3RyaW5nKCd1dGY4JywgdGhpcy5wb3MsIGVuZCk7XG4gICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH0sXG5cbiAgICByZWFkQnl0ZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyxcbiAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuYnVmLnNsaWNlKHRoaXMucG9zLCBlbmQpO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9LFxuXG4gICAgLy8gdmVyYm9zZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczsgZG9lc24ndCBhZmZlY3QgZ3ppcHBlZCBzaXplXG5cbiAgICByZWFkUGFja2VkVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFZhcmludCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkQm9vbGVhbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZsb2F0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZERvdWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQ2NCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQ2NCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuXG4gICAgc2tpcDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHZhciB0eXBlID0gdmFsICYgMHg3O1xuICAgICAgICBpZiAodHlwZSA9PT0gUGJmLlZhcmludCkgd2hpbGUgKHRoaXMuYnVmW3RoaXMucG9zKytdID4gMHg3Zikge31cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkJ5dGVzKSB0aGlzLnBvcyA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3M7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5GaXhlZDMyKSB0aGlzLnBvcyArPSA0O1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuRml4ZWQ2NCkgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ1VuaW1wbGVtZW50ZWQgdHlwZTogJyArIHR5cGUpO1xuICAgIH0sXG5cbiAgICAvLyA9PT0gV1JJVElORyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgd3JpdGVUYWc6IGZ1bmN0aW9uKHRhZywgdHlwZSkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KCh0YWcgPDwgMykgfCB0eXBlKTtcbiAgICB9LFxuXG4gICAgcmVhbGxvYzogZnVuY3Rpb24obWluKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8fCAxNjtcblxuICAgICAgICB3aGlsZSAobGVuZ3RoIDwgdGhpcy5wb3MgKyBtaW4pIGxlbmd0aCAqPSAyO1xuXG4gICAgICAgIGlmIChsZW5ndGggIT09IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihsZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5idWYuY29weShidWYpO1xuICAgICAgICAgICAgdGhpcy5idWYgPSBidWY7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMucG9zO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1Zi5zbGljZSgwLCB0aGlzLmxlbmd0aCk7XG4gICAgfSxcblxuICAgIHdyaXRlRml4ZWQzMjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVVSW50MzJMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQzMjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZUZpeGVkNjQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRSh2YWwgJiAtMSwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZVVJbnQzMkxFKE1hdGguZmxvb3IodmFsICogU0hJRlRfUklHSFRfMzIpLCB0aGlzLnBvcyArIDQpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZVNGaXhlZDY0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUodmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKE1hdGguZmxvb3IodmFsICogU0hJRlRfUklHSFRfMzIpLCB0aGlzLnBvcyArIDQpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZVZhcmludDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHZhbCA9ICt2YWw7XG5cbiAgICAgICAgaWYgKHZhbCA8PSAweDdmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMSk7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IHZhbDtcblxuICAgICAgICB9IGVsc2UgaWYgKHZhbCA8PSAweDNmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygyKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHZhbCA8PSAweDFmZmZmZikge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDMpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMCkgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiA3KSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDE0KSAmIDB4N2YpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodmFsIDw9IDB4ZmZmZmZmZikge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMCkgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiA3KSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDE0KSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDIxKSAmIDB4N2YpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcG9zID0gdGhpcy5wb3M7XG4gICAgICAgICAgICB3aGlsZSAodmFsID49IDB4ODApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWxsb2MoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAodmFsICYgMHhmZikgfCAweDgwO1xuICAgICAgICAgICAgICAgIHZhbCAvPSAweDgwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSB2YWwgfCAwO1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zIC0gcG9zID4gMTApIHRocm93IG5ldyBFcnJvcignR2l2ZW4gdmFyaW50IGRvZXNuXFwndCBmaXQgaW50byAxMCBieXRlcycpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHdyaXRlU1ZhcmludDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQodmFsIDwgMCA/IC12YWwgKiAyIC0gMSA6IHZhbCAqIDIpO1xuICAgIH0sXG5cbiAgICB3cml0ZUJvb2xlYW46IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odmFsKSk7XG4gICAgfSxcblxuICAgIHdyaXRlU3RyaW5nOiBmdW5jdGlvbihzdHIpIHtcbiAgICAgICAgc3RyID0gU3RyaW5nKHN0cik7XG4gICAgICAgIHZhciBieXRlcyA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHN0cik7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoYnl0ZXMpO1xuICAgICAgICB0aGlzLnJlYWxsb2MoYnl0ZXMpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZShzdHIsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gYnl0ZXM7XG4gICAgfSxcblxuICAgIHdyaXRlRmxvYXQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlRmxvYXRMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVEb3VibGU6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlRG91YmxlTEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlQnl0ZXM6IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAgICAgICB2YXIgbGVuID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgICAgICB0aGlzLnJlYWxsb2MobGVuKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgdGhpcy5idWZbdGhpcy5wb3MrK10gPSBidWZmZXJbaV07XG4gICAgfSxcblxuICAgIHdyaXRlTWVzc2FnZTogZnVuY3Rpb24odGFnLCBmbiwgb2JqKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuXG4gICAgICAgIHRoaXMucG9zKys7IC8vIHJlc2VydmUgMSBieXRlIGZvciBzaG9ydCBtZXNzYWdlIGxlbmd0aFxuXG4gICAgICAgIC8vIHdyaXRlIHRoZSBtZXNzYWdlIGRpcmVjdGx5IHRvIHRoZSBidWZmZXIgYW5kIHNlZSBob3cgbXVjaCB3YXMgd3JpdHRlblxuICAgICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnBvcztcbiAgICAgICAgZm4ob2JqLCB0aGlzKTtcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMucG9zIC0gc3RhcnRQb3M7XG5cbiAgICAgICAgdmFyIHZhcmludExlbiA9XG4gICAgICAgICAgICBsZW4gPD0gMHg3ZiA/IDEgOlxuICAgICAgICAgICAgbGVuIDw9IDB4M2ZmZiA/IDIgOlxuICAgICAgICAgICAgbGVuIDw9IDB4MWZmZmZmID8gMyA6XG4gICAgICAgICAgICBsZW4gPD0gMHhmZmZmZmZmID8gNCA6IE1hdGguY2VpbChNYXRoLmxvZyhsZW4pIC8gKE1hdGguTE4yICogNykpO1xuXG4gICAgICAgIC8vIGlmIDEgYnl0ZSBpc24ndCBlbm91Z2ggZm9yIGVuY29kaW5nIG1lc3NhZ2UgbGVuZ3RoLCBzaGlmdCB0aGUgZGF0YSB0byB0aGUgcmlnaHRcbiAgICAgICAgaWYgKHZhcmludExlbiA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYyh2YXJpbnRMZW4gLSAxKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnBvcyAtIDE7IGkgPj0gc3RhcnRQb3M7IGktLSkgdGhpcy5idWZbaSArIHZhcmludExlbiAtIDFdID0gdGhpcy5idWZbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgbWVzc2FnZSBsZW5ndGggaW4gdGhlIHJlc2VydmVkIHBsYWNlIGFuZCByZXN0b3JlIHRoZSBwb3NpdGlvblxuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0UG9zIC0gMTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgICAgICB0aGlzLnBvcyArPSBsZW47XG4gICAgfSxcblxuICAgIHdyaXRlUGFja2VkVmFyaW50OiAgIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRWYXJpbnQsIGFycik7ICAgfSxcbiAgICB3cml0ZVBhY2tlZFNWYXJpbnQ6ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU1ZhcmludCwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRCb29sZWFuOiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEJvb2xlYW4sIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkRmxvYXQ6ICAgIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGbG9hdCwgYXJyKTsgICAgfSxcbiAgICB3cml0ZVBhY2tlZERvdWJsZTogICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRG91YmxlLCBhcnIpOyAgIH0sXG4gICAgd3JpdGVQYWNrZWRGaXhlZDMyOiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZpeGVkMzIsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkU0ZpeGVkMzI6IGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQzMiwgYXJyKTsgfSxcbiAgICB3cml0ZVBhY2tlZEZpeGVkNjQ6ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRml4ZWQ2NCwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRTRml4ZWQ2NDogZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNGaXhlZDY0LCBhcnIpOyB9LFxuXG4gICAgd3JpdGVCeXRlc0ZpZWxkOiBmdW5jdGlvbih0YWcsIGJ1ZmZlcikge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkJ5dGVzKTtcbiAgICAgICAgdGhpcy53cml0ZUJ5dGVzKGJ1ZmZlcik7XG4gICAgfSxcbiAgICB3cml0ZUZpeGVkMzJGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZUZpeGVkMzIodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU0ZpeGVkMzJGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZVNGaXhlZDMyKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZUZpeGVkNjRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICAgICAgdGhpcy53cml0ZUZpeGVkNjQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU0ZpeGVkNjRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICAgICAgdGhpcy53cml0ZVNGaXhlZDY0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVZhcmludEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLlZhcmludCk7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU1ZhcmludEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLlZhcmludCk7XG4gICAgICAgIHRoaXMud3JpdGVTVmFyaW50KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVN0cmluZ0ZpZWxkOiBmdW5jdGlvbih0YWcsIHN0cikge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkJ5dGVzKTtcbiAgICAgICAgdGhpcy53cml0ZVN0cmluZyhzdHIpO1xuICAgIH0sXG4gICAgd3JpdGVGbG9hdEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlRmxvYXQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlRG91YmxlRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVEb3VibGUodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlQm9vbGVhbkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50RmllbGQodGFnLCBCb29sZWFuKHZhbCkpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIHdyaXRlUGFja2VkVmFyaW50KGFyciwgcGJmKSAgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVZhcmludChhcnJbaV0pOyAgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkU1ZhcmludChhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVNWYXJpbnQoYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRmxvYXQoYXJyLCBwYmYpICAgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUZsb2F0KGFycltpXSk7ICAgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRG91YmxlKGFyciwgcGJmKSAgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZURvdWJsZShhcnJbaV0pOyAgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkQm9vbGVhbihhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUJvb2xlYW4oYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRml4ZWQzMihhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUZpeGVkMzIoYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkMzIoYXJyLCBwYmYpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVNGaXhlZDMyKGFycltpXSk7IH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRml4ZWQ2NChhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUZpeGVkNjQoYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkNjQoYXJyLCBwYmYpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVNGaXhlZDY0KGFycltpXSk7IH1cbiIsIi8qIVxuICogc3RyaXAtY29tbWVudHMgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L3N0cmlwLWNvbW1lbnRzPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBKb24gU2NobGlua2VydCwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWMnO1xuXG52YXIgcmVCbG9jayA9ICdcXFxcL1xcXFwqJztcbnZhciByZUJsb2NrSWdub3JlID0gJ1xcXFwvXFxcXCooPyFcXFxcKj9cXFxcISknO1xudmFyIHJlQmxvY2tFbmQgPSAnKC58W1xcXFxyXFxcXG5dfFxcXFxuKSo/XFxcXCpcXFxcL1xcXFxuP1xcXFxuPyc7XG52YXIgcmVMaW5lID0gLyhefFteXFxTXFxuXSkoPzpcXC9cXC8pKFtcXHNcXFNdKz8pJC9nbTtcbnZhciByZUxpbmVJZ25vcmUgPSAvKF58W15cXFNcXG5dKSg/OlxcL1xcL1teIV0pKFtcXHNcXFNdKz8pJC9nbTtcblxuXG4vKipcbiAqIFN0cmlwIGFsbCBjb21tZW50c1xuICpcbiAqIHslPSBkb2NzKFwic3RyaXBcIikgJX1cbiAqXG4gKiBAcGFyYW0gICB7U3RyaW5nfSBgc3RyYCAgZmlsZSBjb250ZW50cyBvciBzdHJpbmcgdG8gc3RyaXAuXG4gKiBAcGFyYW0gICB7T2JqZWN0fSBgb3B0c2AgIG9wdGlvbnMgYXJlIHBhc3NlZCB0byBgLmJsb2NrYCwgYW5kIGAubGluZWBcbiAqIEByZXR1cm4gIHtTdHJpbmd9IFN0cmluZyB3aXRob3V0IGNvbW1lbnRzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG52YXIgc3RyaXAgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHN0ciwgb3B0cykge1xuICByZXR1cm4gc3RyID8gc3RyaXAuYmxvY2soc3RyaXAubGluZShzdHIsIG9wdHMpLCBvcHRzKSA6ICcnO1xufTtcblxuXG4vKipcbiAqIFN0cmlwIG9ubHkgYmxvY2sgY29tbWVudHMsIG9wdGlvbmFsbHkgbGVhdmluZyBwcm90ZWN0ZWQgY29tbWVudHNcbiAqIChlLmcuIGAvKiFgKSBpbnRhY3QuXG4gKlxuICogeyU9IGRvY3MoXCJibG9ja1wiKSAlfVxuICpcbiAqIEBwYXJhbSAgIHtTdHJpbmd9IGBzdHJgICBmaWxlIGNvbnRlbnQgb3Igc3RyaW5nIHRvIHN0cmlwIHRvXG4gKiBAcGFyYW0gICB7T2JqZWN0fSBgb3B0c2AgIGlmIGBzYWZlOnRydWVgLCBzdHJpcCBvbmx5IGNvbW1lbnRzIHRoYXQgZG8gbm90IHN0YXJ0IHdpdGggYC8qIWAgb3IgYC8qKiFgXG4gKiBAcmV0dXJuICB7U3RyaW5nfSBTdHJpbmcgd2l0aG91dCBibG9jayBjb21tZW50cy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuc3RyaXAuYmxvY2sgPSBmdW5jdGlvbihzdHIsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIHZhciByZSA9IG5ldyBSZWdFeHAocmVCbG9jayArIHJlQmxvY2tFbmQsICdnbScpO1xuICBpZihvcHRzLnNhZmUpIHtcbiAgICByZSA9IG5ldyBSZWdFeHAocmVCbG9ja0lnbm9yZSArIHJlQmxvY2tFbmQsICdnbScpO1xuICB9XG4gIHJldHVybiBzdHIgPyBzdHIucmVwbGFjZShyZSwgJycpIDogJyc7XG59O1xuXG5cbi8qKlxuICogU3RyaXAgb25seSBsaW5lIGNvbW1lbnRzXG4gKlxuICogeyU9IGRvY3MoXCJsaW5lXCIpICV9XG4gKlxuICogQHBhcmFtICAge1N0cmluZ30gYHN0cmAgIGZpbGUgY29udGVudCBvciBzdHJpbmcgdG8gc3RyaXAgdG9cbiAqIEBwYXJhbSAgIHtPYmplY3R9IGBvcHRzYCAgaWYgYHNhZmU6dHJ1ZWAsIHN0cmlwIGFsbCB0aGF0IG5vdCBzdGFydHMgd2l0aCBgLy8hYFxuICogQHJldHVybiAge1N0cmluZ30gU3RyaW5nIHdpdGhvdXQgbGluZSBjb21tZW50cy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuc3RyaXAubGluZSA9IGZ1bmN0aW9uKHN0ciwgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgdmFyIHJlID0gcmVMaW5lO1xuICBpZihvcHRzLnNhZmUpIHtcbiAgICByZSA9IHJlTGluZUlnbm9yZTtcbiAgfVxuICByZXR1cm4gc3RyID8gc3RyLnJlcGxhY2UocmUsICcnKSA6ICcnO1xufTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90b3BvanNvbi90b3BvanNvbi1jbGllbnQgVmVyc2lvbiAyLjEuMC4gQ29weXJpZ2h0IDIwMTYgTWlrZSBCb3N0b2NrLlxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOlxuICAoZmFjdG9yeSgoZ2xvYmFsLnRvcG9qc29uID0gZ2xvYmFsLnRvcG9qc29uIHx8IHt9KSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmV2ZXJzZSA9IGZ1bmN0aW9uKGFycmF5LCBuKSB7XG4gIHZhciB0LCBqID0gYXJyYXkubGVuZ3RoLCBpID0gaiAtIG47XG4gIHdoaWxlIChpIDwgLS1qKSB0ID0gYXJyYXlbaV0sIGFycmF5W2krK10gPSBhcnJheVtqXSwgYXJyYXlbal0gPSB0O1xufTtcblxudmFyIGlkZW50aXR5ID0gZnVuY3Rpb24oeCkge1xuICByZXR1cm4geDtcbn07XG5cbnZhciB0cmFuc2Zvcm0gPSBmdW5jdGlvbih0b3BvbG9neSkge1xuICBpZiAoKHRyYW5zZm9ybSA9IHRvcG9sb2d5LnRyYW5zZm9ybSkgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5O1xuICB2YXIgdHJhbnNmb3JtLFxuICAgICAgeDAsXG4gICAgICB5MCxcbiAgICAgIGt4ID0gdHJhbnNmb3JtLnNjYWxlWzBdLFxuICAgICAga3kgPSB0cmFuc2Zvcm0uc2NhbGVbMV0sXG4gICAgICBkeCA9IHRyYW5zZm9ybS50cmFuc2xhdGVbMF0sXG4gICAgICBkeSA9IHRyYW5zZm9ybS50cmFuc2xhdGVbMV07XG4gIHJldHVybiBmdW5jdGlvbihwb2ludCwgaSkge1xuICAgIGlmICghaSkgeDAgPSB5MCA9IDA7XG4gICAgcG9pbnRbMF0gPSAoeDAgKz0gcG9pbnRbMF0pICoga3ggKyBkeDtcbiAgICBwb2ludFsxXSA9ICh5MCArPSBwb2ludFsxXSkgKiBreSArIGR5O1xuICAgIHJldHVybiBwb2ludDtcbiAgfTtcbn07XG5cbnZhciBmZWF0dXJlID0gZnVuY3Rpb24odG9wb2xvZ3ksIG8pIHtcbiAgcmV0dXJuIG8udHlwZSA9PT0gXCJHZW9tZXRyeUNvbGxlY3Rpb25cIlxuICAgICAgPyB7dHlwZTogXCJGZWF0dXJlQ29sbGVjdGlvblwiLCBmZWF0dXJlczogby5nZW9tZXRyaWVzLm1hcChmdW5jdGlvbihvKSB7IHJldHVybiBmZWF0dXJlJDEodG9wb2xvZ3ksIG8pOyB9KX1cbiAgICAgIDogZmVhdHVyZSQxKHRvcG9sb2d5LCBvKTtcbn07XG5cbmZ1bmN0aW9uIGZlYXR1cmUkMSh0b3BvbG9neSwgbykge1xuICB2YXIgaWQgPSBvLmlkLFxuICAgICAgYmJveCA9IG8uYmJveCxcbiAgICAgIHByb3BlcnRpZXMgPSBvLnByb3BlcnRpZXMgPT0gbnVsbCA/IHt9IDogby5wcm9wZXJ0aWVzLFxuICAgICAgZ2VvbWV0cnkgPSBvYmplY3QodG9wb2xvZ3ksIG8pO1xuICByZXR1cm4gaWQgPT0gbnVsbCAmJiBiYm94ID09IG51bGwgPyB7dHlwZTogXCJGZWF0dXJlXCIsIHByb3BlcnRpZXM6IHByb3BlcnRpZXMsIGdlb21ldHJ5OiBnZW9tZXRyeX1cbiAgICAgIDogYmJveCA9PSBudWxsID8ge3R5cGU6IFwiRmVhdHVyZVwiLCBpZDogaWQsIHByb3BlcnRpZXM6IHByb3BlcnRpZXMsIGdlb21ldHJ5OiBnZW9tZXRyeX1cbiAgICAgIDoge3R5cGU6IFwiRmVhdHVyZVwiLCBpZDogaWQsIGJib3g6IGJib3gsIHByb3BlcnRpZXM6IHByb3BlcnRpZXMsIGdlb21ldHJ5OiBnZW9tZXRyeX07XG59XG5cbmZ1bmN0aW9uIG9iamVjdCh0b3BvbG9neSwgbykge1xuICB2YXIgdHJhbnNmb3JtUG9pbnQgPSB0cmFuc2Zvcm0odG9wb2xvZ3kpLFxuICAgICAgYXJjcyA9IHRvcG9sb2d5LmFyY3M7XG5cbiAgZnVuY3Rpb24gYXJjKGksIHBvaW50cykge1xuICAgIGlmIChwb2ludHMubGVuZ3RoKSBwb2ludHMucG9wKCk7XG4gICAgZm9yICh2YXIgYSA9IGFyY3NbaSA8IDAgPyB+aSA6IGldLCBrID0gMCwgbiA9IGEubGVuZ3RoOyBrIDwgbjsgKytrKSB7XG4gICAgICBwb2ludHMucHVzaCh0cmFuc2Zvcm1Qb2ludChhW2tdLnNsaWNlKCksIGspKTtcbiAgICB9XG4gICAgaWYgKGkgPCAwKSByZXZlcnNlKHBvaW50cywgbik7XG4gIH1cblxuICBmdW5jdGlvbiBwb2ludChwKSB7XG4gICAgcmV0dXJuIHRyYW5zZm9ybVBvaW50KHAuc2xpY2UoKSk7XG4gIH1cblxuICBmdW5jdGlvbiBsaW5lKGFyY3MpIHtcbiAgICB2YXIgcG9pbnRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmNzLmxlbmd0aDsgaSA8IG47ICsraSkgYXJjKGFyY3NbaV0sIHBvaW50cyk7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPCAyKSBwb2ludHMucHVzaChwb2ludHNbMF0uc2xpY2UoKSk7XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJpbmcoYXJjcykge1xuICAgIHZhciBwb2ludHMgPSBsaW5lKGFyY3MpO1xuICAgIHdoaWxlIChwb2ludHMubGVuZ3RoIDwgNCkgcG9pbnRzLnB1c2gocG9pbnRzWzBdLnNsaWNlKCkpO1xuICAgIHJldHVybiBwb2ludHM7XG4gIH1cblxuICBmdW5jdGlvbiBwb2x5Z29uKGFyY3MpIHtcbiAgICByZXR1cm4gYXJjcy5tYXAocmluZyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZW9tZXRyeShvKSB7XG4gICAgdmFyIHR5cGUgPSBvLnR5cGUsIGNvb3JkaW5hdGVzO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIkdlb21ldHJ5Q29sbGVjdGlvblwiOiByZXR1cm4ge3R5cGU6IHR5cGUsIGdlb21ldHJpZXM6IG8uZ2VvbWV0cmllcy5tYXAoZ2VvbWV0cnkpfTtcbiAgICAgIGNhc2UgXCJQb2ludFwiOiBjb29yZGluYXRlcyA9IHBvaW50KG8uY29vcmRpbmF0ZXMpOyBicmVhaztcbiAgICAgIGNhc2UgXCJNdWx0aVBvaW50XCI6IGNvb3JkaW5hdGVzID0gby5jb29yZGluYXRlcy5tYXAocG9pbnQpOyBicmVhaztcbiAgICAgIGNhc2UgXCJMaW5lU3RyaW5nXCI6IGNvb3JkaW5hdGVzID0gbGluZShvLmFyY3MpOyBicmVhaztcbiAgICAgIGNhc2UgXCJNdWx0aUxpbmVTdHJpbmdcIjogY29vcmRpbmF0ZXMgPSBvLmFyY3MubWFwKGxpbmUpOyBicmVhaztcbiAgICAgIGNhc2UgXCJQb2x5Z29uXCI6IGNvb3JkaW5hdGVzID0gcG9seWdvbihvLmFyY3MpOyBicmVhaztcbiAgICAgIGNhc2UgXCJNdWx0aVBvbHlnb25cIjogY29vcmRpbmF0ZXMgPSBvLmFyY3MubWFwKHBvbHlnb24pOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge3R5cGU6IHR5cGUsIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc307XG4gIH1cblxuICByZXR1cm4gZ2VvbWV0cnkobyk7XG59XG5cbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBiYm94fSBmcm9tIFwiLi9zcmMvYmJveFwiO1xuXG4vLyBleHBvcnQge2RlZmF1bHQgYXMgbWVzaCwgbWVzaEFyY3N9IGZyb20gXCIuL3NyYy9tZXNoXCI7XG4vLyBleHBvcnQge2RlZmF1bHQgYXMgbWVyZ2UsIG1lcmdlQXJjc30gZnJvbSBcIi4vc3JjL21lcmdlXCI7XG4vLyBleHBvcnQge2RlZmF1bHQgYXMgbmVpZ2hib3JzfSBmcm9tIFwiLi9zcmMvbmVpZ2hib3JzXCI7XG4vLyBleHBvcnQge2RlZmF1bHQgYXMgcXVhbnRpemV9IGZyb20gXCIuL3NyYy9xdWFudGl6ZVwiO1xuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIHRyYW5zZm9ybX0gZnJvbSBcIi4vc3JjL3RyYW5zZm9ybVwiO1xuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIHVudHJhbnNmb3JtfSBmcm9tIFwiLi9zcmMvdW50cmFuc2Zvcm1cIjtcblxuZXhwb3J0cy5mZWF0dXJlID0gZmVhdHVyZTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxufSkpKTtcbiIsIm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWxheWVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZShwYmYsIGVuZCkge1xuICAgIHRoaXMubGF5ZXJzID0gcGJmLnJlYWRGaWVsZHMocmVhZFRpbGUsIHt9LCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkVGlsZSh0YWcsIGxheWVycywgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICB2YXIgbGF5ZXIgPSBuZXcgVmVjdG9yVGlsZUxheWVyKHBiZiwgcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MpO1xuICAgICAgICBpZiAobGF5ZXIubGVuZ3RoKSBsYXllcnNbbGF5ZXIubmFtZV0gPSBsYXllcjtcbiAgICB9XG59XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlRmVhdHVyZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUZlYXR1cmUocGJmLCBlbmQsIGV4dGVudCwga2V5cywgdmFsdWVzKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0ge307XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQ7XG4gICAgdGhpcy50eXBlID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fZ2VvbWV0cnkgPSAtMTtcbiAgICB0aGlzLl9rZXlzID0ga2V5cztcbiAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkRmVhdHVyZSwgdGhpcywgZW5kKTtcbn1cblxuZnVuY3Rpb24gcmVhZEZlYXR1cmUodGFnLCBmZWF0dXJlLCBwYmYpIHtcbiAgICBpZiAodGFnID09IDEpIGZlYXR1cmUuX2lkID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMikgcmVhZFRhZyhwYmYsIGZlYXR1cmUpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAzKSBmZWF0dXJlLnR5cGUgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSA0KSBmZWF0dXJlLl9nZW9tZXRyeSA9IHBiZi5wb3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWcocGJmLCBmZWF0dXJlKSB7XG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIGtleSA9IGZlYXR1cmUuX2tleXNbcGJmLnJlYWRWYXJpbnQoKV0sXG4gICAgICAgICAgICB2YWx1ZSA9IGZlYXR1cmUuX3ZhbHVlc1twYmYucmVhZFZhcmludCgpXTtcbiAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG59XG5cblZlY3RvclRpbGVGZWF0dXJlLnR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgbGluZXMgPSBbXSxcbiAgICAgICAgbGluZTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgY21kTGVuID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcbiAgICAgICAgICAgIGxlbmd0aCA9IGNtZExlbiA+PiAzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVuZ3RoLS07XG5cbiAgICAgICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcbiAgICAgICAgICAgIHggKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICB5ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuXG4gICAgICAgICAgICBpZiAoY21kID09PSAxKSB7IC8vIG1vdmVUb1xuICAgICAgICAgICAgICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGluZS5wdXNoKG5ldyBQb2ludCh4LCB5KSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgPT09IDcpIHtcbiAgICAgICAgICAgIGxpbmUucHVzaChsaW5lWzBdLmNsb25lKCkpOyAvLyBjbG9zZVBvbHlnb25cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcblxuICAgIHJldHVybiBsaW5lcztcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5iYm94ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgeDEgPSBJbmZpbml0eSxcbiAgICAgICAgeDIgPSAtSW5maW5pdHksXG4gICAgICAgIHkxID0gSW5maW5pdHksXG4gICAgICAgIHkyID0gLUluZmluaXR5O1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICBpZiAoeCA8IHgxKSB4MSA9IHg7XG4gICAgICAgICAgICBpZiAoeCA+IHgyKSB4MiA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IHkxKSB5MSA9IHk7XG4gICAgICAgICAgICBpZiAoeSA+IHkyKSB5MiA9IHk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgIT09IDcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml07XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICAgIHZhciBzaXplID0gdGhpcy5leHRlbnQgKiBNYXRoLnBvdygyLCB6KSxcbiAgICAgICAgeDAgPSB0aGlzLmV4dGVudCAqIHgsXG4gICAgICAgIHkwID0gdGhpcy5leHRlbnQgKiB5LFxuICAgICAgICBjb29yZHMgPSB0aGlzLmxvYWRHZW9tZXRyeSgpLFxuICAgICAgICB0eXBlID0gVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbdGhpcy50eXBlXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gY29vcmRzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBwID0gbGluZVtqXSwgeTIgPSAxODAgLSAocC55ICsgeTApICogMzYwIC8gc2l6ZTtcbiAgICAgICAgICAgIGxpbmVbal0gPSBbXG4gICAgICAgICAgICAgICAgKHAueCArIHgwKSAqIDM2MCAvIHNpemUgLSAxODAsXG4gICAgICAgICAgICAgICAgMzYwIC8gTWF0aC5QSSAqIE1hdGguYXRhbihNYXRoLmV4cCh5MiAqIE1hdGguUEkgLyAxODApKSAtIDkwXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgJiYgY29vcmRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb29yZHMgPSBjb29yZHNbMF1bMF07XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXTtcbiAgICAgICAgdHlwZSA9ICdNdWx0aVBvaW50JztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJyAmJiBjb29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICB0eXBlID0gJ011bHRpTGluZVN0cmluZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3Jkc1xuICAgICAgICB9LFxuICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXNcbiAgICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlZmVhdHVyZS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVMYXllcjtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUxheWVyKHBiZiwgZW5kKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy52ZXJzaW9uID0gMTtcbiAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgIHRoaXMuZXh0ZW50ID0gNDA5NjtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICB0aGlzLl9mZWF0dXJlcyA9IFtdO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZExheWVyLCB0aGlzLCBlbmQpO1xuXG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLl9mZWF0dXJlcy5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRMYXllcih0YWcsIGxheWVyLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxNSkgbGF5ZXIudmVyc2lvbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAxKSBsYXllci5uYW1lID0gcGJmLnJlYWRTdHJpbmcoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGxheWVyLmV4dGVudCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBsYXllci5fZmVhdHVyZXMucHVzaChwYmYucG9zKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDMpIGxheWVyLl9rZXlzLnB1c2gocGJmLnJlYWRTdHJpbmcoKSk7XG4gICAgZWxzZSBpZiAodGFnID09PSA0KSBsYXllci5fdmFsdWVzLnB1c2gocmVhZFZhbHVlTWVzc2FnZShwYmYpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhbHVlTWVzc2FnZShwYmYpIHtcbiAgICB2YXIgdmFsdWUgPSBudWxsLFxuICAgICAgICBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciB0YWcgPSBwYmYucmVhZFZhcmludCgpID4+IDM7XG5cbiAgICAgICAgdmFsdWUgPSB0YWcgPT09IDEgPyBwYmYucmVhZFN0cmluZygpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMiA/IHBiZi5yZWFkRmxvYXQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDMgPyBwYmYucmVhZERvdWJsZSgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNCA/IHBiZi5yZWFkVmFyaW50NjQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDUgPyBwYmYucmVhZFZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNiA/IHBiZi5yZWFkU1ZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNyA/IHBiZi5yZWFkQm9vbGVhbigpIDogbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIHJldHVybiBmZWF0dXJlIGBpYCBmcm9tIHRoaXMgbGF5ZXIgYXMgYSBgVmVjdG9yVGlsZUZlYXR1cmVgXG5WZWN0b3JUaWxlTGF5ZXIucHJvdG90eXBlLmZlYXR1cmUgPSBmdW5jdGlvbihpKSB7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2ZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kcycpO1xuXG4gICAgdGhpcy5fcGJmLnBvcyA9IHRoaXMuX2ZlYXR1cmVzW2ldO1xuXG4gICAgdmFyIGVuZCA9IHRoaXMuX3BiZi5yZWFkVmFyaW50KCkgKyB0aGlzLl9wYmYucG9zO1xuICAgIHJldHVybiBuZXcgVmVjdG9yVGlsZUZlYXR1cmUodGhpcy5fcGJmLCBlbmQsIHRoaXMuZXh0ZW50LCB0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQb2ludDtcblxuZnVuY3Rpb24gUG9pbnQoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbn1cblxuUG9pbnQucHJvdG90eXBlID0ge1xuICAgIGNsb25lOiBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBQb2ludCh0aGlzLngsIHRoaXMueSk7IH0sXG5cbiAgICBhZGQ6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2FkZChwKTsgICAgIH0sXG4gICAgc3ViOiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9zdWIocCk7ICAgICB9LFxuICAgIG11bHQ6ICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdChrKTsgICAgfSxcbiAgICBkaXY6ICAgICBmdW5jdGlvbihrKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2RpdihrKTsgICAgIH0sXG4gICAgcm90YXRlOiAgZnVuY3Rpb24oYSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUoYSk7ICB9LFxuICAgIG1hdE11bHQ6IGZ1bmN0aW9uKG0pIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbWF0TXVsdChtKTsgfSxcbiAgICB1bml0OiAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fdW5pdCgpOyB9LFxuICAgIHBlcnA6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCk7IH0sXG4gICAgcm91bmQ6ICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCk7IH0sXG5cbiAgICBtYWc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSk7XG4gICAgfSxcblxuICAgIGVxdWFsczogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gdGhpcy54ID09PSBwLnggJiZcbiAgICAgICAgICAgICAgIHRoaXMueSA9PT0gcC55O1xuICAgIH0sXG5cbiAgICBkaXN0OiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHApKTtcbiAgICB9LFxuXG4gICAgZGlzdFNxcjogZnVuY3Rpb24ocCkge1xuICAgICAgICB2YXIgZHggPSBwLnggLSB0aGlzLngsXG4gICAgICAgICAgICBkeSA9IHAueSAtIHRoaXMueTtcbiAgICAgICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuICAgIH0sXG5cbiAgICBhbmdsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSwgdGhpcy54KTtcbiAgICB9LFxuXG4gICAgYW5nbGVUbzogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnkgLSBiLnksIHRoaXMueCAtIGIueCk7XG4gICAgfSxcblxuICAgIGFuZ2xlV2l0aDogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmdsZVdpdGhTZXAoYi54LCBiLnkpO1xuICAgIH0sXG5cbiAgICAvLyBGaW5kIHRoZSBhbmdsZSBvZiB0aGUgdHdvIHZlY3RvcnMsIHNvbHZpbmcgdGhlIGZvcm11bGEgZm9yIHRoZSBjcm9zcyBwcm9kdWN0IGEgeCBiID0gfGF8fGJ8c2luKM64KSBmb3IgzrguXG4gICAgYW5nbGVXaXRoU2VwOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKFxuICAgICAgICAgICAgdGhpcy54ICogeSAtIHRoaXMueSAqIHgsXG4gICAgICAgICAgICB0aGlzLnggKiB4ICsgdGhpcy55ICogeSk7XG4gICAgfSxcblxuICAgIF9tYXRNdWx0OiBmdW5jdGlvbihtKSB7XG4gICAgICAgIHZhciB4ID0gbVswXSAqIHRoaXMueCArIG1bMV0gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gbVsyXSAqIHRoaXMueCArIG1bM10gKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfYWRkOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCArPSBwLng7XG4gICAgICAgIHRoaXMueSArPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfc3ViOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCAtPSBwLng7XG4gICAgICAgIHRoaXMueSAtPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfbXVsdDogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggKj0gaztcbiAgICAgICAgdGhpcy55ICo9IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfZGl2OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAvPSBrO1xuICAgICAgICB0aGlzLnkgLz0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF91bml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fZGl2KHRoaXMubWFnKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3BlcnA6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgeSA9IHRoaXMueTtcbiAgICAgICAgdGhpcy55ID0gdGhpcy54O1xuICAgICAgICB0aGlzLnggPSAteTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3RhdGU6IGZ1bmN0aW9uKGFuZ2xlKSB7XG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICB4ID0gY29zICogdGhpcy54IC0gc2luICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IHNpbiAqIHRoaXMueCArIGNvcyAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3VuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMueCA9IE1hdGgucm91bmQodGhpcy54KTtcbiAgICAgICAgdGhpcy55ID0gTWF0aC5yb3VuZCh0aGlzLnkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RzIFBvaW50IGZyb20gYW4gYXJyYXkgaWYgbmVjZXNzYXJ5XG5Qb2ludC5jb252ZXJ0ID0gZnVuY3Rpb24gKGEpIHtcbiAgICBpZiAoYSBpbnN0YW5jZW9mIFBvaW50KSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KGFbMF0sIGFbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbn07XG4iLCIvLyBHZW9tZXRyeSBidWlsZGluZyBmdW5jdGlvbnNcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuZXhwb3J0IGNvbnN0IHRpbGVfYm91bmRzID0gW1xuICAgIHsgeDogMCwgeTogMH0sXG4gICAgeyB4OiBHZW8udGlsZV9zY2FsZSwgeTogLUdlby50aWxlX3NjYWxlIH0gLy8gVE9ETzogY29ycmVjdCBmb3IgZmxpcHBlZCB5LWF4aXM/XG5dO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdF91dnMgPSBbMCwgMCwgMSwgMV07XG5cbi8vIFRlc3RzIGlmIGEgbGluZSBzZWdtZW50IChmcm9tIHBvaW50IEEgdG8gQikgaXMgb3V0c2lkZSB0aGUgdGlsZSBib3VuZHNcbi8vICh3aXRoaW4gYSBjZXJ0YWluIHRvbGVyYW5jZSB0byBhY2NvdW50IGZvciBnZW9tZXRyeSBuZWFybHkgb24gdGlsZSBlZGdlcylcbmV4cG9ydCBmdW5jdGlvbiBvdXRzaWRlVGlsZSAoX2EsIF9iLCB0b2xlcmFuY2UpIHtcbiAgICBsZXQgdGlsZV9taW4gPSB0aWxlX2JvdW5kc1swXTtcbiAgICBsZXQgdGlsZV9tYXggPSB0aWxlX2JvdW5kc1sxXTtcblxuICAgIC8vIFRPRE86IGZpeCBmbGlwcGVkIFkgY29vcmRzIGhlcmUsIGNvbmZ1c2luZyB3aXRoICdtYXgnIHJlZmVyZW5jZVxuICAgIGlmICgoX2FbMF0gPD0gdGlsZV9taW4ueCArIHRvbGVyYW5jZSAmJiBfYlswXSA8PSB0aWxlX21pbi54ICsgdG9sZXJhbmNlKSB8fFxuICAgICAgICAoX2FbMF0gPj0gdGlsZV9tYXgueCAtIHRvbGVyYW5jZSAmJiBfYlswXSA+PSB0aWxlX21heC54IC0gdG9sZXJhbmNlKSB8fFxuICAgICAgICAoX2FbMV0gPj0gdGlsZV9taW4ueSAtIHRvbGVyYW5jZSAmJiBfYlsxXSA+PSB0aWxlX21pbi55IC0gdG9sZXJhbmNlKSB8fFxuICAgICAgICAoX2FbMV0gPD0gdGlsZV9tYXgueSArIHRvbGVyYW5jZSAmJiBfYlsxXSA8PSB0aWxlX21heC55ICsgdG9sZXJhbmNlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Nvb3JkT3V0c2lkZVRpbGUgKGNvb3JkLCB0b2xlcmFuY2UpIHtcbiAgICB0b2xlcmFuY2UgPSB0b2xlcmFuY2UgfHwgMDtcbiAgICBsZXQgdGlsZV9taW4gPSB0aWxlX2JvdW5kc1swXTtcbiAgICBsZXQgdGlsZV9tYXggPSB0aWxlX2JvdW5kc1sxXTtcblxuICAgIHJldHVybiBjb29yZFswXSA8PSB0aWxlX21pbi54ICsgdG9sZXJhbmNlIHx8XG4gICAgICAgICAgIGNvb3JkWzBdID49IHRpbGVfbWF4LnggLSB0b2xlcmFuY2UgfHxcbiAgICAgICAgICAgY29vcmRbMV0gPj0gdGlsZV9taW4ueSAtIHRvbGVyYW5jZSB8fFxuICAgICAgICAgICBjb29yZFsxXSA8PSB0aWxlX21heC55ICsgdG9sZXJhbmNlO1xufVxuIiwiLy8gUG9pbnQgYnVpbGRlcnNcbmltcG9ydCB7IGRlZmF1bHRfdXZzIH0gZnJvbSAnLi9jb21tb24nO1xuXG4vLyBCdWlsZCBhIGJpbGxib2FyZCBzcHJpdGUgcXVhZCBjZW50ZXJlZCBvbiBhIHBvaW50LiBTcHJpdGVzIGFyZSBpbnRlbmRlZCB0byBiZSBkcmF3biBpbiBzY3JlZW5zcGFjZSwgYW5kIGhhdmVcbi8vIHByb3BlcnRpZXMgZm9yIHdpZHRoLCBoZWlnaHQsIGFuZ2xlLCBhbmQgYSBzY2FsZSBmYWN0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcnBvbGF0ZSB0aGUgc2NyZWVuc3BhY2Ugc2l6ZVxuLy8gb2YgYSBzcHJpdGUgYmV0d2VlbiB0d28gem9vbSBsZXZlbHMuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRRdWFkc0ZvclBvaW50cyAocG9pbnRzLCB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgIHsgdGV4Y29vcmRfaW5kZXgsIHBvc2l0aW9uX2luZGV4LCBzaGFwZV9pbmRleCwgb2Zmc2V0X2luZGV4IH0sXG4gICAgeyBxdWFkLCBxdWFkX25vcm1hbGl6ZSwgb2Zmc2V0LCBhbmdsZSwgc2hhcGVfdywgdGV4Y29vcmRfc2NhbGUsIHRleGNvb3JkX25vcm1hbGl6ZSB9KSB7XG4gICAgcXVhZF9ub3JtYWxpemUgPSBxdWFkX25vcm1hbGl6ZSB8fCAxO1xuICAgIGxldCB3MiA9IHF1YWRbMF0gLyAyICogcXVhZF9ub3JtYWxpemU7XG4gICAgbGV0IGgyID0gcXVhZFsxXSAvIDIgKiBxdWFkX25vcm1hbGl6ZTtcbiAgICBsZXQgc2NhbGluZyA9IFtcbiAgICAgICAgWy13MiwgLWgyXSxcbiAgICAgICAgW3cyLCAtaDJdLFxuICAgICAgICBbdzIsIGgyXSxcbiAgICAgICAgWy13MiwgaDJdXG4gICAgXTtcblxuICAgIGxldCB2ZXJ0ZXhfZWxlbWVudHMgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG4gICAgbGV0IGVsZW1lbnRfb2Zmc2V0ID0gdmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuXG4gICAgbGV0IHRleGNvb3JkcztcbiAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplID0gdGV4Y29vcmRfbm9ybWFsaXplIHx8IDE7XG5cbiAgICAgICAgdmFyIFttaW5fdSwgbWluX3YsIG1heF91LCBtYXhfdl0gPSB0ZXhjb29yZF9zY2FsZSB8fCBkZWZhdWx0X3V2cztcbiAgICAgICAgdGV4Y29vcmRzID0gW1xuICAgICAgICAgICAgW21pbl91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1pbl92XSxcbiAgICAgICAgICAgIFttYXhfdSwgbWF4X3ZdLFxuICAgICAgICAgICAgW21pbl91LCBtYXhfdl1cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBsZXQgbnVtX3BvaW50cyA9IHBvaW50cy5sZW5ndGg7XG4gICAgZm9yIChsZXQgcD0wOyBwIDwgbnVtX3BvaW50czsgcCsrKSB7XG4gICAgICAgIGxldCBwb2ludCA9IHBvaW50c1twXTtcblxuICAgICAgICBmb3IgKGxldCBwb3M9MDsgcG9zIDwgNDsgcG9zKyspIHtcbiAgICAgICAgICAgIC8vIEFkZCB0ZXhjb29yZHNcbiAgICAgICAgICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDBdID0gdGV4Y29vcmRzW3Bvc11bMF0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMV0gPSB0ZXhjb29yZHNbcG9zXVsxXSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3Bvc2l0aW9uX2luZGV4ICsgMF0gPSBwb2ludFswXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtwb3NpdGlvbl9pbmRleCArIDFdID0gcG9pbnRbMV07XG5cbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDBdID0gc2NhbGluZ1twb3NdWzBdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3NoYXBlX2luZGV4ICsgMV0gPSBzY2FsaW5nW3Bvc11bMV07XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAyXSA9IGFuZ2xlO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3NoYXBlX2luZGV4ICsgM10gPSBzaGFwZV93O1xuXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbb2Zmc2V0X2luZGV4ICsgMF0gPSBvZmZzZXRbMF07XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbb2Zmc2V0X2luZGV4ICsgMV0gPSBvZmZzZXRbMV07XG5cbiAgICAgICAgICAgIHZlcnRleF9kYXRhLmFkZFZlcnRleCh2ZXJ0ZXhfdGVtcGxhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAwKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAxKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAyKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAyKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAzKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAwKTtcblxuICAgICAgICBlbGVtZW50X29mZnNldCArPSA0O1xuICAgIH1cbn1cbiIsIi8vIFBvbHlnb24gYnVpbGRlcnNcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi4vdmVjdG9yJztcbmltcG9ydCB7IGRlZmF1bHRfdXZzLCBvdXRzaWRlVGlsZSB9IGZyb20gJy4vY29tbW9uJztcblxuaW1wb3J0IGVhcmN1dCBmcm9tICdlYXJjdXQnO1xuXG5jb25zdCB1cF92ZWMzID0gWzAsIDAsIDFdO1xuXG4vLyBUZXNzZWxhdGUgYSBmbGF0IDJEIHBvbHlnb25cbi8vIHggJiB5IGNvb3JkaW5hdGVzIHdpbGwgYmUgc2V0IGFzIGZpcnN0IHR3byBlbGVtZW50cyBvZiBwcm92aWRlZCB2ZXJ0ZXhfdGVtcGxhdGVcbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvbHlnb25zIChcbiAgICBwb2x5Z29ucyxcbiAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgIHsgdGV4Y29vcmRfaW5kZXgsIHRleGNvb3JkX3NjYWxlLCB0ZXhjb29yZF9ub3JtYWxpemUgfSkge1xuXG4gICAgdmFyIHZlcnRleF9lbGVtZW50cyA9IHZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcblxuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgMTtcbiAgICAgICAgdmFyIFttaW5fdSwgbWluX3YsIG1heF91LCBtYXhfdl0gPSB0ZXhjb29yZF9zY2FsZSB8fCBkZWZhdWx0X3V2cztcbiAgICB9XG5cbiAgICB2YXIgbnVtX3BvbHlnb25zID0gcG9seWdvbnMubGVuZ3RoO1xuICAgIGZvciAodmFyIHA9MDsgcCA8IG51bV9wb2x5Z29uczsgcCsrKSB7XG4gICAgICAgIHZhciBlbGVtZW50X29mZnNldCA9IHZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgICAgICB2YXIgcG9seWdvbiA9IHBvbHlnb25zW3BdO1xuXG4gICAgICAgIC8vIEZpbmQgcG9seWdvbiBleHRlbnRzIHRvIGNhbGN1bGF0ZSBVVnMsIGZpdCB0aGVtIHRvIHRoZSBheGlzLWFsaWduZWQgYm91bmRpbmcgYm94XG4gICAgICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICAgICAgdmFyIFttaW5feCwgbWluX3ksIG1heF94LCBtYXhfeV0gPSBHZW8uZmluZEJvdW5kaW5nQm94KHBvbHlnb24pO1xuICAgICAgICAgICAgdmFyIHNwYW5feCA9IG1heF94IC0gbWluX3g7XG4gICAgICAgICAgICB2YXIgc3Bhbl95ID0gbWF4X3kgLSBtaW5feTtcbiAgICAgICAgICAgIHZhciBzY2FsZV91ID0gKG1heF91IC0gbWluX3UpIC8gc3Bhbl94O1xuICAgICAgICAgICAgdmFyIHNjYWxlX3YgPSAobWF4X3YgLSBtaW5fdikgLyBzcGFuX3k7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciByaW5nX2luZGV4ID0gMDsgcmluZ19pbmRleCA8IHBvbHlnb24ubGVuZ3RoOyByaW5nX2luZGV4Kyspe1xuICAgICAgICAgICAgLy8gQWRkIHZlcnRleCBkYXRhXG4gICAgICAgICAgICB2YXIgcG9seWdvbl9yaW5nID0gcG9seWdvbltyaW5nX2luZGV4XTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbl9yaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZlcnRleCA9IHBvbHlnb25fcmluZ1tpXTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMF0gPSB2ZXJ0ZXhbMF07XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzFdID0gdmVydGV4WzFdO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIFVWc1xuICAgICAgICAgICAgICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAwXSA9ICgodmVydGV4WzBdIC0gbWluX3gpICogc2NhbGVfdSArIG1pbl91KSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMV0gPSAoKHZlcnRleFsxXSAtIG1pbl95KSAqIHNjYWxlX3YgKyBtaW5fdikgKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEuYWRkVmVydGV4KHZlcnRleF90ZW1wbGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgZWxlbWVudCBpbmRpY2VzXG4gICAgICAgIHZhciBpbmRpY2VzID0gdHJpYW5ndWxhdGVQb2x5Z29uKGVhcmN1dC5mbGF0dGVuKHBvbHlnb24pKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgaW5kaWNlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIFRlc3NlbGF0ZSBhbmQgZXh0cnVkZSBhIGZsYXQgMkQgcG9seWdvbiBpbnRvIGEgc2ltcGxlIDNEIG1vZGVsIHdpdGggZml4ZWQgaGVpZ2h0IGFuZCBhZGQgdG8gR0wgdmVydGV4IGJ1ZmZlclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXh0cnVkZWRQb2x5Z29ucyAoXG4gICAgcG9seWdvbnMsXG4gICAgeiwgaGVpZ2h0LCBtaW5faGVpZ2h0LFxuICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgbm9ybWFsX2luZGV4LFxuICAgIG5vcm1hbF9ub3JtYWxpemUsXG4gICAge1xuICAgICAgICByZW1vdmVfdGlsZV9lZGdlcyxcbiAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZSxcbiAgICAgICAgdGV4Y29vcmRfaW5kZXgsXG4gICAgICAgIHRleGNvb3JkX3NjYWxlLFxuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUsXG4gICAgICAgIHdpbmRpbmdcbiAgICB9KSB7XG5cbiAgICAvLyBUb3BcbiAgICB2YXIgbWluX3ogPSB6ICsgKG1pbl9oZWlnaHQgfHwgMCk7XG4gICAgdmFyIG1heF96ID0geiArIGhlaWdodDtcbiAgICB2ZXJ0ZXhfdGVtcGxhdGVbMl0gPSBtYXhfejtcbiAgICBidWlsZFBvbHlnb25zKHBvbHlnb25zLCB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLCB7IHRleGNvb3JkX2luZGV4LCB0ZXhjb29yZF9zY2FsZSwgdGV4Y29vcmRfbm9ybWFsaXplIH0pO1xuXG4gICAgdmFyIHZlcnRleF9lbGVtZW50cyA9IHZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcbiAgICB2YXIgZWxlbWVudF9vZmZzZXQgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICAvLyBXYWxsc1xuICAgIC8vIEZpdCBVVnMgdG8gd2FsbCBxdWFkXG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCAxO1xuICAgICAgICB2YXIgW21pbl91LCBtaW5fdiwgbWF4X3UsIG1heF92XSA9IHRleGNvb3JkX3NjYWxlIHx8IGRlZmF1bHRfdXZzO1xuICAgICAgICB2YXIgdGV4Y29vcmRzID0gW1xuICAgICAgICAgICAgW21pbl91LCBtYXhfdl0sXG4gICAgICAgICAgICBbbWluX3UsIG1pbl92XSxcbiAgICAgICAgICAgIFttYXhfdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtYXhfdl1cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICB2YXIgbnVtX3BvbHlnb25zID0gcG9seWdvbnMubGVuZ3RoO1xuICAgIGZvciAodmFyIHA9MDsgcCA8IG51bV9wb2x5Z29uczsgcCsrKSB7XG4gICAgICAgIHZhciBwb2x5Z29uID0gcG9seWdvbnNbcF07XG5cbiAgICAgICAgZm9yICh2YXIgcT0wOyBxIDwgcG9seWdvbi5sZW5ndGg7IHErKykge1xuICAgICAgICAgICAgdmFyIGNvbnRvdXIgPSBwb2x5Z29uW3FdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciB3PTA7IHcgPCBjb250b3VyLmxlbmd0aCAtIDE7IHcrKykge1xuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVfdGlsZV9lZGdlcyAmJiBvdXRzaWRlVGlsZShjb250b3VyW3ddLCBjb250b3VyW3crMV0sIHRpbGVfZWRnZV90b2xlcmFuY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBkb24ndCBleHRydWRlIHRpbGUgZWRnZXNcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBXYWxsIG9yZGVyIGlzIGRlcGVuZGVudCBvbiB3aW5kaW5nIG9yZGVyLCBzbyB0aGF0IG5vcm1hbHMgZmFjZSBvdXR3YXJkXG4gICAgICAgICAgICAgICAgbGV0IHcwLCB3MTtcbiAgICAgICAgICAgICAgICBpZiAod2luZGluZyA9PT0gJ0NDVycpIHtcbiAgICAgICAgICAgICAgICAgICAgdzAgPSB3O1xuICAgICAgICAgICAgICAgICAgICB3MSA9IHcrMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHcwID0gdysxO1xuICAgICAgICAgICAgICAgICAgICB3MSA9IHc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVHdvIHRyaWFuZ2xlcyBmb3IgdGhlIHF1YWQgZm9ybWVkIGJ5IGVhY2ggdmVydGV4IHBhaXIsIGdvaW5nIGZyb20gYm90dG9tIHRvIHRvcCBoZWlnaHRcbiAgICAgICAgICAgICAgICB2YXIgd2FsbF92ZXJ0aWNlcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRvdXJbdzFdWzBdLCBjb250b3VyW3cxXVsxXSwgbWF4X3pdLFxuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MV1bMF0sIGNvbnRvdXJbdzFdWzFdLCBtaW5fel0sXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cwXVswXSwgY29udG91clt3MF1bMV0sIG1pbl96XSxcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRvdXJbdzBdWzBdLCBjb250b3VyW3cwXVsxXSwgbWF4X3pdXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIC8vIENhbGMgdGhlIG5vcm1hbCBvZiB0aGUgd2FsbCBmcm9tIHVwIHZlY3RvciBhbmQgb25lIHNlZ21lbnQgb2YgdGhlIHdhbGwgdHJpYW5nbGVzXG4gICAgICAgICAgICAgICAgbGV0IHdhbGxfdmVjID0gVmVjdG9yLm5vcm1hbGl6ZShbY29udG91clt3MV1bMF0gLSBjb250b3VyW3cwXVswXSwgY29udG91clt3MV1bMV0gLSBjb250b3VyW3cwXVsxXSwgMF0pO1xuICAgICAgICAgICAgICAgIGxldCBub3JtYWwgPSBWZWN0b3IuY3Jvc3ModXBfdmVjMywgd2FsbF92ZWMpO1xuXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHZlcnRleCB0ZW1wbGF0ZSB3aXRoIGN1cnJlbnQgc3VyZmFjZSBub3JtYWxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbbm9ybWFsX2luZGV4ICsgMF0gPSBub3JtYWxbMF0gKiBub3JtYWxfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtub3JtYWxfaW5kZXggKyAxXSA9IG5vcm1hbFsxXSAqIG5vcm1hbF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW25vcm1hbF9pbmRleCArIDJdID0gbm9ybWFsWzJdICogbm9ybWFsX25vcm1hbGl6ZTtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIHd2PTA7IHd2IDwgd2FsbF92ZXJ0aWNlcy5sZW5ndGg7IHd2KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzBdID0gd2FsbF92ZXJ0aWNlc1t3dl1bMF07XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVsxXSA9IHdhbGxfdmVydGljZXNbd3ZdWzFdO1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMl0gPSB3YWxsX3ZlcnRpY2VzW3d2XVsyXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDBdID0gdGV4Y29vcmRzW3d2XVswXSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDFdID0gdGV4Y29vcmRzW3d2XVsxXSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLmFkZFZlcnRleCh2ZXJ0ZXhfdGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAxKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAzKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuXG4gICAgICAgICAgICAgICAgZWxlbWVudF9vZmZzZXQgKz0gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gVHJpYW5ndWxhdGlvbiB1c2luZyBlYXJjdXRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvZWFyY3V0XG5leHBvcnQgZnVuY3Rpb24gdHJpYW5ndWxhdGVQb2x5Z29uIChkYXRhKSB7XG4gICAgcmV0dXJuIGVhcmN1dChkYXRhLnZlcnRpY2VzLCBkYXRhLmhvbGVzLCBkYXRhLmRpbWVuc2lvbnMpO1xufVxuIiwiLy8gR2VvbWV0cnkgYnVpbGRpbmcgZnVuY3Rpb25zXG5cbmltcG9ydCBWZWN0b3IgZnJvbSAnLi4vdmVjdG9yJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCB7b3V0c2lkZVRpbGUsIGlzQ29vcmRPdXRzaWRlVGlsZX0gZnJvbSAnLi9jb21tb24nO1xuXG5jb25zdCB6ZXJvX3ZlYzIgPSBbMCwgMF07XG5cbi8vIEJ1aWxkIHRlc3NlbGxhdGVkIHRyaWFuZ2xlcyBmb3IgYSBwb2x5bGluZVxuY29uc3QgQ0FQX1RZUEUgPSB7XG4gICAgYnV0dDogMCxcbiAgICBzcXVhcmU6IDEsXG4gICAgcm91bmQ6IDJcbn07XG5cbmNvbnN0IEpPSU5fVFlQRSA9IHtcbiAgICBtaXRlcjogMCxcbiAgICBiZXZlbDogMSxcbiAgICByb3VuZDogMlxufTtcblxuY29uc3QgREVGQVVMVCA9IHtcbiAgICBNSVRFUl9MSU1JVDogMyxcbiAgICBURVhDT09SRF9OT1JNQUxJWkU6IDEsXG4gICAgVEVYQ09PUkRfUkFUSU86IDEsXG4gICAgTUlOX0ZBTl9XSURUSDogNSAgICAgICAgLy8gV2lkdGggb2YgbGluZSBpbiB0aWxlIHVuaXRzIHRvIHBsYWNlIDEgdHJpYW5nbGUgcGVyIGZhblxufTtcblxuLy8gU2NhbGluZyBmYWN0b3IgdG8gYWRkIHByZWNpc2lvbiB0byBsaW5lIHRleHR1cmUgViBjb29yZGluYXRlIHBhY2tlZCBhcyBub3JtYWxpemVkIHNob3J0XG5jb25zdCB2X3NjYWxlX2FkanVzdCA9IEdlby50aWxlX3NjYWxlO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2x5bGluZXMgKGxpbmVzLCB3aWR0aCwgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICB7XG4gICAgICAgIGNsb3NlZF9wb2x5Z29uLFxuICAgICAgICByZW1vdmVfdGlsZV9lZGdlcyxcbiAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZSxcbiAgICAgICAgdGV4Y29vcmRfaW5kZXgsXG4gICAgICAgIHRleGNvb3JkX3NjYWxlLFxuICAgICAgICB0ZXhjb29yZF93aWR0aCxcbiAgICAgICAgdGV4Y29vcmRfcmF0aW8sXG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSxcbiAgICAgICAgc2NhbGluZ19pbmRleCxcbiAgICAgICAgc2NhbGluZ19ub3JtYWxpemUsXG4gICAgICAgIGpvaW4sIGNhcCxcbiAgICAgICAgbWl0ZXJfbGltaXRcbiAgICB9KSB7XG5cbiAgICB2YXIgY2FwX3R5cGUgPSBjYXAgPyBDQVBfVFlQRVtjYXBdIDogQ0FQX1RZUEUuYnV0dDtcbiAgICB2YXIgam9pbl90eXBlID0gam9pbiA/IEpPSU5fVFlQRVtqb2luXSA6IEpPSU5fVFlQRS5taXRlcjtcblxuICAgIC8vIENvbmZpZ3VyZSBtaXRlciBsaW1pdFxuICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICBtaXRlcl9saW1pdCA9IG1pdGVyX2xpbWl0IHx8IERFRkFVTFQuTUlURVJfTElNSVQ7IC8vIGRlZmF1bHQgbWl0ZXIgbGltaXRcbiAgICAgICAgdmFyIG1pdGVyX2xlbl9zcSA9IG1pdGVyX2xpbWl0ICogbWl0ZXJfbGltaXQ7XG4gICAgfVxuXG4gICAgLy8gVGV4dHVyZSBWYXJpYWJsZXNcbiAgICB2YXIgdl9zY2FsZTtcbiAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplID0gdGV4Y29vcmRfbm9ybWFsaXplIHx8IERFRkFVTFQuVEVYQ09PUkRfTk9STUFMSVpFO1xuICAgICAgICB0ZXhjb29yZF9yYXRpbyA9IHRleGNvb3JkX3JhdGlvIHx8IERFRkFVTFQuVEVYQ09PUkRfUkFUSU87XG4gICAgICAgIHZfc2NhbGUgPSAxIC8gKHRleGNvb3JkX3dpZHRoICogdGV4Y29vcmRfcmF0aW8gKiB2X3NjYWxlX2FkanVzdCk7IC8vIHNjYWxlcyBsaW5lIHRleHR1cmUgYXMgYSByYXRpbyBvZiB0aGUgbGluZSdzIHdpZHRoXG4gICAgfVxuXG4gICAgLy8gVmFsdWVzIHRoYXQgYXJlIGNvbnN0YW50IGZvciBlYWNoIGxpbmUgYW5kIGFyZSBwYXNzZWQgdG8gaGVscGVyIGZ1bmN0aW9uc1xuICAgIHZhciBjb250ZXh0ID0ge1xuICAgICAgICBjbG9zZWRfcG9seWdvbixcbiAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2UsXG4gICAgICAgIG1pdGVyX2xlbl9zcSxcbiAgICAgICAgam9pbl90eXBlLFxuICAgICAgICBjYXBfdHlwZSxcbiAgICAgICAgdmVydGV4X2RhdGEsXG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgaGFsZl93aWR0aDogd2lkdGggLyAyLFxuICAgICAgICBzY2FsaW5nX2luZGV4LFxuICAgICAgICBzY2FsaW5nX25vcm1hbGl6ZSxcbiAgICAgICAgdl9zY2FsZSxcbiAgICAgICAgdGV4Y29vcmRfaW5kZXgsXG4gICAgICAgIHRleGNvb3JkX3dpZHRoLFxuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemVcbiAgICB9O1xuXG4gICAgLy8gQnVmZmVyIGZvciBleHRyYSBsaW5lcyB0byBwcm9jZXNzXG4gICAgdmFyIGV4dHJhX2xpbmVzID0gW107XG5cbiAgICAvLyBQcm9jZXNzIGxpbmVzXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBidWlsZFBvbHlsaW5lKGxpbmVzW2luZGV4XSwgY29udGV4dCwgZXh0cmFfbGluZXMpO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgZXh0cmEgbGluZXNcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXh0cmFfbGluZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGJ1aWxkUG9seWxpbmUoZXh0cmFfbGluZXNbaW5kZXhdLCBjb250ZXh0LCBleHRyYV9saW5lcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBvbHlsaW5lKGxpbmUsIGNvbnRleHQsIGV4dHJhX2xpbmVzKXtcbiAgICAvLyBTa2lwIGlmIGxpbmUgaXMgbm90IHZhbGlkXG4gICAgaWYgKGxpbmUubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHtqb2luX3R5cGUsIGNhcF90eXBlLCBjbG9zZWRfcG9seWdvbiwgcmVtb3ZlX3RpbGVfZWRnZXMsIHRpbGVfZWRnZV90b2xlcmFuY2UsIHZfc2NhbGUsIG1pdGVyX2xlbl9zcX0gPSBjb250ZXh0O1xuXG4gICAgLy8gTG9vcCBiYWNrd2FyZHMgdGhyb3VnaCBsaW5lIHRvIGEgdGlsZSBib3VuZGFyeSBpZiBmb3VuZFxuICAgIGlmIChjbG9zZWRfcG9seWdvbiAmJiBqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICB2YXIgYm91bmRhcnlJbmRleCA9IGdldFRpbGVCb3VuZGFyeUluZGV4KGxpbmUpO1xuICAgICAgICBpZiAoYm91bmRhcnlJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBsaW5lIHRoYXQgaXMgYSBjeWNsaWMgcGVybXV0YXRpb24gb2YgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICB2YXIgcGVybXV0ZWRMaW5lID0gcGVybXV0ZUxpbmUobGluZSwgYm91bmRhcnlJbmRleCk7XG4gICAgICAgICAgICBleHRyYV9saW5lcy5wdXNoKHBlcm11dGVkTGluZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY29vcmRDdXJyLCBjb29yZE5leHQsIG5vcm1QcmV2LCBub3JtTmV4dDtcbiAgICB2YXIgdiA9IDA7IC8vIFRleHR1cmUgdi1jb29yZGluYXRlXG5cbiAgICB2YXIgaW5kZXhfc3RhcnQgPSAwO1xuICAgIHZhciBpbmRleF9lbmQgPSBsaW5lLmxlbmd0aCAtIDE7XG4gICAgdmFyIGlnbm9yZWRfaW5kaWNlc19jb3VudCA9IDA7XG5cbiAgICAvLyBGSVJTVCBQT0lOVFxuICAgIC8vIGxvb3AgdGhyb3VnaCBiZWdpbm5pbmcgcG9pbnRzIGlmIGR1cGxpY2F0ZXNcbiAgICBjb29yZEN1cnIgPSBsaW5lW2luZGV4X3N0YXJ0XTtcbiAgICBjb29yZE5leHQgPSBsaW5lW2luZGV4X3N0YXJ0ICsgMV07XG4gICAgd2hpbGUgKFZlY3Rvci5pc0VxdWFsKGNvb3JkQ3VyciwgY29vcmROZXh0KSkge1xuICAgICAgICBpbmRleF9zdGFydCsrO1xuICAgICAgICBjb29yZEN1cnIgPSBjb29yZE5leHQ7XG4gICAgICAgIGNvb3JkTmV4dCA9IGxpbmVbaW5kZXhfc3RhcnQgKyAxXTtcbiAgICAgICAgaWdub3JlZF9pbmRpY2VzX2NvdW50Kys7XG4gICAgICAgIGlmIChpbmRleF9zdGFydCA9PT0gbGluZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBsb29wIHRocm91Z2ggZW5kaW5nIHBvaW50cyB0byBjaGVjayBmb3IgZHVwbGljYXRlc1xuICAgIHdoaWxlIChWZWN0b3IuaXNFcXVhbChsaW5lW2luZGV4X2VuZF0sIGxpbmVbaW5kZXhfZW5kIC0gMV0pKSB7XG4gICAgICAgIGluZGV4X2VuZC0tO1xuICAgICAgICBpZ25vcmVkX2luZGljZXNfY291bnQrKztcbiAgICAgICAgaWYgKGluZGV4X2VuZCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxpbmUubGVuZ3RoIDwgMiArIGlnbm9yZWRfaW5kaWNlc19jb3VudCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9ybU5leHQgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5wZXJwKGNvb3JkQ3VyciwgY29vcmROZXh0KSk7XG5cbiAgICAvLyBTa2lwIHRpbGUgYm91bmRhcnkgbGluZXMgYW5kIGFwcGVuZCBhIG5ldyBsaW5lIGlmIG5lZWRlZFxuICAgIGlmIChyZW1vdmVfdGlsZV9lZGdlcyAmJiBvdXRzaWRlVGlsZShjb29yZEN1cnIsIGNvb3JkTmV4dCwgdGlsZV9lZGdlX3RvbGVyYW5jZSkpIHtcbiAgICAgICAgdmFyIG5vbkJvdW5kYXJ5U2VnbWVudCA9IGdldE5leHROb25Cb3VuZGFyeVNlZ21lbnQobGluZSwgaW5kZXhfc3RhcnQsIHRpbGVfZWRnZV90b2xlcmFuY2UpO1xuICAgICAgICBpZiAobm9uQm91bmRhcnlTZWdtZW50KSB7XG4gICAgICAgICAgICBleHRyYV9saW5lcy5wdXNoKG5vbkJvdW5kYXJ5U2VnbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjbG9zZWRfcG9seWdvbil7XG4gICAgICAgIC8vIEJlZ2luIHRoZSBwb2x5Z29uIHdpdGggYSBqb2luIChjb25uZWN0aW5nIHRoZSBmaXJzdCBhbmQgbGFzdCBzZWdtZW50cylcbiAgICAgICAgbm9ybVByZXYgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5wZXJwKGxpbmVbaW5kZXhfZW5kIC0gMV0sIGNvb3JkQ3VycikpO1xuICAgICAgICBzdGFydFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJZiBsaW5lIGJlZ2lucyBhdCBlZGdlLCBkb24ndCBhZGQgYSBjYXBcbiAgICAgICAgaWYgKCFpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICAgICAgYWRkQ2FwKGNvb3JkQ3Vyciwgdiwgbm9ybU5leHQsIGNhcF90eXBlLCB0cnVlLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChjYXBfdHlwZSAhPT0gQ0FQX1RZUEUuYnV0dCkge1xuICAgICAgICAgICAgICAgIHYgKz0gMC41ICogdl9zY2FsZSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgZmlyc3QgcGFpciBvZiBwb2ludHMgZm9yIHRoZSBsaW5lIHN0cmlwXG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1OZXh0KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBJTlRFUk1FRElBUlkgUE9JTlRTXG4gICAgdiArPSB2X3NjYWxlICogVmVjdG9yLmxlbmd0aChWZWN0b3Iuc3ViKGNvb3JkTmV4dCwgY29vcmRDdXJyKSk7XG4gICAgZm9yICh2YXIgaSA9IGluZGV4X3N0YXJ0ICsgMTsgaSA8IGluZGV4X2VuZDsgaSsrKSB7XG4gICAgICAgIHZhciBjdXJySW5kZXggPSBpO1xuICAgICAgICB2YXIgbmV4dEluZGV4ID0gaSArIDE7XG4gICAgICAgIGNvb3JkQ3VyciA9IGxpbmVbY3VyckluZGV4XTtcbiAgICAgICAgY29vcmROZXh0ID0gbGluZVtuZXh0SW5kZXhdO1xuXG4gICAgICAgIC8vIFNraXAgcmVkdW5kYW50IHZlcnRpY2VzXG4gICAgICAgIGlmIChWZWN0b3IuaXNFcXVhbChjb29yZEN1cnIsIGNvb3JkTmV4dCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRpbGUgYm91bmRhcmllc1xuICAgICAgICBpZiAocmVtb3ZlX3RpbGVfZWRnZXMgJiYgb3V0c2lkZVRpbGUoY29vcmRDdXJyLCBjb29yZE5leHQsIHRpbGVfZWRnZV90b2xlcmFuY2UpKSB7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtTmV4dCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgdmFyIG5vbkJvdW5kYXJ5TGluZXMgPSBnZXROZXh0Tm9uQm91bmRhcnlTZWdtZW50KGxpbmUsIGN1cnJJbmRleCArIDEsIHRpbGVfZWRnZV90b2xlcmFuY2UpO1xuICAgICAgICAgICAgaWYgKG5vbkJvdW5kYXJ5TGluZXMpIHtcbiAgICAgICAgICAgICAgICBleHRyYV9saW5lcy5wdXNoKG5vbkJvdW5kYXJ5TGluZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9ybVByZXYgPSBub3JtTmV4dDtcbiAgICAgICAgbm9ybU5leHQgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5wZXJwKGNvb3JkQ3VyciwgY29vcmROZXh0KSk7XG5cbiAgICAgICAgLy8gQWRkIGpvaW5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgICAgICBhZGRNaXRlcih2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgbWl0ZXJfbGVuX3NxLCBmYWxzZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRKb2luKGpvaW5fdHlwZSwgdiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGZhbHNlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHYgKz0gdl9zY2FsZSAqIFZlY3Rvci5sZW5ndGgoVmVjdG9yLnN1Yihjb29yZE5leHQsIGNvb3JkQ3VycikpO1xuICAgIH1cblxuICAgIC8vIExBU1QgUE9JTlRcbiAgICBjb29yZEN1cnIgPSBjb29yZE5leHQ7XG4gICAgbm9ybVByZXYgPSBub3JtTmV4dDtcblxuICAgIGlmIChjbG9zZWRfcG9seWdvbikge1xuICAgICAgICAvLyBDbG9zZSB0aGUgcG9seWdvbiB3aXRoIGEgbWl0ZXIgam9pbnQgb3IgYnV0dCBjYXAgaWYgb24gYSB0aWxlIGJvdW5kYXJ5XG4gICAgICAgIG5vcm1OZXh0ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChjb29yZEN1cnIsIGxpbmVbMV0pKTtcbiAgICAgICAgZW5kUG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCB2LCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIEZpbmlzaCB0aGUgbGluZSBzdHJpcFxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtUHJldiksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG5cbiAgICAgICAgLy8gSWYgbGluZSBlbmRzIGF0IGVkZ2UsIGRvbid0IGFkZCBhIGNhcFxuICAgICAgICBpZiAoIWlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgICAgICBhZGRDYXAoY29vcmRDdXJyLCB2LCBub3JtUHJldiwgY2FwX3R5cGUsIGZhbHNlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0VGlsZUJvdW5kYXJ5SW5kZXgobGluZSl7XG4gICAgaWYgKGlzQ29vcmRPdXRzaWRlVGlsZShsaW5lWzBdKSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBiYWNrSW5kZXggPSAwOyBiYWNrSW5kZXggPCBsaW5lLmxlbmd0aDsgYmFja0luZGV4KyspIHtcbiAgICAgICAgdmFyIGNvb3JkQ3VyciA9IGxpbmVbbGluZS5sZW5ndGggLSAxIC0gYmFja0luZGV4XTtcbiAgICAgICAgaWYgKGlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbGluZS5sZW5ndGggLSAxIC0gYmFja0luZGV4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG59XG5cbi8vIEl0ZXJhdGUgdGhyb3VnaCBsaW5lIGZyb20gc3RhcnRJbmRleCB0byBmaW5kIGEgc2VnbWVudCBub3Qgb24gYSB0aWxlIGJvdW5kYXJ5LCBpZiBhbnkuXG5mdW5jdGlvbiBnZXROZXh0Tm9uQm91bmRhcnlTZWdtZW50IChsaW5lLCBzdGFydEluZGV4LCB0b2xlcmFuY2UpIHtcbiAgICB2YXIgZW5kSW5kZXggPSBzdGFydEluZGV4O1xuICAgIHdoaWxlIChsaW5lW2VuZEluZGV4ICsgMV0gJiYgb3V0c2lkZVRpbGUobGluZVtlbmRJbmRleF0sIGxpbmVbZW5kSW5kZXggKyAxXSwgdG9sZXJhbmNlKSkge1xuICAgICAgICBlbmRJbmRleCsrO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIGEgbGluZSBzZWdtZW50IHJlbWFpbmluZyB0aGF0IGlzIHdpdGhpbiB0aGUgdGlsZSwgcHVzaCBpdCB0byB0aGUgbGluZXMgYXJyYXlcbiAgICByZXR1cm4gKGxpbmUubGVuZ3RoIC0gZW5kSW5kZXggPj0gMikgPyBsaW5lLnNsaWNlKGVuZEluZGV4KSA6IGZhbHNlO1xufVxuXG4vLyBCZWdpbiBhIHBvbHlnb24gd2l0aCBhIGpvaW4gY29ubmVjdGluZyB0byB0aGUgbGFzdCBzZWdtZW50IChpZiB2YWxpZCBqb2luLXR5cGUgc3BlY2lmaWVkKVxuZnVuY3Rpb24gc3RhcnRQb2x5Z29uKGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBqb2luX3R5cGUsIGNvbnRleHQpe1xuICAgIC8vIElmIHBvbHlnb24gc3RhcnRzIG9uIGEgdGlsZSBib3VuZGFyeSwgZG9uJ3QgYWRkIGEgam9pblxuICAgIGlmIChqb2luX3R5cGUgPT09IHVuZGVmaW5lZCB8fCBpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtTmV4dCwgWzEsIDBdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCAwXSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJZiBwb2x5Z29uIHN0YXJ0cyB3aXRoaW4gYSB0aWxlLCBhZGQgYSBqb2luXG4gICAgICAgIHZhciB2ID0gMDtcbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgICAgICBhZGRNaXRlcih2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgY29udGV4dC5taXRlcl9sZW5fc3EsIHRydWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWRkSm9pbihqb2luX3R5cGUsIHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCB0cnVlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gRW5kIGEgcG9seWdvbiBhcHByb3ByaWF0ZWx5XG5mdW5jdGlvbiBlbmRQb2x5Z29uKGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBqb2luX3R5cGUsIHYsIGNvbnRleHQpIHtcbiAgICAvLyBJZiBwb2x5Z29uIGVuZHMgb24gYSB0aWxlIGJvdW5kYXJ5LCBkb24ndCBhZGQgYSBqb2luXG4gICAgaWYgKGlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1QcmV2LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1QcmV2KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIElmIHBvbHlnb24gZW5kcyB3aXRoaW4gYSB0aWxlLCBhZGQgTWl0ZXIgb3Igbm8gam9pbnQgKGpvaW4gYWRkZWQgb24gc3RhcnRQb2x5Z29uKVxuICAgICAgICB2YXIgbWl0ZXJWZWMgPSBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpO1xuXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlciAmJiBWZWN0b3IubGVuZ3RoU3EobWl0ZXJWZWMpID4gY29udGV4dC5taXRlcl9sZW5fc3EpIHtcbiAgICAgICAgICAgIGpvaW5fdHlwZSA9IEpPSU5fVFlQRS5iZXZlbDsgLy8gc3dpdGNoIHRvIGJldmVsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG1pdGVyVmVjLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1QcmV2KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1pdGVyVmVjKG5vcm1QcmV2LCBub3JtTmV4dCkge1xuICAgIHZhciBtaXRlclZlYyA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLmFkZChub3JtUHJldiwgbm9ybU5leHQpKTtcbiAgICB2YXIgc2NhbGUgPSAyIC8gKDEgKyBNYXRoLmFicyhWZWN0b3IuZG90KG5vcm1QcmV2LCBtaXRlclZlYykpKTtcbiAgICByZXR1cm4gVmVjdG9yLm11bHQobWl0ZXJWZWMsIHNjYWxlICogc2NhbGUpO1xufVxuXG4vLyBBZGQgYSBtaXRlciB2ZWN0b3Igb3IgYSBqb2luIGlmIHRoZSBtaXRlciBpcyB0b28gc2hhcnBcbmZ1bmN0aW9uIGFkZE1pdGVyICh2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgbWl0ZXJfbGVuX3NxLCBpc0JlZ2lubmluZywgY29udGV4dCkge1xuICAgIHZhciBtaXRlclZlYyA9IGNyZWF0ZU1pdGVyVmVjKG5vcm1QcmV2LCBub3JtTmV4dCk7XG5cbiAgICAvLyAgTWl0ZXIgbGltaXQ6IGlmIG1pdGVyIGpvaW4gaXMgdG9vIHNoYXJwLCBjb252ZXJ0IHRvIGJldmVsIGluc3RlYWRcbiAgICBpZiAoVmVjdG9yLmxlbmd0aFNxKG1pdGVyVmVjKSA+IG1pdGVyX2xlbl9zcSkge1xuICAgICAgICBhZGRKb2luKEpPSU5fVFlQRS5taXRlciwgdiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGlzQmVnaW5uaW5nLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG1pdGVyVmVjLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFpc0JlZ2lubmluZykge1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gQWRkIGEgYmV2ZWwgb3Igcm91bmQgam9pblxuZnVuY3Rpb24gYWRkSm9pbihqb2luX3R5cGUsIHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBpc0JlZ2lubmluZywgY29udGV4dCkge1xuICAgIHZhciBtaXRlclZlYyA9IGNyZWF0ZU1pdGVyVmVjKG5vcm1QcmV2LCBub3JtTmV4dCk7XG4gICAgdmFyIGlzQ2xvY2t3aXNlID0gKG5vcm1OZXh0WzBdICogbm9ybVByZXZbMV0gLSBub3JtTmV4dFsxXSAqIG5vcm1QcmV2WzBdID4gMCk7XG5cbiAgICBpZiAoaXNDbG9ja3dpc2Upe1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtUHJldiksIFswLCB2XSwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKCFpc0JlZ2lubmluZykge1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5iZXZlbCkge1xuICAgICAgICAgICAgYWRkQmV2ZWwoY29vcmRDdXJyLFxuICAgICAgICAgICAgICAgIFZlY3Rvci5uZWcobm9ybVByZXYpLCBtaXRlclZlYywgVmVjdG9yLm5lZyhub3JtTmV4dCksXG4gICAgICAgICAgICAgICAgWzAsIHZdLCBbMSwgdl0sIFswLCB2XSxcbiAgICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLnJvdW5kKSB7XG4gICAgICAgICAgICBhZGRGYW4oY29vcmRDdXJyLFxuICAgICAgICAgICAgICAgIFZlY3Rvci5uZWcobm9ybVByZXYpLCBtaXRlclZlYywgVmVjdG9yLm5lZyhub3JtTmV4dCksXG4gICAgICAgICAgICAgICAgWzAsIHZdLCBbMSwgdl0sIFswLCB2XSxcbiAgICAgICAgICAgICAgICBmYWxzZSwgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG1pdGVyVmVjLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1OZXh0KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1QcmV2LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoIWlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLmJldmVsKSB7XG4gICAgICAgICAgICBhZGRCZXZlbChjb29yZEN1cnIsXG4gICAgICAgICAgICAgICAgbm9ybVByZXYsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBub3JtTmV4dCxcbiAgICAgICAgICAgICAgICBbMSwgdl0sIFswLCB2XSwgWzEsIHZdLFxuICAgICAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUucm91bmQpIHtcbiAgICAgICAgICAgIGFkZEZhbihjb29yZEN1cnIsXG4gICAgICAgICAgICAgICAgbm9ybVByZXYsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBub3JtTmV4dCxcbiAgICAgICAgICAgICAgICBbMSwgdl0sIFswLCB2XSwgWzEsIHZdLFxuICAgICAgICAgICAgICAgIGZhbHNlLCBjb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgIH1cbn1cblxuLy8gQWRkIGluZGljZXMgdG8gdmVydGV4X2VsZW1lbnRzXG5mdW5jdGlvbiBpbmRleFBhaXJzKG51bV9wYWlycywgY29udGV4dCl7XG4gICAgdmFyIHZlcnRleF9lbGVtZW50cyA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuICAgIHZhciBudW1fdmVydGljZXMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcbiAgICB2YXIgb2Zmc2V0ID0gbnVtX3ZlcnRpY2VzIC0gMiAqIG51bV9wYWlycyAtIDI7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9wYWlyczsgaSsrKXtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gob2Zmc2V0ICsgMiAqIGkgKyAyKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gob2Zmc2V0ICsgMiAqIGkgKyAxKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gob2Zmc2V0ICsgMiAqIGkgKyAwKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gob2Zmc2V0ICsgMiAqIGkgKyAyKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gob2Zmc2V0ICsgMiAqIGkgKyAzKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gob2Zmc2V0ICsgMiAqIGkgKyAxKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZFZlcnRleChjb29yZGluYXRlLCBub3JtYWwsIHV2LCBjb250ZXh0KSB7XG4gICAgdmFyIHZlcnRleF90ZW1wbGF0ZSA9IGNvbnRleHQudmVydGV4X3RlbXBsYXRlO1xuICAgIHZhciB2ZXJ0ZXhfZGF0YSA9IGNvbnRleHQudmVydGV4X2RhdGE7XG5cbiAgICBidWlsZFZlcnRleFRlbXBsYXRlKHZlcnRleF90ZW1wbGF0ZSwgY29vcmRpbmF0ZSwgdXYsIG5vcm1hbCwgY29udGV4dCk7XG4gICAgdmVydGV4X2RhdGEuYWRkVmVydGV4KHZlcnRleF90ZW1wbGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVmVydGV4VGVtcGxhdGUgKHZlcnRleF90ZW1wbGF0ZSwgdmVydGV4LCB0ZXh0dXJlX2Nvb3JkLCBzY2FsZSwgY29udGV4dCkge1xuICAgIC8vIHNldCB2ZXJ0ZXggcG9zaXRpb25cbiAgICB2ZXJ0ZXhfdGVtcGxhdGVbMF0gPSB2ZXJ0ZXhbMF07XG4gICAgdmVydGV4X3RlbXBsYXRlWzFdID0gdmVydGV4WzFdO1xuXG4gICAgLy8gc2V0IFVWc1xuICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICYmIHRleHR1cmVfY29vcmQpIHtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQudGV4Y29vcmRfaW5kZXggKyAwXSA9IHRleHR1cmVfY29vcmRbMF0gKiBjb250ZXh0LnRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQudGV4Y29vcmRfaW5kZXggKyAxXSA9IHRleHR1cmVfY29vcmRbMV0gKiBjb250ZXh0LnRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICB9XG5cbiAgICAvLyBzZXQgU2NhbGluZyB2ZXJ0ZXggKFgsIFkgbm9ybWFsIGRpcmVjdGlvbiArIFogaGFsZl93aWR0aCBhcyBhdHRyaWJ1dGUpXG4gICAgaWYgKGNvbnRleHQuc2NhbGluZ19pbmRleCkge1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC5zY2FsaW5nX2luZGV4ICsgMF0gPSBzY2FsZVswXSAqIGNvbnRleHQuc2NhbGluZ19ub3JtYWxpemU7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnNjYWxpbmdfaW5kZXggKyAxXSA9IHNjYWxlWzFdICogY29udGV4dC5zY2FsaW5nX25vcm1hbGl6ZTtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQuc2NhbGluZ19pbmRleCArIDJdID0gY29udGV4dC5oYWxmX3dpZHRoO1xuICAgIH1cbn1cblxuLy8gIFRlc3NhbGF0ZSBhIEZBTiBnZW9tZXRyeSBiZXR3ZWVuIHBvaW50cyBBICAgICAgIEJcbi8vICB1c2luZyB0aGVpciBub3JtYWxzIGZyb20gYSBjZW50ZXIgICAgICAgIFxcIC4gLiAvXG4vLyAgYW5kIGludGVycG9sYXRpbmcgdGhlaXIgVVZzICAgICAgICAgICAgICAgXFwgcCAvXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcLi9cbmZ1bmN0aW9uIGFkZEZhbiAoY29vcmQsIG5BLCBuQywgbkIsIHV2QSwgdXZDLCB1dkIsIGlzQ2FwLCBjb250ZXh0KSB7XG4gICAgdmFyIGNyb3NzID0gbkFbMF0gKiBuQlsxXSAtIG5BWzFdICogbkJbMF07XG4gICAgdmFyIGRvdCA9IFZlY3Rvci5kb3QobkEsIG5CKTtcblxuICAgIHZhciBhbmdsZSA9IE1hdGguYXRhbjIoY3Jvc3MsIGRvdCk7XG4gICAgd2hpbGUgKGFuZ2xlID49IE1hdGguUEkpIHtcbiAgICAgICAgYW5nbGUgLT0gMipNYXRoLlBJO1xuICAgIH1cblxuICAgIHZhciBudW1UcmlhbmdsZXMgPSB0cmlhbmdsZXNQZXJBcmMoYW5nbGUsIGNvbnRleHQuaGFsZl93aWR0aCk7XG4gICAgaWYgKG51bVRyaWFuZ2xlcyA8IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwaXZvdEluZGV4ID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG4gICAgdmFyIHZlcnRleF9lbGVtZW50cyA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuXG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQywgdXZDLCBjb250ZXh0KTtcbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5BLCB1dkEsIGNvbnRleHQpO1xuXG4gICAgdmFyIGJsYWRlID0gbkE7XG5cbiAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciB1dkN1cnI7XG4gICAgICAgIGlmIChpc0NhcCl7XG4gICAgICAgICAgICB1dkN1cnIgPSBbXTtcbiAgICAgICAgICAgIHZhciBhZmZpbmVfdXZDdXJyID0gVmVjdG9yLnN1Yih1dkEsIHV2Qyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1dkN1cnIgPSBWZWN0b3Iuc2V0KHV2QSk7XG4gICAgICAgICAgICB2YXIgdXZfZGVsdGEgPSBWZWN0b3IuZGl2KFZlY3Rvci5zdWIodXZCLCB1dkEpLCBudW1UcmlhbmdsZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGFuZ2xlX3N0ZXAgPSBhbmdsZSAvIG51bVRyaWFuZ2xlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVRyaWFuZ2xlczsgaSsrKSB7XG4gICAgICAgIGJsYWRlID0gVmVjdG9yLnJvdChibGFkZSwgYW5nbGVfc3RlcCk7XG5cbiAgICAgICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGlzQ2FwKXtcbiAgICAgICAgICAgICAgICAvLyBVViB0ZXh0dXJlcyBnbyBcInRocm91Z2hcIiB0aGUgY2FwXG4gICAgICAgICAgICAgICAgYWZmaW5lX3V2Q3VyciA9IFZlY3Rvci5yb3QoYWZmaW5lX3V2Q3VyciwgYW5nbGVfc3RlcCk7XG4gICAgICAgICAgICAgICAgdXZDdXJyWzBdID0gYWZmaW5lX3V2Q3VyclswXSArIHV2Q1swXTtcbiAgICAgICAgICAgICAgICB1dkN1cnJbMV0gPSBhZmZpbmVfdXZDdXJyWzFdICogY29udGV4dC50ZXhjb29yZF93aWR0aCAqIGNvbnRleHQudl9zY2FsZSArIHV2Q1sxXTsgLy8gc2NhbGUgdGhlIHYtY29vcmRpbmF0ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVVYgdGV4dHVyZXMgZ28gXCJhcm91bmRcIiB0aGUgam9pblxuICAgICAgICAgICAgICAgIHV2Q3VyciA9IFZlY3Rvci5hZGQodXZDdXJyLCB1dl9kZWx0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIGJsYWRlLCB1dkN1cnIsIGNvbnRleHQpO1xuXG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyBpICsgKChjcm9zcyA+IDApID8gMiA6IDEpKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyBpICsgKChjcm9zcyA+IDApID8gMSA6IDIpKTtcbiAgICB9XG59XG5cbi8vICBhZGRCZXZlbCAgICBBIC0tLS0tIEJcbi8vICAgICAgICAgICAgIC8gXFwgICAgIC8gXFxcbi8vICAgICAgICAgICAvICAgL1xcICAgL1xcICBcXFxuLy8gICAgICAgICAgICAgIC8gIFxcIC8gIFxcICBcXFxuLy8gICAgICAgICAgICAgICAgLyBDIFxcXG5mdW5jdGlvbiBhZGRCZXZlbCAoY29vcmQsIG5BLCBuQywgbkIsIHVBLCB1QywgdUIsIGNvbnRleHQpIHtcbiAgICB2YXIgcGl2b3RJbmRleCA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuXG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQywgdUMsIGNvbnRleHQpO1xuICAgIGFkZFZlcnRleChjb29yZCwgbkEsIHVBLCBjb250ZXh0KTtcbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5CLCB1QiwgY29udGV4dCk7XG5cbiAgICB2YXIgb3JpZW50YXRpb24gPSBuQVswXSAqIG5CWzFdIC0gbkFbMV0gKiBuQlswXSA+IDA7XG5cbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG5cbiAgICBpZiAob3JpZW50YXRpb24pIHtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAwKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDIpO1xuICAgIH1cbn1cblxuLy8gIEZ1bmN0aW9uIHRvIGFkZCB0aGUgdmVydGV4IG5lZWQgZm9yIGxpbmUgY2Fwcyxcbi8vICBiZWNhdXNlIHJlLXVzZSB0aGUgYnVmZmVycyBuZWVkcyB0byBiZSBhdCB0aGUgZW5kXG5mdW5jdGlvbiBhZGRDYXAgKGNvb3JkLCB2LCBub3JtYWwsIHR5cGUsIGlzQmVnaW5uaW5nLCBjb250ZXh0KSB7XG4gICAgdmFyIG5lZ19ub3JtYWwgPSBWZWN0b3IubmVnKG5vcm1hbCk7XG5cbiAgICBzd2l0Y2ggKHR5cGUpe1xuICAgICAgICBjYXNlIENBUF9UWVBFLnNxdWFyZTpcbiAgICAgICAgICAgIHZhciB0YW5nZW50O1xuICAgICAgICAgICAgaWYgKGlzQmVnaW5uaW5nKXtcbiAgICAgICAgICAgICAgICB0YW5nZW50ID0gW25vcm1hbFsxXSwgLW5vcm1hbFswXV07XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIFZlY3Rvci5hZGQobm9ybWFsLCB0YW5nZW50KSwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIFZlY3Rvci5hZGQobmVnX25vcm1hbCwgdGFuZ2VudCksIFswLCB2XSwgY29udGV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgbGVuZ3RoIG9mIHNxdWFyZSBjYXAgdG8gdGV4dHVyZSBjb29yZGluYXRlXG4gICAgICAgICAgICAgICAgdiArPSAwLjUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlO1xuXG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBub3JtYWwsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBuZWdfbm9ybWFsLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFuZ2VudCA9IFstbm9ybWFsWzFdLCBub3JtYWxbMF1dO1xuXG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBub3JtYWwsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBuZWdfbm9ybWFsLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIGxlbmd0aCBvZiBzcXVhcmUgY2FwIHRvIHRleHR1cmUgY29vcmRpbmF0ZVxuICAgICAgICAgICAgICAgIHYgKz0gMC41ICogY29udGV4dC50ZXhjb29yZF93aWR0aCAqIGNvbnRleHQudl9zY2FsZTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgVmVjdG9yLmFkZChub3JtYWwsIHRhbmdlbnQpLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgVmVjdG9yLmFkZChuZWdfbm9ybWFsLCB0YW5nZW50KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENBUF9UWVBFLnJvdW5kOlxuICAgICAgICAgICAgdmFyIG5BLCBuQiwgdXZBLCB1dkIsIHV2QztcbiAgICAgICAgICAgIGlmIChpc0JlZ2lubmluZykge1xuICAgICAgICAgICAgICAgIG5BID0gbm9ybWFsO1xuICAgICAgICAgICAgICAgIG5CID0gbmVnX25vcm1hbDtcblxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGU7XG4gICAgICAgICAgICAgICAgICAgIHV2QSA9IFsxLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZCID0gWzAsIHZdO1xuICAgICAgICAgICAgICAgICAgICB1dkMgPSBbMC41LCB2XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuQSA9IG5lZ19ub3JtYWw7XG4gICAgICAgICAgICAgICAgbkIgPSBub3JtYWw7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAhPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICAgICAgICAgICAgdXZBID0gWzAsIHZdO1xuICAgICAgICAgICAgICAgICAgICB1dkIgPSBbMSwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QyA9IFswLjUsIHZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYWRkRmFuKGNvb3JkLFxuICAgICAgICAgICAgICAgIG5BLCB6ZXJvX3ZlYzIsIG5CLFxuICAgICAgICAgICAgICAgIHV2QSwgdXZDLCB1dkIsXG4gICAgICAgICAgICAgICAgdHJ1ZSwgY29udGV4dFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ0FQX1RZUEUuYnV0dDpcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG59XG5cbi8vIENhbGN1bGF0ZSBudW1iZXIgb2YgdHJpYW5nbGVzIGZvciBhIGZhbiBnaXZlbiBhbiBhbmdsZSBhbmQgbGluZSB3aWR0aFxuZnVuY3Rpb24gdHJpYW5nbGVzUGVyQXJjIChhbmdsZSwgd2lkdGgpIHtcbiAgICBpZiAoYW5nbGUgPCAwKSB7XG4gICAgICAgIGFuZ2xlID0gLWFuZ2xlO1xuICAgIH1cblxuICAgIHZhciBudW1UcmlhbmdsZXMgPSAod2lkdGggPiAyICogREVGQVVMVC5NSU5fRkFOX1dJRFRIKSA/IE1hdGgubG9nMih3aWR0aCAvIERFRkFVTFQuTUlOX0ZBTl9XSURUSCkgOiAxO1xuICAgIHJldHVybiBNYXRoLmNlaWwoYW5nbGUgLyBNYXRoLlBJICogbnVtVHJpYW5nbGVzKTtcbn1cblxuLy8gQ3ljbGljYWxseSBwZXJtdXRlIGNsb3NlZCBsaW5lIHN0YXJ0aW5nIGF0IGFuIGluZGV4XG5mdW5jdGlvbiBwZXJtdXRlTGluZShsaW5lLCBzdGFydEluZGV4KXtcbiAgICB2YXIgbmV3TGluZSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBpbmRleCA9IChpICsgc3RhcnRJbmRleCkgJSBsaW5lLmxlbmd0aDtcbiAgICAgICAgLy8gc2tpcCB0aGUgZmlyc3QgKHJlcGVhdGVkKSBpbmRleFxuICAgICAgICBpZiAoaW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIG5ld0xpbmUucHVzaChsaW5lW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV3TGluZS5wdXNoKG5ld0xpbmVbMF0pO1xuICAgIHJldHVybiBuZXdMaW5lO1xufSIsImltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IHttYXQ0LCBtYXQzLCB2ZWMzfSBmcm9tICcuL3V0aWxzL2dsLW1hdHJpeCc7XG5cbi8vIEFic3RyYWN0IGJhc2UgY2xhc3NcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb247XG4gICAgICAgIHRoaXMuem9vbSA9IG9wdGlvbnMuem9vbTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBjYW1lcmEgYnkgdHlwZSBuYW1lLCBmYWN0b3J5LXN0eWxlXG4gICAgc3RhdGljIGNyZWF0ZShuYW1lLCB2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3dpdGNoIChjb25maWcudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnaXNvbWV0cmljJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElzb21ldHJpY0NhbWVyYShuYW1lLCB2aWV3LCBjb25maWcpO1xuICAgICAgICAgICAgY2FzZSAnZmxhdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbGF0Q2FtZXJhKG5hbWUsIHZpZXcsIGNvbmZpZyk7XG4gICAgICAgICAgICBjYXNlICdwZXJzcGVjdGl2ZSc6XG4gICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGVyc3BlY3RpdmVDYW1lcmEobmFtZSwgdmlldywgY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlKCkge1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbmNlIHBlciBmcmFtZSBwZXIgcHJvZ3JhbSAoZS5nLiBmb3IgbWFpbiByZW5kZXIgcGFzcywgdGhlbiBmb3IgZWFjaCBhZGRpdGlvbmFsIHBhc3MgZm9yIGZlYXR1cmUgc2VsZWN0aW9uLCBldGMuKVxuICAgIHNldHVwUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgfVxuXG4gICAgLy8gU3luYyBjYW1lcmEgcG9zaXRpb24vem9vbSB0byBzY2VuZSB2aWV3XG4gICAgdXBkYXRlVmlldyAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uIHx8IHRoaXMuem9vbSkge1xuICAgICAgICAgICAgdmFyIHZpZXcgPSB7fTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmlldyA9IHsgbG5nOiB0aGlzLnBvc2l0aW9uWzBdLCBsYXQ6IHRoaXMucG9zaXRpb25bMV0sIHpvb206IHRoaXMucG9zaXRpb25bMl0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnpvb20pIHtcbiAgICAgICAgICAgICAgICB2aWV3Lnpvb20gPSB0aGlzLnpvb207XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBtb2RlbC12aWV3IGFuZCBub3JtYWwgbWF0cmljZXNcbiAgICBzZXR1cE1hdHJpY2VzIChtYXRyaWNlcywgcHJvZ3JhbSkge1xuICAgICAgICAvLyBNb2RlbCB2aWV3IG1hdHJpeCAtIHRyYW5zZm9ybSB0aWxlIHNwYWNlIGludG8gdmlldyBzcGFjZSAobWV0ZXJzLCByZWxhdGl2ZSB0byBjYW1lcmEpXG4gICAgICAgIG1hdDQubXVsdGlwbHkobWF0cmljZXMubW9kZWxfdmlldzMyLCB0aGlzLnZpZXdfbWF0cml4LCBtYXRyaWNlcy5tb2RlbCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfbW9kZWxWaWV3JywgbWF0cmljZXMubW9kZWxfdmlldzMyKTtcblxuICAgICAgICAvLyBOb3JtYWwgbWF0cmljZXMgLSB0cmFuc2Zvcm1zIHN1cmZhY2Ugbm9ybWFscyBpbnRvIHZpZXcgc3BhY2VcbiAgICAgICAgbWF0My5ub3JtYWxGcm9tTWF0NChtYXRyaWNlcy5ub3JtYWwzMiwgbWF0cmljZXMubW9kZWxfdmlldzMyKTtcbiAgICAgICAgbWF0My5pbnZlcnQobWF0cmljZXMuaW52ZXJzZV9ub3JtYWwzMiwgbWF0cmljZXMubm9ybWFsMzIpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDNmdicsICd1X25vcm1hbE1hdHJpeCcsIG1hdHJpY2VzLm5vcm1hbDMyKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXgzZnYnLCAndV9pbnZlcnNlTm9ybWFsTWF0cml4JywgbWF0cmljZXMuaW52ZXJzZV9ub3JtYWwzMik7XG4gICAgfVxuXG59XG5cbi8qKlxuICAgIFBlcnNwZWN0aXZlIG1hdHJpeCBwcm9qZWN0aW9uXG5cbiAgICBUaGlzIGlzIGEgc3BlY2lhbGl6ZWQgcGVyc3BlY3RpdmUgY2FtZXJhIHRoYXQsIGdpdmVuIGEgZGVzaXJlZCBjYW1lcmEgZm9jYWwgbGVuZ3RoICh3aGljaCBjYW4gYWxzbyB2YXJ5IGJ5IHpvb20gbGV2ZWwpLFxuICAgIGNvbnN0cmFpbnMgdGhlIGNhbWVyYSBoZWlnaHQgYWJvdmUgdGhlIGdyb3VuZCBwbGFuZSBzdWNoIHRoYXQgdGhlIGRpc3BsYXllZCBncm91bmQgYXJlYSBvZiB0aGUgbWFwIG1hdGNoZXMgdGhhdCBvZlxuICAgIGEgdHJhZGl0aW9uYWwgd2ViIG1lcmNhdG9yIG1hcC4gVGhpcyBtZWFucyB5b3UgY2FuIHNldCB0aGUgY2FtZXJhIGxvY2F0aW9uIGJ5IFtsYXQsIGxuZywgem9vbV0gYXMgeW91IHdvdWxkIGEgdHlwaWNhbFxuICAgIHdlYiBtZXJjYXRvciBtYXAsIHRoZW4gYWRqdXN0IHRoZSBmb2NhbCBsZW5ndGggYXMgbmVlZGVkLlxuXG4gICAgVmFuaXNoaW5nIHBvaW50IGNhbiBhbHNvIGJlIGFkanVzdGVkIHRvIGFjaGlldmUgZGlmZmVyZW50IFwidmlld2luZyBhbmdsZXNcIiwgZS5nLiBpbnN0ZWFkIG9mIGxvb2tpbmcgc3RyYWlnaHQgZG93biBpbnRvXG4gICAgdGhlIGNlbnRlciBvZiB0aGUgdmlld3BvcnQsIHRoZSBjYW1lcmEgYXBwZWFycyB0byBiZSB0aWx0ZWQgYXQgYW4gYW5nbGUuIEZvciBleGFtcGxlOlxuXG4gICAgWzAsIDBdID0gbG9va2luZyB0b3dhcmRzIGNlbnRlciBvZiB2aWV3cG9ydFxuICAgIFstMjUwLCAtMjUwXSA9IGxvb2tpbmcgMjUwIHBpeGVscyBmcm9tIHRoZSB2aWV3cG9ydCBjZW50ZXIgdG8gdGhlIGxvd2VyLWxlZnQgY29ybmVyXG4gICAgWzQwMCwgMF0gPSBsb29raW5nIDQwMCBwaXhlbHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSB2aWV3cG9ydCBjZW50ZXJcbiovXG5jbGFzcyBQZXJzcGVjdGl2ZUNhbWVyYSBleHRlbmRzIENhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdmlldywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdwZXJzcGVjdGl2ZSc7XG5cbiAgICAgICAgLy8gYSBzaW5nbGUgc2NhbGFyLCBvciBwYWlycyBvZiBzdG9wcyBtYXBwaW5nIHpvb20gbGV2ZWxzLCBlLmcuIFt6b29tLCBmb2NhbCBsZW5ndGhdXG4gICAgICAgIHRoaXMuZm9jYWxfbGVuZ3RoID0gb3B0aW9ucy5mb2NhbF9sZW5ndGg7XG4gICAgICAgIHRoaXMuZm92ID0gb3B0aW9ucy5mb3Y7XG4gICAgICAgIGlmICghdGhpcy5mb2NhbF9sZW5ndGggJiYgIXRoaXMuZm92KSB7XG4gICAgICAgICAgICAvLyBEZWZhdWx0IGZvY2FsIGxlbmd0aCByYW5nZXMgYnkgem9vbVxuICAgICAgICAgICAgdGhpcy5mb2NhbF9sZW5ndGggPSBbWzE2LCAyXSwgWzE3LCAyLjVdLCBbMTgsIDNdLCBbMTksIDRdLCBbMjAsIDZdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50ID0gb3B0aW9ucy52YW5pc2hpbmdfcG9pbnQgfHwgWzAsIDBdOyAvLyBbeCwgeV1cbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnQgPSB0aGlzLnZhbmlzaGluZ19wb2ludC5tYXAocGFyc2VGbG9hdCk7IC8vIHdlIGltcGxpY2l0bHkgb25seSBzdXBwb3J0IHB4IHVuaXRzIGhlcmVcbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tldyA9IFtdO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb25fbWV0ZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3X21hdHJpeCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG5cbiAgICAgICAgLy8gJ2NhbWVyYScgaXMgdGhlIG5hbWUgb2YgdGhlIHNoYWRlciBibG9jaywgZS5nLiBkZXRlcm1pbmVzIHdoZXJlIGluIHRoZSBzaGFkZXIgdGhpcyBjb2RlIGlzIGluamVjdGVkXG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdjYW1lcmEnLCBgXG4gICAgICAgICAgICB1bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZXllO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMyIHVfdmFuaXNoaW5nX3BvaW50O1xuXG4gICAgICAgICAgICB2b2lkIGNhbWVyYVByb2plY3Rpb24gKGlub3V0IHZlYzQgcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHVfcHJvamVjdGlvbiAqIHBvc2l0aW9uO1xuICAgICAgICAgICAgfWBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb25zdHJhaW5zIHRoZSBjYW1lcmEgc28gdGhhdCB0aGUgdmlld2FibGUgYXJlYSBtYXRjaGVzIGdpdmVuIHRoZSB2aWV3cG9ydCBoZWlnaHRcbiAgICAvLyAoaW4gd29ybGQgc3BhY2UsIGUuZy4gbWV0ZXJzKSwgZ2l2ZW4gZWl0aGVyIGEgY2FtZXJhIGZvY2FsIGxlbmd0aCBvciBmaWVsZC1vZi12aWV3XG4gICAgLy8gKGZvY2FsIGxlbmd0aCBpcyB1c2VkIGlmIGJvdGggYXJlIHBhc3NlZCkuXG4gICAgY29uc3RyYWluQ2FtZXJhKHsgdmlld19oZWlnaHQsIGhlaWdodCwgZm9jYWxfbGVuZ3RoLCBmb3YgfSkge1xuICAgICAgICAvLyBTb2x2ZSBmb3IgY2FtZXJhIGhlaWdodFxuICAgICAgICBpZiAoIWhlaWdodCkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBmb2NhbCBsZW5ndGgsIGNhbGN1bGF0ZSBGT1ZcbiAgICAgICAgICAgIGlmIChmb2NhbF9sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3YgPSBNYXRoLmF0YW4oMSAvIGZvY2FsX2xlbmd0aCkgKiAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgaGF2ZSBGT1YsIGNhbGN1bGF0ZSBmb2NhbCBsZW5ndGhcbiAgICAgICAgICAgIGVsc2UgaWYgKGZvdikge1xuICAgICAgICAgICAgICAgIGZvdiA9IGZvdiAqIE1hdGguUEkgLyAxODA7IC8vIGNvbnZlcnQgRk9WIGRlZ3JlZXMgdG8gcmFkaWFuc1xuICAgICAgICAgICAgICAgIGZvY2FsX2xlbmd0aCA9IDEgLyBNYXRoLnRhbihmb3YgLyAyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGlzdGFuY2UgdGhhdCBjYW1lcmEgc2hvdWxkIGJlIGZyb20gZ3JvdW5kIHN1Y2ggdGhhdCBpdCBmaXRzIHRoZSBmaWVsZCBvZiB2aWV3IGV4cGVjdGVkXG4gICAgICAgICAgICAvLyBmb3IgYSBjb252ZW50aW9uYWwgd2ViIG1lcmNhdG9yIG1hcCBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsIGFuZCBjYW1lcmEgZm9jYWwgbGVuZ3RoXG4gICAgICAgICAgICBoZWlnaHQgPSB2aWV3X2hlaWdodCAvIDIgKiBmb2NhbF9sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29sdmUgZm9yIGNhbWVyYSBmb2NhbCBsZW5ndGggLyBmaWVsZC1vZi12aWV3XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9jYWxfbGVuZ3RoID0gMiAqIGhlaWdodCAvIHZpZXdfaGVpZ2h0O1xuICAgICAgICAgICAgZm92ID0gTWF0aC5hdGFuKDEgLyBmb2NhbF9sZW5ndGgpICogMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHZpZXdfaGVpZ2h0LCBoZWlnaHQsIGZvY2FsX2xlbmd0aCwgZm92IH07XG4gICAgfVxuXG4gICAgdXBkYXRlTWF0cmljZXMoKSB7XG4gICAgICAgIC8vIFRPRE86IG9ubHkgcmUtY2FsY3VsYXRlIHRoZXNlIHZhcnMgd2hlbiBuZWNlc3NhcnlcblxuICAgICAgICAvLyBIZWlnaHQgb2YgdGhlIHZpZXdwb3J0IGluIG1ldGVycyBhdCBjdXJyZW50IHpvb21cbiAgICAgICAgdmFyIHZpZXdwb3J0X2hlaWdodCA9IHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQgKiB0aGlzLnZpZXcubWV0ZXJzX3Blcl9waXhlbDtcblxuICAgICAgICAvLyBDb21wdXRlIGNhbWVyYSBwcm9wZXJ0aWVzIHRvIGZpdCBkZXNpcmVkIHZpZXdcbiAgICAgICAgdmFyIHsgaGVpZ2h0LCBmb3YgfSA9IHRoaXMuY29uc3RyYWluQ2FtZXJhKHtcbiAgICAgICAgICAgIHZpZXdfaGVpZ2h0OiB2aWV3cG9ydF9oZWlnaHQsXG4gICAgICAgICAgICBmb2NhbF9sZW5ndGg6IFV0aWxzLmludGVycG9sYXRlKHRoaXMudmlldy56b29tLCB0aGlzLmZvY2FsX2xlbmd0aCksXG4gICAgICAgICAgICBmb3Y6IFV0aWxzLmludGVycG9sYXRlKHRoaXMudmlldy56b29tLCB0aGlzLmZvdilcbiAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFZpZXcgbWF0cml4XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IFt0aGlzLnZpZXcuY2VudGVyLm1ldGVycy54LCB0aGlzLnZpZXcuY2VudGVyLm1ldGVycy55LCBoZWlnaHRdO1xuICAgICAgICB0aGlzLnBvc2l0aW9uX21ldGVycyA9IHBvc2l0aW9uO1xuXG4gICAgICAgIC8vIG1hdDQubG9va0F0KHRoaXMudmlld19tYXRyaXgsXG4gICAgICAgIC8vICAgICB2ZWMzLmZyb21WYWx1ZXMoLi4ucG9zaXRpb24pLFxuICAgICAgICAvLyAgICAgdmVjMy5mcm9tVmFsdWVzKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgaGVpZ2h0IC0gMSksXG4gICAgICAgIC8vICAgICB2ZWMzLmZyb21WYWx1ZXMoMCwgMSwgMCkpO1xuICAgICAgICAvLyBFeGNsdWRlIGNhbWVyYSBoZWlnaHQgZnJvbSB2aWV3IG1hdHJpeFxuICAgICAgICBtYXQ0Lmxvb2tBdCh0aGlzLnZpZXdfbWF0cml4LFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgMCksXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMocG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdLCAtMSksXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMoMCwgMSwgMCkpO1xuXG4gICAgICAgIC8vIFByb2plY3Rpb24gbWF0cml4XG4gICAgICAgIG1hdDQucGVyc3BlY3RpdmUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgZm92LCB0aGlzLnZpZXcuYXNwZWN0LCAxLCBoZWlnaHQgKiAyKTtcblxuICAgICAgICAvLyBDb252ZXJ0IHZhbmlzaGluZyBwb2ludCBmcm9tIHBpeGVscyB0byB2aWV3cG9ydCBzcGFjZVxuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzBdID0gdGhpcy52YW5pc2hpbmdfcG9pbnRbMF0gLyB0aGlzLnZpZXcuc2l6ZS5jc3Mud2lkdGg7XG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMV0gPSB0aGlzLnZhbmlzaGluZ19wb2ludFsxXSAvIHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQ7XG5cbiAgICAgICAgLy8gQWRqdXN0IHByb2plY3Rpb24gbWF0cml4IHRvIGluY2x1ZGUgdmFuaXNoaW5nIHBvaW50IHNrZXdcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeFs4XSA9IC10aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzBdICogMjsgLy8geiBjb2x1bW4gb2YgeCByb3csIGUuZy4gYW1vdW50IHogc2tld3MgeFxuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzldID0gLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMV0gKiAyOyAvLyB6IGNvbHVtbiBvZiB5IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB5XG5cbiAgICAgICAgLy8gVHJhbnNsYXRlIGdlb21ldHJ5IGludG8gdGhlIGRpc3RhbmNlIHNvIHRoYXQgY2FtZXJhIGlzIGFwcHJvcHJpYXRlIGhlaWdodCBhYm92ZSBncm91bmRcbiAgICAgICAgLy8gQWRkaXRpb25hbGx5LCBhZGp1c3QgeHkgdG8gY29tcGVuc2F0ZSBmb3IgYW55IHZhbmlzaGluZyBwb2ludCBza2V3LCBlLmcuIG1vdmUgZ2VvbWV0cnkgc28gdGhhdCB0aGUgZGlzcGxheWVkIGdcbiAgICAgICAgLy8gcGxhbmUgb2YgdGhlIG1hcCBtYXRjaGVzIHRoYXQgZXhwZWN0ZWQgYnkgYSB0cmFkaXRpb25hbCB3ZWIgbWVyY2F0b3IgbWFwIGF0IHRoaXMgW2xhdCwgbG5nLCB6b29tXS5cbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcyhcbiAgICAgICAgICAgICAgICB2aWV3cG9ydF9oZWlnaHQvMiAqIHRoaXMudmlldy5hc3BlY3QgKiAoLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMF0gKiAyKSxcbiAgICAgICAgICAgICAgICB2aWV3cG9ydF9oZWlnaHQvMiAqICgtdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1sxXSAqIDIpLFxuICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJbmNsdWRlIGNhbWVyYSBoZWlnaHQgaW4gcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdmVjMy5mcm9tVmFsdWVzKDAsIDAsIC1oZWlnaHQpKTtcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZU1hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtKHByb2dyYW0pIHtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9wcm9qZWN0aW9uJywgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnM2YnLCAndV9leWUnLCBbMCwgMCwgdGhpcy5wb3NpdGlvbl9tZXRlcnNbMl1dKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcyZnYnLCAndV92YW5pc2hpbmdfcG9pbnQnLCB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3KTtcbiAgICB9XG5cbn1cblxuLy8gSXNvbWV0cmljLXN0eWxlIHByb2plY3Rpb25cbi8vIE5vdGU6IHRoaXMgaXMgYWN0dWFsbHkgYW4gXCJheG9ub21ldHJpY1wiIHByb2plY3Rpb24sIGJ1dCBJJ20gdXNpbmcgdGhlIGNvbGxvcXVpYWwgdGVybSBpc29tZXRyaWMgYmVjYXVzZSBpdCBpcyBtb3JlIHJlY29nbml6YWJsZS5cbi8vIEFuIGlzb21ldHJpYyBwcm9qZWN0aW9uIGlzIGEgc3BlY2lmaWMgc3Vic2V0IG9mIGF4b25vbWV0cmljIHByb2plY3Rpb25zLlxuLy8gJ2F4aXMnIGRldGVybWluZXMgdGhlIHh5IHNrZXcgYXBwbGllZCB0byBhIHZlcnRleCBiYXNlZCBvbiBpdHMgeiBjb29yZGluYXRlLCBlLmcuIFswLCAxXSBheGlzIGNhdXNlcyBidWlsZGluZ3MgdG8gYmUgZHJhd25cbi8vIHN0cmFpZ2h0IHVwd2FyZHMgb24gc2NyZWVuIGF0IHRoZWlyIHRydWUgaGVpZ2h0LCBbMCwgLjVdIHdvdWxkIGRyYXcgdGhlbSB1cCBhdCBoYWxmLWhlaWdodCwgWzEsIDBdIHdvdWxkIGJlIHNpZGV3YXlzLCBldGMuXG5jbGFzcyBJc29tZXRyaWNDYW1lcmEgZXh0ZW5kcyBDYW1lcmEge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdmlldywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG5hbWUsIHZpZXcsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnaXNvbWV0cmljJztcbiAgICAgICAgdGhpcy5heGlzID0gb3B0aW9ucy5heGlzIHx8IHsgeDogMCwgeTogMSB9O1xuICAgICAgICBpZiAodGhpcy5heGlzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgdGhpcy5heGlzID0geyB4OiB0aGlzLmF4aXNbMF0sIHk6IHRoaXMuYXhpc1sxXSB9OyAvLyBhbGxvdyBheGlzIHRvIGFsc28gYmUgcGFzc2VkIGFzIDItZWxlbSBhcnJheVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZXdwb3J0X2hlaWdodCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy52aWV3X21hdHJpeCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG5cbiAgICAgICAgLy8gJ2NhbWVyYScgaXMgdGhlIG5hbWUgb2YgdGhlIHNoYWRlciBibG9jaywgZS5nLiBkZXRlcm1pbmVzIHdoZXJlIGluIHRoZSBzaGFkZXIgdGhpcyBjb2RlIGlzIGluamVjdGVkXG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdjYW1lcmEnLCBgXG4gICAgICAgICAgICB1bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZXllO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMyIHVfdmFuaXNoaW5nX3BvaW50O1xuXG4gICAgICAgICAgICB2b2lkIGNhbWVyYVByb2plY3Rpb24gKGlub3V0IHZlYzQgcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHVfcHJvamVjdGlvbiAqIHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uLnh5ICs9IHBvc2l0aW9uLnogKiB1X2lzb21ldHJpY19heGlzO1xuXG4gICAgICAgICAgICAgICAgLy8gUmV2ZXJzZSB6IGZvciBkZXB0aCBidWZmZXIgc28gdXAgaXMgbmVnYXRpdmUsXG4gICAgICAgICAgICAgICAgLy8gYW5kIHNjYWxlIGRvd24gdmFsdWVzIHNvIG9iamVjdHMgaGlnaGVyIHRoYW4gb25lIHNjcmVlbiBoZWlnaHQgd2lsbCBub3QgZ2V0IGNsaXBwZWRcbiAgICAgICAgICAgICAgICAvLyBwdWxsIGZvcndhcmQgc2xpZ2h0bHkgdG8gYXZvaWQgZ29pbmcgcGFzdCBmYXIgY2xpcHBpbmcgcGxhbmVcbiAgICAgICAgICAgICAgICBwb3NpdGlvbi56ID0gLXBvc2l0aW9uLnogLyAxMDAuICsgMS4gLSAwLjAwMTtcbiAgICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcblxuICAgICAgICB0aGlzLnZpZXdwb3J0X2hlaWdodCA9IHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQgKiB0aGlzLnZpZXcubWV0ZXJzX3Blcl9waXhlbDtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gW3RoaXMudmlldy5jZW50ZXIubWV0ZXJzLngsIHRoaXMudmlldy5jZW50ZXIubWV0ZXJzLnksIHRoaXMudmlld3BvcnRfaGVpZ2h0XTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBwb3NpdGlvbjtcblxuICAgICAgICAvLyBWaWV3XG4gICAgICAgIG1hdDQuaWRlbnRpdHkodGhpcy52aWV3X21hdHJpeCk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHRoaXMudmlld19tYXRyaXgsIHRoaXMudmlld19tYXRyaXgsIHZlYzMuZnJvbVZhbHVlcygtcG9zaXRpb25bMF0sIC1wb3NpdGlvblsxXSwgMCkpO1xuXG4gICAgICAgIC8vIFByb2plY3Rpb25cbiAgICAgICAgbWF0NC5pZGVudGl0eSh0aGlzLnByb2plY3Rpb25fbWF0cml4KTtcblxuICAgICAgICAvLyBhcHBseSBpc29tZXRyaWMgc2tld1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzhdID0gdGhpcy5heGlzLnggLyB0aGlzLnZpZXcuYXNwZWN0OyAvLyB6IGNvbHVtbiBvZiB4IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB4XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXhbOV0gPSB0aGlzLmF4aXMueTsgICAgICAgICAgICAgICAgICAgIC8vIHogY29sdW1uIG9mIHggcm93LCBlLmcuIGFtb3VudCB6IHNrZXdzIHlcblxuICAgICAgICAvLyBjb252ZXJ0IG1ldGVycyB0byB2aWV3cG9ydFxuICAgICAgICBtYXQ0LnNjYWxlKHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgsXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMoXG4gICAgICAgICAgICAgICAgMiAvIHRoaXMudmlldy5zaXplLm1ldGVycy54LFxuICAgICAgICAgICAgICAgIDIgLyB0aGlzLnZpZXcuc2l6ZS5tZXRlcnMueSxcbiAgICAgICAgICAgICAgICAyIC8gdGhpcy52aWV3LnNpemUubWV0ZXJzLnlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0ocHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDRmdicsICd1X3Byb2plY3Rpb24nLCB0aGlzLnByb2plY3Rpb25fbWF0cml4KTtcblxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzNmdicsICd1X2V5ZScsIFswLCAwLCB0aGlzLnZpZXdwb3J0X2hlaWdodF0pO1xuICAgICAgICAvLyBwcm9ncmFtLnVuaWZvcm0oJzNmJywgJ3VfZXllJywgdGhpcy52aWV3cG9ydF9oZWlnaHQgKiB0aGlzLmF4aXMueCwgdGhpcy52aWV3cG9ydF9oZWlnaHQgKiB0aGlzLmF4aXMueSwgdGhpcy52aWV3cG9ydF9oZWlnaHQpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzJmdicsICd1X3ZhbmlzaGluZ19wb2ludCcsIFswLCAwXSk7XG4gICAgfVxuXG59XG5cbi8vIEZsYXQgcHJvamVjdGlvbiAoZS5nLiBqdXN0IHRvcC1kb3duLCBubyBwZXJzcGVjdGl2ZSkgLSBhIGRlZ2VuZXJhdGUgaXNvbWV0cmljIGNhbWVyYVxuY2xhc3MgRmxhdENhbWVyYSBleHRlbmRzIElzb21ldHJpY0NhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdmlldywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdmbGF0JztcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIC8vIEF4aXMgaXMgZml4ZWQgdG8gKDAsIDApIGZvciBmbGF0IGNhbWVyYVxuICAgICAgICB0aGlzLmF4aXMueCA9IDA7XG4gICAgICAgIHRoaXMuYXhpcy55ID0gMDtcblxuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICB9XG5cbn1cbiIsIi8vIE1pc2NlbGxhbmVvdXMgZ2VvIGZ1bmN0aW9uc1xuXG52YXIgR2VvO1xuZXhwb3J0IGRlZmF1bHQgR2VvID0ge307XG5cbi8vIFByb2plY3Rpb24gY29uc3RhbnRzXG5HZW8uZGVmYXVsdF9zb3VyY2VfbWF4X3pvb20gPSAxODtcbkdlby5kZWZhdWx0X3ZpZXdfbWF4X3pvb20gPSAyMDtcbkdlby50aWxlX3NpemUgPSAyNTY7XG5HZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycyA9IDIwMDM3NTA4LjM0Mjc4OTI0NDtcbkdlby5jaXJjdW1mZXJlbmNlX21ldGVycyA9IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzICogMjtcbkdlby5taW5fem9vbV9tZXRlcnNfcGVyX3BpeGVsID0gR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gR2VvLnRpbGVfc2l6ZTsgLy8gbWluIHpvb20gZHJhd3Mgd29ybGQgYXMgMiB0aWxlcyB3aWRlXG5cbmxldCBtZXRlcnNfcGVyX3BpeGVsID0gW107XG5HZW8ubWV0ZXJzUGVyUGl4ZWwgPSBmdW5jdGlvbiAoeikge1xuICAgIG1ldGVyc19wZXJfcGl4ZWxbel0gPSBtZXRlcnNfcGVyX3BpeGVsW3pdIHx8IEdlby5taW5fem9vbV9tZXRlcnNfcGVyX3BpeGVsIC8gTWF0aC5wb3coMiwgeik7XG4gICAgcmV0dXJuIG1ldGVyc19wZXJfcGl4ZWxbel07XG59O1xuXG5sZXQgbWV0ZXJzX3Blcl90aWxlID0gW107XG5HZW8ubWV0ZXJzUGVyVGlsZSA9IGZ1bmN0aW9uICh6KSB7XG4gICAgbWV0ZXJzX3Blcl90aWxlW3pdID0gbWV0ZXJzX3Blcl90aWxlW3pdIHx8IEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHopO1xuICAgIHJldHVybiBtZXRlcnNfcGVyX3RpbGVbel07XG59O1xuXG4vLyBDb252ZXJzaW9uIGZ1bmN0aW9ucyBiYXNlZCBvbiBhbiBkZWZpbmVkIHRpbGUgc2NhbGVcbkdlby50aWxlX3NjYWxlID0gNDA5NjsgLy8gY29vcmRpbmF0ZXMgYXJlIGxvY2FsbHkgc2NhbGVkIHRvIHRoZSByYW5nZSBbMCwgdGlsZV9zY2FsZV1cbkdlby51bml0c19wZXJfcGl4ZWwgPSBHZW8udGlsZV9zY2FsZSAvIEdlby50aWxlX3NpemU7XG5HZW8uaGVpZ2h0X3NjYWxlID0gMTY7ICAvLyBwcm92aWRlcyBzdWItbWV0ZXIgcHJlY2lzaW9uIGZvciBoZWlnaHQgdmFsdWVzICgxNnRocyBvZiBhIG1ldGVycylcblxubGV0IHVuaXRzX3Blcl9tZXRlciA9IFtdO1xuR2VvLnVuaXRzUGVyTWV0ZXIgPSBmdW5jdGlvbiAoeikge1xuICAgIHVuaXRzX3Blcl9tZXRlclt6XSA9IHVuaXRzX3Blcl9tZXRlclt6XSB8fCBHZW8udGlsZV9zY2FsZSAvIChHZW8udGlsZV9zaXplICogR2VvLm1ldGVyc1BlclBpeGVsKHopKTtcbiAgICByZXR1cm4gdW5pdHNfcGVyX21ldGVyW3pdO1xufTtcblxuLy8gQ29udmVydCB0aWxlIGxvY2F0aW9uIHRvIG1lcmNhdG9yIG1ldGVycyAtIG11bHRpcGx5IGJ5IHBpeGVscyBwZXIgdGlsZSwgdGhlbiBieSBtZXRlcnMgcGVyIHBpeGVsLCBhZGp1c3QgZm9yIG1hcCBvcmlnaW5cbkdlby5tZXRlcnNGb3JUaWxlID0gZnVuY3Rpb24gKHRpbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB0aWxlLnggKiBHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB0aWxlLnopIC0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMsXG4gICAgICAgIHk6IC0odGlsZS55ICogR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgdGlsZS56KSAtIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzKVxuICAgIH07XG59O1xuXG4vKipcbiAgIEdpdmVuIGEgcG9pbnQgaW4gbWVyY2F0b3IgbWV0ZXJzIGFuZCBhIHpvb20gbGV2ZWwsIHJldHVybiB0aGUgdGlsZSBYL1kvWiB0aGF0IHRoZSBwb2ludCBsaWVzIGluXG4qL1xuR2VvLnRpbGVGb3JNZXRlcnMgPSBmdW5jdGlvbiAoW3gsIHldLCB6b29tKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogTWF0aC5mbG9vcigoeCArIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzKSAvIChHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB6b29tKSkpLFxuICAgICAgICB5OiBNYXRoLmZsb29yKCgteSArIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzKSAvIChHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB6b29tKSkpLFxuICAgICAgICB6OiB6b29tXG4gICAgfTtcbn07XG5cbi8vIFdyYXAgYSB0aWxlIHRvIHBvc2l0aXZlICNzIGZvciB6b29tXG4vLyBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIGF4ZXMgdG8gd3JhcFxuR2VvLndyYXBUaWxlID0gZnVuY3Rpb24oeyB4LCB5LCB6IH0sIG1hc2sgPSB7IHg6IHRydWUsIHk6IGZhbHNlIH0pIHtcbiAgICB2YXIgbSA9ICgxIDw8IHopIC0gMTtcbiAgICBpZiAobWFzay54KSB7XG4gICAgICAgIHggPSB4ICYgbTtcbiAgICB9XG4gICAgaWYgKG1hc2sueSkge1xuICAgICAgICB5ID0geSAmIG07XG4gICAgfVxuICAgIHJldHVybiB7IHgsIHksIHogfTtcbn07XG5cbi8qKlxuICAgQ29udmVydCBtZXJjYXRvciBtZXRlcnMgdG8gbGF0LWxuZ1xuKi9cbkdlby5tZXRlcnNUb0xhdExuZyA9IGZ1bmN0aW9uIChbeCwgeV0pIHtcblxuICAgIHggLz0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnM7XG4gICAgeSAvPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycztcblxuICAgIHkgPSAoMiAqIE1hdGguYXRhbihNYXRoLmV4cCh5ICogTWF0aC5QSSkpIC0gKE1hdGguUEkgLyAyKSkgLyBNYXRoLlBJO1xuXG4gICAgeCAqPSAxODA7XG4gICAgeSAqPSAxODA7XG5cbiAgICByZXR1cm4gW3gsIHldO1xufTtcblxuLyoqXG4gIENvbnZlcnQgbGF0LWxuZyB0byBtZXJjYXRvciBtZXRlcnNcbiovXG5HZW8ubGF0TG5nVG9NZXRlcnMgPSBmdW5jdGlvbihbeCwgeV0pIHtcblxuICAgIC8vIExhdGl0dWRlXG4gICAgeSA9IE1hdGgubG9nKE1hdGgudGFuKHkqTWF0aC5QSS8zNjAgKyBNYXRoLlBJLzQpKSAvIE1hdGguUEk7XG4gICAgeSAqPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycztcblxuICAgIC8vIExvbmdpdHVkZVxuICAgIHggKj0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyAxODA7XG5cbiAgICByZXR1cm4gW3gsIHldO1xufTtcblxuR2VvLndyYXBMbmcgPSBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPiAxODAgfHwgeCA8IC0xODApIHtcbiAgICAgICAgeCA9ICgoeCArIDE4MCkgJSAzNjAgKyAzNjApICUgMzYwIC0gMTgwO1xuICAgIH1cbiAgICByZXR1cm4geDtcbn07XG5cbi8vIFJ1biBhbiBpbi1wbGFjZSB0cmFuc2Zvcm0gZnVuY3Rpb24gb24gZWFjaCBjb29vcmRpbmF0ZSBpbiBhIEdlb0pTT04gZ2VvbWV0cnlcbkdlby50cmFuc2Zvcm1HZW9tZXRyeSA9IGZ1bmN0aW9uIChnZW9tZXRyeSwgdHJhbnNmb3JtKSB7XG4gICAgaWYgKGdlb21ldHJ5ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBza2lwIGlmIG1pc3NpbmcgZ2VvbWV0cnkgKHZhbGlkIEdlb0pTT04pXG4gICAgfVxuXG4gICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgdHJhbnNmb3JtKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKHRyYW5zZm9ybSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKGNvb3JkaW5hdGVzID0+IGNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2gocG9seWdvbiA9PiB7XG4gICAgICAgICAgICBwb2x5Z29uLmZvckVhY2goY29vcmRpbmF0ZXMgPT4gY29vcmRpbmF0ZXMuZm9yRWFjaCh0cmFuc2Zvcm0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFRPRE86IHN1cHBvcnQgR2VvbWV0cnlDb2xsZWN0aW9uXG59O1xuXG5HZW8uYm94SW50ZXJzZWN0ID0gZnVuY3Rpb24gKGIxLCBiMikge1xuICAgIHJldHVybiAhKFxuICAgICAgICBiMi5zdy54ID4gYjEubmUueCB8fFxuICAgICAgICBiMi5uZS54IDwgYjEuc3cueCB8fFxuICAgICAgICBiMi5zdy55ID4gYjEubmUueSB8fFxuICAgICAgICBiMi5uZS55IDwgYjEuc3cueVxuICAgICk7XG59O1xuXG4vLyBGaW5kcyB0aGUgYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCBmb3IgYSBwb2x5Z29uXG5HZW8uZmluZEJvdW5kaW5nQm94ID0gZnVuY3Rpb24gKHBvbHlnb24pIHtcbiAgICB2YXIgbWluX3ggPSBJbmZpbml0eSxcbiAgICAgICAgbWF4X3ggPSAtSW5maW5pdHksXG4gICAgICAgIG1pbl95ID0gSW5maW5pdHksXG4gICAgICAgIG1heF95ID0gLUluZmluaXR5O1xuXG4gICAgLy8gT25seSBuZWVkIHRvIGV4YW1pbmUgb3V0ZXIgcmluZyAocG9seWdvblswXSlcbiAgICB2YXIgbnVtX2Nvb3JkcyA9IHBvbHlnb25bMF0ubGVuZ3RoO1xuICAgIGZvciAodmFyIGM9MDsgYyA8IG51bV9jb29yZHM7IGMrKykge1xuICAgICAgICB2YXIgY29vcmQgPSBwb2x5Z29uWzBdW2NdO1xuXG4gICAgICAgIGlmIChjb29yZFswXSA8IG1pbl94KSB7XG4gICAgICAgICAgICBtaW5feCA9IGNvb3JkWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb29yZFsxXSA8IG1pbl95KSB7XG4gICAgICAgICAgICBtaW5feSA9IGNvb3JkWzFdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb29yZFswXSA+IG1heF94KSB7XG4gICAgICAgICAgICBtYXhfeCA9IGNvb3JkWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb29yZFsxXSA+IG1heF95KSB7XG4gICAgICAgICAgICBtYXhfeSA9IGNvb3JkWzFdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFttaW5feCwgbWluX3ksIG1heF94LCBtYXhfeV07XG59O1xuXG4vLyBDb252ZXJ0IGdlb21ldHJ5IHR5cGUgdG8gb25lIG9mOiAncG9pbnQnLCAnbGluZScsICdwb2x5Z29uJ1xuR2VvLmdlb21ldHJ5VHlwZSA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gJ1BvbHlnb24nIHx8IHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHJldHVybiAncG9seWdvbic7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJ2xpbmUnO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgcmV0dXJuICdwb2ludCc7XG4gICAgfVxufTtcblxuR2VvLmNlbnRyb2lkID0gZnVuY3Rpb24gKHBvbHlnb24pIHtcbiAgICAvLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL0xlYWZsZXQvTGVhZmxldC9ibG9iL2MxMGY0MDVhMTEyMTQyYjE5Nzg1OTY3Y2UwZTE0MjEzMmE2MDk1YWQvc3JjL2xheWVyL3ZlY3Rvci9Qb2x5Z29uLmpzI0w1N1xuICAgIGxldCB4ID0gMCwgeSA9IDAsIGFyZWEgPSAwO1xuICAgIGxldCByaW5nID0gcG9seWdvblswXTsgLy8gb25seSB1c2UgZmlyc3QgcmluZyBmb3Igbm93XG4gICAgbGV0IGxlbiA9IHJpbmcubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSwgaSsrKSB7XG4gICAgICAgIGxldCBwMCA9IHJpbmdbaV07XG4gICAgICAgIGxldCBwMSA9IHJpbmdbal07XG4gICAgICAgIGxldCBmID0gcDBbMV0gKiBwMVswXSAtIHAxWzFdICogcDBbMF07XG5cbiAgICAgICAgeCArPSAocDBbMF0gKyBwMVswXSkgKiBmO1xuICAgICAgICB5ICs9IChwMFsxXSArIHAxWzFdKSAqIGY7XG4gICAgICAgIGFyZWEgKz0gZiAqIDM7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4IC8gYXJlYSwgeSAvIGFyZWFdO1xufTtcblxuR2VvLm11bHRpQ2VudHJvaWQgPSBmdW5jdGlvbiAocG9seWdvbnMpIHtcbiAgICBsZXQgbiA9IHBvbHlnb25zLmxlbmd0aDtcbiAgICBsZXQgY2VudHJvaWQgPSBbMCwgMF07XG5cbiAgICBmb3IgKGxldCBwPTA7IHAgPCBwb2x5Z29ucy5sZW5ndGg7IHArKykge1xuICAgICAgICBsZXQgYyA9IEdlby5jZW50cm9pZChwb2x5Z29uc1twXSk7XG4gICAgICAgIGNlbnRyb2lkWzBdICs9IGNbMF07XG4gICAgICAgIGNlbnRyb2lkWzFdICs9IGNbMV07XG4gICAgfVxuXG4gICAgY2VudHJvaWRbMF0gLz0gbjtcbiAgICBjZW50cm9pZFsxXSAvPSBuO1xuXG4gICAgcmV0dXJuIGNlbnRyb2lkO1xufTtcblxuR2VvLnNpZ25lZFBvbHlnb25SaW5nQXJlYVN1bSA9IGZ1bmN0aW9uIChyaW5nKSB7XG4gICAgbGV0IGFyZWEgPSAwO1xuICAgIGxldCBuID0gcmluZy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4gLSAxOyBpKyspIHtcbiAgICAgICAgbGV0IHAwID0gcmluZ1tpXTtcbiAgICAgICAgbGV0IHAxID0gcmluZ1tpKzFdO1xuXG4gICAgICAgIGFyZWEgKz0gcDBbMF0gKiBwMVsxXSAtIHAxWzBdICogcDBbMV07XG4gICAgfVxuXG4gICAgYXJlYSArPSByaW5nW24gLSAxXVswXSAqIHJpbmdbMF1bMV0gLSByaW5nWzBdWzBdICogcmluZ1tuIC0gMV1bMV07XG4gICAgcmV0dXJuIGFyZWE7XG59O1xuXG5HZW8ucG9seWdvblJpbmdBcmVhID0gZnVuY3Rpb24gKHJpbmcpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoR2VvLnNpZ25lZFBvbHlnb25SaW5nQXJlYVN1bShyaW5nKSkgLyAyO1xufTtcblxuLy8gVE9ETzogc3VidHJhY3QgaW5uZXIgcmluZ3Ncbkdlby5wb2x5Z29uQXJlYSA9IGZ1bmN0aW9uIChwb2x5Z29uKSB7XG4gICAgcmV0dXJuIEdlby5wb2x5Z29uUmluZ0FyZWEocG9seWdvblswXSk7XG59O1xuXG5HZW8ubXVsdGlQb2x5Z29uQXJlYSA9IGZ1bmN0aW9uIChwb2x5Z29ucykge1xuICAgIGxldCBhcmVhID0gMDtcblxuICAgIGZvciAobGV0IHA9MDsgcCA8IHBvbHlnb25zLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgIGFyZWEgKz0gR2VvLnBvbHlnb25BcmVhKHBvbHlnb25zW3BdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJlYTtcbn07XG5cbkdlby5yaW5nV2luZGluZyA9IGZ1bmN0aW9uIChyaW5nKSB7XG4gICAgbGV0IGFyZWEgPSBHZW8uc2lnbmVkUG9seWdvblJpbmdBcmVhU3VtKHJpbmcpO1xuICAgIGlmIChhcmVhID4gMCkge1xuICAgICAgICByZXR1cm4gJ0NXJztcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJlYSA8IDApIHtcbiAgICAgICAgcmV0dXJuICdDQ1cnO1xuICAgIH1cbiAgICAvLyByZXR1cm4gdW5kZWZpbmVkIG9uIHplcm8gYXJlYSBwb2x5Z29uXG59O1xuIiwiLy8gV2ViR0wgY29uc3RhbnRzIC0gbmVlZCB0byBpbXBvcnQgdGhlc2Ugc2VwYXJhdGVseSB0byBtYWtlIHRoZW0gYXZhaWxhYmxlIGluIHRoZSB3ZWIgd29ya2VyXG5cbnZhciBnbDtcbmV4cG9ydCBkZWZhdWx0IGdsID0ge307XG5cbi8qIERhdGFUeXBlICovXG5nbC5CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDA7XG5nbC5VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgPSAweDE0MDE7XG5nbC5TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDI7XG5nbC5VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgPSAweDE0MDM7XG5nbC5JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDQ7XG5nbC5VTlNJR05FRF9JTlQgICAgICAgICAgICAgICAgICAgPSAweDE0MDU7XG5nbC5GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDY7XG4iLCIvLyBXZWJHTCBjb250ZXh0IHdyYXBwZXJcblxudmFyIENvbnRleHQ7XG5leHBvcnQgZGVmYXVsdCBDb250ZXh0ID0ge307XG5cbi8vIFNldHVwIGEgV2ViR0wgY29udGV4dFxuLy8gSWYgbm8gY2FudmFzIGVsZW1lbnQgaXMgcHJvdmlkZWQsIG9uZSBpcyBjcmVhdGVkIGFuZCBhZGRlZCB0byB0aGUgZG9jdW1lbnQgYm9keVxuQ29udGV4dC5nZXRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q29udGV4dCAoY2FudmFzLCBvcHRpb25zKVxue1xuICAgIHZhciBmdWxsc2NyZWVuID0gZmFsc2U7XG4gICAgaWYgKGNhbnZhcyA9PSBudWxsKSB7XG4gICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICBjYW52YXMuc3R5bGUudG9wID0gMDtcbiAgICAgICAgY2FudmFzLnN0eWxlLmxlZnQgPSAwO1xuICAgICAgICBjYW52YXMuc3R5bGUuekluZGV4ID0gLTE7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICAgICAgZnVsbHNjcmVlbiA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGdsID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgb3B0aW9ucykgfHwgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIG9wdGlvbnMpO1xuICAgIGlmICghZ2wpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgY3JlYXRlIFdlYkdMIGNvbnRleHQuXCIpO1xuICAgIH1cblxuICAgIGlmICghZnVsbHNjcmVlbikge1xuICAgICAgICBDb250ZXh0LnJlc2l6ZShnbCwgcGFyc2VGbG9hdChjYW52YXMuc3R5bGUud2lkdGgpLCBwYXJzZUZsb2F0KGNhbnZhcy5zdHlsZS5oZWlnaHQpLCBvcHRpb25zLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBDb250ZXh0LnJlc2l6ZShnbCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCwgb3B0aW9ucy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgQ29udGV4dC5yZXNpemUoZ2wsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQsIG9wdGlvbnMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdsO1xufTtcblxuQ29udGV4dC5yZXNpemUgPSBmdW5jdGlvbiAoZ2wsIHdpZHRoLCBoZWlnaHQsIGRldmljZV9waXhlbF9yYXRpbylcbntcbiAgICBkZXZpY2VfcGl4ZWxfcmF0aW8gPSBkZXZpY2VfcGl4ZWxfcmF0aW8gfHwgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcbiAgICBnbC5jYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG4gICAgZ2wuY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gICAgZ2wuY2FudmFzLndpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCAqIGRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgZ2wuY2FudmFzLmhlaWdodCA9IE1hdGgucm91bmQoaGVpZ2h0ICogZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgIGdsLnZpZXdwb3J0KDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCk7XG59O1xuIiwiLy8gV2ViR0wgZXh0ZW5zaW9uIHdyYXBwZXJcbi8vIFN0b3JlcyBleHRlbnNpb25zIGJ5IG5hbWUgYW5kIEdMIGNvbnRleHRcblxuLy8gbGlzdCBvZiBleHRlbnNpb24gYXJyYXlzLCBmb3IgZWFjaCBlbnRyeSwgMXN0IGVsZW1lbnQgR0wgY29udGV4dCwgMm5kIG1hcCBvZiBleHRlbnNpb25zIGJ5IG5hbWVcbmxldCBleHRlbnNpb25zID0gW107XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEV4dGVuc2lvbiAoZ2wsIG5hbWUpIHtcbiAgICBsZXQgZXh0cyA9IGV4dGVuc2lvbnMuZmlsdGVyKGUgPT4gZVswXSA9PT0gZ2wpWzBdO1xuICAgIGV4dHMgPSBleHRzICYmIGV4dHNbMV07XG5cbiAgICBpZiAoIWV4dHMpIHtcbiAgICAgICAgZXh0ZW5zaW9ucy5wdXNoKFtnbCwge31dKTtcbiAgICAgICAgZXh0cyA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9ucy5sZW5ndGgtMV1bMV07XG4gICAgfVxuXG4gICAgaWYgKCFleHRzW25hbWVdKSB7XG4gICAgICAgIGV4dHNbbmFtZV0gPSBnbC5nZXRFeHRlbnNpb24obmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBleHRzW25hbWVdO1xufVxuIiwidmFyIEdMU0wgPSB7fTtcbmV4cG9ydCBkZWZhdWx0IEdMU0w7XG5cbi8qKlxuICAgIFBhcnNlIHVuaWZvcm1zIGZyb20gYSBKUyBvYmplY3QsIGluZmVycyB0eXBlcyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggdGhlXG4gICAgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIHNldCB1bmlmb3JtIHZhbHVlcyBvbiBhIEdMIHByb2dyYW0uIEVhY2ggb2JqZWN0IGluIHRoZSByZXR1cm5lZFxuICAgIGFycmF5IGhhcyB0aGUgZm9ybTpcbiAgICB7IHR5cGUsIG1ldGhvZCwgbmFtZSwgdmFsdWUgfVxuXG4gICAgdHlwZTogdGhlIEdMIHVuaWZvcm0gdHlwZSwgc3VjaCBhcyAndmVjMycsICdmbG9hdCcsIGV0Yy5cbiAgICBtZXRob2Q6IHRoZSBHTCB1bmlmb3JtIHNldHRlciBtZXRob2QgdG8gdXNlLCBzdWNoIGFzICcxZicsICczZnYnLCBldGMuXG4gICAgbmFtZTogdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBHTCB1bmlmb3JtIGxvY2F0aW9uLCBlLmcuICdhcnJheVswXS5maWVsZCcsIGV0Yy5cbiAgICB2YWx1ZTogdGhlIHZhbHVlIHRvIGJlIHBhc3NlZCB0byB0aGUgR0wgdW5pZm9ybSBzZXR0ZXIgZm9yIHRoYXQgdHlwZSwgZS5nLiBbMSwgMiwgM10gZm9yIGEgdmVjM1xuXG4gICAgVGV4dHVyZXMgaGF2ZSBzcGVjaWFsIGJlaGF2aW9yOiB1bmlmb3JtcyB3aXRoIHN0cmluZyB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgdGV4dHVyZXMsIGFuZFxuICAgIHRoZSBzdHJpbmcgaXMgdXNlZCBhcyBhIHVuaXF1ZSB0ZXh0dXJlICdrZXknIHRvIGJlIGludGVycHJldGVkIGJ5IHRoZSBjYWxsZXIgKHdoaWNoIGlzIHJlc3BvbnNpYmxlXG4gICAgZm9yIGFjdHVhbGx5IHNldHRpbmcgdGhlIHVuaWZvcm1zKS4gRm9yIGV4YW1wbGUsIHRoaXMgY291bGQgYmUgdXNlZCBhcyBhIGtleSBpbnRvIGEgZGljdGlvbmFyeSBvZlxuICAgIGtub3duIHRleHR1cmUgbmFtZXMsIG9yIGl0IGNvdWxkIHNpbXBseSBiZSB1c2VkIGFzIGEgVVJMIHRvIGR5bmFtaWNhbGx5IGxvYWQgdGhlIHRleHR1cmUgZnJvbS5cbiovXG5HTFNMLnBhcnNlVW5pZm9ybXMgPSBmdW5jdGlvbiAodW5pZm9ybXMpIHtcbiAgICB2YXIgcGFyc2VkID0gW107XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIHVuaWZvcm1zKSB7XG4gICAgICAgIHZhciBrZXkgPSBuYW1lOyAvLyBzYXZlIHRoZSBvcmlnaW5hbCBuYW1lXG4gICAgICAgIHZhciB1bmlmb3JtID0gdW5pZm9ybXNbbmFtZV07XG4gICAgICAgIHZhciB1O1xuXG4gICAgICAgIC8vIFNpbmdsZSBmbG9hdFxuICAgICAgICBpZiAodHlwZW9mIHVuaWZvcm0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Zsb2F0JyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICcxZicsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5OiB2ZWN0b3IsIGFycmF5IG9mIGZsb2F0cywgYXJyYXkgb2YgdGV4dHVyZXNcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh1bmlmb3JtKSkge1xuICAgICAgICAgICAgLy8gTnVtZXJpYyB2YWx1ZXNcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdW5pZm9ybVswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAvLyBmbG9hdCB2ZWN0b3JzICh2ZWMyLCB2ZWMzLCB2ZWM0KVxuICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtLmxlbmd0aCA+PSAyICYmIHVuaWZvcm0ubGVuZ3RoIDw9IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZlYycgKyB1bmlmb3JtLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogdW5pZm9ybS5sZW5ndGggKyAnZnYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGZsb2F0IGFycmF5XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodW5pZm9ybS5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdmbG9hdFtdJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJzFmdicsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lICsgJ1swXScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBhc3N1bWUgbWF0cml4IGZvciAodHlwZW9mID09IEZsb2F0MzJBcnJheSAmJiBsZW5ndGggPT0gMTYpP1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXJyYXkgb2YgdGV4dHVyZXNcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB1bmlmb3JtWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGZvciAodT0wOyB1IDwgdW5pZm9ybS5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc2FtcGxlcjJEJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJzFpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUgKyAnWycgKyB1ICsgJ10nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm1bdV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtczogdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBcnJheSBvZiBhcnJheXMgLSBidXQgb25seSBhcnJheXMgb2YgdmVjdG9ycyBhcmUgYWxsb3dlZCBpbiB0aGlzIGNhc2VcbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodW5pZm9ybVswXSkgJiYgdHlwZW9mIHVuaWZvcm1bMF1bMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgLy8gZmxvYXQgdmVjdG9ycyAodmVjMiwgdmVjMywgdmVjNClcbiAgICAgICAgICAgICAgICBpZiAodW5pZm9ybVswXS5sZW5ndGggPj0gMiAmJiB1bmlmb3JtWzBdLmxlbmd0aCA8PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgZm9yICh1PTA7IHUgPCB1bmlmb3JtLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZlYycgKyB1bmlmb3JtWzBdLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHVuaWZvcm1bdV0ubGVuZ3RoICsgJ2Z2JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lICsgJ1snICsgdSArICddJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybVt1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVE9ETzogZWxzZSB3YXJuaW5nXG4gICAgICAgIH1cbiAgICAgICAgLy8gQm9vbGVhblxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdW5pZm9ybSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2wnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJzFpJyxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGV4dHVyZVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdW5pZm9ybSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2FtcGxlcjJEJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZDtcbn07XG5cbi8qKlxuICAgIEdlbmVyYXRlIGEgR0xTTCB2YXJpYWJsZSBkZWZpbml0aW9uIGZyb20gYSBKUyBvYmplY3RcbiovXG5HTFNMLmRlZmluZVZhcmlhYmxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIHR5cGUsIGFycmF5O1xuXG4gICAgLy8gU2luZ2xlIGZsb2F0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdHlwZSA9ICdmbG9hdCc7XG4gICAgfVxuICAgIC8vIE11bHRpcGxlIGZsb2F0cyAtIHZlY3RvciBvciBhcnJheVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIC8vIE51bWVyaWMgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWVbMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAvLyBmbG9hdCB2ZWN0b3JzICh2ZWMyLCB2ZWMzLCB2ZWM0KVxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+PSAyICYmIHZhbHVlLmxlbmd0aCA8PSA0KSB7XG4gICAgICAgICAgICAgICAgdHlwZSA9ICd2ZWMnICsgdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZmxvYXQgYXJyYXlcbiAgICAgICAgICAgIGVsc2UgeyAvL2lmICh2YWx1ZS5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdmbG9hdCc7XG4gICAgICAgICAgICAgICAgYXJyYXkgPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPOiBhc3N1bWUgbWF0cml4IGZvciAodHlwZW9mID09IEZsb2F0MzJBcnJheSAmJiBsZW5ndGggPT0gMTYpP1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5IG9mIHRleHR1cmVzXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZVswXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnc2FtcGxlcjJEJztcbiAgICAgICAgICAgIGFycmF5ID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEJvb2xlYW5cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICB0eXBlID0gJ2Jvb2wnO1xuICAgIH1cbiAgICAvLyBUZXh0dXJlXG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0eXBlID0gJ3NhbXBsZXIyRCc7XG4gICAgfVxuXG4gICAgLy8gQ29uc3RydWN0IHZhcmlhYmxlIGRlZmluaXRpb25cbiAgICB2YXIgdmFyaWFibGUgPSAnJztcbiAgICB2YXJpYWJsZSArPSBgJHt0eXBlfSAke25hbWV9YDtcbiAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgdmFyaWFibGUgKz0gYFske2FycmF5fV1gO1xuICAgIH1cbiAgICB2YXJpYWJsZSArPSAnO1xcbic7XG5cbiAgICByZXR1cm4gdmFyaWFibGU7XG59O1xuXG4vKipcbiAgICBHZW5lcmF0ZSBhIEdMU0wgdW5pZm9ybSBkZWZpbml0aW9uIGZyb20gYSBKUyBvYmplY3RcbiovXG5HTFNMLmRlZmluZVVuaWZvcm0gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gJ3VuaWZvcm0gJyArIEdMU0wuZGVmaW5lVmFyaWFibGUobmFtZSwgdmFsdWUpO1xufTtcblxuLyoqXG4gICAgQ2hlY2sgZm9yIGEgdW5pZm9ybSBkZWZpbml0aW9uIG9mICduYW1lJyBpbiB0aGUgcHJvdmlkZWQgR0xTTCBzb3VyY2VcbiAgICBTaW1wbGUgcmVnZXggY2hlY2sgZm9yICd1bmlmb3JtJyBrZXl3b3JkIGFuZCB2YXIgbmFtZSwgZG9lcyBub3QgYXR0ZW1wdCB0byBwYXJzZS9leHRyYWN0IEdMU0xcbiAgICBOT1RFOiBhc3N1bWVzIGNvbW1lbnRzIGhhdmUgYmVlbiBzdHJpcHBlZCBmcm9tIHNvdXJjZVxuKi9cbkdMU0wuaXNVbmlmb3JtRGVmaW5lZCA9IGZ1bmN0aW9uIChuYW1lLCBzb3VyY2UpIHtcbiAgICAvLyBNYXRjaCwgaW4gb3JkZXI6XG4gICAgLy8gLSB0aGUga2V5d29yZCAndW5pZm9ybSdcbiAgICAvLyAtIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgdGhhdCBpcyBhbnl0aGluZyBleGNlcHQgYSBzZW1pY29sb24sIDtcbiAgICAvLyAtIG9wdGlvbmFsbHksIGFueXRoaW5nIGVuY2xvc2VkIGluIGN1cmx5IGJyYWNlcywgeyAuLi4gfSAoYW4gaW5saW5lIHN0cnVjdHVyZSBkZWZpbml0aW9uIGNhbiBnbyBoZXJlKVxuICAgIC8vIC0gb3B0aW9uYWxseSwgYW55ICMgb2YgY2hhcmFjdGVycyB0aGF0IGlzIG5vdCBhIHNlbWljb2xvbiwgO1xuICAgIC8vIC0gdGhlIG5hbWUgb2YgdGhlIHVuaWZvcm1cblxuICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ3VuaWZvcm1bXjtdKyg/OntbXFxcXHNcXFxcU10qfSk/W147XSpcXFxcYicgKyBuYW1lICsgJ1xcXFxiJywgJ2cnKTtcbiAgICBpZiAoc291cmNlLm1hdGNoKHJlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gICAgQ2hlY2sgdGhhdCBhIHN5bWJvbCBpcyByZWZlcmVuY2VkIGluIHRoZSBHTFNMIHNvdXJjZVxuICAgIE5PVEU6IGFzc3VtZXMgY29tbWVudHMgaGF2ZSBiZWVuIHN0cmlwcGVkIGZyb20gc291cmNlXG4qL1xuR0xTTC5pc1N5bWJvbFJlZmVyZW5jZWQgPSBmdW5jdGlvbiAobmFtZSwgc291cmNlKSB7XG4gICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgnXFxcXGInICsgbmFtZSArICdcXFxcYicsICdnJyk7XG4gICAgaWYgKHNvdXJjZS5zZWFyY2gocmUpID49IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICAgIEV4cGFuZCBhIHNpbmdsZSB2YWx1ZSBvciAyLWVsZW1lbnQgYXJyYXkgaW50byBhIDMtZWxlbWVudCBhcnJheSwgd2l0aCB0aGUgbGFzdCAoIHogKVxuICAgIGNvb3JkaW5hdGUgZGVmYXVsdGluZyB0byAxICh3aXRoIG9wdGlvbiB0byBzcGVjaWZ5KS4gQWxzbyBydW5zIHBhcnNlRmxvYXQgdG8gdHJ5IHRvIG1haW50YWluXG4gICAgZGF0YSBpbnRlZ3JpdHkuIFJldHVybnMgbnVsbCBpZiBpbnB1dCBjb3VsZG4ndCBiZSBwYXJzZWQuXG4qL1xuR0xTTC5leHBhbmRWZWMzID0gZnVuY3Rpb24gKHYsIHogPSAxKSB7XG4gICAgbGV0IHg7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgaWYgKHYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB4ID0gWy4uLnYsIHpdLm1hcChwYXJzZUZsb2F0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB4ID0gW3YsIHYsIHZdLm1hcChwYXJzZUZsb2F0KTtcbiAgICB9XG5cbiAgICBpZiAoeCAmJiB4LmV2ZXJ5KG4gPT4gdHlwZW9mIG4gPT09ICdudW1iZXInICYmICFpc05hTihuKSkpIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxufTtcblxuLyoqXG4gICAgRXhwYW5kIGEgc2luZ2xlIHZhbHVlIG9yIDMtZWxlbWVudCBhcnJheSBpbnRvIGEgNC1lbGVtZW50IGFycmF5LCB3aXRoIHRoZSBsYXN0IChlLmcuIHcgb3IgYSlcbiAgICBjb29yZGluYXRlIGRlZmF1bHRpbmcgdG8gMSAod2l0aCBvcHRpb24gdG8gc3BlY2lmeSkuIEFsc28gcnVucyBwYXJzZUZsb2F0IHRvIHRyeSB0byBtYWludGFpblxuICAgIGRhdGEgaW50ZWdyaXR5LiBSZXR1cm5zIG51bGwgaWYgaW5wdXQgY291bGRuJ3QgYmUgcGFyc2VkLlxuKi9cbkdMU0wuZXhwYW5kVmVjNCA9IGZ1bmN0aW9uICh2LCB3ID0gMSkge1xuICAgIGxldCB4O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIGlmICh2Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgeCA9IFsuLi52LCB3XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgeCA9IFt2LCB2LCB2LCB3XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgfVxuXG4gICAgaWYgKHggJiYgeC5ldmVyeShuID0+IHR5cGVvZiBuID09PSAnbnVtYmVyJyAmJiAhaXNOYU4obikpKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbn07XG5cblxuIiwiXG5leHBvcnQgY2xhc3MgUmVuZGVyU3RhdGUge1xuXHRjb25zdHJ1Y3RvciAodmFsdWUsIHNldHVwKSB7XG4gICAgICAgIHNldHVwKHZhbHVlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNldHVwID0gc2V0dXA7XG4gICAgfVxuXG4gICAgc2V0ICh2YWx1ZSkge1xuICAgIFx0Ly8gaWYgdGhlIHN0YXRlcyBhcmUgZGlmZmVyZW50LCBjYWxsIHRoZSBHTCBjb250ZXh0IGZvciBhIHN0YXRlIGNoYW5nZVxuICAgIFx0aWYgKEpTT04uc3RyaW5naWZ5KHRoaXMudmFsdWUpICE9PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIHtcbiAgICBcdFx0dGhpcy5zZXR1cCh2YWx1ZSk7XG4gICAgXHRcdHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICBcdH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlbmRlclN0YXRlTWFuYWdlciB7XG5cbiAgICBjb25zdHJ1Y3RvciAoZ2wpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0cyA9IHt9O1xuXG4gICAgICAgIC8vIEN1bGxpbmdcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5jdWxsaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5jdWxsaW5nX2ZhY2UgPSBnbC5CQUNLO1xuXG4gICAgICAgIC8vIEJsZW5kaW5nXG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19zcmMgPSBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX2RzdCA9IGdsLk9ORV9NSU5VU19TUkNfQUxQSEE7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfc3JjX2FscGhhID0gZ2wuT05FO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX2RzdF9hbHBoYSA9IGdsLk9ORV9NSU5VU19TUkNfQUxQSEE7XG5cbiAgICAgICAgLy8gRGVwdGggdGVzdC93cml0ZVxuICAgICAgICB0aGlzLmRlZmF1bHRzLmRlcHRoX3dyaXRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5kZXB0aF90ZXN0ID0gdHJ1ZTtcbiAgICAgICAgZ2wuZGVwdGhGdW5jKGdsLkxFU1MpOyAvLyBkZXB0aCBmdW5jdGlvbiBvbmx5IG5lZWRzIHRvIGJlIHNldCBvbmNlXG5cbiAgICBcdC8vIEN1bGxpbmdcbiAgICAgICAgdGhpcy5jdWxsaW5nID0gbmV3IFJlbmRlclN0YXRlKFxuICAgICAgICAgICAgeyBjdWxsOiB0aGlzLmRlZmF1bHRzLmN1bGxpbmcsIGZhY2U6IHRoaXMuZGVmYXVsdHMuY3VsbGluZ19mYWNlIH0sXG4gICAgXHRcdCh2YWx1ZSkgPT4ge1xuICAgIFx0XHRcdGlmICh2YWx1ZS5jdWxsKSB7XG4gICAgXHRcdFx0XHRnbC5lbmFibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICAgICAgICAgIFx0XHRnbC5jdWxsRmFjZSh2YWx1ZS5mYWNlKTtcbiAgICBcdFx0XHR9IGVsc2Uge1xuICAgIFx0XHRcdFx0Z2wuZGlzYWJsZShnbC5DVUxMX0ZBQ0UpO1xuICAgIFx0XHRcdH1cbiAgICBcdFx0fVxuICAgIFx0KTtcblxuICAgIFx0Ly8gQmxlbmRpbmcgbW9kZVxuICAgICAgICB0aGlzLmJsZW5kaW5nID0gbmV3IFJlbmRlclN0YXRlKHtcbiAgICAgICAgICAgICAgICBibGVuZDogdGhpcy5kZWZhdWx0cy5ibGVuZGluZyxcbiAgICAgICAgICAgICAgICBzcmM6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfc3JjLFxuICAgICAgICAgICAgICAgIGRzdDogdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3QsXG4gICAgICAgICAgICAgICAgc3JjX2FscGhhOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyY19hbHBoYSxcbiAgICAgICAgICAgICAgICBkc3RfYWxwaGE6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfZHN0X2FscGhhXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgXHRcdFx0aWYgKHZhbHVlLmJsZW5kKSB7XG4gICAgICAgICAgICBcdFx0Z2wuZW5hYmxlKGdsLkJMRU5EKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3JjX2FscGhhICYmIHZhbHVlLmRzdF9hbHBoYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2wuYmxlbmRGdW5jU2VwYXJhdGUodmFsdWUuc3JjLCB2YWx1ZS5kc3QsIHZhbHVlLnNyY19hbHBoYSwgdmFsdWUuZHN0X2FscGhhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmJsZW5kRnVuYyh2YWx1ZS5zcmMsIHZhbHVlLmRzdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICBcdFx0XHR9IGVsc2Uge1xuICAgIFx0XHRcdFx0Z2wuZGlzYWJsZShnbC5CTEVORCk7XG4gICAgXHRcdFx0fVxuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgXHQvLyBEZXB0aCB3cml0ZVxuICAgICAgICB0aGlzLmRlcHRoX3dyaXRlID0gbmV3IFJlbmRlclN0YXRlKFxuICAgICAgICAgICAgeyBkZXB0aF93cml0ZTogdGhpcy5kZWZhdWx0cy5kZXB0aF93cml0ZSB9LFxuICAgIFx0XHQodmFsdWUpID0+IHtcbiAgICAgICAgXHRcdGdsLmRlcHRoTWFzayh2YWx1ZS5kZXB0aF93cml0ZSk7XG4gICAgXHRcdH1cbiAgICBcdCk7XG5cbiAgICBcdC8vIERlcHRoIHRlc3RcbiAgICAgICAgdGhpcy5kZXB0aF90ZXN0ID0gbmV3IFJlbmRlclN0YXRlKFxuICAgICAgICAgICAgeyBkZXB0aF90ZXN0OiB0aGlzLmRlZmF1bHRzLmRlcHRoX3Rlc3QgfSxcbiAgICAgICAgICAgICh2YWx1ZSkgPT4ge1xuICAgIFx0XHRcdGlmICh2YWx1ZS5kZXB0aF90ZXN0KSB7XG4gICAgICAgICAgICBcdFx0Z2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgIFx0XHRcdH0gZWxzZSB7XG4gICAgICAgICAgICBcdFx0Z2wuZGlzYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdCk7XG5cbiAgICB9XG5cbn1cbiIsIi8vIEdMIHByb2dyYW0gd3JhcHBlciB0byBjYWNoZSB1bmlmb3JtIGxvY2F0aW9ucy92YWx1ZXMsIGRvIGNvbXBpbGUtdGltZSBwcmUtcHJvY2Vzc2luZ1xuLy8gKGluamVjdGluZyAjZGVmaW5lcyBhbmQgI3ByYWdtYSBibG9ja3MgaW50byBzaGFkZXJzKSwgZXRjLlxuXG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgR0xTTCBmcm9tICcuL2dsc2wnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlJztcbmltcG9ydCBnZXRFeHRlbnNpb24gZnJvbSAnLi9leHRlbnNpb25zJztcblxuaW1wb3J0IHN0cmlwIGZyb20gJ3N0cmlwLWNvbW1lbnRzJztcbmltcG9ydCB7IGRlZmF1bHQgYXMgcGFyc2VTaGFkZXJFcnJvcnMgfSBmcm9tICdnbC1zaGFkZXItZXJyb3JzJztcblxuLy8gUmVnZXggcGF0dGVybnNcbmNvbnN0IHJlX3ByYWdtYSA9IC9eXFxzKiNwcmFnbWEuKiQvZ207ICAgLy8gZm9yIHJlbW92aW5nIHVudXNlZCBwcmFnbWFzIGFmdGVyIHNoYWRlciBibG9jayBpbmplY3Rpb25cbmNvbnN0IHJlX2NvbnRpbnVlX2xpbmUgPSAvXFxcXFxccypcXG4vbWc7ICAgLy8gZm9yIHJlbW92aW5nIGJhY2tzbGFzaCBsaW5lIGNvbnRpbnVhdGlvbnNcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hhZGVyUHJvZ3JhbSB7XG5cbiAgICBjb25zdHJ1Y3RvcihnbCwgdmVydGV4X3NvdXJjZSwgZnJhZ21lbnRfc291cmNlLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbXBpbGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcblxuICAgICAgICAvLyBrZXkvdmFsdWVzIGluc2VydGVkIGFzICNkZWZpbmVzIGludG8gc2hhZGVycyBhdCBjb21waWxlLXRpbWVcbiAgICAgICAgdGhpcy5kZWZpbmVzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5kZWZpbmVzfHx7fSk7XG5cbiAgICAgICAgLy8ga2V5L3ZhbHVlcyBmb3IgYmxvY2tzIHRoYXQgY2FuIGJlIGluamVjdGVkIGludG8gc2hhZGVycyBhdCBjb21waWxlLXRpbWVcbiAgICAgICAgdGhpcy5ibG9ja3MgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmJsb2Nrc3x8e30pO1xuICAgICAgICB0aGlzLmJsb2NrX3Njb3BlcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuYmxvY2tfc2NvcGVzfHx7fSk7XG5cbiAgICAgICAgLy8gbGlzdCBvZiBleHRlbnNpb25zIHRvIGFjdGl2YXRlXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IG9wdGlvbnMuZXh0ZW5zaW9ucyB8fCBbXTtcblxuICAgICAgICAvLyBKUy1vYmplY3QgdW5pZm9ybXMgdGhhdCBhcmUgZXhwZWN0ZWQgYnkgdGhpcyBwcm9ncmFtXG4gICAgICAgIC8vIElmIHRoZXkgYXJlIG5vdCBmb3VuZCBpbiB0aGUgZXhpc3Rpbmcgc2hhZGVyIHNvdXJjZSwgdGhlaXIgdHlwZXMgd2lsbCBiZSBpbmZlcnJlZCBhbmQgZGVmaW5pdGlvbnNcbiAgICAgICAgLy8gZm9yIGVhY2ggd2lsbCBiZSBpbmplY3RlZC5cbiAgICAgICAgdGhpcy5kZXBlbmRlbnRfdW5pZm9ybXMgPSBvcHRpb25zLnVuaWZvcm1zO1xuXG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSB7fTsgLy8gcHJvZ3JhbSBsb2NhdGlvbnMgb2YgdW5pZm9ybXMsIGxhemlseSBhZGRlZCBhcyBlYWNoIHVuaWZvcm0gaXMgc2V0XG4gICAgICAgIHRoaXMuYXR0cmlicyA9IHt9OyAvLyBwcm9ncmFtIGxvY2F0aW9ucyBvZiB2ZXJ0ZXggYXR0cmlidXRlcywgbGF6aWx5IGFkZGVkIGFzIGVhY2ggYXR0cmlidXRlIGlzIGFjY2Vzc2VkXG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfc291cmNlID0gdmVydGV4X3NvdXJjZTtcbiAgICAgICAgdGhpcy5mcmFnbWVudF9zb3VyY2UgPSBmcmFnbWVudF9zb3VyY2U7XG5cbiAgICAgICAgdGhpcy5pZCA9IFNoYWRlclByb2dyYW0uaWQrKztcbiAgICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lOyAvLyBjYW4gcHJvdmlkZSBhIHByb2dyYW0gbmFtZSAodXNlZnVsIGZvciBkZWJ1Z2dpbmcpXG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5nbC51c2VQcm9ncmFtKG51bGwpO1xuICAgICAgICB0aGlzLmdsLmRlbGV0ZVByb2dyYW0odGhpcy5wcm9ncmFtKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgdGhpcy51bmlmb3JtcyA9IHt9O1xuICAgICAgICB0aGlzLmF0dHJpYnMgPSB7fTtcbiAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFVzZSBwcm9ncmFtIHdyYXBwZXIgd2l0aCBzaW1wbGUgc3RhdGUgY2FjaGVcbiAgICB1c2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFNoYWRlclByb2dyYW0uY3VycmVudCAhPT0gdGhpcykge1xuICAgICAgICAgICAgdGhpcy5nbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gICAgICAgIH1cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5jdXJyZW50ID0gdGhpcztcbiAgICB9XG5cbiAgICBjb21waWxlKCkge1xuICAgICAgICBpZiAodGhpcy5jb21waWxpbmcpIHtcbiAgICAgICAgICAgIHRocm93KG5ldyBFcnJvcihgU2hhZGVyUHJvZ3JhbS5jb21waWxlKCk6IHNraXBwaW5nIGZvciAke3RoaXMuaWR9ICgke3RoaXMubmFtZX0pIGJlY2F1c2UgYWxyZWFkeSBjb21waWxpbmdgKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21waWxpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuXG4gICAgICAgIC8vIENvcHkgc291cmNlcyBmcm9tIHByZS1tb2RpZmllZCB0ZW1wbGF0ZVxuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLnZlcnRleF9zb3VyY2U7XG4gICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gdGhpcy5mcmFnbWVudF9zb3VyY2U7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGV4dGVuc2lvbiBhdmFpbGFiaWxpdHlcbiAgICAgICAgbGV0IGV4dGVuc2lvbnMgPSB0aGlzLmNoZWNrRXh0ZW5zaW9ucygpO1xuXG4gICAgICAgIC8vIE1ha2UgbGlzdCBvZiBkZWZpbmVzIHRvIGJlIGluamVjdGVkIGxhdGVyXG4gICAgICAgIHZhciBkZWZpbmVzID0gdGhpcy5idWlsZERlZmluZUxpc3QoKTtcblxuICAgICAgICAvLyBJbmplY3QgdXNlci1kZWZpbmVkIGJsb2NrcyAoYXJiaXRyYXJ5IGNvZGUgcG9pbnRzIG1hdGNoaW5nIG5hbWVkICNwcmFnbWFzKVxuICAgICAgICAvLyBSZXBsYWNlIGFjY29yZGluZyB0byB0aGlzIHBhdHRlcm46XG4gICAgICAgIC8vICNwcmFnbWEgdGFuZ3JhbTogW2tleV1cbiAgICAgICAgLy8gZS5nLiAjcHJhZ21hIHRhbmdyYW06IGdsb2JhbFxuXG4gICAgICAgIC8vIEdhdGhlciBhbGwgYmxvY2sgY29kZSBzbmlwcGV0c1xuICAgICAgICB2YXIgYmxvY2tzID0gdGhpcy5idWlsZFNoYWRlckJsb2NrTGlzdCgpO1xuICAgICAgICB2YXIgcmVnZXhwO1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBibG9ja3MpIHtcbiAgICAgICAgICAgIHZhciBibG9jayA9IGJsb2Nrc1trZXldO1xuICAgICAgICAgICAgaWYgKCFibG9jayB8fCAoQXJyYXkuaXNBcnJheShibG9jaykgJiYgYmxvY2subGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaXJzdCBmaW5kIGNvZGUgcmVwbGFjZSBwb2ludHMgaW4gc2hhZGVyc1xuICAgICAgICAgICAgcmVnZXhwID0gbmV3IFJlZ0V4cCgnXlxcXFxzKiNwcmFnbWFcXFxccyt0YW5ncmFtOlxcXFxzKycgKyBrZXkgKyAnXFxcXHMqJCcsICdtJyk7XG4gICAgICAgICAgICB2YXIgaW5qZWN0X3ZlcnRleCA9IHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZS5tYXRjaChyZWdleHApO1xuICAgICAgICAgICAgdmFyIGluamVjdF9mcmFnbWVudCA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLm1hdGNoKHJlZ2V4cCk7XG5cbiAgICAgICAgICAgIC8vIEF2b2lkIG5ldHdvcmsgcmVxdWVzdCBpZiBub3RoaW5nIHRvIHJlcGxhY2VcbiAgICAgICAgICAgIGlmIChpbmplY3RfdmVydGV4ID09IG51bGwgJiYgaW5qZWN0X2ZyYWdtZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ29tYmluZSBhbGwgYmxvY2tzIGludG8gb25lIHN0cmluZ1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9ICcnO1xuICAgICAgICAgICAgYmxvY2suZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE1hcmsgc3RhcnQgYW5kIGVuZCBvZiBlYWNoIGJsb2NrIHdpdGggbWV0YWRhdGEgKHdoaWNoIGNhbiBiZSBleHRyYWN0ZWQgZnJvbVxuICAgICAgICAgICAgICAgIC8vIGZpbmFsIHNvdXJjZSBmb3IgZXJyb3IgaGFuZGxpbmcsIGRlYnVnZ2luZywgZXRjLilcbiAgICAgICAgICAgICAgICBsZXQgbWFyayA9IGAke3ZhbC5zY29wZX0sICR7dmFsLmtleX0sICR7dmFsLm51bX1gO1xuICAgICAgICAgICAgICAgIHNvdXJjZSArPSBgXFxuLy8gdGFuZ3JhbS1ibG9jay1zdGFydDogJHttYXJrfVxcbmA7XG4gICAgICAgICAgICAgICAgc291cmNlICs9IHZhbC5zb3VyY2U7XG4gICAgICAgICAgICAgICAgc291cmNlICs9IGBcXG4vLyB0YW5ncmFtLWJsb2NrLWVuZDogJHttYXJrfVxcbmA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gSW5qZWN0XG4gICAgICAgICAgICBpZiAoaW5qZWN0X3ZlcnRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLnJlcGxhY2UocmVnZXhwLCBzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluamVjdF9mcmFnbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZS5yZXBsYWNlKHJlZ2V4cCwgc291cmNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIGEgI2RlZmluZSBmb3IgdGhpcyBpbmplY3Rpb24gcG9pbnRcbiAgICAgICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fQkxPQ0tfJyArIGtleS5yZXBsYWNlKC9bXFxzLV0rL2csICdfJykudG9VcHBlckNhc2UoKV0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYW4tdXAgYW55ICNwcmFnbWFzIHRoYXQgd2VyZW4ndCByZXBsYWNlZCAodG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncylcbiAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLnJlcGxhY2UocmVfcHJhZ21hLCAnJyk7XG4gICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UucmVwbGFjZShyZV9wcmFnbWEsICcnKTtcblxuICAgICAgICAvLyBEZXRlY3QgdW5pZm9ybSBkZWZpbml0aW9ucywgaW5qZWN0IGFueSBtaXNzaW5nIG9uZXNcbiAgICAgICAgdGhpcy5lbnN1cmVVbmlmb3Jtcyh0aGlzLmRlcGVuZGVudF91bmlmb3Jtcyk7XG5cbiAgICAgICAgLy8gQnVpbGQgJiBpbmplY3QgZXh0ZW5zaW9ucyAmIGRlZmluZXNcbiAgICAgICAgLy8gVGhpcyBpcyBkb25lICphZnRlciogY29kZSBpbmplY3Rpb24gc28gdGhhdCB3ZSBjYW4gYWRkIGRlZmluZXMgZm9yIHdoaWNoIGNvZGUgcG9pbnRzIHdlcmUgaW5qZWN0ZWRcbiAgICAgICAgbGV0IHByZWNpc2lvbiA9ICcnO1xuICAgICAgICBsZXQgaGlnaCA9IHRoaXMuZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KHRoaXMuZ2wuRlJBR01FTlRfU0hBREVSLCB0aGlzLmdsLkhJR0hfRkxPQVQpO1xuICAgICAgICBpZiAoaGlnaCAmJiBoaWdoLnByZWNpc2lvbiA+IDApIHtcbiAgICAgICAgICAgIHByZWNpc2lvbiA9ICdwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XFxuJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByZWNpc2lvbiA9ICdwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcXG4nO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmaW5lc1snVEFOR1JBTV9WRVJURVhfU0hBREVSJ10gPSB0cnVlO1xuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX0ZSQUdNRU5UX1NIQURFUiddID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9XG4gICAgICAgICAgICBwcmVjaXNpb24gK1xuICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbS5idWlsZERlZmluZVN0cmluZyhkZWZpbmVzKSArXG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2U7XG5cbiAgICAgICAgLy8gUHJlY2lzaW9uIHF1YWxpZmllciBvbmx5IHZhbGlkIGluIGZyYWdtZW50IHNoYWRlclxuICAgICAgICAvLyBOQjogJyNleHRlbnNpb24nIHN0YXRlbWVudHMgYWRkZWQgdG8gZnJhZ21lbnQgc2hhZGVyIG9ubHksIGFzIElFMTEgdGhyb3dzIGVycm9yIHdoZW4gdGhleSBhcHBlYXIgaW5cbiAgICAgICAgLy8gdmVydGV4IHNoYWRlciAoZXZlbiB3aGVuIGd1YXJkZWQgYnkgI2lmZGVmKSwgYW5kIG5vIFdlYkdMIGV4dGVuc2lvbnMgcmVxdWlyZSAnI2V4dGVuc2lvbicgaW4gdmVydGV4IHNoYWRlcnNcbiAgICAgICAgZGVmaW5lc1snVEFOR1JBTV9WRVJURVhfU0hBREVSJ10gPSBmYWxzZTtcbiAgICAgICAgZGVmaW5lc1snVEFOR1JBTV9GUkFHTUVOVF9TSEFERVInXSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID1cbiAgICAgICAgICAgIFNoYWRlclByb2dyYW0uYnVpbGRFeHRlbnNpb25TdHJpbmcoZXh0ZW5zaW9ucykgK1xuICAgICAgICAgICAgcHJlY2lzaW9uICtcbiAgICAgICAgICAgIFNoYWRlclByb2dyYW0uYnVpbGREZWZpbmVTdHJpbmcoZGVmaW5lcykgK1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2U7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBtdWx0aS1saW5lIGJhY2tzbGFzaGVzXG4gICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZS5yZXBsYWNlKHJlX2NvbnRpbnVlX2xpbmUsICcnKTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZS5yZXBsYWNlKHJlX2NvbnRpbnVlX2xpbmUsICcnKTtcblxuICAgICAgICAvLyBDb21waWxlICYgc2V0IHVuaWZvcm1zIHRvIGNhY2hlZCB2YWx1ZXNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbSA9IFNoYWRlclByb2dyYW0udXBkYXRlUHJvZ3JhbSh0aGlzLmdsLCB0aGlzLnByb2dyYW0sIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSwgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcblxuICAgICAgICAgICAgLy8gc2hhZGVyIGVycm9yIGluZm9cbiAgICAgICAgICAgIGlmIChlcnJvci50eXBlID09PSAndmVydGV4JyB8fCBlcnJvci50eXBlID09PSAnZnJhZ21lbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkZXJfZXJyb3JzID0gZXJyb3IuZXJyb3JzO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hhZGVyX2Vycm9ycy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlLnR5cGUgPSBlcnJvci50eXBlO1xuICAgICAgICAgICAgICAgICAgICBlLmJsb2NrID0gdGhpcy5ibG9jayhlcnJvci50eXBlLCBlLmxpbmUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aHJvdyhuZXcgRXJyb3IoYFNoYWRlclByb2dyYW0uY29tcGlsZSgpOiBwcm9ncmFtICR7dGhpcy5pZH0gKCR7dGhpcy5uYW1lfSkgZXJyb3I6YCwgZXJyb3IpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXNlKCk7XG4gICAgICAgIHRoaXMucmVmcmVzaFVuaWZvcm1zKCk7XG4gICAgICAgIHRoaXMucmVmcmVzaEF0dHJpYnV0ZXMoKTtcbiAgICB9XG5cbiAgICAvLyBNYWtlIGxpc3Qgb2YgZGVmaW5lcyAoZ2xvYmFsLCB0aGVuIHByb2dyYW0tc3BlY2lmaWMpXG4gICAgYnVpbGREZWZpbmVMaXN0KCkge1xuICAgICAgICB2YXIgZCwgZGVmaW5lcyA9IHt9O1xuICAgICAgICBmb3IgKGQgaW4gU2hhZGVyUHJvZ3JhbS5kZWZpbmVzKSB7XG4gICAgICAgICAgICBkZWZpbmVzW2RdID0gU2hhZGVyUHJvZ3JhbS5kZWZpbmVzW2RdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoZCBpbiB0aGlzLmRlZmluZXMpIHtcbiAgICAgICAgICAgIGRlZmluZXNbZF0gPSB0aGlzLmRlZmluZXNbZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZXM7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBsaXN0IG9mIHNoYWRlciBibG9ja3MgKGdsb2JhbCwgdGhlbiBwcm9ncmFtLXNwZWNpZmljKVxuICAgIGJ1aWxkU2hhZGVyQmxvY2tMaXN0KCkge1xuICAgICAgICBsZXQga2V5LCBibG9ja3MgPSB7fTtcblxuICAgICAgICAvLyBHbG9iYWwgYmxvY2tzXG4gICAgICAgIGZvciAoa2V5IGluIFNoYWRlclByb2dyYW0uYmxvY2tzKSB7XG4gICAgICAgICAgICBibG9ja3Nba2V5XSA9IFtdO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldKSkge1xuICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIC4uLlNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0ubWFwKChzb3VyY2UsIG51bSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5LCBzb3VyY2UsIG51bSwgc2NvcGU6ICdTaGFkZXJQcm9ncmFtJyB9O1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBibG9ja3Nba2V5XSA9IFt7IGtleSwgc291cmNlOiBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldLCBudW06IDAsIHNjb3BlOiAnU2hhZGVyUHJvZ3JhbScgfV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9ncmFtLXNwZWNpZmljIGJsb2Nrc1xuICAgICAgICBmb3IgKGtleSBpbiB0aGlzLmJsb2Nrcykge1xuICAgICAgICAgICAgYmxvY2tzW2tleV0gPSBibG9ja3Nba2V5XSB8fCBbXTtcblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5ibG9ja3Nba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2NvcGVzID0gKHRoaXMuYmxvY2tfc2NvcGVzICYmIHRoaXMuYmxvY2tfc2NvcGVzW2tleV0pIHx8IFtdO1xuICAgICAgICAgICAgICAgIGxldCBjdXJfc2NvcGUgPSBudWxsLCBudW0gPSAwO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYj0wOyBiIDwgdGhpcy5ibG9ja3Nba2V5XS5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDb3VudCBibG9ja3MgcmVsYXRpdmUgdG8gY3VycmVudCBzY29wZVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGVzW2JdICE9PSBjdXJfc2NvcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9zY29wZSA9IHNjb3Blc1tiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBibG9ja3Nba2V5XS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5ibG9ja3Nba2V5XVtiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlOiBjdXJfc2NvcGUgfHwgdGhpcy5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIG51bSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZHJlc3MgZGlzY3JlcGFuY3kgaW4gYXJyYXkgdnMuIHNpbmdsZS12YWx1ZSBibG9ja3NcbiAgICAgICAgICAgICAgICAvLyBzdHlsZXMgYXNzdW1lIGFycmF5IHdoZW4gdHJhY2tpbmcgYmxvY2sgc2NvcGVzXG4gICAgICAgICAgICAgICAgYmxvY2tzW2tleV0ucHVzaCh7IGtleSwgc291cmNlOiB0aGlzLmJsb2Nrc1trZXldLCBudW06IDAsIHNjb3BlOiB0aGlzLm5hbWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJsb2NrcztcbiAgICB9XG5cbiAgICAvLyBEZXRlY3QgdW5pZm9ybSBkZWZpbml0aW9ucywgaW5qZWN0IGFueSBtaXNzaW5nIG9uZXNcbiAgICBlbnN1cmVVbmlmb3Jtcyh1bmlmb3Jtcykge1xuICAgICAgICBpZiAoIXVuaWZvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdnMgPSBzdHJpcCh0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UpO1xuICAgICAgICB2YXIgZnMgPSBzdHJpcCh0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSk7XG4gICAgICAgIHZhciBpbmplY3QsIHZzX2luamVjdGlvbnMgPSBbXSwgZnNfaW5qZWN0aW9ucyA9IFtdO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBtaXNzaW5nIHVuaWZvcm0gZGVmaW5pdGlvbnNcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB1bmlmb3Jtcykge1xuICAgICAgICAgICAgaW5qZWN0ID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdmVydGV4IHNoYWRlclxuICAgICAgICAgICAgaWYgKCFHTFNMLmlzVW5pZm9ybURlZmluZWQobmFtZSwgdnMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0ID0gR0xTTC5kZWZpbmVVbmlmb3JtKG5hbWUsIHVuaWZvcm1zW25hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBQcm9ncmFtICR7dGhpcy5uYW1lfTogJHtuYW1lfSBub3QgZGVmaW5lZCBpbiB2ZXJ0ZXggc2hhZGVyLCBpbmplY3Rpbmc6ICcke2luamVjdH0nYCk7XG4gICAgICAgICAgICAgICAgdnNfaW5qZWN0aW9ucy5wdXNoKGluamVjdCk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrIGZyYWdtZW50IHNoYWRlclxuICAgICAgICAgICAgaWYgKCFHTFNMLmlzVW5pZm9ybURlZmluZWQobmFtZSwgZnMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0ID0gR0xTTC5kZWZpbmVVbmlmb3JtKG5hbWUsIHVuaWZvcm1zW25hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBQcm9ncmFtICR7dGhpcy5uYW1lfTogJHtuYW1lfSBub3QgZGVmaW5lZCBpbiBmcmFnbWVudCBzaGFkZXIsIGluamVjdGluZzogJyR7aW5qZWN0fSdgKTtcbiAgICAgICAgICAgICAgICBmc19pbmplY3Rpb25zLnB1c2goaW5qZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluamVjdCBtaXNzaW5nIHVuaWZvcm1zXG4gICAgICAgIC8vIE5PVEU6IHRoZXNlIGFyZSBpbmplY3RlZCBhdCB0aGUgdmVyeSB0b3Agb2YgdGhlIHNoYWRlcnMsIGV2ZW4gYmVmb3JlIGFueSAjZGVmaW5lcyBvciAjcHJhZ21hcyBhcmUgYWRkZWRcbiAgICAgICAgLy8gdGhpcyBjb3VsZCBjYXVzZSBzb21lIGlzc3VlcyB3aXRoIGNlcnRhaW4gI3ByYWdtYXMsIG9yIG90aGVyIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0IGV4cGVjdCAjZGVmaW5lc1xuICAgICAgICBpZiAodnNfaW5qZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB2c19pbmplY3Rpb25zLmpvaW4oJ1xcbicpICsgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZzX2luamVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSBmc19pbmplY3Rpb25zLmpvaW4oJ1xcbicpICsgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdW5pZm9ybXMgZnJvbSBhIEpTIG9iamVjdCwgd2l0aCBpbmZlcnJlZCB0eXBlc1xuICAgIHNldFVuaWZvcm1zKHVuaWZvcm1zLCByZXNldF90ZXh0dXJlX3VuaXQgPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogb25seSB1cGRhdGUgdW5pZm9ybXMgd2hlbiBjaGFuZ2VkXG5cbiAgICAgICAgLy8gVGV4dHVyZSB1bml0cyBtdXN0IGJlIHRyYWNrZWQgYW5kIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIHRleHR1cmUgc2FtcGxlciB1bmlmb3JtIGlzIHNldC5cbiAgICAgICAgLy8gQnkgZGVmYXVsdCwgdGhlIHRleHR1cmUgdW5pdCBpcyByZXNldCB0byAwIGVhY2ggdGltZSBzZXRVbmlmb3JtcyBpcyBjYWxsZWQsIGJ1dCB0aGV5IGNhblxuICAgICAgICAvLyBhbHNvIGJlIHByZXNlcnZlZCwgZm9yIGV4YW1wbGUgaW4gY2FzZXMgd2hlcmUgbXVsdGlwbGUgY2FsbHMgdG8gc2V0VW5pZm9ybXMgYXJlIGV4cGVjdGVkXG4gICAgICAgIC8vIChlLmcuIHByb2dyYW0tc3BlY2lmaWMgdW5pZm9ybXMgZm9sbG93ZWQgYnkgbWVzaC1zcGVjaWZpYyBvbmVzKS5cbiAgICAgICAgaWYgKHJlc2V0X3RleHR1cmVfdW5pdCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlX3VuaXQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2UgdW5pZm9ybSB0eXBlcyBhbmQgdmFsdWVzIGZyb20gdGhlIEpTIG9iamVjdFxuICAgICAgICBjb25zdCBwYXJzZWQgPSBHTFNMLnBhcnNlVW5pZm9ybXModW5pZm9ybXMpO1xuXG4gICAgICAgIC8vIFNldCBlYWNoIHVuaWZvcm1cbiAgICAgICAgZm9yIChsZXQgdT0wOyB1IDwgcGFyc2VkLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICBjb25zdCB1bmlmb3JtID0gcGFyc2VkW3VdO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm0udHlwZSA9PT0gJ3NhbXBsZXIyRCcpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgdGV4dHVyZXMsIHdlIG5lZWQgdG8gdHJhY2sgdGV4dHVyZSB1bml0cywgc28gd2UgaGF2ZSBhIHNwZWNpYWwgc2V0dGVyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRUZXh0dXJlVW5pZm9ybSh1bmlmb3JtLm5hbWUsIHVuaWZvcm0udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bmlmb3JtKHVuaWZvcm0ubWV0aG9kLCB1bmlmb3JtLm5hbWUsIHVuaWZvcm0udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FjaGUgc29tZSBvciBhbGwgdW5pZm9ybSB2YWx1ZXMgc28gdGhleSBjYW4gYmUgcmVzdG9yZWRcbiAgICBzYXZlVW5pZm9ybXMoc3Vic2V0KSB7XG4gICAgICAgIGxldCB1bmlmb3JtcyA9IHN1YnNldCB8fCB0aGlzLnVuaWZvcm1zO1xuICAgICAgICBmb3IgKGxldCB1IGluIHVuaWZvcm1zKSB7XG4gICAgICAgICAgICBsZXQgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICBpZiAodW5pZm9ybSkge1xuICAgICAgICAgICAgICAgIHVuaWZvcm0uc2F2ZWRfdmFsdWUgPSB1bmlmb3JtLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2F2ZWRfdGV4dHVyZV91bml0ID0gdGhpcy50ZXh0dXJlX3VuaXQgfHwgMDtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHNvbWUgb3IgYWxsIHVuaWZvcm1zIHRvIHNhdmVkIHZhbHVlc1xuICAgIHJlc3RvcmVVbmlmb3JtcyhzdWJzZXQpIHtcbiAgICAgICAgbGV0IHVuaWZvcm1zID0gc3Vic2V0IHx8IHRoaXMudW5pZm9ybXM7XG4gICAgICAgIGZvciAobGV0IHUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1t1XTtcbiAgICAgICAgICAgIGlmICh1bmlmb3JtICYmIHVuaWZvcm0uc2F2ZWRfdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB1bmlmb3JtLnZhbHVlID0gdW5pZm9ybS5zYXZlZF92YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVVuaWZvcm0odW5pZm9ybSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXh0dXJlX3VuaXQgPSB0aGlzLnNhdmVkX3RleHR1cmVfdW5pdCB8fCAwO1xuICAgIH1cblxuICAgIC8vIFNldCBhIHRleHR1cmUgdW5pZm9ybSwgZmluZHMgdGV4dHVyZSBieSBuYW1lIG9yIGNyZWF0ZXMgYSBuZXcgb25lXG4gICAgc2V0VGV4dHVyZVVuaWZvcm0odW5pZm9ybV9uYW1lLCB0ZXh0dXJlX25hbWUpIHtcbiAgICAgICAgdmFyIHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW3RleHR1cmVfbmFtZV07XG4gICAgICAgIGlmICh0ZXh0dXJlID09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZygnd2FybicsIGBDYW5ub3QgZmluZCB0ZXh0dXJlICcke3RleHR1cmVfbmFtZX0nYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0ZXh0dXJlLmJpbmQodGhpcy50ZXh0dXJlX3VuaXQpO1xuICAgICAgICB0aGlzLnVuaWZvcm0oJzFpJywgdW5pZm9ybV9uYW1lLCB0aGlzLnRleHR1cmVfdW5pdCk7XG4gICAgICAgIHRoaXMudGV4dHVyZV91bml0Kys7IC8vIFRPRE86IHRyYWNrIG1heCB0ZXh0dXJlIHVuaXRzIGFuZCBsb2cvdGhyb3cgZXJyb3JzXG4gICAgfVxuXG4gICAgLy8gZXg6IHByb2dyYW0udW5pZm9ybSgnM2Z2JywgJ3Bvc2l0aW9uJywgW3gsIHksIHpdKTtcbiAgICAvLyBUT0RPOiBvbmx5IHVwZGF0ZSB1bmlmb3JtcyB3aGVuIGNoYW5nZWRcbiAgICB1bmlmb3JtKG1ldGhvZCwgbmFtZSwgdmFsdWUpIHsgLy8gJ3ZhbHVlJyBpcyBhIG1ldGhvZC1hcHByb3ByaWF0ZSBhcmd1bWVudHMgbGlzdFxuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudW5pZm9ybXNbbmFtZV0gPSB0aGlzLnVuaWZvcm1zW25hbWVdIHx8IHt9O1xuICAgICAgICBsZXQgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbbmFtZV07XG4gICAgICAgIHVuaWZvcm0ubmFtZSA9IG5hbWU7XG4gICAgICAgIGlmICh1bmlmb3JtLmxvY2F0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHVuaWZvcm0ubG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHVuaWZvcm0ubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB1bmlmb3JtLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlVW5pZm9ybSh1bmlmb3JtKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgYSBzaW5nbGUgdW5pZm9ybVxuICAgIHVwZGF0ZVVuaWZvcm0odW5pZm9ybSkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdW5pZm9ybSB8fCB1bmlmb3JtLmxvY2F0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXNlKCk7XG4gICAgICAgIHRoaXMuY29tbWl0VW5pZm9ybSh1bmlmb3JtKTtcbiAgICB9XG5cbiAgICAvLyBDb21taXRzIHRoZSB1bmlmb3JtIHRvIHRoZSBHUFVcbiAgICBjb21taXRVbmlmb3JtKHVuaWZvcm0pe1xuICAgICAgICBsZXQgbG9jYXRpb24gPSB1bmlmb3JtLmxvY2F0aW9uO1xuICAgICAgICBsZXQgdmFsdWUgPSB1bmlmb3JtLnZhbHVlO1xuXG4gICAgICAgIHN3aXRjaCAodW5pZm9ybS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgJzFpJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xaShsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFmKGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcyZic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMmYobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczZic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtM2YobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSwgdmFsdWVbMl0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnNGYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTRmKGxvY2F0aW9uLCB2YWx1ZVswXSwgdmFsdWVbMV0sIHZhbHVlWzJdLCB2YWx1ZVszXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxaXYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnM2l2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0zaXYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzFmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWZ2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcyZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTJmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnM2Z2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0zZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzRmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtNGZ2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdNYXRyaXgzZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDNmdihsb2NhdGlvbiwgZmFsc2UsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ01hdHJpeDRmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4NGZ2KGxvY2F0aW9uLCBmYWxzZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVmcmVzaCB1bmlmb3JtIGxvY2F0aW9ucyBhbmQgc2V0IHRvIGxhc3QgY2FjaGVkIHZhbHVlc1xuICAgIHJlZnJlc2hVbmlmb3JtcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciB1IGluIHRoaXMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1t1XTtcbiAgICAgICAgICAgIHVuaWZvcm0ubG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sIHUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVbmlmb3JtKHVuaWZvcm0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVmcmVzaEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIC8vIHZhciBsZW4gPSB0aGlzLmdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5wcm9ncmFtLCB0aGlzLmdsLkFDVElWRV9BVFRSSUJVVEVTKTtcbiAgICAgICAgLy8gZm9yICh2YXIgaT0wOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgLy8gICAgIHZhciBhID0gdGhpcy5nbC5nZXRBY3RpdmVBdHRyaWIodGhpcy5wcm9ncmFtLCBpKTtcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLmF0dHJpYnMgPSB7fTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGxvY2F0aW9uIG9mIGEgdmVydGV4IGF0dHJpYnV0ZVxuICAgIGF0dHJpYnV0ZShuYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGF0dHJpYiA9ICh0aGlzLmF0dHJpYnNbbmFtZV0gPSB0aGlzLmF0dHJpYnNbbmFtZV0gfHwge30pO1xuICAgICAgICBpZiAoYXR0cmliLmxvY2F0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhdHRyaWI7XG4gICAgICAgIH1cblxuICAgICAgICBhdHRyaWIubmFtZSA9IG5hbWU7XG4gICAgICAgIGF0dHJpYi5sb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCBuYW1lKTtcblxuICAgICAgICAvLyB2YXIgaW5mbyA9IHRoaXMuZ2wuZ2V0QWN0aXZlQXR0cmliKHRoaXMucHJvZ3JhbSwgYXR0cmliLmxvY2F0aW9uKTtcbiAgICAgICAgLy8gYXR0cmliLnR5cGUgPSBpbmZvLnR5cGU7XG4gICAgICAgIC8vIGF0dHJpYi5zaXplID0gaW5mby5zaXplO1xuXG4gICAgICAgIHJldHVybiBhdHRyaWI7XG4gICAgfVxuXG4gICAgLy8gR2V0IHNoYWRlciBzb3VyY2UgYXMgc3RyaW5nXG4gICAgc291cmNlKHR5cGUpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICd2ZXJ0ZXgnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdmcmFnbWVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCBzaGFkZXIgc291cmNlIGFzIGFycmF5IG9mIGxpbmUgc3RyaW5nc1xuICAgIGxpbmVzKHR5cGUpIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuc291cmNlKHR5cGUpO1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gR2V0IGEgc3BlY2lmaWMgbGluZSBmcm9tIHNoYWRlciBzb3VyY2VcbiAgICBsaW5lKHR5cGUsIG51bSkge1xuICAgICAgICBsZXQgc291cmNlID0gdGhpcy5saW5lcyh0eXBlKTtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZVtudW1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IGluZm8gb24gd2hpY2ggc2hhZGVyIGJsb2NrIChpZiBhbnkpIGEgcGFydGljdWxhciBsaW5lIG51bWJlciBpbiBhIHNoYWRlciBpcyBpblxuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBpbmZvIGlmIGEgYmxvY2sgaXMgZm91bmQ6IHsgbmFtZSwgbGluZSwgc291cmNlIH1cbiAgICAvLyAgc2NvcGU6IHdoZXJlIHRoZSBzaGFkZXIgYmxvY2sgb3JpZ2luYXRlZCwgZWl0aGVyIGEgc3R5bGUgbmFtZSwgb3IgZ2xvYmFsIHN1Y2ggYXMgU2hhZGVyUHJvZ3JhbVxuICAgIC8vICBuYW1lOiBzaGFkZXIgYmxvY2sgbmFtZSAoZS5nLiAnY29sb3InLCAncG9zaXRpb24nLCAnZ2xvYmFsJylcbiAgICAvLyAgbnVtOiB0aGUgYmxvY2sgbnVtYmVyICp3aXRoaW4qIGxvY2FsIHNjb3BlIChlLmcuIGlmIGEgc3R5bGUgaGFzIG11bHRpcGxlICdjb2xvcicgYmxvY2tzKVxuICAgIC8vICBsaW5lOiBsaW5lIG51bWJlciAqd2l0aGluKiB0aGUgc2hhZGVyIGJsb2NrIChub3QgdGhlIHdob2xlIHNoYWRlciBwcm9ncmFtKSwgdXNlZnVsIGZvciBlcnJvciBoaWdobGlnaHRpbmdcbiAgICAvLyAgc291cmNlOiB0aGUgY29kZSBmb3IgdGhlIGxpbmVcbiAgICAvLyBOT1RFOiB0aGlzIGRvZXMgYSBicnV0ZWZvcmNlIGxvb3Agb3ZlciB0aGUgc2hhZGVyIHNvdXJjZSBhbmQgbG9va3MgZm9yIHNoYWRlciBibG9jayBzdGFydC9lbmQgbWFya2Vyc1xuICAgIC8vIFdlIGNvdWxkIHRyYWNrIGxpbmUgcmFuZ2VzIGZvciBzaGFkZXIgYmxvY2tzIGFzIHRoZXkgYXJlIGluc2VydGVkLCBidXQgYXMgdGhpcyBjb2RlIGlzIG9ubHkgdXNlZCBmb3JcbiAgICAvLyBlcnJvciBoYW5kbGluZyBvbiBjb21waWxhdGlvbiBmYWlsdXJlLCBpdCB3YXMgc2ltcGxlciB0byBrZWVwIGl0IHNlcGFyYXRlIHRoYW4gdG8gYnVyZGVuIHRoZSBjb3JlXG4gICAgLy8gY29tcGlsYXRpb24gcGF0aC5cbiAgICBibG9jayh0eXBlLCBudW0pIHtcbiAgICAgICAgbGV0IGxpbmVzID0gdGhpcy5saW5lcyh0eXBlKTtcbiAgICAgICAgbGV0IGJsb2NrO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBudW0gJiYgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICAgICAgbGV0IG1hdGNoID0gbGluZS5tYXRjaCgvXFwvXFwvIHRhbmdyYW0tYmxvY2stc3RhcnQ6IChbQS1aYS16MC05Xy1dKyksIChbQS1aYS16MC05Xy1dKyksIChcXGQrKS8pO1xuICAgICAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBtYXJrIGN1cnJlbnQgYmxvY2tcbiAgICAgICAgICAgICAgICBibG9jayA9IHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtYXRjaFsyXSxcbiAgICAgICAgICAgICAgICAgICAgbnVtOiBtYXRjaFszXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXRjaCA9IGxpbmUubWF0Y2goL1xcL1xcLyB0YW5ncmFtLWJsb2NrLWVuZDogKFtBLVphLXowLTlfLV0rKSwgKFtBLVphLXowLTlfLV0rKSwgKFxcZCspLyk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBudWxsOyAvLyBjbGVhciBjdXJyZW50IGJsb2NrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB1cGRhdGUgbGluZSAjIGFuZCBjb250ZW50XG4gICAgICAgICAgICBpZiAoYmxvY2spIHtcbiAgICAgICAgICAgICAgICAvLyBpbml0IHRvIC0xIHNvIHRoYXQgbGluZSAwIGlzIGZpcnN0IGFjdHVhbCBsaW5lIG9mIGJsb2NrIGNvZGUsIGFmdGVyIGNvbW1lbnQgbWFya2VyXG4gICAgICAgICAgICAgICAgYmxvY2subGluZSA9IChibG9jay5saW5lID09IG51bGwpID8gLTEgOiBibG9jay5saW5lICsgMTtcbiAgICAgICAgICAgICAgICBibG9jay5zb3VyY2UgPSBsaW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBibG9jaztcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGxpc3Qgb2YgYXZhaWxhYmxlIGV4dGVuc2lvbnMgZnJvbSB0aG9zZSByZXF1ZXN0ZWRcbiAgICAvLyBTZXRzIGludGVybmFsICNkZWZpbmVzIGluZGljYXRpbmcgYXZhaWxhYmlsaXR5IG9mIGVhY2ggcmVxdWVzdGVkIGV4dGVuc2lvblxuICAgIGNoZWNrRXh0ZW5zaW9ucygpIHtcbiAgICAgICAgbGV0IGV4dHMgPSBbXTtcbiAgICAgICAgdGhpcy5leHRlbnNpb25zLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgICAgICBsZXQgZXh0ID0gZ2V0RXh0ZW5zaW9uKHRoaXMuZ2wsIG5hbWUpO1xuICAgICAgICAgICAgbGV0IGRlZiA9IGBUQU5HUkFNX0VYVEVOU0lPTl8ke25hbWV9YDtcblxuICAgICAgICAgICAgdGhpcy5kZWZpbmVzW2RlZl0gPSAoZXh0ICE9IG51bGwpO1xuXG4gICAgICAgICAgICBpZiAoZXh0KSB7XG4gICAgICAgICAgICAgICAgZXh0cy5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBDb3VsZCBub3QgZW5hYmxlIGV4dGVuc2lvbiAnJHtuYW1lfSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBleHRzO1xuICAgIH1cblxufVxuXG5cbi8vIFN0YXRpYyBtZXRob2RzIGFuZCBzdGF0ZVxuU2hhZGVyUHJvZ3JhbS5pZCA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIGFzc2lnbiBlYWNoIHByb2dyYW0gYSB1bmlxdWUgaWRcblNoYWRlclByb2dyYW0uY3VycmVudCA9IG51bGw7ICAgICAgICAgICAvLyBjdXJyZW50bHkgYm91bmQgcHJvZ3JhbVxuXG4vLyBHbG9iYWwgY29uZmlnIGFwcGxpZWQgdG8gYWxsIHByb2dyYW1zIChkdXBsaWNhdGUgcHJvcGVydGllcyBmb3IgYSBzcGVjaWZpYyBwcm9ncmFtIHdpbGwgdGFrZSBwcmVjZWRlbmNlKVxuU2hhZGVyUHJvZ3JhbS5kZWZpbmVzID0ge307XG5TaGFkZXJQcm9ncmFtLmJsb2NrcyA9IHt9O1xuXG4vLyBSZXNldCBwcm9ncmFtIGFuZCBzaGFkZXIgY2FjaGVzXG5TaGFkZXJQcm9ncmFtLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgIFNoYWRlclByb2dyYW0ucHJvZ3JhbXNfYnlfc291cmNlID0ge307ICAvLyBHTCBwcm9ncmFtIG9iamVjdHMgYnkgZXhhY3QgdmVydGV4ICsgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZVxuICAgIFNoYWRlclByb2dyYW0uc2hhZGVyc19ieV9zb3VyY2UgPSB7fTsgICAvLyBHTCBzaGFkZXIgb2JqZWN0cyBieSBleGFjdCBzb3VyY2Vcbn07XG5TaGFkZXJQcm9ncmFtLnJlc2V0KCk7XG5cbi8vIFR1cm4gYW4gb2JqZWN0IG9mIGtleS92YWx1ZSBwYWlycyBpbnRvIHNpbmdsZSBzdHJpbmcgb2YgI2RlZmluZSBzdGF0ZW1lbnRzXG5TaGFkZXJQcm9ncmFtLmJ1aWxkRGVmaW5lU3RyaW5nID0gZnVuY3Rpb24gKGRlZmluZXMpIHtcbiAgICB2YXIgZGVmaW5lX3N0ciA9IFwiXCI7XG4gICAgZm9yICh2YXIgZCBpbiBkZWZpbmVzKSB7XG4gICAgICAgIGlmIChkZWZpbmVzW2RdID09IG51bGwgfHwgZGVmaW5lc1tkXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmVzW2RdID09PSAnYm9vbGVhbicgJiYgZGVmaW5lc1tkXSA9PT0gdHJ1ZSkgeyAvLyBib29sZWFucyBhcmUgc2ltcGxlIGRlZmluZXMgd2l0aCBubyB2YWx1ZVxuICAgICAgICAgICAgZGVmaW5lX3N0ciArPSBcIiNkZWZpbmUgXCIgKyBkICsgXCJcXG5cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lc1tkXSA9PT0gJ251bWJlcicgJiYgTWF0aC5mbG9vcihkZWZpbmVzW2RdKSA9PT0gZGVmaW5lc1tkXSkgeyAvLyBpbnQgdG8gZmxvYXQgY29udmVyc2lvbiB0byBzYXRpc2Z5IEdMU0wgZmxvYXRzXG4gICAgICAgICAgICBkZWZpbmVfc3RyICs9IFwiI2RlZmluZSBcIiArIGQgKyBcIiBcIiArIGRlZmluZXNbZF0udG9GaXhlZCgxKSArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIGFueSBvdGhlciBmbG9hdCBvciBzdHJpbmcgdmFsdWVcbiAgICAgICAgICAgIGRlZmluZV9zdHIgKz0gXCIjZGVmaW5lIFwiICsgZCArIFwiIFwiICsgZGVmaW5lc1tkXSArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlZmluZV9zdHI7XG59O1xuXG4vLyBUdXJuIGEgbGlzdCBvZiBleHRlbnNpb24gbmFtZXMgaW50byBzaW5nbGUgc3RyaW5nIG9mICNleHRlbnNpb24gc3RhdGVtZW50c1xuU2hhZGVyUHJvZ3JhbS5idWlsZEV4dGVuc2lvblN0cmluZyA9IGZ1bmN0aW9uIChleHRlbnNpb25zKSB7XG4gICAgZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgfHwgW107XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZXh0ZW5zaW9ucy5mb3JFYWNoKGV4dCA9PiB7XG4gICAgICAgIHN0ciArPSBgI2lmZGVmIEdMXyR7ZXh0fVxcbiNleHRlbnNpb24gR0xfJHtleHR9IDogZW5hYmxlXFxuI2VuZGlmXFxuYDtcbiAgICB9KTtcbiAgICByZXR1cm4gc3RyO1xufTtcblxuU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayA9IGZ1bmN0aW9uIChrZXksIC4uLmJsb2Nrcykge1xuICAgIFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0gPSBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldIHx8IFtdO1xuICAgIFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0ucHVzaCguLi5ibG9ja3MpO1xufTtcblxuLy8gUmVtb3ZlIGFsbCBnbG9iYWwgc2hhZGVyIGJsb2NrcyBmb3IgYSBnaXZlbiBrZXlcblNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2sgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSA9IFtdO1xufTtcblxuU2hhZGVyUHJvZ3JhbS5yZXBsYWNlQmxvY2sgPSBmdW5jdGlvbiAoa2V5LCAuLi5ibG9ja3MpIHtcbiAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKGtleSk7XG4gICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhrZXksIC4uLmJsb2Nrcyk7XG59O1xuXG4vLyBDb21waWxlICYgbGluayBhIFdlYkdMIHByb2dyYW0gZnJvbSBwcm92aWRlZCB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlciBzb3VyY2VzXG4vLyB1cGRhdGUgYSBwcm9ncmFtIGlmIG9uZSBpcyBwYXNzZWQgaW4uIENyZWF0ZSBvbmUgaWYgbm90LiBBbGVydCBhbmQgZG9uJ3QgdXBkYXRlIGFueXRoaW5nIGlmIHRoZSBzaGFkZXJzIGRvbid0IGNvbXBpbGUuXG5TaGFkZXJQcm9ncmFtLnVwZGF0ZVByb2dyYW0gPSBmdW5jdGlvbiAoZ2wsIHByb2dyYW0sIHZlcnRleF9zaGFkZXJfc291cmNlLCBmcmFnbWVudF9zaGFkZXJfc291cmNlKSB7XG4gICAgLy8gUHJvZ3JhbSB3aXRoIHRoaXMgZXhhY3QgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIgc291cmNlcyBhbHJlYWR5IGNhY2hlZD9cbiAgICBsZXQga2V5ID0gdmVydGV4X3NoYWRlcl9zb3VyY2UgKyAnOjonICsgZnJhZ21lbnRfc2hhZGVyX3NvdXJjZTtcbiAgICBpZiAoU2hhZGVyUHJvZ3JhbS5wcm9ncmFtc19ieV9zb3VyY2Vba2V5XSkge1xuICAgICAgICBsb2coJ3RyYWNlJywgJ1JldXNpbmcgaWRlbnRpY2FsIHNvdXJjZSBHTCBwcm9ncmFtIG9iamVjdCcpO1xuICAgICAgICByZXR1cm4gU2hhZGVyUHJvZ3JhbS5wcm9ncmFtc19ieV9zb3VyY2Vba2V5XTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICB2YXIgdmVydGV4X3NoYWRlciA9IFNoYWRlclByb2dyYW0uY3JlYXRlU2hhZGVyKGdsLCB2ZXJ0ZXhfc2hhZGVyX3NvdXJjZSwgZ2wuVkVSVEVYX1NIQURFUik7XG4gICAgICAgIHZhciBmcmFnbWVudF9zaGFkZXIgPSBTaGFkZXJQcm9ncmFtLmNyZWF0ZVNoYWRlcihnbCwgZnJhZ21lbnRfc2hhZGVyX3NvdXJjZSwgZ2wuRlJBR01FTlRfU0hBREVSKTtcbiAgICB9XG4gICAgY2F0Y2goZXJyKSB7XG4gICAgICAgIGxvZygnZXJyb3InLCBlcnIubWVzc2FnZSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBnbC51c2VQcm9ncmFtKG51bGwpO1xuICAgIGlmIChwcm9ncmFtICE9IG51bGwpIHtcbiAgICAgICAgdmFyIG9sZF9zaGFkZXJzID0gZ2wuZ2V0QXR0YWNoZWRTaGFkZXJzKHByb2dyYW0pO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgb2xkX3NoYWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGdsLmRldGFjaFNoYWRlcihwcm9ncmFtLCBvbGRfc2hhZGVyc1tpXSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuICAgIH1cblxuICAgIGlmICh2ZXJ0ZXhfc2hhZGVyID09IG51bGwgfHwgZnJhZ21lbnRfc2hhZGVyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfVxuXG4gICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleF9zaGFkZXIpO1xuICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBmcmFnbWVudF9zaGFkZXIpO1xuXG4gICAgZ2wubGlua1Byb2dyYW0ocHJvZ3JhbSk7XG5cbiAgICAvLyBUT0RPOiByZWZlcmVuY2UgY291bnQgYW5kIGRlbGV0ZSBzaGFkZXIgb2JqZWN0cyB3aGVuIG5vIHByb2dyYW1zIHJlZmVyZW5jZSB0aGVtXG5cbiAgICBpZiAoIWdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMpKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgYFdlYkdMIHByb2dyYW0gZXJyb3I6XG4gICAgICAgICAgICBWQUxJREFURV9TVEFUVVM6ICR7Z2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5WQUxJREFURV9TVEFUVVMpfVxuICAgICAgICAgICAgRVJST1I6ICR7Z2wuZ2V0RXJyb3IoKX1cbiAgICAgICAgICAgIC0tLSBWZXJ0ZXggU2hhZGVyIC0tLVxuICAgICAgICAgICAgJHt2ZXJ0ZXhfc2hhZGVyX3NvdXJjZX1cbiAgICAgICAgICAgIC0tLSBGcmFnbWVudCBTaGFkZXIgLS0tXG4gICAgICAgICAgICAke2ZyYWdtZW50X3NoYWRlcl9zb3VyY2V9YCk7XG5cbiAgICAgICAgbGV0IGVycm9yID0geyB0eXBlOiAncHJvZ3JhbScsIG1lc3NhZ2UgfTtcbiAgICAgICAgbG9nKCdlcnJvcicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBTaGFkZXJQcm9ncmFtLnByb2dyYW1zX2J5X3NvdXJjZVtrZXldID0gcHJvZ3JhbTsgLy8gY2FjaGUgYnkgZXhhY3Qgc291cmNlXG4gICAgcmV0dXJuIHByb2dyYW07XG59O1xuXG4vLyBDb21waWxlIGEgdmVydGV4IG9yIGZyYWdtZW50IHNoYWRlciBmcm9tIHByb3ZpZGVkIHNvdXJjZVxuU2hhZGVyUHJvZ3JhbS5jcmVhdGVTaGFkZXIgPSBmdW5jdGlvbiAoZ2wsIHNvdXJjZSwgc3R5cGUpIHtcbiAgICAvLyBQcm9ncmFtIHdpdGggaWRlbnRpY2FsIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZXMgYWxyZWFkeSBjYWNoZWQ/XG4gICAgbGV0IGtleSA9IHNvdXJjZTtcbiAgICBpZiAoU2hhZGVyUHJvZ3JhbS5zaGFkZXJzX2J5X3NvdXJjZVtrZXldKSB7XG4gICAgICAgIGxvZygndHJhY2UnLCAnUmV1c2luZyBpZGVudGljYWwgc291cmNlIEdMIHNoYWRlciBvYmplY3QnKTtcbiAgICAgICAgcmV0dXJuIFNoYWRlclByb2dyYW0uc2hhZGVyc19ieV9zb3VyY2Vba2V5XTtcbiAgICB9XG5cbiAgICBsZXQgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKHN0eXBlKTtcblxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZSk7XG4gICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpO1xuXG4gICAgaWYgKCFnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykpIHtcbiAgICAgICAgbGV0IHR5cGUgPSAoc3R5cGUgPT09IGdsLlZFUlRFWF9TSEFERVIgPyAndmVydGV4JyA6ICdmcmFnbWVudCcpO1xuICAgICAgICBsZXQgbWVzc2FnZSA9IGdsLmdldFNoYWRlckluZm9Mb2coc2hhZGVyKTtcbiAgICAgICAgbGV0IGVycm9ycyA9IHBhcnNlU2hhZGVyRXJyb3JzKG1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyB7IHR5cGUsIG1lc3NhZ2UsIGVycm9ycyB9O1xuICAgIH1cblxuICAgIFNoYWRlclByb2dyYW0uc2hhZGVyc19ieV9zb3VyY2Vba2V5XSA9IHNoYWRlcjsgLy8gY2FjaGUgYnkgZXhhY3Qgc291cmNlXG4gICAgcmV0dXJuIHNoYWRlcjtcbn07XG4iLCIvLyBUZXh0dXJlIG1hbmFnZW1lbnRcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi4vdXRpbHMvc3Vic2NyaWJlJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbi8vIEdMIHRleHR1cmUgd3JhcHBlciBvYmplY3QgZm9yIGtlZXBpbmcgdHJhY2sgb2YgYSBnbG9iYWwgc2V0IG9mIHRleHR1cmVzLCBrZXllZCBieSBhIHVuaXF1ZSB1c2VyLWRlZmluZWQgbmFtZVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGV4dHVyZSB7XG5cbiAgICBjb25zdHJ1Y3RvcihnbCwgbmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICBpZiAodGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJpbmQoKTtcblxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnJldGFpbl9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMuc291cmNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY29uZmlnX3R5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsOyAgICAvLyBhIFByb21pc2Ugb2JqZWN0IHRvIHRyYWNrIHRoZSBsb2FkaW5nIHN0YXRlIG9mIHRoaXMgdGV4dHVyZVxuICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlOyAgICAvLyBzdWNjZXNzZnVsbHkgbG9hZGVkIGFzIGV4cGVjdGVkXG4gICAgICAgIHRoaXMuZmlsdGVyaW5nID0gb3B0aW9ucy5maWx0ZXJpbmc7XG4gICAgICAgIHRoaXMuc3ByaXRlcyA9IG9wdGlvbnMuc3ByaXRlcztcbiAgICAgICAgdGhpcy50ZXhjb29yZHMgPSB7fTsgICAgLy8gc3ByaXRlIFVWcyAoWzAsIDFdIHJhbmdlKVxuICAgICAgICB0aGlzLnNpemVzID0ge307ICAgICAgICAvLyBzcHJpdGUgc2l6ZXMgKHBpeGVsIHNpemUpXG5cbiAgICAgICAgLy8gRGVmYXVsdCB0byBhIDEtcGl4ZWwgYmxhY2sgdGV4dHVyZSBzbyB3ZSBjYW4gc2FmZWx5IHJlbmRlciB3aGlsZSB3ZSB3YWl0IGZvciBhbiBpbWFnZSB0byBsb2FkXG4gICAgICAgIC8vIFNlZTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTcyMjI0Ny93ZWJnbC13YWl0LWZvci10ZXh0dXJlLXRvLWxvYWRcbiAgICAgICAgdGhpcy5zZXREYXRhKDEsIDEsIG5ldyBVaW50OEFycmF5KFswLCAwLCAwLCAyNTVdKSwgeyBmaWx0ZXJpbmc6ICduZWFyZXN0JyB9KTtcblxuICAgICAgICAvLyBEZXN0cm95IHByZXZpb3VzIHRleHR1cmUgaWYgcHJlc2VudFxuICAgICAgICBpZiAoVGV4dHVyZS50ZXh0dXJlc1t0aGlzLm5hbWVdKSB7XG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSBwcmV2aW91cyByZXRhaW4gY291bnRcbiAgICAgICAgICAgIHRoaXMucmV0YWluX2NvdW50ID0gVGV4dHVyZS50ZXh0dXJlc1t0aGlzLm5hbWVdLnJldGFpbl9jb3VudDtcbiAgICAgICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXS5yZXRhaW5fY291bnQgPSAwOyAvLyBhbGxvdyB0byBiZSBmcmVlZFxuICAgICAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLm5hbWVdLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhY2hlIHRleHR1cmUgaW5zdGFuY2UgYW5kIGRlZmluaXRpb25cbiAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLm5hbWVdID0gdGhpcztcbiAgICAgICAgVGV4dHVyZS50ZXh0dXJlX2NvbmZpZ3NbdGhpcy5uYW1lXSA9IE9iamVjdC5hc3NpZ24oeyBuYW1lIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMubG9hZChvcHRpb25zKTtcbiAgICAgICAgbG9nKCd0cmFjZScsIGBjcmVhdGluZyBUZXh0dXJlICR7dGhpcy5uYW1lfWApO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgYSBzaW5nbGUgdGV4dHVyZSBpbnN0YW5jZVxuICAgIGRlc3Ryb3koeyBmb3JjZSB9ID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMucmV0YWluX2NvdW50ID4gMCAmJiAhZm9yY2UpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBgVGV4dHVyZSAnJHt0aGlzLm5hbWV9JzogZGVzdHJveWluZyB0ZXh0dXJlIHdpdGggcmV0YWluIGNvdW50IG9mICcke3RoaXMucmV0YWluX2NvdW50fSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlVGV4dHVyZSh0aGlzLnRleHR1cmUpO1xuICAgICAgICB0aGlzLnRleHR1cmUgPSBudWxsO1xuICAgICAgICBkZWxldGUgdGhpcy5kYXRhO1xuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgICAgICBkZWxldGUgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLm5hbWVdO1xuICAgICAgICB0aGlzLnZhbGlkID0gZmFsc2U7XG4gICAgICAgIGxvZygndHJhY2UnLCBgZGVzdHJveWluZyBUZXh0dXJlICR7dGhpcy5uYW1lfWApO1xuICAgIH1cblxuICAgIHJldGFpbiAoKSB7XG4gICAgICAgIHRoaXMucmV0YWluX2NvdW50Kys7XG4gICAgfVxuXG4gICAgcmVsZWFzZSAoKSB7XG4gICAgICAgIGlmICh0aGlzLnJldGFpbl9jb3VudCA8PSAwKSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IHJlbGVhc2luZyB0ZXh0dXJlIHdpdGggcmV0YWluIGNvdW50IG9mICcke3RoaXMucmV0YWluX2NvdW50fSdgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmV0YWluX2NvdW50LS07XG4gICAgICAgIGlmICh0aGlzLnJldGFpbl9jb3VudCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmQodW5pdCA9IDApIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVGV4dHVyZS5hY3RpdmVVbml0ICE9PSB1bml0KSB7XG4gICAgICAgICAgICB0aGlzLmdsLmFjdGl2ZVRleHR1cmUodGhpcy5nbC5URVhUVVJFMCArIHVuaXQpO1xuICAgICAgICAgICAgVGV4dHVyZS5hY3RpdmVVbml0ID0gdW5pdDtcbiAgICAgICAgICAgIFRleHR1cmUuYm91bmRUZXh0dXJlID0gbnVsbDsgLy8gdGV4dHVyZSBtdXN0IGJlIHJlLWJvdW5kIHdoZW4gdW5pdCBjaGFuZ2VzXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVGV4dHVyZS5ib3VuZFRleHR1cmUgIT09IHRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5nbC5iaW5kVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG4gICAgICAgICAgICBUZXh0dXJlLmJvdW5kVGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWQob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmcgfHwgUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbnVsbDtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3R5cGUgPSAndXJsJztcbiAgICAgICAgICAgIHRoaXMuc2V0VXJsKG9wdGlvbnMudXJsLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3R5cGUgPSAnZWxlbWVudCc7XG4gICAgICAgICAgICB0aGlzLnNldEVsZW1lbnQob3B0aW9ucy5lbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy53aWR0aCAmJiBvcHRpb25zLmhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWdfdHlwZSA9ICdkYXRhJztcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YShvcHRpb25zLndpZHRoLCBvcHRpb25zLmhlaWdodCwgb3B0aW9ucy5kYXRhLCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGluZyA9XG4gICAgICAgICAgICAodGhpcy5sb2FkaW5nICYmIHRoaXMubG9hZGluZy50aGVuKCgpID0+IHsgdGhpcy5jYWxjdWxhdGVTcHJpdGVzKCk7IHJldHVybiB0aGlzOyB9KSkgfHxcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBTZXRzIHRleHR1cmUgZnJvbSBhbiB1cmxcbiAgICBzZXRVcmwodXJsLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVybCA9IHVybDsgLy8gc2F2ZSBVUkwgcmVmZXJlbmNlICh3aWxsIGJlIG92ZXJ3cml0dGVuIHdoZW4gZWxlbWVudCBpcyBsb2FkZWQgYmVsb3cpXG4gICAgICAgIHRoaXMuc291cmNlID0gdGhpcy51cmw7XG4gICAgICAgIHRoaXMuc291cmNlX3R5cGUgPSAndXJsJztcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEVsZW1lbnQoaW1hZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgVGV4dHVyZSAnJHt0aGlzLm5hbWV9JzogZmFpbGVkIHRvIGxvYWQgdXJsOiAnJHt0aGlzLnNvdXJjZX0nYCwgZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIFRleHR1cmUudHJpZ2dlcignd2FybmluZycsIHsgbWVzc2FnZTogYEZhaWxlZCB0byBsb2FkIHRleHR1cmUgZnJvbSAke3RoaXMuc291cmNlfWAsIGVycm9yOiBlLCB0ZXh0dXJlOiBvcHRpb25zIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSBlID0+IHtcbiAgICAgICAgICAgICAgICAvLyBXYXJuIGFuZCByZXNvbHZlIG9uIGVycm9yXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgVGV4dHVyZSAnJHt0aGlzLm5hbWV9JzogZmFpbGVkIHRvIGxvYWQgdXJsOiAnJHt0aGlzLnNvdXJjZX0nYCwgZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd3YXJuaW5nJywgeyBtZXNzYWdlOiBgRmFpbGVkIHRvIGxvYWQgdGV4dHVyZSBmcm9tICR7dGhpcy5zb3VyY2V9YCwgZXJyb3I6IGUsIHRleHR1cmU6IG9wdGlvbnMgfSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIFNhZmFyaSBoYXMgYSBidWcgbG9hZGluZyBkYXRhLVVSTCBpbWFnZXMgd2l0aCBDT1JTIGVuYWJsZWQsIHNvIGl0IG11c3QgYmUgZGlzYWJsZWQgaW4gdGhhdCBjYXNlXG4gICAgICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIzOTc4XG4gICAgICAgICAgICBpZiAoIShVdGlscy5pc1NhZmFyaSgpICYmIHRoaXMuc291cmNlLnNsaWNlKDAsIDUpID09PSAnZGF0YTonKSkge1xuICAgICAgICAgICAgICAgIGltYWdlLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGltYWdlLnNyYyA9IHRoaXMuc291cmNlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBTZXRzIHRleHR1cmUgdG8gYSByYXcgaW1hZ2UgYnVmZmVyXG4gICAgc2V0RGF0YSh3aWR0aCwgaGVpZ2h0LCBkYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuICAgICAgICB0aGlzLnNvdXJjZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuc291cmNlX3R5cGUgPSAnZGF0YSc7XG5cbiAgICAgICAgLy8gQ29udmVydCByZWd1bGFyIGFycmF5IHRvIHR5cGVkIGFycmF5XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuc291cmNlKSkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBuZXcgVWludDhBcnJheSh0aGlzLnNvdXJjZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZShvcHRpb25zKTtcbiAgICAgICAgdGhpcy5zZXRGaWx0ZXJpbmcob3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gU2V0cyB0aGUgdGV4dHVyZSB0byB0cmFjayBhIGVsZW1lbnQgKGNhbnZhcy9pbWFnZSlcbiAgICBzZXRFbGVtZW50KGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGVsID0gZWxlbWVudDtcblxuICAgICAgICAvLyBhIHN0cmluZyBlbGVtZW50IGlzIGludGVycGV0ZWQgYXMgYSBDU1Mgc2VsZWN0b3JcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50IHx8XG4gICAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fFxuICAgICAgICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gZWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuc291cmNlX3R5cGUgPSAnZWxlbWVudCc7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlKG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5zZXRGaWx0ZXJpbmcob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IG1zZyA9IGB0aGUgJ2VsZW1lbnQnIHBhcmFtZXRlciAoXFxgZWxlbWVudDogJHtKU09OLnN0cmluZ2lmeShlbCl9XFxgKSBtdXN0IGJlIGEgQ1NTIGA7XG4gICAgICAgICAgICBtc2cgKz0gYHNlbGVjdG9yIHN0cmluZywgb3IgYSA8Y2FudmFzPiwgPGltYWdlPiBvciA8dmlkZW8+IG9iamVjdGA7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgVGV4dHVyZSAnJHt0aGlzLm5hbWV9JzogJHttc2d9YCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3dhcm5pbmcnLCB7IG1lc3NhZ2U6IGBGYWlsZWQgdG8gbG9hZCB0ZXh0dXJlIGJlY2F1c2UgJHttc2d9YCwgdGV4dHVyZTogb3B0aW9ucyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFVwbG9hZHMgY3VycmVudCBpbWFnZSBvciBidWZmZXIgdG8gdGhlIEdQVSAoY2FuIGJlIHVzZWQgdG8gdXBkYXRlIGFuaW1hdGVkIHRleHR1cmVzIG9uIHRoZSBmbHkpXG4gICAgdXBkYXRlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYmluZCgpO1xuICAgICAgICB0aGlzLmdsLnBpeGVsU3RvcmVpKHRoaXMuZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgKG9wdGlvbnMuVU5QQUNLX0ZMSVBfWV9XRUJHTCA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWUpKTtcbiAgICAgICAgdGhpcy5nbC5waXhlbFN0b3JlaSh0aGlzLmdsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgb3B0aW9ucy5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wgfHwgZmFsc2UpO1xuXG4gICAgICAgIC8vIEltYWdlIG9yIENhbnZhcyBlbGVtZW50XG4gICAgICAgIGlmICh0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50IHx8IHRoaXMuc291cmNlIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCB8fFxuICAgICAgICAgICAgKHRoaXMuc291cmNlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCAmJiB0aGlzLnNvdXJjZS5jb21wbGV0ZSkpIHtcblxuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuc291cmNlLndpZHRoO1xuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLnNvdXJjZS5oZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLmdsLnRleEltYWdlMkQodGhpcy5nbC5URVhUVVJFXzJELCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuUkdCQSwgdGhpcy5nbC5VTlNJR05FRF9CWVRFLCB0aGlzLnNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmF3IGltYWdlIGJ1ZmZlclxuICAgICAgICBlbHNlIGlmICh0aGlzLnNvdXJjZV90eXBlID09PSAnZGF0YScpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wudGV4SW1hZ2UyRCh0aGlzLmdsLlRFWFRVUkVfMkQsIDAsIHRoaXMuZ2wuUkdCQSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDAsIHRoaXMuZ2wuUkdCQSwgdGhpcy5nbC5VTlNJR05FRF9CWVRFLCB0aGlzLnNvdXJjZSk7XG4gICAgICAgIH1cblxuICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3VwZGF0ZScsIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZXMgYXBwcm9wcmlhdGUgZmlsdGVyaW5nIG1vZGVcbiAgICBzZXRGaWx0ZXJpbmcob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5maWx0ZXJpbmcgPSBvcHRpb25zLmZpbHRlcmluZyB8fCAnbGluZWFyJztcblxuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuICAgICAgICB0aGlzLmJpbmQoKTtcblxuICAgICAgICAvLyBGb3IgcG93ZXItb2YtMiB0ZXh0dXJlcywgdGhlIGZvbGxvd2luZyBwcmVzZXRzIGFyZSBhdmFpbGFibGU6XG4gICAgICAgIC8vIG1pcG1hcDogbGluZWFyIGJsZW5kIGZyb20gbmVhcmVzdCBtaXBcbiAgICAgICAgLy8gbGluZWFyOiBsaW5lYXIgYmxlbmQgZnJvbSBvcmlnaW5hbCBpbWFnZSAobm8gbWlwcylcbiAgICAgICAgLy8gbmVhcmVzdDogbmVhcmVzdCBwaXhlbCBmcm9tIG9yaWdpbmFsIGltYWdlIChubyBtaXBzLCAnYmxvY2t5JyBsb29rKVxuICAgICAgICBpZiAoVXRpbHMuaXNQb3dlck9mMih0aGlzLndpZHRoKSAmJiBVdGlscy5pc1Bvd2VyT2YyKHRoaXMuaGVpZ2h0KSkge1xuICAgICAgICAgICAgdGhpcy5wb3dlcl9vZl8yID0gdHJ1ZTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIG9wdGlvbnMuVEVYVFVSRV9XUkFQX1MgfHwgKG9wdGlvbnMucmVwZWF0ICYmIGdsLlJFUEVBVCkgfHwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBvcHRpb25zLlRFWFRVUkVfV1JBUF9UIHx8IChvcHRpb25zLnJlcGVhdCAmJiBnbC5SRVBFQVQpIHx8IGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXJpbmcgPT09ICdtaXBtYXAnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbWlwbWFwJztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSX01JUE1BUF9MSU5FQVIpOyAvLyBUT0RPOiB1c2UgdHJpbGluZWFyIGZpbHRlcmluZyBieSBkZWZ1YWx0IGluc3RlYWQ/XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICAgICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmZpbHRlcmluZyA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICdsaW5lYXInO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5maWx0ZXJpbmcgPT09ICduZWFyZXN0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ25lYXJlc3QnO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBXZWJHTCBoYXMgc3RyaWN0IHJlcXVpcmVtZW50cyBvbiBub24tcG93ZXItb2YtMiB0ZXh0dXJlczpcbiAgICAgICAgICAgIC8vIE5vIG1pcG1hcHMgYW5kIG11c3QgY2xhbXAgdG8gZWRnZVxuICAgICAgICAgICAgdGhpcy5wb3dlcl9vZl8yID0gZmFsc2U7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXJpbmcgPT09ICduZWFyZXN0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ25lYXJlc3QnO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gZGVmYXVsdCB0byBsaW5lYXIgZm9yIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbGluZWFyJztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIFRleHR1cmUudHJpZ2dlcigndXBkYXRlJywgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gUHJlLWNhbGMgc3ByaXRlIHJlZ2lvbnMgZm9yIGEgdGV4dHVyZSBzcHJpdGUgaW4gVVYgWzAsIDFdIHNwYWNlXG4gICAgY2FsY3VsYXRlU3ByaXRlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuc3ByaXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgcyBpbiB0aGlzLnNwcml0ZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3ByaXRlID0gdGhpcy5zcHJpdGVzW3NdO1xuXG4gICAgICAgICAgICAgICAgLy8gTWFwIFswLCAwXSB0byBbMSwgMV0gY29vcmRzIHRvIHRoZSBhcHByb3ByaWF0ZSBzcHJpdGUgc3ViLWFyZWEgb2YgdGhlIHRleHR1cmVcbiAgICAgICAgICAgICAgICB0aGlzLnRleGNvb3Jkc1tzXSA9IFRleHR1cmUuZ2V0VGV4Y29vcmRzRm9yU3ByaXRlKFxuICAgICAgICAgICAgICAgICAgICBbc3ByaXRlWzBdLCBzcHJpdGVbMV1dLFxuICAgICAgICAgICAgICAgICAgICBbc3ByaXRlWzJdLCBzcHJpdGVbM11dLFxuICAgICAgICAgICAgICAgICAgICBbdGhpcy53aWR0aCwgdGhpcy5oZWlnaHRdXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIFBpeGVsIHNpemUgb2Ygc3ByaXRlXG4gICAgICAgICAgICAgICAgdGhpcy5zaXplc1tzXSA9IFtzcHJpdGVbMl0sIHNwcml0ZVszXV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuXG4vLyBTdGF0aWMvY2xhc3MgbWV0aG9kcyBhbmQgc3RhdGVcblxuVGV4dHVyZS5jcmVhdGUgPSBmdW5jdGlvbiAoZ2wsIG5hbWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFRleHR1cmUoZ2wsIG5hbWUsIG9wdGlvbnMpO1xufTtcblxuVGV4dHVyZS5yZXRhaW4gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmIChUZXh0dXJlLnRleHR1cmVzW25hbWVdKSB7XG4gICAgICAgIFRleHR1cmUudGV4dHVyZXNbbmFtZV0ucmV0YWluKCk7XG4gICAgfVxufTtcblxuVGV4dHVyZS5yZWxlYXNlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoVGV4dHVyZS50ZXh0dXJlc1tuYW1lXSkge1xuICAgICAgICBUZXh0dXJlLnRleHR1cmVzW25hbWVdLnJlbGVhc2UoKTtcbiAgICB9XG59O1xuXG4vLyBEZXN0cm95IGFsbCB0ZXh0dXJlIGluc3RhbmNlcyBmb3IgYSBnaXZlbiBHTCBjb250ZXh0XG5UZXh0dXJlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoZ2wpIHtcbiAgICB2YXIgdGV4dHVyZXMgPSBPYmplY3Qua2V5cyhUZXh0dXJlLnRleHR1cmVzKTtcbiAgICB0ZXh0dXJlcy5mb3JFYWNoKHQgPT4ge1xuICAgICAgICB2YXIgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdF07XG4gICAgICAgIGlmICh0ZXh0dXJlLmdsID09PSBnbCkge1xuICAgICAgICAgICAgdGV4dHVyZS5kZXN0cm95KHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbi8vIEdldCBzcHJpdGUgcGl4ZWwgc2l6ZSBhbmQgVVZzXG5UZXh0dXJlLmdldFNwcml0ZUluZm8gPSBmdW5jdGlvbiAodGV4bmFtZSwgc3ByaXRlKSB7XG4gICAgbGV0IHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW3RleG5hbWVdO1xuICAgIHJldHVybiB0ZXh0dXJlICYmIHsgc2l6ZTogdGV4dHVyZS5zaXplc1tzcHJpdGVdLCB0ZXhjb29yZHM6IHRleHR1cmUudGV4Y29vcmRzW3Nwcml0ZV0gfTtcbn07XG5cbi8vIFJlLXNjYWxlIFVWcyBmcm9tIFswLCAxXSByYW5nZSB0byBhIHNtYWxsZXIgYXJlYSB3aXRoaW4gdGhlIGltYWdlXG5UZXh0dXJlLmdldFRleGNvb3Jkc0ZvclNwcml0ZSA9IGZ1bmN0aW9uIChhcmVhX29yaWdpbiwgYXJlYV9zaXplLCB0ZXhfc2l6ZSkge1xuICAgIHZhciBhcmVhX29yaWdpbl95ID0gdGV4X3NpemVbMV0gLSBhcmVhX29yaWdpblsxXSAtIGFyZWFfc2l6ZVsxXTtcblxuICAgIHJldHVybiBbXG4gICAgICAgIGFyZWFfb3JpZ2luWzBdIC8gdGV4X3NpemVbMF0sXG4gICAgICAgIGFyZWFfb3JpZ2luX3kgLyB0ZXhfc2l6ZVsxXSxcbiAgICAgICAgKGFyZWFfc2l6ZVswXSArIGFyZWFfb3JpZ2luWzBdKSAvIHRleF9zaXplWzBdLFxuICAgICAgICAoYXJlYV9zaXplWzFdICsgYXJlYV9vcmlnaW5feSkgLyB0ZXhfc2l6ZVsxXVxuICAgIF07XG59O1xuXG4vLyBDcmVhdGUgYSBzZXQgb2YgdGV4dHVyZXMga2V5ZWQgaW4gYW4gb2JqZWN0XG4vLyBPcHRpb25hbGx5IGxvYWQgZWFjaCBpZiBpdCBoYXMgYSBVUkwgc3BlY2lmaWVkXG5UZXh0dXJlLmNyZWF0ZUZyb21PYmplY3QgPSBmdW5jdGlvbiAoZ2wsIHRleHR1cmVzKSB7XG4gICAgbGV0IGxvYWRpbmcgPSBbXTtcbiAgICBpZiAodGV4dHVyZXMpIHtcbiAgICAgICAgZm9yIChsZXQgdGV4bmFtZSBpbiB0ZXh0dXJlcykge1xuICAgICAgICAgICAgbGV0IGNvbmZpZyA9IHRleHR1cmVzW3RleG5hbWVdO1xuXG4gICAgICAgICAgICAvLyBJZiB0ZXh0dXJlIGFscmVhZHkgZXhpc3RzIGFuZCBkZWZpbml0aW9uIGhhc24ndCBjaGFuZ2VkLCBubyBuZWVkIHRvIHJlLWNyZWF0ZVxuICAgICAgICAgICAgLy8gTm90ZTogdG8gYXZvaWQgZmxpY2tlciB3aGVuIG90aGVyIHRleHR1cmVzL3NjZW5lIGl0ZW1zIGNoYW5nZVxuICAgICAgICAgICAgaWYgKCFUZXh0dXJlLmNoYW5nZWQodGV4bmFtZSwgY29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdGV4dHVyZSA9IFRleHR1cmUuY3JlYXRlKGdsLCB0ZXhuYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgbG9hZGluZy5wdXNoKHRleHR1cmUubG9hZGluZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGxvYWRpbmcpO1xufTtcblxuLy8gQ3JlYXRlIGEgJ2RlZmF1bHQnIHRleHR1cmUgKDF4MSBwaXhlbCkgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyXG4vLyAoZm9yIGV4YW1wbGUgdG8gcHJldmVudCBHTCBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHVuYm91bmQgdGV4dHVyZXMpXG5UZXh0dXJlLmRlZmF1bHQgPSAnX19kZWZhdWx0JztcblRleHR1cmUuY3JlYXRlRGVmYXVsdCA9IGZ1bmN0aW9uIChnbCkge1xuICAgIHJldHVybiBUZXh0dXJlLmNyZWF0ZShnbCwgVGV4dHVyZS5kZWZhdWx0KTtcbn07XG5cbi8vIEluZGljYXRlIGlmIGEgdGV4dHVyZSBkZWZpbml0aW9uIHdvdWxkIGJlIGEgY2hhbmdlIGZyb20gdGhlIGN1cnJlbnQgY2FjaGVcblRleHR1cmUuY2hhbmdlZCA9IGZ1bmN0aW9uIChuYW1lLCBjb25maWcpIHtcbiAgICBsZXQgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbbmFtZV07XG4gICAgaWYgKHRleHR1cmUpIHsgLy8gY2FjaGVkIHRleHR1cmVcbiAgICAgICAgLy8gY2FudmFzL2ltYWdlLWJhc2VkIHRleHR1cmVzIGFyZSBjb25zaWRlcmVkIGR5bmFtaWMgYW5kIGFsd2F5cyByZWZyZXNoXG4gICAgICAgIGlmICh0ZXh0dXJlLmNvbmZpZ190eXBlID09PSAnZWxlbWVudCcgfHwgY29uZmlnLmVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb21wYXJlIGRlZmluaXRpb25zXG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShUZXh0dXJlLnRleHR1cmVfY29uZmlnc1tuYW1lXSkgPT09XG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShPYmplY3QuYXNzaWduKHsgbmFtZSB9LCBjb25maWcpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLy8gR2V0IG1ldGFkYXRhIGZvciBhIHRleHR1cmUgYnkgbmFtZVxuLy8gUmV0dXJucyB2aWEgcHJvbWlzZSwgaW4gY2FzZSB0ZXh0dXJlIGlzIHN0aWxsIGxvYWRpbmdcbi8vIENhbiBiZSBjYWxsZWQgb24gbWFpbiB0aHJlYWQgZnJvbSB3b3JrZXIsIHRvIHN5bmMgdGV4dHVyZSBpbmZvIHRvIHdvcmtlclxuVGV4dHVyZS5nZXRJbmZvID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAvLyBHZXQgaW5mbyBmb3IgYWxsIHRleHR1cmVzIGJ5IGRlZmF1bHRcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgbmFtZSA9IE9iamVjdC5rZXlzKFRleHR1cmUudGV4dHVyZXMpO1xuICAgIH1cblxuICAgIC8vIEdldCBtdWx0aXBsZSB0ZXh0dXJlc1xuICAgIGlmIChBcnJheS5pc0FycmF5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChuYW1lLm1hcChuID0+IFRleHR1cmUuZ2V0SW5mbyhuKSkpO1xuICAgIH1cblxuICAgIC8vIEdldCBzaW5nbGUgdGV4dHVyZVxuICAgIHZhciB0ZXggPSBUZXh0dXJlLnRleHR1cmVzW25hbWVdO1xuICAgIGlmICh0ZXgpIHtcbiAgICAgICAgLy8gV2FpdCBmb3IgdGhpcyB0ZXh0dXJlIHRvIGZpbmlzaCBsb2FkaW5nLCBvciByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgdmFyIGxvYWRpbmcgPSB0ZXgubG9hZGluZyB8fCBQcm9taXNlLnJlc29sdmUodGV4KTtcbiAgICAgICAgcmV0dXJuIGxvYWRpbmcudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gYSBzdWJzZXQgb2YgdGV4dHVyZSBpbmZvXG4gICAgICAgICAgICAvLyAoY29tcGF0aWJsZSB3L3N0cnVjdHVyZWQgY2xvbmluZywgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gYSB3b3JrZXIpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRleC5uYW1lLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB0ZXgud2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiB0ZXguaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHNwcml0ZXM6IHRleC5zcHJpdGVzLFxuICAgICAgICAgICAgICAgIHRleGNvb3JkczogdGV4LnRleGNvb3JkcyxcbiAgICAgICAgICAgICAgICBzaXplczogdGV4LnNpemVzLFxuICAgICAgICAgICAgICAgIGZpbHRlcmluZzogdGV4LmZpbHRlcmluZyxcbiAgICAgICAgICAgICAgICBwb3dlcl9vZl8yOiB0ZXgucG93ZXJfb2ZfMixcbiAgICAgICAgICAgICAgICB2YWxpZDogdGV4LnZhbGlkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIE5vIHRleHR1cmUgZm91bmRcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG59O1xuXG4vLyBTeW5jIHRleHR1cmUgaW5mbyB0byB3b3JrZXJcbi8vIENhbGxlZCBmcm9tIHdvcmtlciwgZ2V0cyBpbmZvIG9uIG9uZSBvciBtb3JlIHRleHR1cmVzIGluZm8gZnJvbSBtYWluIHRocmVhZCB2aWEgcmVtb3RlIGNhbGwsIHRoZW4gc3RvcmVzIGl0XG4vLyBsb2NhbGx5IGluIHdvcmtlci4gJ3RleHR1cmVzJyBjYW4gYmUgYW4gYXJyYXkgb2YgdGV4dHVyZSBuYW1lcyB0byBzeW5jLCBvciBpZiBudWxsLCBhbGwgdGV4dHVyZXMgYXJlIHN5bmNlZC5cblRleHR1cmUuc3luY1RleHR1cmVzVG9Xb3JrZXIgPSBmdW5jdGlvbiAobmFtZXMpIHtcbiAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKCdUZXh0dXJlLmdldEluZm8nLCBuYW1lcykuXG4gICAgICAgIHRoZW4odGV4dHVyZXMgPT4ge1xuICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCh0ZXggPT4ge1xuICAgICAgICAgICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGV4Lm5hbWVdID0gdGV4O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gVGV4dHVyZS50ZXh0dXJlcztcbiAgICAgICAgfSk7XG59O1xuXG4vLyBSZXBvcnQgbWF4IHRleHR1cmUgc2l6ZSBmb3IgYSBHTCBjb250ZXh0XG5UZXh0dXJlLmdldE1heFRleHR1cmVTaXplID0gZnVuY3Rpb24gKGdsKSB7XG4gICAgcmV0dXJuIGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9TSVpFKTtcbn07XG5cbi8vIEdsb2JhbCBzZXQgb2YgdGV4dHVyZXMsIGJ5IG5hbWVcblRleHR1cmUudGV4dHVyZXMgPSB7fTtcblRleHR1cmUudGV4dHVyZV9jb25maWdzID0ge307XG5UZXh0dXJlLmJvdW5kVGV4dHVyZSA9IG51bGw7XG5UZXh0dXJlLmFjdGl2ZVVuaXQgPSBudWxsO1xuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdUZXh0dXJlJywgVGV4dHVyZSk7XG5zdWJzY3JpYmVNaXhpbihUZXh0dXJlKTtcbiIsIi8vIENyZWF0ZXMgYSBWZXJ0ZXggQXJyYXkgT2JqZWN0IGlmIHRoZSBleHRlbnNpb24gaXMgYXZhaWxhYmxlLCBvciBmYWxscyBiYWNrIG9uIHN0YW5kYXJkIGF0dHJpYnV0ZSBjYWxsc1xuXG5pbXBvcnQgZ2V0RXh0ZW5zaW9uIGZyb20gJy4vZXh0ZW5zaW9ucyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcblxuICAgIGRpc2FibGVkOiBmYWxzZSwgLy8gc2V0IHRvIHRydWUgdG8gZGlzYWJsZSBWQU9zIGV2ZW4gaWYgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZVxuICAgIGJvdW5kX3ZhbzogW10sICAgLy8gY3VycmVudGx5IGJvdW5kIFZBTywgYnkgR0wgY29udGV4dFxuXG4gICAgaW5pdCAoZ2wpIHtcbiAgICAgICAgbGV0IGV4dDtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGV4dCA9IGdldEV4dGVuc2lvbihnbCwgJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXh0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxvZygnaW5mbycsICdWZXJ0ZXggQXJyYXkgT2JqZWN0IGV4dGVuc2lvbiBhdmFpbGFibGUnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCAnVmVydGV4IEFycmF5IE9iamVjdCBleHRlbnNpb24gTk9UIGF2YWlsYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZlcnRleCBBcnJheSBPYmplY3QgZXh0ZW5zaW9uIGZvcmNlIGRpc2FibGVkJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY3JlYXRlIChnbCwgc2V0dXAsIHRlYXJkb3duKSB7XG4gICAgICAgIGxldCB2YW8gPSB7fTtcbiAgICAgICAgdmFvLnNldHVwID0gc2V0dXA7XG4gICAgICAgIHZhby50ZWFyZG93biA9IHRlYXJkb3duO1xuXG4gICAgICAgIGxldCBleHQgPSBnZXRFeHRlbnNpb24oZ2wsICdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuICAgICAgICBpZiAoZXh0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhby5fdmFvID0gZXh0LmNyZWF0ZVZlcnRleEFycmF5T0VTKCk7XG4gICAgICAgICAgICBleHQuYmluZFZlcnRleEFycmF5T0VTKHZhby5fdmFvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhby5zZXR1cCh0cnVlKTtcblxuICAgICAgICByZXR1cm4gdmFvO1xuICAgIH0sXG5cbiAgICBnZXRDdXJyZW50QmluZGluZyAoZ2wpIHtcbiAgICAgICAgbGV0IGJvdW5kID0gdGhpcy5ib3VuZF92YW8uZmlsdGVyKGUgPT4gZVswXSA9PT0gZ2wpWzBdO1xuICAgICAgICByZXR1cm4gYm91bmQgJiYgYm91bmRbMV07XG4gICAgfSxcblxuICAgIHNldEN1cnJlbnRCaW5kaW5nIChnbCwgdmFvKSB7XG4gICAgICAgIGxldCBib3VuZF92YW8gPSB0aGlzLmJvdW5kX3ZhbztcbiAgICAgICAgbGV0IGJpbmRpbmcgPSBib3VuZF92YW8uZmlsdGVyKGUgPT4gZVswXSA9PT0gZ2wpWzBdO1xuICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICBib3VuZF92YW8ucHVzaChbZ2wsIHZhb10pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYmluZGluZ1sxXSA9IHZhbztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBiaW5kIChnbCwgdmFvKSB7XG4gICAgICAgIGxldCBleHQgPSBnZXRFeHRlbnNpb24oZ2wsICdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuICAgICAgICBpZiAodmFvICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChleHQgIT0gbnVsbCAmJiB2YW8uX3ZhbyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyh2YW8uX3Zhbyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDdXJyZW50QmluZGluZyhnbCwgdmFvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhby5zZXR1cChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgYm91bmRfdmFvID0gdGhpcy5nZXRDdXJyZW50QmluZGluZyhnbCk7XG4gICAgICAgICAgICBpZiAoZXh0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBleHQuYmluZFZlcnRleEFycmF5T0VTKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYm91bmRfdmFvICE9IG51bGwgJiYgdHlwZW9mIGJvdW5kX3Zhby50ZWFyZG93biA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGJvdW5kX3Zhby50ZWFyZG93bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRDdXJyZW50QmluZGluZyhnbCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVzdHJveSAoZ2wsIHZhbykge1xuICAgICAgICBsZXQgZXh0ID0gZ2V0RXh0ZW5zaW9uKGdsLCAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbiAgICAgICAgaWYgKGV4dCAhPSBudWxsICYmIHZhbyAhPSBudWxsICYmIHZhby5fdmFvICE9IG51bGwpIHtcbiAgICAgICAgICAgIGV4dC5kZWxldGVWZXJ0ZXhBcnJheU9FUyh2YW8uX3Zhbyk7XG4gICAgICAgICAgICB2YW8uX3ZhbyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGVzdHJveSBpcyBhIG5vLW9wIGlmIFZBTyBleHRlbnNpb24gaXNuJ3QgYXZhaWxhYmxlXG4gICAgfVxuXG59O1xuIiwiLy8gTWFuYWdlIHJlbmRlcmluZyBmb3IgcHJpbWl0aXZlc1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgVmVydGV4QXJyYXlPYmplY3QgZnJvbSAnLi92YW8nO1xuXG4vLyBBIHNpbmdsZSBtZXNoL1ZCTywgZGVzY3JpYmVkIGJ5IGEgdmVydGV4IGxheW91dCwgdGhhdCBjYW4gYmUgZHJhd24gd2l0aCBvbmUgb3IgbW9yZSBwcm9ncmFtc1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVkJPTWVzaCAge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIHZlcnRleF9kYXRhLCBlbGVtZW50X2RhdGEsIHZlcnRleF9sYXlvdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLnZlcnRleF9kYXRhID0gdmVydGV4X2RhdGE7IC8vIHR5cGVkIGFycmF5XG4gICAgICAgIHRoaXMuZWxlbWVudF9kYXRhID0gZWxlbWVudF9kYXRhOyAvLyB0eXBlZCBhcnJheVxuICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQgPSB2ZXJ0ZXhfbGF5b3V0O1xuICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmRyYXdfbW9kZSA9IG9wdGlvbnMuZHJhd19tb2RlIHx8IHRoaXMuZ2wuVFJJQU5HTEVTO1xuICAgICAgICB0aGlzLmRhdGFfdXNhZ2UgPSBvcHRpb25zLmRhdGFfdXNhZ2UgfHwgdGhpcy5nbC5TVEFUSUNfRFJBVztcbiAgICAgICAgdGhpcy52ZXJ0aWNlc19wZXJfZ2VvbWV0cnkgPSAzOyAvLyBUT0RPOiBzdXBwb3J0IGxpbmVzLCBzdHJpcCwgZmFuLCBldGMuXG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSBvcHRpb25zLnVuaWZvcm1zO1xuICAgICAgICB0aGlzLnJldGFpbiA9IG9wdGlvbnMucmV0YWluIHx8IGZhbHNlOyAvLyB3aGV0aGVyIHRvIHJldGFpbiBtZXNoIGRhdGEgaW4gQ1BVIGFmdGVyIHVwbG9hZGluZyB0byBHUFVcbiAgICAgICAgdGhpcy5jcmVhdGVkX2F0ID0gK25ldyBEYXRlKCk7XG4gICAgICAgIHRoaXMuZmFkZV9pbl90aW1lID0gb3B0aW9ucy5mYWRlX2luX3RpbWUgfHwgMDsgLy8gb3B0aW9uYWwgdGltZSB0byBmYWRlIGluIG1lc2hcblxuICAgICAgICB0aGlzLnZlcnRleF9jb3VudCA9IHRoaXMudmVydGV4X2RhdGEuYnl0ZUxlbmd0aCAvIHRoaXMudmVydGV4X2xheW91dC5zdHJpZGU7XG4gICAgICAgIHRoaXMudmFvcyA9IHt9OyAvLyBtYXAgb2YgVmVydGV4QXJyYXlPYmplY3RzLCBrZXllZCBieSBwcm9ncmFtXG5cbiAgICAgICAgdGhpcy50b2dnbGVfZWxlbWVudF9hcnJheSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50X2RhdGEpe1xuICAgICAgICAgICAgdGhpcy50b2dnbGVfZWxlbWVudF9hcnJheSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRfY291bnQgPSB0aGlzLmVsZW1lbnRfZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmdlb21ldHJ5X2NvdW50ID0gdGhpcy5lbGVtZW50X2NvdW50IC8gdGhpcy52ZXJ0aWNlc19wZXJfZ2VvbWV0cnk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRfdHlwZSA9ICh0aGlzLmVsZW1lbnRfZGF0YS5jb25zdHJ1Y3RvciA9PT0gVWludDE2QXJyYXkpID8gdGhpcy5nbC5VTlNJR05FRF9TSE9SVDogdGhpcy5nbC5VTlNJR05FRF9JTlQ7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRfYnVmZmVyID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmVsZW1lbnRfYnVmZmVyKTtcbiAgICAgICAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmVsZW1lbnRfZGF0YSwgdGhpcy5kYXRhX3VzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2VvbWV0cnlfY291bnQgPSB0aGlzLnZlcnRleF9jb3VudCAvIHRoaXMudmVydGljZXNfcGVyX2dlb21ldHJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLnZlcnRleF9idWZmZXIpO1xuICAgICAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMudmVydGV4X2RhdGEsIHRoaXMuZGF0YV91c2FnZSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnJldGFpbikge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMudmVydGV4X2RhdGE7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5lbGVtZW50X2RhdGE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWxpZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyLCBieSBkZWZhdWx0IHdpdGggY3VycmVudGx5IGJvdW5kIHByb2dyYW0sIG9yIG90aGVyd2lzZSB3aXRoIG9wdGlvbmFsbHkgcHJvdmlkZWQgb25lXG4gICAgLy8gUmV0dXJucyB0cnVlIGlmIG1lc2ggcmVxdWVzdHMgYSByZW5kZXIgb24gbmV4dCBmcmFtZSAoZS5nLiBmb3IgZmFkZSBhbmltYXRpb25zKVxuICAgIHJlbmRlcihvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcHJvZ3JhbSA9IG9wdGlvbnMucHJvZ3JhbSB8fCBTaGFkZXJQcm9ncmFtLmN1cnJlbnQ7XG4gICAgICAgIHByb2dyYW0udXNlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHByb2dyYW0uc2F2ZVVuaWZvcm1zKHRoaXMudW5pZm9ybXMpO1xuICAgICAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3Jtcyh0aGlzLnVuaWZvcm1zLCBmYWxzZSk7IC8vIGRvbid0IHJlc2V0IHRleHR1cmUgdW5pdFxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZpc2libGVfdGltZSA9ICgrbmV3IERhdGUoKSAtIHRoaXMuY3JlYXRlZF9hdCkgLyAxMDAwO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfdmlzaWJsZV90aW1lJywgdmlzaWJsZV90aW1lKTtcblxuICAgICAgICB0aGlzLmJpbmQocHJvZ3JhbSk7XG5cbiAgICAgICAgaWYgKHRoaXMudG9nZ2xlX2VsZW1lbnRfYXJyYXkpe1xuICAgICAgICAgICAgdGhpcy5nbC5kcmF3RWxlbWVudHModGhpcy5kcmF3X21vZGUsIHRoaXMuZWxlbWVudF9jb3VudCwgdGhpcy5lbGVtZW50X3R5cGUsIDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nbC5kcmF3QXJyYXlzKHRoaXMuZHJhd19tb2RlLCAwLCB0aGlzLnZlcnRleF9jb3VudCk7XG4gICAgICAgIH1cblxuICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5iaW5kKHRoaXMuZ2wsIG51bGwpO1xuXG4gICAgICAgIGlmICh0aGlzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICBwcm9ncmFtLnJlc3RvcmVVbmlmb3Jtcyh0aGlzLnVuaWZvcm1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlcXVlc3QgbmV4dCByZW5kZXIgaWYgbWVzaCBpcyBmYWRpbmcgaW5cbiAgICAgICAgcmV0dXJuICh2aXNpYmxlX3RpbWUgPCB0aGlzLmZhZGVfaW5fdGltZSk7XG4gICAgfVxuXG4gICAgLy8gQmluZCBidWZmZXJzIGFuZCB2ZXJ0ZXggYXR0cmlidXRlcyB0byBwcmVwYXJlIGZvciByZW5kZXJpbmdcbiAgICBiaW5kKHByb2dyYW0pIHtcbiAgICAgICAgLy8gQmluZCBWQU8gZm9yIHRoaXMgcHJvZ2FtLCBvciBjcmVhdGUgb25lXG4gICAgICAgIGxldCB2YW8gPSB0aGlzLnZhb3NbcHJvZ3JhbS5pZF07XG4gICAgICAgIGlmICh2YW8pIHtcbiAgICAgICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmJpbmQodGhpcy5nbCwgdmFvKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFvc1twcm9ncmFtLmlkXSA9IFZlcnRleEFycmF5T2JqZWN0LmNyZWF0ZSh0aGlzLmdsLCAoZm9yY2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMudmVydGV4X2J1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudG9nZ2xlX2VsZW1lbnRfYXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuZWxlbWVudF9idWZmZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQuZW5hYmxlKHRoaXMuZ2wsIHByb2dyYW0sIGZvcmNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IHYgaW4gdGhpcy52YW9zKSB7XG4gICAgICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5kZXN0cm95KHRoaXMuZ2wsIHRoaXMudmFvc1t2XSk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2coJ3RyYWNlJywgJ1ZCT01lc2guZGVzdHJveTogZGVsZXRlIGJ1ZmZlcicgKyAodGhpcy52ZXJ0ZXhfZGF0YSA/IGAgb2Ygc2l6ZSAke3RoaXMudmVydGV4X2RhdGEuYnl0ZUxlbmd0aH1gIDogJycpKTtcblxuICAgICAgICB0aGlzLmdsLmRlbGV0ZUJ1ZmZlcih0aGlzLnZlcnRleF9idWZmZXIpO1xuICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRfYnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmVsZW1lbnRfYnVmZmVyKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudF9idWZmZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMudmVydGV4X2RhdGE7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmVsZW1lbnRfZGF0YTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbn1cbiIsImltcG9ydCBnbCBmcm9tICcuL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVmVydGV4RWxlbWVudHMgZnJvbSAnLi92ZXJ0ZXhfZWxlbWVudHMnO1xuXG4vLyBNYXBzIEdMIHR5cGVzIHRvIEpTIGFycmF5IHR5cGVzXG5sZXQgYXJyYXlfdHlwZXMgPSB7XG4gICAgW2dsLkZMT0FUXTogRmxvYXQzMkFycmF5LFxuICAgIFtnbC5CWVRFXTogSW50OEFycmF5LFxuICAgIFtnbC5VTlNJR05FRF9CWVRFXTogVWludDhBcnJheSxcbiAgICBbZ2wuSU5UXTogSW50MzJBcnJheSxcbiAgICBbZ2wuVU5TSUdORURfSU5UXTogVWludDMyQXJyYXksXG4gICAgW2dsLlNIT1JUXTogSW50MTZBcnJheSxcbiAgICBbZ2wuVU5TSUdORURfU0hPUlRdOiBVaW50MTZBcnJheVxufTtcblxuLy8gQW4gaW50ZXJtZWRpYXJ5IG9iamVjdCB0aGF0IGhvbGRzIHZlcnRleCBkYXRhIGluIHR5cGVkIGFycmF5cywgYWNjb3JkaW5nIHRvIGEgZ2l2ZW4gdmVydGV4IGxheW91dFxuLy8gVXNlZCB0byBjb25zdHJ1Y3QgYSBtZXNoL1ZCTyBmb3IgcmVuZGVyaW5nXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJ0ZXhEYXRhIHtcblxuICAgIGNvbnN0cnVjdG9yICh2ZXJ0ZXhfbGF5b3V0LCB7IHByZWFsbG9jID0gNTAwIH0gPSB7fSkge1xuICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQgPSB2ZXJ0ZXhfbGF5b3V0O1xuICAgICAgICB0aGlzLnZlcnRleF9lbGVtZW50cyA9IG5ldyBWZXJ0ZXhFbGVtZW50cygpO1xuXG4gICAgICAgIGlmIChWZXJ0ZXhEYXRhLmFycmF5X3Bvb2wubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gVmVydGV4RGF0YS5hcnJheV9wb29sLnBvcCgpO1xuICAgICAgICAgICAgdGhpcy5ieXRlX2xlbmd0aCA9IHRoaXMudmVydGV4X2J1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5zaXplID0gTWF0aC5mbG9vcih0aGlzLmJ5dGVfbGVuZ3RoIC8gdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZSk7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYFZlcnRleERhdGE6IHJldXNlZCBidWZmZXIgb2YgYnl0ZXMgJHt0aGlzLmJ5dGVfbGVuZ3RofSwgJHt0aGlzLnNpemV9IHZlcnRpY2VzYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNpemUgPSBwcmVhbGxvYzsgLy8gIyBvZiB2ZXJ0aWNlcyB0byBhbGxvY2F0ZVxuICAgICAgICAgICAgdGhpcy5ieXRlX2xlbmd0aCA9IHRoaXMudmVydGV4X2xheW91dC5zdHJpZGUgKiB0aGlzLnNpemU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSBuZXcgVWludDhBcnJheSh0aGlzLmJ5dGVfbGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9mZnNldCA9IDA7ICAgICAgICAgICAgIC8vIGJ5dGUgb2Zmc2V0IGludG8gY3VycmVudGx5IGFsbG9jYXRlZCBidWZmZXJcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgdGhpcy52ZXJ0ZXhfbGF5b3V0LmNvbXBvbmVudHMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKFsuLi50aGlzLnZlcnRleF9sYXlvdXQuY29tcG9uZW50c1tjXV0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmVydGV4X2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5yZWFsbG9jX2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5zZXRCdWZmZXJWaWV3cygpO1xuICAgIH1cblxuICAgIC8vIChSZS0pYWxsb2NhdGUgdHlwZWQgdmlld3MgaW50byB0aGUgbWFpbiBidWZmZXIgLSBvbmx5IGNyZWF0ZSB0aGUgdHlwZXMgd2UgbmVlZCBmb3IgdGhpcyBsYXlvdXRcbiAgICBzZXRCdWZmZXJWaWV3cyAoKSB7XG4gICAgICAgIHRoaXMudmlld3MgPSB7fTtcbiAgICAgICAgdGhpcy52aWV3c1tnbC5VTlNJR05FRF9CWVRFXSA9IHRoaXMudmVydGV4X2J1ZmZlcjtcbiAgICAgICAgZm9yIChsZXQgYT0wOyBhIDwgdGhpcy52ZXJ0ZXhfbGF5b3V0LmF0dHJpYnMubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYiA9IHRoaXMudmVydGV4X2xheW91dC5hdHRyaWJzW2FdO1xuXG4gICAgICAgICAgICAvLyBOZWVkIHZpZXcgZm9yIHRoaXMgdHlwZT9cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdzW2F0dHJpYi50eXBlXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFycmF5X3R5cGUgPSBhcnJheV90eXBlc1thdHRyaWIudHlwZV07XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3c1thdHRyaWIudHlwZV0gPSBuZXcgYXJyYXlfdHlwZSh0aGlzLnZlcnRleF9idWZmZXIuYnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBjb21wb25lbnQgYnVmZmVyIHBvaW50ZXJzXG4gICAgICAgIGZvciAobGV0IGM9MDsgYyA8IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzW2NdO1xuICAgICAgICAgICAgY29tcG9uZW50WzFdID0gdGhpcy52aWV3c1tjb21wb25lbnRbMF1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYWxsb2NhdGVkIGJ1ZmZlciBzaXplLCBleHBhbmQvcmVhbGxvYyBidWZmZXIgaWYgbmVlZGVkXG4gICAgY2hlY2tCdWZmZXJTaXplICgpIHtcbiAgICAgICAgaWYgKCh0aGlzLm9mZnNldCArIHRoaXMudmVydGV4X2xheW91dC5zdHJpZGUpID4gdGhpcy5ieXRlX2xlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zaXplID0gTWF0aC5mbG9vcih0aGlzLnNpemUgKiAxLjUpO1xuICAgICAgICAgICAgdGhpcy5zaXplIC09IHRoaXMuc2l6ZSAlIDQ7XG4gICAgICAgICAgICB0aGlzLmJ5dGVfbGVuZ3RoID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZSAqIHRoaXMuc2l6ZTtcbiAgICAgICAgICAgIHZhciBuZXdfdmlldyA9IG5ldyBVaW50OEFycmF5KHRoaXMuYnl0ZV9sZW5ndGgpO1xuICAgICAgICAgICAgbmV3X3ZpZXcuc2V0KHRoaXMudmVydGV4X2J1ZmZlcik7IC8vIGNvcHkgZXhpc3RpbmcgZGF0YSB0byBuZXcgYnVmZmVyXG4gICAgICAgICAgICBWZXJ0ZXhEYXRhLmFycmF5X3Bvb2wucHVzaCh0aGlzLnZlcnRleF9idWZmZXIpOyAvLyBzYXZlIHByZXZpb3VzIGJ1ZmZlciBmb3IgdXNlIGJ5IG5leHQgdGlsZVxuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gbmV3X3ZpZXc7XG4gICAgICAgICAgICB0aGlzLnNldEJ1ZmZlclZpZXdzKCk7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2NfY291bnQrKztcbiAgICAgICAgICAgIC8vIGxvZygnaW5mbycsIGBWZXJ0ZXhEYXRhOiBleHBhbmRlZCB2ZXJ0ZXggYmxvY2sgdG8gJHt0aGlzLnNpemV9IHZlcnRpY2VzYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgYSB2ZXJ0ZXgsIGNvcGllZCBmcm9tIGEgcGxhaW4gSlMgYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIG9yZGVyIG9mIHRoZSB2ZXJ0ZXggbGF5b3V0LlxuICAgIC8vIE5vdGU6IHVzZXMgcHJlLWNhbGN1bGF0ZWQgaW5mbyBhYm91dCBlYWNoIGF0dHJpYnV0ZSwgaW5jbHVkaW5nIHBvaW50ZXIgdG8gYXBwcm9wcmlhdGUgdHlwZWQgYXJyYXlcbiAgICAvLyB2aWV3IGFuZCBvZmZzZXQgaW50byBpdC4gVGhpcyB3YXMgdGhlIGZhc3Rlc3QgbWV0aG9kIHByb2ZpbGVkIHNvIGZhciBmb3IgZmlsbGluZyBhIG1peGVkLXR5cGVcbiAgICAvLyB2ZXJ0ZXggbGF5b3V0ICh0aG91Z2ggc3RpbGwgc2xvd2VyIHRoYW4gdGhlIHByZXZpb3VzIG1ldGhvZCB0aGF0IG9ubHkgc3VwcG9ydGVkIEZsb2F0MzJBcnJheSBhdHRyaWJ1dGVzKS5cbiAgICBhZGRWZXJ0ZXggKHZlcnRleCkge1xuICAgICAgICB0aGlzLmNoZWNrQnVmZmVyU2l6ZSgpO1xuICAgICAgICB2YXIgaT0wO1xuXG4gICAgICAgIHZhciBjbGVuID0gdGhpcy5jb21wb25lbnRzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgYz0wOyBjIDwgY2xlbjsgYysrKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzW2NdO1xuICAgICAgICAgICAgY29tcG9uZW50WzFdWyh0aGlzLm9mZnNldCA+PiBjb21wb25lbnRbMl0pICsgY29tcG9uZW50WzNdXSA9IHZlcnRleFtpKytdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfY291bnQrKztcbiAgICB9XG5cbiAgICAvLyBGaW5hbGl6ZSB2ZXJ0ZXggYnVmZmVyIGZvciB1c2UgaW4gY29uc3RydWN0aW5nIGEgbWVzaFxuICAgIGVuZCAoKSB7XG4gICAgICAgIC8vIENsaXAgdGhlIGJ1ZmZlciB0byBzaXplIHVzZWQgZm9yIHRoaXMgVkJPXG4gICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IHRoaXMudmVydGV4X2J1ZmZlci5zdWJhcnJheSgwLCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMuZWxlbWVudF9idWZmZXIgPSB0aGlzLnZlcnRleF9lbGVtZW50cy5lbmQoKTtcblxuICAgICAgICBsb2coJ3RyYWNlJywgYFZlcnRleERhdGE6ICR7dGhpcy5zaXplfSB2ZXJ0aWNlcyB0b3RhbCwgcmVhbGxvYyBjb3VudCAke3RoaXMucmVhbGxvY19jb3VudH1gKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbn1cblxuVmVydGV4RGF0YS5hcnJheV9wb29sID0gW107IC8vIHBvb2wgb2YgY3VycmVudGx5IGF2YWlsYWJsZSAocHJldmlvdXNseSB1c2VkKSBidWZmZXJzICh1aW50OClcbiIsImltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmxldCBNQVhfVkFMVUUgPSBNYXRoLnBvdygyLCAxNikgLSAxO1xubGV0IFVpbnQzMl9mbGFnID0gZmFsc2U7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlcnRleEVsZW1lbnRzIHtcbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuYXJyYXkgPSBbXTtcbiAgICAgICAgdGhpcy5oYXNfb3ZlcmZsb3duID0gZmFsc2U7XG4gICAgfVxuICAgIHB1c2ggKHZhbHVlKSB7XG4gICAgICAgIC8vIElmIHZhbHVlcyBoYXZlIG92ZXJmbG93biBhbmQgbm8gVWludDMyIG9wdGlvbiBpcyBhdmFpbGFibGUsIGRvIG5vdCBwdXNoIHZhbHVlc1xuICAgICAgICBpZiAodGhpcy5oYXNfb3ZlcmZsb3duICYmICFVaW50MzJfZmxhZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciBvdmVyZmxvdyBpZiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gVWludDE2IG1heFxuICAgICAgICBpZiAodmFsdWUgPiBNQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzX292ZXJmbG93biA9IHRydWU7XG4gICAgICAgICAgICBpZiAoIVVpbnQzMl9mbGFnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcnJheS5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgZW5kICgpIHtcbiAgICAgICAgaWYgKHRoaXMuYXJyYXkubGVuZ3RoKXtcbiAgICAgICAgICAgIGxldCBidWZmZXIgPSBjcmVhdGVCdWZmZXIodGhpcy5hcnJheSwgdGhpcy5oYXNfb3ZlcmZsb3duKTtcbiAgICAgICAgICAgIHRoaXMuYXJyYXkgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaGFzX292ZXJmbG93biA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuVmVydGV4RWxlbWVudHMuc2V0VWludDMyRmxhZyA9IGZ1bmN0aW9uKGZsYWcpIHtcbiAgICBVaW50MzJfZmxhZyA9IGZsYWc7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIoYXJyYXksIG92ZXJmbG93bikge1xuICAgIHZhciB0eXBlZEFycmF5ID0gKG92ZXJmbG93biAmJiBVaW50MzJfZmxhZykgPyBVaW50MzJBcnJheSA6IFVpbnQxNkFycmF5O1xuICAgIHJldHVybiBuZXcgdHlwZWRBcnJheShhcnJheSk7XG59XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ1ZlcnRleEVsZW1lbnRzJywgVmVydGV4RWxlbWVudHMpO1xuIiwiaW1wb3J0IGdsIGZyb20gJy4vY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBWZXJ0ZXhEYXRhIGZyb20gJy4vdmVydGV4X2RhdGEnO1xuXG4vLyBEZXNjcmliZXMgYSB2ZXJ0ZXggbGF5b3V0IHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBtYW55IGRpZmZlcmVudCBHTCBwcm9ncmFtcy5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlcnRleExheW91dCB7XG4gICAgLy8gQXR0cmlicyBhcmUgYW4gYXJyYXksIGluIGxheW91dCBvcmRlciwgb2Y6IG5hbWUsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWRcbiAgICAvLyBleDogeyBuYW1lOiAncG9zaXRpb24nLCBzaXplOiAzLCB0eXBlOiBnbC5GTE9BVCwgbm9ybWFsaXplZDogZmFsc2UgfVxuICAgIGNvbnN0cnVjdG9yIChhdHRyaWJzKSB7XG4gICAgICAgIHRoaXMuYXR0cmlicyA9IGF0dHJpYnM7IC8vIGFycmF5IG9mIGF0dHJpYnV0ZXMsIHNwZWNpZmllZCBhcyBzdGFuZGFyZCBHTCBhdHRyaWIgb3B0aW9uc1xuICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBbXTsgICAvLyBsaXN0IG9mIHR5cGUgYW5kIG9mZnNldCBpbmZvIGFib3V0IGVhY2ggYXR0cmlidXRlIGNvbXBvbmVudFxuICAgICAgICB0aGlzLmluZGV4ID0ge307ICAgICAgICAvLyBsaW5lYXIgYnVmZmVyIGluZGV4IG9mIGVhY2ggYXR0cmlidXRlIGNvbXBvbmVudCwgZS5nLiB0aGlzLmluZGV4LnBvc2l0aW9uLnhcblxuICAgICAgICAvLyBDYWxjIHZlcnRleCBzdHJpZGVcbiAgICAgICAgdGhpcy5zdHJpZGUgPSAwO1xuXG4gICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgIGZvciAobGV0IGE9MDsgYSA8IHRoaXMuYXR0cmlicy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgbGV0IGF0dHJpYiA9IHRoaXMuYXR0cmlic1thXTtcbiAgICAgICAgICAgIGF0dHJpYi5vZmZzZXQgPSB0aGlzLnN0cmlkZTtcbiAgICAgICAgICAgIGF0dHJpYi5ieXRlX3NpemUgPSBhdHRyaWIuc2l6ZTtcbiAgICAgICAgICAgIHZhciBzaGlmdCA9IDA7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoYXR0cmliLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIGdsLkZMT0FUOlxuICAgICAgICAgICAgICAgIGNhc2UgZ2wuSU5UOlxuICAgICAgICAgICAgICAgIGNhc2UgZ2wuVU5TSUdORURfSU5UOlxuICAgICAgICAgICAgICAgICAgICBhdHRyaWIuYnl0ZV9zaXplICo9IDQ7XG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5TSE9SVDpcbiAgICAgICAgICAgICAgICBjYXNlIGdsLlVOU0lHTkVEX1NIT1JUOlxuICAgICAgICAgICAgICAgICAgICBhdHRyaWIuYnl0ZV9zaXplICo9IDI7XG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIDQtYnl0ZSBhbGlnbm1lbnQgb24gYXR0cmlidXRlc1xuICAgICAgICAgICAgdGhpcy5zdHJpZGUgKz0gYXR0cmliLmJ5dGVfc2l6ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0cmlkZSAmIDMpIHsgLy8gcGFkIHRvIG11bHRpcGxlIG9mIDQgYnl0ZXNcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmlkZSArPSA0IC0gKHRoaXMuc3RyaWRlICYgMyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBpbmZvIHRvIGxpc3Qgb2YgYXR0cmlidXRlIGNvbXBvbmVudHNcbiAgICAgICAgICAgIC8vIFVzZWQgdG8gYnVpbGQgdGhlIHZlcnRleCBkYXRhLCBwcm92aWRlcyBwb2ludGVycyBhbmQgb2Zmc2V0cyBpbnRvIGVhY2ggdHlwZWQgYXJyYXkgdmlld1xuICAgICAgICAgICAgLy8gRWFjaCBjb21wb25lbnQgaXMgYW4gYXJyYXkgb2Y6XG4gICAgICAgICAgICAvLyBbR0wgYXR0cmliIHR5cGUsIHBvaW50ZXIgdG8gdHlwZWQgYXJyYXkgdmlldywgYml0cyB0byBzaGlmdCByaWdodCB0byBkZXRlcm1pbmUgYnVmZmVyIG9mZnNldCwgYWRkaXRpb25hbCBidWZmZXIgb2Zmc2V0IGZvciB0aGUgY29tcG9uZW50XVxuICAgICAgICAgICAgdmFyIG9mZnNldF90eXBlZCA9IGF0dHJpYi5vZmZzZXQgPj4gc2hpZnQ7XG4gICAgICAgICAgICBpZiAoYXR0cmliLnNpemUgPiAxKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcz0wOyBzIDwgYXR0cmliLnNpemU7IHMrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChbYXR0cmliLnR5cGUsIG51bGwsIHNoaWZ0LCBvZmZzZXRfdHlwZWQrK10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKFthdHRyaWIudHlwZSwgbnVsbCwgc2hpZnQsIG9mZnNldF90eXBlZF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQcm92aWRlIGFuIGluZGV4IGludG8gdGhlIHZlcnRleCBkYXRhIGJ1ZmZlciBmb3IgZWFjaCBhdHRyaWJ1dGUgY29tcG9uZW50XG4gICAgICAgICAgICB0aGlzLmluZGV4W2F0dHJpYi5uYW1lXSA9IGNvdW50O1xuICAgICAgICAgICAgY291bnQgKz0gYXR0cmliLnNpemU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXR1cCBhIHZlcnRleCBsYXlvdXQgZm9yIGEgc3BlY2lmaWMgR0wgcHJvZ3JhbVxuICAgIC8vIEFzc3VtZXMgdGhhdCB0aGUgZGVzaXJlZCB2ZXJ0ZXggYnVmZmVyIChWQk8pIGlzIGFscmVhZHkgYm91bmRcbiAgICAvLyBJZiBhIGdpdmVuIHByb2dyYW0gZG9lc24ndCBpbmNsdWRlIGFsbCBhdHRyaWJ1dGVzLCBpdCBjYW4gc3RpbGwgdXNlIHRoZSB2ZXJ0ZXggbGF5b3V0XG4gICAgLy8gdG8gcmVhZCB0aG9zZSBhdHRyaWJzIHRoYXQgaXQgZG9lcyByZWNvZ25pemUsIHVzaW5nIHRoZSBhdHRyaWIgb2Zmc2V0cyB0byBza2lwIG90aGVycy5cbiAgICBlbmFibGUgKGdsLCBwcm9ncmFtLCBmb3JjZSlcbiAgICB7XG4gICAgICAgIHZhciBhdHRyaWIsIGxvY2F0aW9uO1xuXG4gICAgICAgIC8vIEVuYWJsZSBhbGwgYXR0cmlidXRlcyBmb3IgdGhpcyBsYXlvdXRcbiAgICAgICAgZm9yICh2YXIgYT0wOyBhIDwgdGhpcy5hdHRyaWJzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBhdHRyaWIgPSB0aGlzLmF0dHJpYnNbYV07XG4gICAgICAgICAgICBsb2NhdGlvbiA9IHByb2dyYW0uYXR0cmlidXRlKGF0dHJpYi5uYW1lKS5sb2NhdGlvbjtcblxuICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmICghVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl0gfHwgZm9yY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobG9jYXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGxvY2F0aW9uLCBhdHRyaWIuc2l6ZSwgYXR0cmliLnR5cGUsIGF0dHJpYi5ub3JtYWxpemVkLCB0aGlzLnN0cmlkZSwgYXR0cmliLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl0gPSBwcm9ncmFtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzYWJsZSBhbnkgcHJldmlvdXNseSBib3VuZCBhdHRyaWJ1dGVzIHRoYXQgYXJlbid0IGZvciB0aGlzIGxheW91dFxuICAgICAgICBmb3IgKGxvY2F0aW9uIGluIFZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnMpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZShnbCwgbG9jYXRpb24sIHByb2dyYW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBhbiBhdHRyaWJ1dGUgaWYgaXQgd2FzIG5vdCBlbmFibGVkIGZvciB0aGUgc3BlY2lmaWVkIHByb2dyYW1cbiAgICAvLyBOT1RFOiB0aGlzIHdhcyBtb3ZlZCBvdXQgb2YgdGhlIGlubmVyIGxvb3AgaW4gZW5hYmxlKCkgdG8gYXNzaXN0IHcvVk0gb3B0aW1pemF0aW9uXG4gICAgZGlzYWJsZVVudXNlZEF0dHJpYnV0ZSAoZ2wsIGxvY2F0aW9uLCBwcm9ncmFtKSB7XG4gICAgICAgIGlmIChWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzW2xvY2F0aW9uXSAhPT0gcHJvZ3JhbSkge1xuICAgICAgICAgICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGxvY2F0aW9uKTtcbiAgICAgICAgICAgIGRlbGV0ZSBWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzW2xvY2F0aW9uXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZVZlcnRleERhdGEgKCkge1xuICAgICAgICByZXR1cm4gbmV3IFZlcnRleERhdGEodGhpcyk7XG4gICAgfVxuXG59XG5cbi8vIFRyYWNrIGN1cnJlbnRseSBlbmFibGVkIGF0dHJpYnMsIGJ5IHRoZSBwcm9ncmFtIHRoZXkgYXJlIGJvdW5kIHRvXG4vLyBTdGF0aWMgY2xhc3MgcHJvcGVydHkgdG8gcmVmbGVjdCBnbG9iYWwgR0wgc3RhdGVcblZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnMgPSB7fTtcbiIsImltcG9ydCBSZXBlYXRHcm91cCBmcm9tICcuL3JlcGVhdF9ncm91cCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5cbnZhciBDb2xsaXNpb247XG5cbmV4cG9ydCBkZWZhdWx0IENvbGxpc2lvbiA9IHtcblxuICAgIHRpbGVzOiB7fSxcblxuICAgIHN0YXJ0VGlsZSAodGlsZSkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnRpbGVzW3RpbGVdID0ge1xuICAgICAgICAgICAgYmJveGVzOiB7ICAgICAgICAgICAvLyBjdXJyZW50IHNldCBvZiBwbGFjZWQgYm91bmRpbmcgYm94ZXNcbiAgICAgICAgICAgICAgICBhYWJiOiBbXSxcbiAgICAgICAgICAgICAgICBvYmI6IFtdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb2JqZWN0czoge30sICAgICAgICAvLyBvYmplY3RzIHRvIGNvbGxpZGUsIGdyb3VwZWQgYnkgcHJpb3JpdHksIHRoZW4gYnkgc3R5bGVcbiAgICAgICAgICAgIGtlZXA6IHt9LCAgICAgICAgICAgLy8gb2JqZWN0cyB0aGF0IHdlcmUga2VwdCBhZnRlciBjb2xsaXNpb24sIGdyb3VwZWQgYnkgc3R5bGVcbiAgICAgICAgICAgIHN0eWxlczoge30gICAgICAgICAgLy8gc3R5bGVzIGNvbnRyaWJ1dGluZyBjb2xsaXNpb24gb2JqZWN0c1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFByb21pc2UgcmVzb2x2ZWQgd2hlbiBhbGwgcmVnaXN0ZXJlZCBzdHlsZXMgaGF2ZSBhZGRlZCBvYmplY3RzXG4gICAgICAgIHN0YXRlLmNvbXBsZXRlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc3RhdGUucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICBzdGF0ZS5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICByZXNldFRpbGUgKHRpbGUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMudGlsZXNbdGlsZV07XG4gICAgfSxcblxuICAgIC8vIEFkZCBhIHN0eWxlIHRvIHRoZSBwZW5kaW5nIHNldCwgY29sbGlzaW9uIHdpbGwgYmxvY2sgb24gYWxsIHN0eWxlcyBzdWJtaXR0aW5nIHRvIGNvbGxpc2lvbiBzZXRcbiAgICBhZGRTdHlsZSAoc3R5bGUsIHRpbGUpIHtcbiAgICAgICAgdGhpcy50aWxlc1t0aWxlXS5zdHlsZXNbc3R5bGVdID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLy8gQWRkIGNvbGxpc2lvbiBvYmplY3RzIGZvciBhIHN0eWxlXG4gICAgY29sbGlkZSAob2JqZWN0cywgc3R5bGUsIHRpbGUpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy50aWxlc1t0aWxlXTtcbiAgICAgICAgaWYgKCFzdGF0ZSkge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsICdDb2xsaXNpb24uY29sbGlkZSgpIGNhbGxlZCB3aXRoIG51bGwgdGlsZScsIHRpbGUsIHRoaXMudGlsZXMsIHN0eWxlLCBvYmplY3RzKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR3JvdXAgYnkgcHJpb3JpdHkgYW5kIHN0eWxlXG4gICAgICAgIGxldCB0aWxlX29iamVjdHMgPSBzdGF0ZS5vYmplY3RzO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgb2JqID0gb2JqZWN0c1tpXTtcbiAgICAgICAgICAgIGxldCBwcmlvcml0eSA9IG9iai5sYWJlbC5sYXlvdXQucHJpb3JpdHk7XG4gICAgICAgICAgICB0aWxlX29iamVjdHNbcHJpb3JpdHldID0gdGlsZV9vYmplY3RzW3ByaW9yaXR5XSB8fCB7fTtcbiAgICAgICAgICAgIHRpbGVfb2JqZWN0c1twcmlvcml0eV1bc3R5bGVdID0gdGlsZV9vYmplY3RzW3ByaW9yaXR5XVtzdHlsZV0gfHwgW107XG4gICAgICAgICAgICB0aWxlX29iamVjdHNbcHJpb3JpdHldW3N0eWxlXS5wdXNoKG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBwZW5kaW5nIHN0eWxlIHNldCwgaWYgbm8gbW9yZSBzdHlsZXMsIGRvIGNvbGxpc2lvbiAmIGZpbmlzaCB0aWxlXG4gICAgICAgIGRlbGV0ZSBzdGF0ZS5zdHlsZXNbc3R5bGVdO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc3RhdGUuc3R5bGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZW5kVGlsZSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdhaXQgZm9yIG9iamVjdHMgdG8gYmUgYWRkZWQgZnJvbSBhbGwgc3R5bGVzXG4gICAgICAgIHJldHVybiBzdGF0ZS5jb21wbGV0ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5rZWVwW3N0eWxlXSB8fCBbXTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFRlc3QgbGFiZWxzIGZvciBjb2xsaXNpb25zLCBoaWdoZXIgdG8gbG93ZXIgcHJpb3JpdHlcbiAgICAvLyBXaGVuIHR3byBjb2xsaWRlLCBkaXNjYXJkIHRoZSBsb3dlci1wcmlvcml0eSBsYWJlbFxuICAgIGVuZFRpbGUgKHRpbGUpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy50aWxlc1t0aWxlXTtcbiAgICAgICAgbGV0IGtlZXAgPSBzdGF0ZS5rZWVwO1xuXG4gICAgICAgIFJlcGVhdEdyb3VwLmNsZWFyKHRpbGUpO1xuXG4gICAgICAgIC8vIFByb2Nlc3MgbGFiZWxzIGJ5IHByaW9yaXR5LCB0aGVuIGJ5IHN0eWxlXG4gICAgICAgIGxldCBwcmlvcml0aWVzID0gT2JqZWN0LmtleXMoc3RhdGUub2JqZWN0cykuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICBmb3IgKGxldCBwPTA7IHAgPCBwcmlvcml0aWVzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICBsZXQgc3R5bGVfb2JqZWN0cyA9IHN0YXRlLm9iamVjdHNbcHJpb3JpdGllc1twXV07XG4gICAgICAgICAgICBpZiAoIXN0eWxlX29iamVjdHMpIHsgLy8gbm8gbGFiZWxzIGF0IHRoaXMgcHJpb3JpdHksIHNraXAgdG8gbmV4dFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3IgZWFjaCBzdHlsZVxuICAgICAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gc3R5bGVfb2JqZWN0cykge1xuICAgICAgICAgICAgICAgIGxldCBvYmplY3RzID0gc3R5bGVfb2JqZWN0c1tzdHlsZV07XG4gICAgICAgICAgICAgICAga2VlcFtzdHlsZV0gPSBrZWVwW3N0eWxlXSB8fCBbXTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0ID0gb2JqZWN0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuQmVQbGFjZWQob2JqZWN0LCB0aWxlLCBvYmplY3QubGlua2VkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2VlcCBvYmplY3QgaWYgaXQgaXNuJ3QgZGVwZW5kZW50IG9uIGEgcGFyZW50IG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmplY3QubGlua2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcFtzdHlsZV0ucHVzaChvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2Uob2JqZWN0LCB0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG9iamVjdCBpcyBkZXBlbmRlbnQgb24gYSBwYXJlbnQsIG9ubHkga2VlcCBpZiBib3RoIGNhbiBiZSBwbGFjZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY2FuQmVQbGFjZWQob2JqZWN0LmxpbmtlZCwgdGlsZSwgb2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBbc3R5bGVdLnB1c2gob2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlKG9iamVjdCwgdGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZShvYmplY3QubGlua2VkLCB0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgICAgICBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgfSxcblxuICAgIC8vIFJ1biBjb2xsaXNpb24gYW5kIHJlcGVhdCBjaGVjayB0byBzZWUgaWYgbGFiZWwgY2FuIGN1cnJlbnRseSBiZSBwbGFjZWRcbiAgICBjYW5CZVBsYWNlZCAob2JqZWN0LCB0aWxlLCBleGNsdWRlID0gbnVsbCkge1xuICAgICAgICBsZXQgbGFiZWwgPSBvYmplY3QubGFiZWw7XG4gICAgICAgIGxldCBsYXlvdXQgPSBvYmplY3QubGFiZWwubGF5b3V0O1xuXG4gICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBwcm9jZXNzZWQgKGUuZy4gYnkgcGFyZW50IG9iamVjdClcbiAgICAgICAgaWYgKGxhYmVsLnBsYWNlZCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbGFiZWwucGxhY2VkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGVzdCB0aGUgbGFiZWwgZm9yIGludGVyc2VjdGlvbnMgd2l0aCBvdGhlciBsYWJlbHMgaW4gdGhlIHRpbGVcbiAgICAgICAgbGV0IGJib3hlcyA9IHRoaXMudGlsZXNbdGlsZV0uYmJveGVzO1xuICAgICAgICBpZiAoIWxheW91dC5jb2xsaWRlIHx8ICFsYWJlbC5kaXNjYXJkKGJib3hlcywgZXhjbHVkZSAmJiBleGNsdWRlLmxhYmVsKSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHJlcGVhdHNcbiAgICAgICAgICAgIGxldCByZXBlYXQgPSBSZXBlYXRHcm91cC5jaGVjayhsYWJlbCwgbGF5b3V0LCB0aWxlKTtcbiAgICAgICAgICAgIGlmIChyZXBlYXQpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgYGRpc2NhcmQgbGFiZWwgJyR7bGFiZWwudGV4dH0nLCAob25lX3Blcl9ncm91cDogJHtyZXBlYXQub25lX3Blcl9ncm91cH0pLCBkaXN0ICR7TWF0aC5zcXJ0KHJlcGVhdC5kaXN0X3NxKS9sYXlvdXQudW5pdHNfcGVyX3BpeGVsfSA8ICR7TWF0aC5zcXJ0KHJlcGVhdC5yZXBlYXRfZGlzdF9zcSkvbGF5b3V0LnVuaXRzX3Blcl9waXhlbH1gKTtcbiAgICAgICAgICAgICAgICBsYWJlbC5wbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxheW91dC5jb2xsaWRlKSB7XG4gICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgYGRpc2NhcmQgbGFiZWwgJyR7bGFiZWwudGV4dH0nIGR1ZSB0byBjb2xsaXNpb25gKTtcbiAgICAgICAgICAgIGxhYmVsLnBsYWNlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYWJlbC5wbGFjZWQ7XG4gICAgfSxcblxuICAgIC8vIFBsYWNlIGxhYmVsXG4gICAgcGxhY2UgKHsgbGFiZWwgfSwgdGlsZSkge1xuICAgICAgICAvLyBTa2lwIGlmIGFscmVhZHkgcHJvY2Vzc2VkIChlLmcuIGJ5IHBhcmVudCBvYmplY3QpXG4gICAgICAgIGlmIChsYWJlbC5wbGFjZWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgcGxhY2VkIGZvciBmdXR1cmUgY29sbGlzaW9uIGFuZCByZXBlYXQgY3VsbGluZ1xuICAgICAgICBSZXBlYXRHcm91cC5hZGQobGFiZWwsIGxhYmVsLmxheW91dCwgdGlsZSk7XG4gICAgICAgIGxhYmVsLmFkZCh0aGlzLnRpbGVzW3RpbGVdLmJib3hlcyk7XG4gICAgfVxuXG59O1xuIiwiXG4vLyBEbyBBQUJCIGBhYCBhbmQgYGJgIGludGVyc2VjdD9cbmV4cG9ydCBmdW5jdGlvbiBib3hJbnRlcnNlY3RzQm94IChhLCBiKSB7XG4gICAgaWYgKGFbMl0gPCBiWzBdIHx8IC8vIGEgaXMgbGVmdCBvZiBiXG4gICAgICAgIGFbMF0gPiBiWzJdIHx8IC8vIGEgaXMgcmlnaHQgb2YgYlxuICAgICAgICBhWzNdIDwgYlsxXSB8fCAvLyBhIGlzIGFib3ZlIGJcbiAgICAgICAgYVsxXSA+IGJbM10pIHsgLy8gYSBpcyBiZWxvdyBiXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7IC8vIGJveGVzIG92ZXJsYXBcbn1cblxuLy8gRG9lcyBBQUJCIGBhYCBpbnRlcnNlY3QgYW55IG9mIHRoZSBBQUJCcyBpbiBhcnJheSBgYm94ZXNgP1xuLy8gSW52b2tlcyBgY2FsbGJhY2tgIHdpdGggaW5kZXggb2YgaW50ZXJzZWN0aW5nIGJveFxuLy8gU3RvcHMgaW50ZXJzZWN0aW5nIGlmIGBjYWxsYmFja2AgcmV0dXJucyBub24tbnVsbCB2YWx1ZSAoY29udGludWVzIG90aGVyd2lzZSlcbmV4cG9ydCBmdW5jdGlvbiBib3hJbnRlcnNlY3RzTGlzdCAoYSwgYm94ZXMsIGNhbGxiYWNrKSB7XG4gICAgZm9yIChsZXQgaT0wOyBpIDwgYm94ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGJveEludGVyc2VjdHNCb3goYSwgYm94ZXNbaV0pKSB7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2soaSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IFBvaW50QW5jaG9yIGZyb20gJy4vcG9pbnRfYW5jaG9yJztcbmltcG9ydCB7Ym94SW50ZXJzZWN0c0xpc3R9IGZyb20gJy4vaW50ZXJzZWN0JztcbmltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgT0JCIGZyb20gJy4uL3V0aWxzL29iYic7XG4vLyBpbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYmVsIHtcblxuICAgIGNvbnN0cnVjdG9yIChzaXplLCBsYXlvdXQgPSB7fSkge1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuYW5jaG9yID0gQXJyYXkuaXNBcnJheSh0aGlzLmxheW91dC5hbmNob3IpID8gdGhpcy5sYXlvdXQuYW5jaG9yWzBdIDogdGhpcy5sYXlvdXQuYW5jaG9yOyAvLyBpbml0aWFsIGFuY2hvclxuICAgICAgICB0aGlzLnBsYWNlZCA9IG51bGw7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gbGF5b3V0Lm9mZnNldDtcbiAgICAgICAgdGhpcy5hYWJiID0gbnVsbDtcbiAgICAgICAgdGhpcy5vYmIgPSBudWxsO1xuICAgICAgICB0aGlzLmFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIHRoaXMudGhyb3dfYXdheSA9IGZhbHNlOyAgICAvLyBpZiBsYWJlbCBkb2VzIG5vdCBmaXQgKGV4Y2VlZHMgdGlsZSBib3VuZGFyeSwgZXRjKSB0aGlzIGJvb2xlYW4gd2lsbCBiZSB0cnVlXG4gICAgfVxuXG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgdGhpcy5hbGlnbiA9IHRoaXMubGF5b3V0LmFsaWduIHx8IFBvaW50QW5jaG9yLmFsaWduRm9yQW5jaG9yKHRoaXMuYW5jaG9yKTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBmb3Igb3ZlcmxhcHMgd2l0aCBvdGhlciBsYWJlbHMgaW4gdGhlIHRpbGVcbiAgICBvY2NsdWRlZCAoYmJveGVzLCBleGNsdWRlID0gbnVsbCkge1xuICAgICAgICBsZXQgaW50ZXJzZWN0ID0gZmFsc2U7XG4gICAgICAgIGxldCBhYWJicyA9IGJib3hlcy5hYWJiO1xuICAgICAgICBsZXQgb2JicyA9IGJib3hlcy5vYmI7XG5cbiAgICAgICAgLy8gQnJvYWQgcGhhc2VcbiAgICAgICAgaWYgKGFhYmJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGJveEludGVyc2VjdHNMaXN0KHRoaXMuYWFiYiwgYWFiYnMsIChqKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsICdjb2xsaXNpb246IGJyb2FkIHBoYXNlIGNvbGxpZGUnLCB0aGlzLmxheW91dC5pZCwgdGhpcywgdGhpcy5hYWJiLCBhYWJic1tqXSk7XG5cbiAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIGNvbGxpZGluZyB3aXRoIGV4Y2x1ZGVkIGxhYmVsXG4gICAgICAgICAgICAgICAgaWYgKGV4Y2x1ZGUgJiYgYWFiYnNbal0gPT09IGV4Y2x1ZGUuYWFiYikge1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogc2tpcHBpbmcgZHVlIHRvIGV4cGxpY2l0IGV4Y2x1c2lvbicsIHRoaXMsIGV4Y2x1ZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2tpcCBuYXJyb3cgcGhhc2UgY29sbGlzaW9uIGlmIG5vIHJvdGF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2JiLmFuZ2xlID09PSAwICYmIG9iYnNbal0uYW5nbGUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsICdjb2xsaXNpb246IHNraXAgbmFycm93IHBoYXNlIGNvbGxpZGUgYmVjYXVzZSBuZWl0aGVyIGlzIHJvdGF0ZWQnLCB0aGlzLmxheW91dC5pZCwgdGhpcywgdGhpcy5vYmIsIG9iYnNbal0pO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBOYXJyb3cgcGhhc2VcbiAgICAgICAgICAgICAgICBpZiAoT0JCLmludGVyc2VjdCh0aGlzLm9iYiwgb2Jic1tqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsICdjb2xsaXNpb246IG5hcnJvdyBwaGFzZSBjb2xsaWRlJywgdGhpcy5sYXlvdXQuaWQsIHRoaXMsIHRoaXMub2JiLCBvYmJzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGludGVyc2VjdDtcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhpcyBsYWJlbCdzIGJvdW5kaW5nIGJveCB0byB0aGUgcHJvdmlkZWQgc2V0XG4gICAgYWRkIChiYm94ZXMpIHtcbiAgICAgICAgdGhpcy5wbGFjZWQgPSB0cnVlO1xuICAgICAgICBiYm94ZXMuYWFiYi5wdXNoKHRoaXMuYWFiYik7XG4gICAgICAgIGJib3hlcy5vYmIucHVzaCh0aGlzLm9iYik7XG4gICAgfVxuXG4gICAgLy8gY2hlY2tzIHdoZXRoZXIgdGhlIGxhYmVsIGlzIHdpdGhpbiB0aGUgdGlsZSBib3VuZGFyaWVzXG4gICAgaW5UaWxlQm91bmRzICgpIHtcbiAgICAgICAgbGV0IG1pbiA9IFsgdGhpcy5hYWJiWzBdLCB0aGlzLmFhYmJbMV0gXTtcbiAgICAgICAgbGV0IG1heCA9IFsgdGhpcy5hYWJiWzJdLCB0aGlzLmFhYmJbM10gXTtcblxuICAgICAgICBpZiAoIVV0aWxzLnBvaW50SW5UaWxlKG1pbikgfHwgIVV0aWxzLnBvaW50SW5UaWxlKG1heCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFdoZXRoZXIgdGhlIGxhYmVsIHNob3VsZCBiZSBkaXNjYXJkZWRcbiAgICAvLyBEZXBlbmRzIG9uIHdoZXRoZXIgbGFiZWwgbXVzdCBmaXQgaW4gdGhlIHRpbGUgYm91bmRzLCBhbmQgaWYgc28sIGNhbiBpdCBiZSBtb3ZlZCB0byBmaXQgdGhlcmVcbiAgICBkaXNjYXJkKGJib3hlcywgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMudGhyb3dfYXdheSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMub2NjbHVkZWQoYmJveGVzLCBleGNsdWRlKTtcbiAgICB9XG59XG5cbkxhYmVsLmVwc2lsb24gPSAwLjk5OTk7IC8vIHRvbGVyYW5jZSBhcm91bmQgY29sbGlzaW9uIGJveGVzLCBwcmV2ZW50IHBlcmZlY3RseSBhZGphY2VudCBvYmplY3RzIGZyb20gY29sbGlkaW5nXG4iLCJpbXBvcnQgTGFiZWwgZnJvbSAnLi9sYWJlbCc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5pbXBvcnQgT0JCIGZyb20gJy4uL3V0aWxzL29iYic7XG5cbmNvbnN0IFBMQUNFTUVOVCA9IHtcbiAgICBNSURfUE9JTlQ6IDAsXG4gICAgQ09STkVSOiAxXG59O1xuXG5jb25zdCBNQVhfQU5HTEUgPSBNYXRoLlBJIC8gMjsgICAgICAvLyBtYXhpbXVtIGFuZ2xlIGZvciBhcnRpY3VsYXRlZCBsYWJlbHNcbmNvbnN0IExJTkVfRVhDRUVEX1NUUkFJR0hUID0gMC43OyAgIC8vIG1pbmltYWwgcmF0aW8gZm9yIHN0cmFpZ2h0IGxhYmVscyAobGFiZWwgbGVuZ3RoKSAvIChsaW5lIGxlbmd0aClcbmNvbnN0IExJTkVfRVhDRUVEX0tJTktFRCA9IDAuNjsgICAgIC8vIG1pbmltYWwgcmF0aW8gZm9yIGtpbmtlZCBsYWJlbHNcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGFiZWxMaW5lIHtcblxuICAgIGNvbnN0cnVjdG9yIChzaXplLCBsaW5lcywgbGF5b3V0KSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICAgICAgICB0aGlzLmxpbmVzID0gbGluZXM7XG4gICAgICAgIHRoaXMuc3BhY2Vfd2lkdGggPSBsYXlvdXQuc3BhY2Vfd2lkdGg7IC8vIHdpZHRoIG9mIHNwYWNlIGZvciB0aGUgZm9udCB1c2VkXG4gICAgICAgIHRoaXMubnVtX3NlZ21lbnRzID0gc2l6ZS5sZW5ndGg7IC8vIG51bWJlciBvZiBsYWJlbCBzZWdtZW50c1xuICAgICAgICB0aGlzLnRvdGFsX2xlbmd0aCA9IHNpemUucmVkdWNlKGZ1bmN0aW9uKHByZXYsIG5leHQpeyByZXR1cm4gcHJldiArIG5leHRbMF07IH0sIDApICsgKHNpemUubGVuZ3RoIC0gMSkgKiB0aGlzLnNwYWNlX3dpZHRoO1xuICAgICAgICB0aGlzLnRvdGFsX2hlaWdodCA9IHNpemVbMF1bMV07XG4gICAgICAgIHRoaXMucGxhY2VtZW50ID0gKGxheW91dC5wbGFjZW1lbnQgPT09IHVuZGVmaW5lZCkgPyBQTEFDRU1FTlQuTUlEX1BPSU5UIDogbGF5b3V0LnBsYWNlbWVudDtcblxuICAgICAgICB0aGlzLmtpbmtfaW5kZXggPSAwOyAvLyBpbmRleCBhdCB3aGljaCBhbiBhcnRpY3VsYXRlZCBsYWJlbCB3aWxsIGtpbmsgKGUuZy4sIDEgbWVhbnMgYSBraW5rIF9hZnRlcl8gdGhlIGZpcnN0IHNlZ21lbnQpXG4gICAgICAgIHRoaXMuc3ByZWFkX2ZhY3RvciA9IDAuNTsgLy8gc3BhY2VzIG91dCBhZGphY2VudCB3b3JkcyB0byBwcmV2ZW50IG92ZXJsYXBcbiAgICAgICAgdGhpcy5maXRuZXNzID0gMDsgLy8gbWVhc3VyZSBvZiBxdWFsaXR5IG9mIGZpdFxuXG4gICAgICAgIC8vIEFycmF5cyBmb3IgTGFiZWwgcHJvcGVydGllcy4gVE9ETzogY3JlYXRlIGFycmF5IG9mIExhYmVsIHR5cGVzLCB3aGVyZSBMYWJlbExpbmUgYWN0cyBhcyBhIFwiZ3JvdXBlZCBsYWJlbFwiXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBbXTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IFtdO1xuICAgICAgICB0aGlzLm9mZnNldHMgPSBbXTtcbiAgICAgICAgdGhpcy5vYmJzID0gW107XG4gICAgICAgIHRoaXMuYWFiYnMgPSBbXTtcblxuICAgICAgICAvLyBvcHRpb25hbGx5IGxpbWl0IHRoZSBsaW5lIHNlZ21lbnRzIHRoYXQgdGhlIGxhYmVsIG1heSBiZSBwbGFjZWQgaW4sIGJ5IHNwZWNpZnlpbmcgYSBzZWdtZW50IGluZGV4IHJhbmdlXG4gICAgICAgIC8vIHVzZWQgYXMgYSBjb2Fyc2Ugc3ViZGl2aWRlIGZvciBwbGFjaW5nIG11bHRpcGxlIGxhYmVscyBwZXIgbGluZSBnZW9tZXRyeVxuICAgICAgICB0aGlzLnNlZ21lbnRfaW5kZXggPSBsYXlvdXQuc2VnbWVudF9pbmRleCB8fCBsYXlvdXQuc2VnbWVudF9zdGFydCB8fCAwO1xuICAgICAgICB0aGlzLnNlZ21lbnRfbWF4ID0gbGF5b3V0LnNlZ21lbnRfZW5kIHx8IHRoaXMubGluZXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIEZpcnN0IGZpdHRpbmcgc2VnbWVudFxuICAgICAgICBsZXQgc2VnbWVudCA9IHRoaXMuZ2V0TmV4dEZpdHRpbmdTZWdtZW50KHRoaXMuZ2V0Q3VycmVudFNlZ21lbnQoKSk7XG4gICAgICAgIHRoaXMudGhyb3dfYXdheSA9ICghc2VnbWVudCk7XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaW5lIGdlb21ldHJ5IGNyZWF0aW5nIHRoZSBuZXh0IHZhbGlkIGxhYmVsLlxuICAgIHN0YXRpYyBuZXh0TGFiZWwobGFiZWwpIHtcbiAgICAgICAgLy8gaW5jcmVtZW50IHNlZ21lbnRcbiAgICAgICAgbGV0IGhhc05leHQgPSBsYWJlbC5nZXROZXh0U2VnbWVudCgpO1xuICAgICAgICBpZiAoIWhhc05leHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsb25lIG9wdGlvbnNcbiAgICAgICAgbGV0IGxheW91dCA9IE9iamVjdC5jcmVhdGUobGFiZWwubGF5b3V0KTtcbiAgICAgICAgbGF5b3V0LnNlZ21lbnRfaW5kZXggPSBsYWJlbC5zZWdtZW50X2luZGV4O1xuICAgICAgICBsYXlvdXQucGxhY2VtZW50ID0gbGFiZWwucGxhY2VtZW50O1xuXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgbGFiZWxcbiAgICAgICAgbGV0IG5leHRMYWJlbCA9IG5ldyBMYWJlbExpbmUobGFiZWwuc2l6ZSwgbGFiZWwubGluZXMsIGxheW91dCk7XG5cbiAgICAgICAgcmV0dXJuIChuZXh0TGFiZWwudGhyb3dfYXdheSkgPyBmYWxzZSA6IG5leHRMYWJlbDtcbiAgICB9XG5cbiAgICAvLyBTdHJhdGVneSBmb3IgcmV0dXJuaW5nIHRoZSBuZXh0IHNlZ21lbnQuIEFzc3VtZXMgYW4gXCJvcmRlcmluZ1wiIG9mIHBvc3NpYmxlIHNlZ21lbnRzXG4gICAgLy8gdGFraW5nIGludG8gYWNjb3VudCBib3RoIHN0cmFpZ2h0IGFuZCBhcnRpY3VsYXRlZCBzZWdtZW50cy4gUmV0dXJucyBmYWxzZSBpZiBhbGwgcG9zc2liaWxpdGllc1xuICAgIC8vIGhhdmUgYmVlbiBleGhhdXN0ZWRcbiAgICBnZXROZXh0U2VnbWVudCgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50ID0gUExBQ0VNRU5ULk1JRF9QT0lOVDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWdtZW50X2luZGV4ID49IHRoaXMubGluZXMubGVuZ3RoIC0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc2l6ZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50ID0gUExBQ0VNRU5ULkNPUk5FUjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZWdtZW50X2luZGV4Kys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50U2VnbWVudCgpO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgdGhlIGxpbmUgc2VnbWVudHMgbmVjZXNzYXJ5IGZvciBvdGhlciBjYWxjdWxhdGlvbnMgYXQgdGhlIGN1cnJlbnQgbGluZSBzZWdtZW50IGluZGV4LlxuICAgIC8vIFRoaXMgaXMgdGhlIGN1cnJlbnQgYW5kIG5leHQgc2VnbWVudCBmb3IgYSBzdHJhaWdodCBsaW5lLCBhbmQgdGhlIHByZXZpb3VzLCBjdXJyZW50IGFuZCBuZXh0XG4gICAgLy8gZm9yIGFuIGFydGljdWxhdGVkIHNlZ21lbnQuXG4gICAgZ2V0Q3VycmVudFNlZ21lbnQoKSB7XG4gICAgICAgIGxldCBwMSwgcDIsIHNlZ21lbnQ7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBwMSA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4IC0gMV07XG4gICAgICAgICAgICAgICAgcDIgPSB0aGlzLmxpbmVzW3RoaXMuc2VnbWVudF9pbmRleF07XG4gICAgICAgICAgICAgICAgbGV0IHAzID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXggKyAxXTtcbiAgICAgICAgICAgICAgICBzZWdtZW50ID0gWyBwMSwgcDIsIHAzIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgcDEgPSB0aGlzLmxpbmVzW3RoaXMuc2VnbWVudF9pbmRleF07XG4gICAgICAgICAgICAgICAgcDIgPSB0aGlzLmxpbmVzW3RoaXMuc2VnbWVudF9pbmRleCArIDFdO1xuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBbIHAxLCBwMiBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlZ21lbnQ7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBuZXh0IHNlZ21lbnQgdGhhdCBpcyB2YWxpZCAod2l0aGluIHRpbGUsIGluc2lkZSBhbmdsZSByZXF1aXJlbWVudHMgYW5kIHdpdGhpbiBsaW5lIGdlb21ldHJ5KS5cbiAgICBnZXROZXh0Rml0dGluZ1NlZ21lbnQoc2VnbWVudCkge1xuICAgICAgICBzZWdtZW50ID0gc2VnbWVudCB8fCB0aGlzLmdldE5leHRTZWdtZW50KCk7XG4gICAgICAgIGlmICghc2VnbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZG9lc1NlZ21lbnRGaXQoc2VnbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5pblRpbGVCb3VuZHMoKSAmJiB0aGlzLmluQW5nbGVCb3VuZHMoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWdtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmV4dEZpdHRpbmdTZWdtZW50KCk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBjdXJyZW50IHNlZ21lbnQgaXMgdmFsaWRcbiAgICBkb2VzU2VnbWVudEZpdChzZWdtZW50KSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maXRLaW5rZWRTZWdtZW50KHNlZ21lbnQpO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpdFN0cmFpZ2h0U2VnbWVudChzZWdtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIga2lua2VkIHNlZ21lbnQgaXMgdmFsaWRcbiAgICAvLyBDeWNsZXMgdGhyb3VnaCB2YXJpb3VzIHdheXMgb2Yga2lua2luZyB0aGUgbGFiZWxzIGFyb3VuZCB0aGUgc2VnbWVudCdzIHBpdm90LFxuICAgIC8vIGZpbmRpbmcgdGhlIGJlc3QgZml0LCBhbmQgZGV0ZXJtaW5lcyB0aGUga2lua19pbmRleC5cbiAgICBmaXRLaW5rZWRTZWdtZW50KHNlZ21lbnQpIHtcbiAgICAgICAgbGV0IHVwcCA9IHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcblxuICAgICAgICBsZXQgcDBwMSA9IFZlY3Rvci5zdWIoc2VnbWVudFswXSwgc2VnbWVudFsxXSk7XG4gICAgICAgIGxldCBwMXAyID0gVmVjdG9yLnN1YihzZWdtZW50WzFdLCBzZWdtZW50WzJdKTtcblxuICAgICAgICAvLyBEb24ndCBmaXQgaWYgc2VnbWVudCBkb2Vzbid0IHBhc3MgdGhlIHZlcnRpY2FsIGxpbmUgdGVzdCwgcmVzdWx0aW5nIGluIHVwc2lkZS1kb3duIGxhYmVsc1xuICAgICAgICBpZiAocDBwMVswXSAqIHAxcDJbMF0gPCAwICYmIHAwcDFbMV0gKiBwMXAyWzFdID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxpbmVfbGVuZ3RoMSA9IFZlY3Rvci5sZW5ndGgocDBwMSkgLyB1cHA7XG4gICAgICAgIGxldCBsaW5lX2xlbmd0aDIgPSBWZWN0b3IubGVuZ3RoKHAxcDIpIC8gdXBwO1xuXG4gICAgICAgIC8vIGJyZWFrIHVwIG11bHRpcGxlIHNlZ21lbnRzIGludG8gdHdvIGNodW5rcyAoTi0xIG9wdGlvbnMpXG4gICAgICAgIGxldCBsYWJlbF9sZW5ndGgxID0gdGhpcy50b3RhbF9sZW5ndGg7XG4gICAgICAgIGxldCBsYWJlbF9sZW5ndGgyID0gMDtcbiAgICAgICAgbGV0IHdpZHRoLCBmaXRuZXNzID0gMDtcbiAgICAgICAgbGV0IGtpbmtfaW5kZXggPSB0aGlzLm51bV9zZWdtZW50cyAtIDE7XG4gICAgICAgIGxldCBmaXRuZXNzZXMgPSBbXTtcblxuICAgICAgICB3aGlsZSAoa2lua19pbmRleCA+IDApIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5zaXplW2tpbmtfaW5kZXhdWzBdICsgdGhpcy5zcGFjZV93aWR0aDtcblxuICAgICAgICAgICAgbGFiZWxfbGVuZ3RoMSAtPSB3aWR0aDtcbiAgICAgICAgICAgIGxhYmVsX2xlbmd0aDIgKz0gd2lkdGg7XG5cbiAgICAgICAgICAgIGZpdG5lc3MgPSBNYXRoLm1heChjYWxjRml0bmVzcyhsaW5lX2xlbmd0aDEsIGxhYmVsX2xlbmd0aDEpLCBjYWxjRml0bmVzcyhsaW5lX2xlbmd0aDIsIGxhYmVsX2xlbmd0aDIpKTtcbiAgICAgICAgICAgIGZpdG5lc3Nlcy51bnNoaWZ0KGZpdG5lc3MpO1xuXG4gICAgICAgICAgICBraW5rX2luZGV4LS07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWF4X2ZpdG5lc3MgPSBNYXRoLm1heC5hcHBseShudWxsLCBmaXRuZXNzZXMpO1xuXG4gICAgICAgIGlmIChtYXhfZml0bmVzcyA8IExJTkVfRVhDRUVEX0tJTktFRCkge1xuICAgICAgICAgICAgdGhpcy5raW5rX2luZGV4ID0gZml0bmVzc2VzLmluZGV4T2YobWF4X2ZpdG5lc3MpICsgMTtcbiAgICAgICAgICAgIHRoaXMuZml0bmVzcyA9IG1heF9maXRuZXNzO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmtpbmtfaW5kZXggPSAwO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBzdHJhaWdodCBzZWdtZW50IGlzIHZhbGlkXG4gICAgLy8gQSBzdHJhaWdodCBzZWdtZW50IGlzIHBsYWNlZCBhdCB0aGUgbWlkcG9pbnQgYW5kIGlzIHZhbGlkIGlmIHRoZSBsYWJlbCdzIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gYVxuICAgIC8vIGZhY3RvciAoTElORV9FWENFRURfU1RSQUlHSFQpIG9mIHRoZSBsaW5lIHNlZ21lbnQncyBsZW5ndGhcbiAgICBmaXRTdHJhaWdodFNlZ21lbnQoc2VnbWVudCkge1xuICAgICAgICBsZXQgdXBwID0gdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsO1xuICAgICAgICBsZXQgbGluZV9sZW5ndGggPSBWZWN0b3IubGVuZ3RoKFZlY3Rvci5zdWIoc2VnbWVudFswXSwgc2VnbWVudFsxXSkpIC8gdXBwO1xuICAgICAgICBsZXQgZml0bmVzcyA9IGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoLCB0aGlzLnRvdGFsX2xlbmd0aCk7XG5cbiAgICAgICAgaWYgKGZpdG5lc3MgPCBMSU5FX0VYQ0VFRF9TVFJBSUdIVCl7XG4gICAgICAgICAgICB0aGlzLmZpdG5lc3MgPSBmaXRuZXNzO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbmNlIGEgZml0dGluZyBzZWdtZW50IGlzIGZvdW5kLCBkZXRlcm1pbmUgaXRzIGFuZ2xlcywgcG9zaXRpb25zIGFuZCBib3VuZGluZyBib3hlc1xuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5hbmdsZSA9IHRoaXMuZ2V0Q3VycmVudEFuZ2xlKCk7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSB0aGlzLmdldEN1cnJlbnRQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLnVwZGF0ZUJCb3hlcygpO1xuICAgIH1cblxuICAgIGdldEN1cnJlbnRBbmdsZSgpIHtcbiAgICAgICAgbGV0IHNlZ21lbnQgPSB0aGlzLmdldEN1cnJlbnRTZWdtZW50KCk7XG4gICAgICAgIGxldCBhbmdsZXMgPSBbXTtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgbGV0IHRoZXRhMSA9IGdldEFuZ2xlRnJvbVNlZ21lbnQoc2VnbWVudFswXSwgc2VnbWVudFsxXSk7XG4gICAgICAgICAgICAgICAgbGV0IHRoZXRhMiA9IGdldEFuZ2xlRnJvbVNlZ21lbnQoc2VnbWVudFsxXSwgc2VnbWVudFsyXSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgcDBwMSA9IFZlY3Rvci5zdWIoc2VnbWVudFswXSwgc2VnbWVudFsxXSk7XG4gICAgICAgICAgICAgICAgbGV0IHAxcDIgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMV0sIHNlZ21lbnRbMl0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IG9yaWVudGF0aW9uID0gKHAwcDFbMF0gPj0gMCAmJiBwMXAyWzBdID49IDApID8gMSA6IC0xO1xuICAgICAgICAgICAgICAgIGxldCBhbmdsZTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1fc2VnbWVudHM7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpIDwgdGhpcy5raW5rX2luZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gKG9yaWVudGF0aW9uID4gMCkgPyB0aGV0YTIgOiB0aGV0YTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmdsZSA9IChvcmllbnRhdGlvbiA+IDApID8gdGhldGExIDogdGhldGEyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlcy5wdXNoKGFuZ2xlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgbGV0IHRoZXRhID0gZ2V0QW5nbGVGcm9tU2VnbWVudChzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBhbmdsZXMucHVzaCh0aGV0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFuZ2xlcztcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGxhYmVsXG4gICAgZ2V0Q3VycmVudFBvc2l0aW9uKCkge1xuICAgICAgICBsZXQgc2VnbWVudCA9IHRoaXMuZ2V0Q3VycmVudFNlZ21lbnQoKTtcbiAgICAgICAgbGV0IHBvc2l0aW9uO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHNlZ21lbnRbMV0uc2xpY2UoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IFtcbiAgICAgICAgICAgICAgICAgICAgMC41ICogKHNlZ21lbnRbMF1bMF0gKyBzZWdtZW50WzFdWzBdKSxcbiAgICAgICAgICAgICAgICAgICAgMC41ICogKHNlZ21lbnRbMF1bMV0gKyBzZWdtZW50WzFdWzFdKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGFydGljdWxhdGVkIGxhYmVscyB0byBiZSB3aXRoaW4gYW4gYW5nbGUgcmFuZ2UgWy1NQVhfQU5HTEUsICtNQVhfQU5HTEVdXG4gICAgaW5BbmdsZUJvdW5kcygpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIGxldCBhbmdsZTAgPSB0aGlzLmFuZ2xlWzBdO1xuICAgICAgICAgICAgICAgIGlmIChhbmdsZTAgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlMCArPSAyICogTWF0aC5QSTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUxID0gdGhpcy5hbmdsZVsxXTtcbiAgICAgICAgICAgICAgICBpZiAoYW5nbGUxIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBhbmdsZTEgKz0gMiAqIE1hdGguUEk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHRoZXRhID0gTWF0aC5hYnMoYW5nbGUxIC0gYW5nbGUwKTtcbiAgICAgICAgICAgICAgICB0aGV0YSA9IE1hdGgubWluKDIgKiBNYXRoLlBJIC0gdGhldGEsIHRoZXRhKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGV0YSA8PSBNQVhfQU5HTEU7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgYm91bmRpbmcgYm94ZXNcbiAgICB1cGRhdGVCQm94ZXMoKSB7XG4gICAgICAgIGxldCB1cHAgPSB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWw7XG4gICAgICAgIGxldCBoZWlnaHQgPSAodGhpcy50b3RhbF9oZWlnaHQgKyB0aGlzLmxheW91dC5idWZmZXJbMV0gKiAyKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG5cbiAgICAgICAgLy8gcmVzZXQgYm91bmRpbmcgYm94ZXNcbiAgICAgICAgdGhpcy5vYmJzID0gW107XG4gICAgICAgIHRoaXMuYWFiYnMgPSBbXTtcblxuICAgICAgICAvLyBmdWRnZSB3aWR0aCB2YWx1ZSBhcyB0ZXh0IG1heSBvdmVyZmxvdyBib3VuZGluZyBib3ggaWYgaXQgaGFzIGl0YWxpYywgYm9sZCwgZXRjIHN0eWxlXG4gICAgICAgIGxldCBpdGFsaWNzX2J1ZmZlciA9ICh0aGlzLmxheW91dC5pdGFsaWMpID8gNSAqIHVwcCA6IDA7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIGxldCBhbmdsZTAgPSB0aGlzLmFuZ2xlW3RoaXMua2lua19pbmRleCAtIDFdOyAvLyBhbmdsZSBiZWZvcmUga2lua1xuICAgICAgICAgICAgICAgIGxldCBhbmdsZTEgPSB0aGlzLmFuZ2xlW3RoaXMua2lua19pbmRleF07IC8vIGFuZ2xlIGFmdGVyIGtpbmtcbiAgICAgICAgICAgICAgICBsZXQgdGhldGEgPSBNYXRoLmFicyhhbmdsZTEgLSBhbmdsZTApOyAvLyBhbmdsZSBkZWx0YVxuXG4gICAgICAgICAgICAgICAgLy8gQSBzcHJlYWQgZmFjdG9yIG9mIDAgcGl2b3RzIHRoZSBib3hlcyBvbiB0aGVpciBob3Jpem9udGFsIGNlbnRlciwgbG9va2luZyBsaWtlOiBcIlhcIlxuICAgICAgICAgICAgICAgIC8vIGEgc3ByZWFkIGZhY3RvciBvZiAxIG9mZnNldHMgdGhlIGJveGVzIHNvIHRoYXQgdGhlaXIgY29ybmVycyB0b3VjaCwgbG9va2luZyBsaWtlOiBcIlxcL1wiIG9yIFwiL1xcXCJcbiAgICAgICAgICAgICAgICBsZXQgZHggPSB0aGlzLnNwcmVhZF9mYWN0b3IgKiBNYXRoLmFicyh0aGlzLnRvdGFsX2hlaWdodCAqIE1hdGgudGFuKDAuNSAqIHRoZXRhKSk7XG4gICAgICAgICAgICAgICAgbGV0IG51ZGdlID0gMC41ICogKC1keCAtIHRoaXMuc3BhY2Vfd2lkdGgpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGxhY2UgbGFiZWxzIGJhY2t3YXJkcyBmcm9tIGtpbmsgaW5kZXhcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5raW5rX2luZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoX3B4ID0gdGhpcy5zaXplW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYW5nbGUgPSB0aGlzLmFuZ2xlW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9ICh3aWR0aF9weCArIDIgKiB0aGlzLmxheW91dC5idWZmZXJbMF0pICogdXBwICogTGFiZWwuZXBzaWxvbjtcblxuICAgICAgICAgICAgICAgICAgICBudWRnZSAtPSAwLjUgKiB3aWR0aF9weDtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gVmVjdG9yLnJvdChbbnVkZ2UgKiB1cHAsIDBdLCAtYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSBWZWN0b3IuYWRkKHRoaXMucG9zaXRpb24sIG9mZnNldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iYiA9IGdldE9CQihwb3NpdGlvbiwgd2lkdGggKyBpdGFsaWNzX2J1ZmZlciwgaGVpZ2h0LCBhbmdsZSwgdGhpcy5vZmZzZXQsIHVwcCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhYWJiID0gb2JiLmdldEV4dGVudCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Jicy5wdXNoKG9iYik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWFiYnMucHVzaChhYWJiKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbaV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMF0gKyBudWRnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFsxXVxuICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgIG51ZGdlIC09IDAuNSAqIHdpZHRoX3B4ICsgdGhpcy5zcGFjZV93aWR0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBQbGFjZSBsYWJlbHMgZm9yd2FyZHMgZnJvbSBraW5rIGluZGV4XG4gICAgICAgICAgICAgICAgbnVkZ2UgPSAwLjUgKiAoZHggKyB0aGlzLnNwYWNlX3dpZHRoKTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmtpbmtfaW5kZXg7IGkgPCB0aGlzLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoX3B4ID0gdGhpcy5zaXplW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYW5nbGUgPSB0aGlzLmFuZ2xlW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9ICh3aWR0aF9weCArIDIgKiB0aGlzLmxheW91dC5idWZmZXJbMF0pICogdXBwICogTGFiZWwuZXBzaWxvbjtcblxuICAgICAgICAgICAgICAgICAgICBudWRnZSArPSAwLjUgKiB3aWR0aF9weDtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gVmVjdG9yLnJvdChbbnVkZ2UgKiB1cHAsIDBdLCAtYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSBWZWN0b3IuYWRkKHRoaXMucG9zaXRpb24sIG9mZnNldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iYiA9IGdldE9CQihwb3NpdGlvbiwgd2lkdGggKyBpdGFsaWNzX2J1ZmZlciwgaGVpZ2h0LCBhbmdsZSwgdGhpcy5vZmZzZXQsIHVwcCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhYWJiID0gb2JiLmdldEV4dGVudCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Jicy5wdXNoKG9iYik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWFiYnMucHVzaChhYWJiKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbaV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMF0gKyBudWRnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFsxXVxuICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgIG51ZGdlICs9IDAuNSAqIHdpZHRoX3B4ICsgdGhpcy5zcGFjZV93aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgbGV0IHNoaWZ0ID0gLTAuNSAqIHRoaXMudG90YWxfbGVuZ3RoOyAvLyBzaGlmdCBmb3IgY2VudGVyaW5nIHRoZSBsYWJlbHNcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1fc2VnbWVudHM7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aF9weCA9IHRoaXMuc2l6ZVtpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gKHdpZHRoX3B4ICsgMiAqIHRoaXMubGF5b3V0LmJ1ZmZlclswXSkgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYW5nbGUgPSB0aGlzLmFuZ2xlW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDAuNSAqIHdpZHRoX3B4O1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSBWZWN0b3Iucm90KFtzaGlmdCAqIHVwcCwgMF0sIC1hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IFZlY3Rvci5hZGQodGhpcy5wb3NpdGlvbiwgb2Zmc2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JiID0gZ2V0T0JCKHBvc2l0aW9uLCB3aWR0aCArIGl0YWxpY3NfYnVmZmVyLCBoZWlnaHQsIGFuZ2xlLCB0aGlzLm9mZnNldCwgdXBwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFhYmIgPSBvYmIuZ2V0RXh0ZW50KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmJzLnB1c2gob2JiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hYWJicy5wdXNoKGFhYmIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFswXSArIHNoaWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzFdXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gMC41ICogd2lkdGhfcHggKyB0aGlzLnNwYWNlX3dpZHRoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2tzIGVhY2ggc2VnbWVudCB0byBzZWUgaWYgaXQgaXMgd2l0aGluIHRoZSB0aWxlLiBJZiBhbnkgc2VnbWVudCBmYWlscyB0aGlzIHRlc3QsIHRoZXkgYWxsIGZhaWwuXG4gICAgLy8gVE9ETzogbGFiZWwgZ3JvdXBcbiAgICBpblRpbGVCb3VuZHMoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hYWJicy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGFhYmIgPSB0aGlzLmFhYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iaiA9IHsgYWFiYiB9O1xuICAgICAgICAgICAgbGV0IGluX2JvdW5kcyA9IExhYmVsLnByb3RvdHlwZS5pblRpbGVCb3VuZHMuY2FsbChvYmopO1xuICAgICAgICAgICAgaWYgKCFpbl9ib3VuZHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQWRkcyBlYWNoIHNlZ21lbnQgdG8gdGhlIGNvbGxpc2lvbiBwYXNzIGFzIGl0cyBvd24gYm91bmRpbmcgYm94XG4gICAgLy8gVE9ETzogbGFiZWwgZ3JvdXBcbiAgICBhZGQoYmJveGVzKSB7XG4gICAgICAgIHRoaXMucGxhY2VkID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFhYmJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYWFiYiA9IHRoaXMuYWFiYnNbaV07XG4gICAgICAgICAgICBsZXQgb2JiID0gdGhpcy5vYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iaiA9IHsgYWFiYiwgb2JiIH07XG4gICAgICAgICAgICBMYWJlbC5wcm90b3R5cGUuYWRkLmNhbGwob2JqLCBiYm94ZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2tzIGVhY2ggc2VnbWVudCB0byBzZWUgaWYgaXQgc2hvdWxkIGJlIGRpc2NhcmRlZCAodmlhIGNvbGxpc2lvbikuIElmIGFueSBzZWdtZW50IGZhaWxzIHRoaXMgdGVzdCwgdGhleSBhbGwgZmFpbC5cbiAgICAvLyBUT0RPOiBsYWJlbCBncm91cFxuICAgIGRpc2NhcmQoYmJveGVzLCBleGNsdWRlID0gbnVsbCkge1xuICAgICAgICBpZiAodGhpcy50aHJvd19hd2F5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vYmJzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGxldCBhYWJiID0gdGhpcy5hYWJic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmIgPSB0aGlzLm9iYnNbaV07XG4gICAgICAgICAgICBsZXQgb2JqID0geyBhYWJiLCBvYmIgfTtcblxuICAgICAgICAgICAgbGV0IHNob3VsZERpc2NhcmQgPSBMYWJlbC5wcm90b3R5cGUub2NjbHVkZWQuY2FsbChvYmosIGJib3hlcywgZXhjbHVkZSk7XG4gICAgICAgICAgICBpZiAoc2hvdWxkRGlzY2FyZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8vIFByaXZhdGUgbWV0aG9kIHRvIGNhbGN1bGF0ZSBvcmllbnRlZCBib3VuZGluZyBib3hcbmZ1bmN0aW9uIGdldE9CQihwb3NpdGlvbiwgd2lkdGgsIGhlaWdodCwgYW5nbGUsIG9mZnNldCwgdXBwKSB7XG4gICAgbGV0IHAwLCBwMTtcbiAgICAvLyBhcHBseSBvZmZzZXQsIHggcG9zaXRpdmUsIHkgcG9pbnRpbmcgZG93blxuICAgIGlmIChvZmZzZXQgJiYgKG9mZnNldFswXSAhPT0gMCB8fCBvZmZzZXRbMV0gIT09IDApKSB7XG4gICAgICAgIG9mZnNldCA9IFZlY3Rvci5yb3Qob2Zmc2V0LCBhbmdsZSk7XG4gICAgICAgIHAwID0gcG9zaXRpb25bMF0gKyAob2Zmc2V0WzBdICogdXBwKTtcbiAgICAgICAgcDEgPSBwb3NpdGlvblsxXSAtIChvZmZzZXRbMV0gKiB1cHApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcDAgPSBwb3NpdGlvblswXTtcbiAgICAgICAgcDEgPSBwb3NpdGlvblsxXTtcbiAgICB9XG5cbiAgICAvLyB0aGUgYW5nbGUgb2YgdGhlIG9iYiBpcyBuZWdhdGl2ZSBzaW5jZSBpdCdzIHRoZSB0aWxlIHN5c3RlbSB5IGF4aXMgaXMgcG9pbnRpbmcgZG93blxuICAgIHJldHVybiBuZXcgT0JCKHAwLCBwMSwgLWFuZ2xlLCB3aWR0aCwgaGVpZ2h0KTtcbn1cblxuLy8gUHJpdmF0ZSBtZXRob2QgdG8gY2FsY3VsYXRlIHRoZSBhbmdsZSBvZiBhIHNlZ21lbnQuXG4vLyBUcmFuc2Zvcm1zIHRoZSBhbmdsZSB0byBsaWUgd2l0aGluIHRoZSByYW5nZSBbMCwgUEkvMl0gYW5kIFszKlBJLzIsIDIqUEldICgxc3Qgb3IgNHRoIHF1YWRyYW50cylcbi8vIGFzIG90aGVyIHJhbmdlcyBwcm9kdWNlIFwidXBzaWRlIGRvd25cIiBsYWJlbHNcbmZ1bmN0aW9uIGdldEFuZ2xlRnJvbVNlZ21lbnQocHQxLCBwdDIpIHtcbiAgICBsZXQgUEkgPSBNYXRoLlBJO1xuICAgIGxldCBQSV8yID0gUEkgLyAyO1xuICAgIGxldCBwMXAyID0gVmVjdG9yLnN1YihwdDEsIHB0Mik7XG4gICAgbGV0IHRoZXRhID0gTWF0aC5hdGFuMihwMXAyWzBdLCBwMXAyWzFdKSArIFBJXzI7XG5cbiAgICBpZiAodGhldGEgPiBQSV8yKSB7XG4gICAgICAgIC8vIElmIGluIDJuZCBxdWFkcmFudCwgbW92ZSB0byA0dGggcXVhZHJhbnRcbiAgICAgICAgdGhldGEgKz0gUEk7XG4gICAgICAgIHRoZXRhICU9IDIgKiBNYXRoLlBJO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGV0YSA8IDApIHtcbiAgICAgICAgLy8gSWYgaW4gNHRoIHF1YWRyYW50LCBtYWtlIGEgcG9zaXRpdmUgYW5nbGVcbiAgICAgICAgdGhldGEgKz0gMiAqIFBJO1xuICAgIH1cblxuICAgIHJldHVybiB0aGV0YTtcbn1cblxuZnVuY3Rpb24gY2FsY0ZpdG5lc3MobGluZV9sZW5ndGgsIGxhYmVsX2xlbmd0aCl7XG4gICAgcmV0dXJuIDEgLSBsaW5lX2xlbmd0aCAvIGxhYmVsX2xlbmd0aDtcbn1cbiIsImltcG9ydCBMYWJlbCBmcm9tICcuL2xhYmVsJztcbmltcG9ydCBQb2ludEFuY2hvciBmcm9tICcuL3BvaW50X2FuY2hvcic7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5pbXBvcnQgT0JCIGZyb20gJy4uL3V0aWxzL29iYic7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGFiZWxQb2ludCBleHRlbmRzIExhYmVsIHtcblxuICAgIGNvbnN0cnVjdG9yIChwb3NpdGlvbiwgc2l6ZSwgbGF5b3V0KSB7XG4gICAgICAgIHN1cGVyKHNpemUsIGxheW91dCk7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBbcG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdXTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSB0aGlzLmxheW91dC5wYXJlbnQ7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0LmFuY2hvcikge1xuICAgICAgICAgICAgdGhpcy5zdGFydF9hbmNob3JfaW5kZXggPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhhc05leHQgPSB0aGlzLmdldE5leHRGaXQoKTtcbiAgICAgICAgdGhpcy50aHJvd19hd2F5ID0gIWhhc05leHQ7XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5jb21wdXRlT2Zmc2V0KCk7XG4gICAgICAgIHRoaXMudXBkYXRlQkJveGVzKCk7XG4gICAgfVxuXG4gICAgY29tcHV0ZU9mZnNldCAoKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gW3RoaXMubGF5b3V0Lm9mZnNldFswXSwgdGhpcy5sYXlvdXQub2Zmc2V0WzFdXTtcblxuICAgICAgICAvLyBBZGRpdGlvbmFsIGFuY2hvci9vZmZzZXQgZm9yIHBvaW50OlxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgICAgIC8vIHBvaW50J3Mgb3duIGFuY2hvciwgdGV4dCBhbmNob3IgYXBwbGllZCB0byBwb2ludCwgYWRkaXRpb25hbCBwb2ludCBvZmZzZXRcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gUG9pbnRBbmNob3IuY29tcHV0ZU9mZnNldCh0aGlzLm9mZnNldCwgcGFyZW50LnNpemUsIHBhcmVudC5hbmNob3IsIFBvaW50QW5jaG9yLnplcm9fYnVmZmVyKTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gUG9pbnRBbmNob3IuY29tcHV0ZU9mZnNldCh0aGlzLm9mZnNldCwgcGFyZW50LnNpemUsIHRoaXMuYW5jaG9yLCBQb2ludEFuY2hvci56ZXJvX2J1ZmZlcik7XG4gICAgICAgICAgICBpZiAocGFyZW50Lm9mZnNldCAhPT0gU3R5bGVQYXJzZXIuemVyb1BhaXIpIHsgICAgICAgIC8vIHBvaW50IGhhcyBhbiBvZmZzZXRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPT09IFN0eWxlUGFyc2VyLnplcm9QYWlyKSB7ICAgICAgLy8gbm8gdGV4dCBvZmZzZXQsIHVzZSBwb2ludCdzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gcGFyZW50Lm9mZnNldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHQgaGFzIG9mZnNldCwgYWRkIHBvaW50J3NcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRbMF0gKz0gcGFyZW50Lm9mZnNldFswXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRbMV0gKz0gcGFyZW50Lm9mZnNldFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9mZnNldCA9IFBvaW50QW5jaG9yLmNvbXB1dGVPZmZzZXQodGhpcy5vZmZzZXQsIHRoaXMuc2l6ZSwgdGhpcy5hbmNob3IpO1xuICAgIH1cblxuICAgIHVwZGF0ZUJCb3hlcyAoKSB7XG4gICAgICAgIGxldCB3aWR0aCA9ICh0aGlzLnNpemVbMF0gKyB0aGlzLmxheW91dC5idWZmZXJbMF0gKiAyKSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbCAqIExhYmVsLmVwc2lsb247XG4gICAgICAgIGxldCBoZWlnaHQgPSAodGhpcy5zaXplWzFdICsgdGhpcy5sYXlvdXQuYnVmZmVyWzFdICogMikgKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWwgKiBMYWJlbC5lcHNpbG9uO1xuXG4gICAgICAgIC8vIGZ1ZGdlIHdpZHRoIHZhbHVlIGFzIHRleHQgbWF5IG92ZXJmbG93IGJvdW5kaW5nIGJveCBpZiBpdCBoYXMgaXRhbGljLCBib2xkLCBldGMgc3R5bGVcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Lml0YWxpYyl7XG4gICAgICAgICAgICB3aWR0aCArPSA1ICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHAgPSBbXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzBdICsgKHRoaXMub2Zmc2V0WzBdICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsKSxcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMV0gLSAodGhpcy5vZmZzZXRbMV0gKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWwpXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5vYmIgPSBuZXcgT0JCKHBbMF0sIHBbMV0sIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB0aGlzLmFhYmIgPSB0aGlzLm9iYi5nZXRFeHRlbnQoKTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gbW92ZSB0aGUgbGFiZWwgaW50byB0aGUgdGlsZSBib3VuZHNcbiAgICAvLyBSZXR1cm5zIHRydWUgaWYgbGFiZWwgd2FzIG1vdmVkIGludG8gdGlsZSwgZmFsc2UgaWYgaXQgY291bGRuJ3QgYmUgbW92ZWRcbiAgICBtb3ZlSW50b1RpbGUgKCkge1xuICAgICAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLmFhYmJbMF0gPCAwKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzBdICs9IC10aGlzLmFhYmJbMF07XG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFhYmJbMl0gPj0gR2VvLnRpbGVfc2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMF0gLT0gdGhpcy5hYWJiWzJdIC0gR2VvLnRpbGVfc2NhbGUgKyAxO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hYWJiWzNdID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblsxXSAtPSB0aGlzLmFhYmJbM107XG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFhYmJbMV0gPD0gLUdlby50aWxlX3NjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzFdIC09IHRoaXMuYWFiYlsxXSArIEdlby50aWxlX3NjYWxlIC0gMTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQkJveGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9XG5cbiAgICBnZXROZXh0Rml0KCkge1xuICAgICAgICBpZiAoIXRoaXMubGF5b3V0LmN1bGxfZnJvbV90aWxlIHx8IHRoaXMuaW5UaWxlQm91bmRzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Lm1vdmVfaW50b190aWxlKXtcbiAgICAgICAgICAgIHRoaXMubW92ZUludG9UaWxlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMubGF5b3V0LmFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBvbiBzZWNvbmQgYW5jaG9yIChmaXJzdCBhbmNob3Igd2FzIHNldCBvbiBjcmVhdGlvbilcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMubGF5b3V0LmFuY2hvci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuY2hvciA9IHRoaXMubGF5b3V0LmFuY2hvcltpXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0X2FuY2hvcl9pbmRleCA9IGk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5UaWxlQm91bmRzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBubyBhbmNob3JzIHJlc3VsdCBpbiBmaXRcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc2NhcmQgKGJib3hlcywgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgaWYgKHN1cGVyLmRpc2NhcmQoYmJveGVzLCBleGNsdWRlKSkge1xuICAgICAgICAgICAgLy8gSWYgbW9yZSB0aGFuIG9uZSBhbmNob3Igc3BlY2lmaWVkLCB0cnkgdGhlbSBpbiBvcmRlclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5sYXlvdXQuYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG9uIHNlY29uZCBhbmNob3IgKGZpcnN0IGFuY2hvciB3YXMgc2V0IG9uIGNyZWF0aW9uKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9dGhpcy5zdGFydF9hbmNob3JfaW5kZXg7IGkgPCB0aGlzLmxheW91dC5hbmNob3IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmNob3IgPSB0aGlzLmxheW91dC5hbmNob3JbaV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0LmN1bGxfZnJvbV90aWxlICYmICF0aGlzLmluVGlsZUJvdW5kcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghc3VwZXIuZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG59XG5cbi8vIFBsYWNlbWVudCBzdHJhdGVnaWVzXG5MYWJlbFBvaW50LlBMQUNFTUVOVCA9IHtcbiAgICBWRVJURVg6IDAsICAgICAgICAgIC8vIHBsYWNlIGxhYmVscyBhdCBlbmRwb2ludHMgb2YgbGluZSBzZWdtZW50c1xuICAgIE1JRFBPSU5UOiAxLCAgICAgICAgLy8gcGxhY2UgbGFiZWxzIGF0IG1pZHBvaW50cyBvZiBsaW5lIHNlZ21lbnRzXG4gICAgU1BBQ0VEOiAyLCAgICAgICAgICAvLyBwbGFjZSBsYWJlbHMgZXF1YWxseSBzcGFjZWQgYWxvbmcgbGluZVxuICAgIENFTlRST0lEOiAzICAgICAgICAgLy8gcGxhY2UgbGFiZWxzIGF0IGNlbnRlciBvZiBwb2x5Z29uc1xufTtcbiIsIi8vIFNldHMgb2YgdmFsdWVzIHRvIG1hdGNoIGZvciBkaXJlY3Rpb25hbCBhbmQgY29ybmVyIGFuY2hvcnNcbmNvbnN0IGxlZnRzID0gWydsZWZ0JywgJ3RvcC1sZWZ0JywgJ2JvdHRvbS1sZWZ0J107XG5jb25zdCByaWdodHMgPSBbJ3JpZ2h0JywgJ3RvcC1yaWdodCcsICdib3R0b20tcmlnaHQnXTtcbmNvbnN0IHRvcHMgPSBbJ3RvcCcsICd0b3AtbGVmdCcsICd0b3AtcmlnaHQnXTtcbmNvbnN0IGJvdHRvbXMgPSBbJ2JvdHRvbScsICdib3R0b20tbGVmdCcsICdib3R0b20tcmlnaHQnXTtcblxubGV0IFBvaW50QW5jaG9yO1xuXG5leHBvcnQgZGVmYXVsdCBQb2ludEFuY2hvciA9IHtcblxuICAgIGNvbXB1dGVPZmZzZXQgKG9mZnNldCwgc2l6ZSwgYW5jaG9yLCBidWZmZXIgPSBudWxsKSB7XG4gICAgICAgIGlmICghYW5jaG9yIHx8IGFuY2hvciA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb2Zmc2V0MiA9IFtvZmZzZXRbMF0sIG9mZnNldFsxXV07XG4gICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciB8fCB0aGlzLmRlZmF1bHRfYnVmZmVyO1xuXG4gICAgICAgIC8vIEFuIG9wdGlvbmFsIGxlZnQvcmlnaHQgb2Zmc2V0XG4gICAgICAgIGlmICh0aGlzLmlzTGVmdEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICBvZmZzZXQyWzBdIC09IHNpemVbMF0gLyAyO1xuICAgICAgICAgICAgaWYgKGFuY2hvciA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0MlswXSAtPSBidWZmZXJbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc1JpZ2h0QW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgIG9mZnNldDJbMF0gKz0gc2l6ZVswXSAvIDI7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0MlswXSArPSBidWZmZXJbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbiBvcHRpb25hbCB0b3AvYm90dG9tIG9mZnNldFxuICAgICAgICBpZiAodGhpcy5pc1RvcEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICBvZmZzZXQyWzFdIC09IHNpemVbMV0gLyAyO1xuICAgICAgICAgICAgaWYgKGFuY2hvciA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzFdIC09IGJ1ZmZlclsyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzQm90dG9tQW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgIG9mZnNldDJbMV0gKz0gc2l6ZVsxXSAvIDI7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID09PSAnYm90dG9tJykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMV0gKz0gYnVmZmVyWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9mZnNldDI7XG4gICAgfSxcblxuICAgIGFsaWduRm9yQW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgaWYgKGFuY2hvciAmJiBhbmNob3IgIT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0xlZnRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncmlnaHQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1JpZ2h0QW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnY2VudGVyJztcbiAgICB9LFxuXG4gICAgaXNMZWZ0QW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIChsZWZ0cy5pbmRleE9mKGFuY2hvcikgPiAtMSk7XG4gICAgfSxcblxuICAgIGlzUmlnaHRBbmNob3IgKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gKHJpZ2h0cy5pbmRleE9mKGFuY2hvcikgPiAtMSk7XG4gICAgfSxcblxuICAgIGlzVG9wQW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuICh0b3BzLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgaXNCb3R0b21BbmNob3IgKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gKGJvdHRvbXMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICAvLyBCdWZmZXJzOiBbbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tXVxuICAgIGRlZmF1bHRfYnVmZmVyOiBbMi41LCAyLjUsIDEuNSwgMC43NV0sXG4gICAgemVyb19idWZmZXI6IFswLCAwLCAwLCAwXVxuXG59O1xuIiwiLy8gTG9naWMgZm9yIHBsYWNpbmcgcG9pbnQgbGFiZWxzIGFsb25nIGEgbGluZSBnZW9tZXRyeVxuXG5pbXBvcnQgTGFiZWxQb2ludCBmcm9tICcuL2xhYmVsX3BvaW50JztcbmltcG9ydCB7aXNDb29yZE91dHNpZGVUaWxlfSBmcm9tICcuLi9idWlsZGVycy9jb21tb24nO1xuXG5jb25zdCBQTEFDRU1FTlQgPSBMYWJlbFBvaW50LlBMQUNFTUVOVDtcbmNvbnN0IGRlZmF1bHRfc3BhY2luZyA9IDgwOyAvLyBzcGFjaW5nIG9mIHBvaW50cyBhbG9uZyBsaW5lIGluIHBpeGVsc1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwbGFjZVBvaW50c09uTGluZSAobGluZSwgc2l6ZSwgb3B0aW9ucykge1xuICAgIGxldCBsYWJlbHMgPSBbXTtcbiAgICBsZXQgc3RyYXRlZ3kgPSBvcHRpb25zLnBsYWNlbWVudDtcbiAgICBsZXQgbWluX2xlbmd0aCA9IE1hdGgubWF4KHNpemVbMF0sIHNpemVbMV0pICogb3B0aW9ucy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyAqIG9wdGlvbnMudW5pdHNfcGVyX3BpeGVsO1xuXG4gICAgc3dpdGNoIChzdHJhdGVneSl7XG4gICAgICAgIGNhc2UgUExBQ0VNRU5ULlNQQUNFRDpcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBnZXRQb3NpdGlvbnNBbmRBbmdsZXMobGluZSwgbWluX2xlbmd0aCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAvLyBmYWxzZSB3aWxsIGJlIHJldHVybmVkIGlmIGxpbmUgaGF2ZSBubyBsZW5ndGhcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcG9zaXRpb25zID0gcmVzdWx0LnBvc2l0aW9ucztcbiAgICAgICAgICAgIGxldCBhbmdsZXMgPSByZXN1bHQuYW5nbGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IHBvc2l0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUgPSBhbmdsZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGlsZV9lZGdlcyA9PT0gdHJ1ZSB8fCAhaXNDb29yZE91dHNpZGVUaWxlKHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBuZXcgTGFiZWxQb2ludChwb3NpdGlvbiwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLmFuZ2xlID0gYW5nbGU7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQTEFDRU1FTlQuVkVSVEVYOlxuICAgICAgICAgICAgbGV0IHAsIHEsIGxhYmVsO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKyl7XG4gICAgICAgICAgICAgICAgcCA9IGxpbmVbaV07XG4gICAgICAgICAgICAgICAgcSA9IGxpbmVbaSArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbGVfZWRnZXMgPT09IHRydWUgfHwgIWlzQ29vcmRPdXRzaWRlVGlsZShwKSkge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbFBvaW50KHAsIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5hbmdsZSA9IGdldEFuZ2xlKHAsIHEsIG9wdGlvbnMuYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGQgbGFzdCBlbmRwb2ludFxuICAgICAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWxQb2ludChxLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGxhYmVsLmFuZ2xlID0gZ2V0QW5nbGUocCwgcSwgb3B0aW9ucy5hbmdsZSk7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEUE9JTlQ6XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKXtcbiAgICAgICAgICAgICAgICBsZXQgcCA9IGxpbmVbaV07XG4gICAgICAgICAgICAgICAgbGV0IHEgPSBsaW5lW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSBbXG4gICAgICAgICAgICAgICAgICAgIDAuNSAqIChwWzBdICsgcVswXSksXG4gICAgICAgICAgICAgICAgICAgIDAuNSAqIChwWzFdICsgcVsxXSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbGVfZWRnZXMgPT09IHRydWUgfHwgIWlzQ29vcmRPdXRzaWRlVGlsZShwb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtaW5fbGVuZ3RoIHx8IG5vcm0ocCwgcSkgPiBtaW5fbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBuZXcgTGFiZWxQb2ludChwb3NpdGlvbiwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbC5hbmdsZSA9IGdldEFuZ2xlKHAsIHEsIG9wdGlvbnMuYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBsYWJlbHM7XG59XG5cbmZ1bmN0aW9uIGdldFBvc2l0aW9uc0FuZEFuZ2xlcyhsaW5lLCBtaW5fbGVuZ3RoLCBvcHRpb25zKXtcbiAgICBsZXQgdXBwID0gb3B0aW9ucy51bml0c19wZXJfcGl4ZWw7XG4gICAgbGV0IHNwYWNpbmcgPSAob3B0aW9ucy5wbGFjZW1lbnRfc3BhY2luZyB8fCBkZWZhdWx0X3NwYWNpbmcpICogdXBwO1xuXG4gICAgbGV0IGxlbmd0aCA9IGdldExpbmVMZW5ndGgobGluZSk7XG4gICAgaWYgKGxlbmd0aCA8PSBtaW5fbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgbnVtX2xhYmVscyA9IE1hdGgubWF4KE1hdGguZmxvb3IobGVuZ3RoIC8gc3BhY2luZyksIDEpO1xuICAgIGxldCByZW1haW5kZXIgPSBsZW5ndGggLSAobnVtX2xhYmVscyAtIDEpICogc3BhY2luZztcbiAgICBsZXQgcG9zaXRpb25zID0gW107XG4gICAgbGV0IGFuZ2xlcyA9IFtdO1xuXG4gICAgbGV0IGRpc3RhbmNlID0gMC41ICogcmVtYWluZGVyO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtX2xhYmVsczsgaSsrKXtcbiAgICAgICAgbGV0IHtwb3NpdGlvbiwgYW5nbGV9ID0gaW50ZXJwb2xhdGVMaW5lKGxpbmUsIGRpc3RhbmNlLCBtaW5fbGVuZ3RoLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uICE9IG51bGwgJiYgYW5nbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcG9zaXRpb25zLnB1c2gocG9zaXRpb24pO1xuICAgICAgICAgICAgYW5nbGVzLnB1c2goYW5nbGUpO1xuICAgICAgICB9XG4gICAgICAgIGRpc3RhbmNlICs9IHNwYWNpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtwb3NpdGlvbnMsIGFuZ2xlc307XG59XG5cbmZ1bmN0aW9uIGdldEFuZ2xlKHAsIHEsIGFuZ2xlID0gMCl7XG4gICAgcmV0dXJuIChhbmdsZSA9PT0gJ2F1dG8nKSA/IE1hdGguYXRhbjIocVswXSAtIHBbMF0sIHFbMV0gLSBwWzFdKSA6IGFuZ2xlO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lTGVuZ3RoKGxpbmUpe1xuICAgIGxldCBkaXN0YW5jZSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKyl7XG4gICAgICAgIGRpc3RhbmNlICs9IG5vcm0obGluZVtpXSwgbGluZVtpKzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBub3JtKHAsIHEpe1xuICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cocFswXSAtIHFbMF0sIDIpICsgTWF0aC5wb3cocFsxXSAtIHFbMV0sIDIpKTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVMaW5lKGxpbmUsIGRpc3RhbmNlLCBtaW5fbGVuZ3RoLCBvcHRpb25zKXtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBsZXQgcG9zaXRpb24sIGFuZ2xlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGgtMTsgaSsrKXtcbiAgICAgICAgbGV0IHAgPSBsaW5lW2ldO1xuICAgICAgICBsZXQgcSA9IGxpbmVbaSsxXTtcblxuICAgICAgICBjb25zdCBsZW5ndGggPSBub3JtKHAsIHEpO1xuICAgICAgICBpZiAobGVuZ3RoIDw9IG1pbl9sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VtICs9IGxlbmd0aDtcblxuICAgICAgICBpZiAoc3VtID4gZGlzdGFuY2Upe1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpbnRlcnBvbGF0ZVNlZ21lbnQocCwgcSwgc3VtIC0gZGlzdGFuY2UpO1xuICAgICAgICAgICAgYW5nbGUgPSBnZXRBbmdsZShwLCBxLCBvcHRpb25zLmFuZ2xlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7cG9zaXRpb24sIGFuZ2xlfTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVTZWdtZW50KHAsIHEsIGRpc3RhbmNlKXtcbiAgICBsZXQgbGVuZ3RoID0gbm9ybShwLCBxKTtcbiAgICBsZXQgcmF0aW8gPSBkaXN0YW5jZSAvIGxlbmd0aDtcbiAgICByZXR1cm4gW1xuICAgICAgICByYXRpbyAqIHBbMF0gKyAoMSAtIHJhdGlvKSAqIHFbMF0sXG4gICAgICAgIHJhdGlvICogcFsxXSArICgxIC0gcmF0aW8pICogcVsxXVxuICAgIF07XG59XG4iLCJpbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcGVhdEdyb3VwIHtcblxuICAgIGNvbnN0cnVjdG9yIChrZXksIHJlcGVhdF9kaXN0LCBtYXhfcmVwZWF0X2Rpc3QpIHtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMucmVwZWF0X2Rpc3QgPSByZXBlYXRfZGlzdDtcbiAgICAgICAgdGhpcy5yZXBlYXRfZGlzdF9zcSA9IHRoaXMucmVwZWF0X2Rpc3QgKiB0aGlzLnJlcGVhdF9kaXN0O1xuICAgICAgICB0aGlzLm1heF9yZXBlYXRfZGlzdF9zcSA9IG1heF9yZXBlYXRfZGlzdCAqIG1heF9yZXBlYXRfZGlzdDtcbiAgICAgICAgdGhpcy5vbmVfcGVyX2dyb3VwID0gKHRoaXMucmVwZWF0X2Rpc3Rfc3EgPj0gdGhpcy5tYXhfcmVwZWF0X2Rpc3Rfc3EpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IFtdO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGFuIG9iamVjdCB0byBzZWUgaWYgaXQncyBhIHJlcGVhdCBpbiB0aGlzIGdyb3VwXG4gICAgY2hlY2sgKG9iaikge1xuICAgICAgICAvLyBJZiBvbmx5IG9uZSBvYmplY3QgYWxsb3dlZCBwZXIgZ3JvdXAsIHNob3J0Y3V0IGRpc3RhbmNlIGxvZ2ljXG4gICAgICAgIGlmICh0aGlzLm9uZV9wZXJfZ3JvdXApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgZGlzdGFuY2UgbWF4ZXMgb3V0IGF0IHRocmVzaG9sZCBpbiB0aGlzIGNhc2VcbiAgICAgICAgICAgICAgICAvLyAobm90IHRydWUgZGlzdCB2YWx1ZSBzaW5jZSB3ZSBza2lwcGVkIGNhbGN1bGF0aW5nIGl0KVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Rfc3E6IHRoaXMubWF4X3JlcGVhdF9kaXN0X3NxLFxuICAgICAgICAgICAgICAgICAgICByZXBlYXRfZGlzdF9zcTogdGhpcy5yZXBlYXRfZGlzdF9zcSxcbiAgICAgICAgICAgICAgICAgICAgb25lX3Blcl9ncm91cDogdGhpcy5vbmVfcGVyX2dyb3VwXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjsgLy8gbm8gb2JqZWN0IGZvciB0aGlzIGdyb3VwIHlldFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZGlzdGFuY2UgZnJvbSBuZXcgb2JqZWN0IHRvIG9iamVjdHMgYWxyZWFkeSBpbiBncm91cFxuICAgICAgICBsZXQgcDEgPSBvYmoucG9zaXRpb247XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IHRoaXMucG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcDIgPSB0aGlzLnBvc2l0aW9uc1tpXTtcbiAgICAgICAgICAgIGxldCBkeCA9IHAxWzBdIC0gcDJbMF07XG4gICAgICAgICAgICBsZXQgZHkgPSBwMVsxXSAtIHAyWzFdO1xuICAgICAgICAgICAgbGV0IGRpc3Rfc3EgPSBkeCAqIGR4ICsgZHkgKiBkeTtcblxuICAgICAgICAgICAgLy8gRm91bmQgYW4gZXhpc3Rpbmcgb2JqZWN0IHdpdGhpbiBhbGxvd2VkIGRpc3RhbmNlXG4gICAgICAgICAgICBpZiAoZGlzdF9zcSA8IHRoaXMucmVwZWF0X2Rpc3Rfc3EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkaXN0X3NxLFxuICAgICAgICAgICAgICAgICAgICByZXBlYXRfZGlzdF9zcTogdGhpcy5yZXBlYXRfZGlzdF9zcVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgb2JqZWN0IHRvIHRoaXMgZ3JvdXBcbiAgICBhZGQgKG9iaikge1xuICAgICAgICAvLyBvbmx5IHN0b3JlIG9iamVjdCdzIHBvc2l0aW9uLCB0byBzYXZlIHNwYWNlIC8gcHJldmVudCB1bm5lY2Vzc2FyeSByZWZlcmVuY2VzXG4gICAgICAgIGlmIChvYmogJiYgb2JqLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9ucy5wdXNoKG9iai5wb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdGF0aWMgbWV0aG9kcyBhcmUgdXNlZCB0byBtYW5hZ2UgcmVwZWF0IGdyb3Vwcywgd2l0aGluIGFuZCBhY3Jvc3MgdGlsZXNcblxuICAgIC8vIFJlc2V0IGFsbCBncm91cHMgZm9yIHRoaXMgdGlsZVxuICAgIHN0YXRpYyBjbGVhciAodGlsZSkge1xuICAgICAgICB0aGlzLmdyb3Vwc1t0aWxlXSA9IHt9O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGFuIG9iamVjdCB0byBzZWUgaWYgaXQncyBhIHJlcGVhdCB3aXRoaW4gaXRzIGRlc2lnbmF0ZWQgZ3JvdXBcbiAgICBzdGF0aWMgY2hlY2sgKG9iaiwgbGF5b3V0LCB0aWxlKSB7XG4gICAgICAgIGlmIChsYXlvdXQucmVwZWF0X2Rpc3RhbmNlICYmIGxheW91dC5yZXBlYXRfZ3JvdXAgJiYgdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyb3Vwc1t0aWxlXVtsYXlvdXQucmVwZWF0X2dyb3VwXS5jaGVjayhvYmopO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGFuIG9iamVjdCB0byBpdHMgZGVzaWduYXRlZCBncm91cFxuICAgIHN0YXRpYyBhZGQgKG9iaiwgbGF5b3V0LCB0aWxlKSB7XG4gICAgICAgIGlmIChsYXlvdXQucmVwZWF0X2Rpc3RhbmNlICYmIGxheW91dC5yZXBlYXRfZ3JvdXApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3Vwc1t0aWxlXVtsYXlvdXQucmVwZWF0X2dyb3VwXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0gPSBuZXcgUmVwZWF0R3JvdXAoXG4gICAgICAgICAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZ3JvdXAsXG4gICAgICAgICAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZGlzdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgIFJlcGVhdEdyb3VwLm1heF9yZXBlYXRfZGlzdFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdyb3Vwc1t0aWxlXVtsYXlvdXQucmVwZWF0X2dyb3VwXS5hZGQob2JqKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG4vLyBDdXJyZW50IHNldCBvZiByZXBlYXQgZ3JvdXBzLCBncm91cGVkIGFuZCBrZXllZCBieSB0aWxlXG5SZXBlYXRHcm91cC5ncm91cHMgPSB7fTtcblxuLy8gTWF4IHJlcGVhdCBkaXN0OiBmb3IgZ3JvdXBzIHdpdGggYSByZXBlYXQgZGlzdCBiZXlvbmQgdGhpcyB0aHJlc2hvbGQsIG9ubHkgb25lIGxhYmVsXG4vLyB3aWxsIGJlIGFsbG93ZWQgcGVyIGdyb3VwLCBlLmcuIHNldCB0byB0aWxlIHNpemUgZm9yIG9uZS1sYWJlbC1wZXItdGlsZVxuUmVwZWF0R3JvdXAubWF4X3JlcGVhdF9kaXN0ID0gR2VvLnRpbGVfc2NhbGU7XG4iLCJpbXBvcnQgVGhyZWFkIGZyb20gJy4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBTY2VuZSBmcm9tICcuL3NjZW5lJztcbmltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuXG4vLyBFeHBvcnRzIG11c3QgYXBwZWFyIG91dHNpZGUgYSBmdW5jdGlvbiwgYnV0IHdpbGwgb25seSBiZSBkZWZpbmVkIGluIG1haW4gdGhyZWFkIChiZWxvdylcbmV4cG9ydCB2YXIgTGVhZmxldExheWVyO1xuZXhwb3J0IGZ1bmN0aW9uIGxlYWZsZXRMYXllcihvcHRpb25zKSB7XG4gICAgcmV0dXJuIGV4dGVuZExlYWZsZXQob3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZExlYWZsZXQob3B0aW9ucykge1xuXG4gICAgLy8gSWYgTGVhZmxldExheWVyIGlzIGFscmVhZHkgZGVmaW5lZCB3aGVuIHRoaXMgaXMgY2FsbGVkIGp1c3QgcmV0dXJuIHRoYXQgaW1tZWRpYXRlbHlcbiAgICAvLyBlLmcuIGlmIHlvdSBjYWxsIGxlYWZsZXRMYXllciBtdWx0aXBsZSB0aW1lcyAod2hpY2ggaXMgdmFsaWQpXG4gICAgaWYgKHR5cGVvZiBMZWFmbGV0TGF5ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGVhZmxldExheWVyKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIExlYWZsZXQgbGF5ZXIgZnVuY3Rpb25hbGl0eSBpcyBvbmx5IGRlZmluZWQgaW4gbWFpbiB0aHJlYWRcbiAgICBpZiAoVGhyZWFkLmlzX21haW4pIHtcblxuICAgICAgICBsZXQgTCA9IG9wdGlvbnMubGVhZmxldCB8fCB3aW5kb3cuTDtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgd2UgYXJlIGV4dGVuZGluZyB0aGUgbGVhZmxldCAwLjcueCBUaWxlTGF5ZXIgY2xhc3MsIG9yIHRoZSBuZXdlclxuICAgICAgICAvLyBsZWFmbGV0IDEueCBHcmlkTGF5ZXIgY2xhc3MuXG4gICAgICAgIGxldCBsYXllckJhc2VDbGFzcyA9IEwuR3JpZExheWVyID8gTC5HcmlkTGF5ZXIgOiBMLlRpbGVMYXllcjtcbiAgICAgICAgbGV0IGxlYWZsZXRWZXJzaW9uID0gbGF5ZXJCYXNlQ2xhc3MgPT09IEwuR3JpZExheWVyID8gJzEueCcgOiAnMC43LngnO1xuICAgICAgICBsZXQgbGF5ZXJDbGFzc0NvbmZpZyA9IHt9O1xuXG4gICAgICAgIC8vIElmIGV4dGVuZGluZyBsZWFmbGV0IDAuNy54IFRpbGVMYXllciwgYWRkaXRpb25hbCBtb2RpZmljYXRpb25zIGFyZSBuZWVkZWRcbiAgICAgICAgaWYgKGxheWVyQmFzZUNsYXNzID09PSBMLlRpbGVMYXllcikge1xuICAgICAgICAgICAgbGF5ZXJDbGFzc0NvbmZpZy5fYWRkVGlsZSA9IGZ1bmN0aW9uKCl7fTtcbiAgICAgICAgICAgIGxheWVyQ2xhc3NDb25maWcuX3JlbW92ZVRpbGUgPSBmdW5jdGlvbigpe307XG4gICAgICAgICAgICBsYXllckNsYXNzQ29uZmlnLl9yZXNldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGxheWVyQmFzZUNsYXNzLnByb3RvdHlwZS5fcmVzZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAvLyByZS1hZGQgdGhlIGNhbnZhcyBzaW5jZSBiYXNlIGNsYXNzIGB2aWV3cmVzZXRgIGV2ZW50IGNhbiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZSAmJiB0aGlzLnNjZW5lLmNvbnRhaW5lciAmJiB0aGlzLnNjZW5lLmNhbnZhcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNjZW5lLmNhbnZhcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmluZSBjdXN0b20gbGF5ZXIgbWV0aG9kc1xuICAgICAgICBPYmplY3QuYXNzaWduKGxheWVyQ2xhc3NDb25maWcsIHtcblxuICAgICAgICAgICAgaW5pdGlhbGl6ZSAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIC8vIERlZmF1bHRzXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zaG93RGVidWcgPSAoIW9wdGlvbnMuc2hvd0RlYnVnID8gZmFsc2UgOiB0cnVlKTtcblxuICAgICAgICAgICAgICAgIEwuc2V0T3B0aW9ucyh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVNjZW5lKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcyA9IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIC8vIEZvcmNlIGxlYWZsZXQgem9vbSBhbmltYXRpb25zIG9mZlxuICAgICAgICAgICAgICAgIHRoaXMuX3pvb21BbmltYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY3JlYXRlU2NlbmUgKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUgPSBTY2VuZS5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zY2VuZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtV29ya2VyczogdGhpcy5vcHRpb25zLm51bVdvcmtlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVVcGRhdGU6IHRoaXMub3B0aW9ucy5wcmVVcGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3N0VXBkYXRlOiB0aGlzLm9wdGlvbnMucG9zdFVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNab29tOiAoTGVhZmxldExheWVyLmxlYWZsZXRWZXJzaW9uID09PSAnMS54JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWdoRGVuc2l0eURpc3BsYXk6IHRoaXMub3B0aW9ucy5oaWdoRGVuc2l0eURpc3BsYXksXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dMZXZlbDogdGhpcy5vcHRpb25zLmxvZ0xldmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW50cm9zcGVjdGlvbjogdGhpcy5vcHRpb25zLmludHJvc3BlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNlZCBvcHRpb24sIGFwcCB3aWxsIGhhdmUgdG8gbWFudWFsbHkgY2FsbGVkIHNjZW5lLnVwZGF0ZSgpIHBlciBmcmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVJlbmRlckxvb3A6IHRoaXMub3B0aW9ucy5kaXNhYmxlUmVuZGVyTG9vcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2VkIG9wdGlvbiwgd2lsbCByZXF1aXJlIGxpYnJhcnkgdG8gYmUgc2VydmVkIGFzIHNhbWUgaG9zdCBhcyBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0Nyb3NzRG9tYWluV29ya2VyczogdGhpcy5vcHRpb25zLmFsbG93Q3Jvc3NEb21haW5Xb3JrZXJzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gRmluaXNoIGluaXRpYWxpemluZyBzY2VuZSBhbmQgc2V0dXAgZXZlbnRzIHdoZW4gbGF5ZXIgaXMgYWRkZWQgdG8gbWFwXG4gICAgICAgICAgICBvbkFkZCAobWFwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNjZW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU2NlbmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsYXllckJhc2VDbGFzcy5wcm90b3R5cGUub25BZGQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MucmVzaXplID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbigncmVzaXplJywgdGhpcy5ob29rcy5yZXNpemUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5tb3ZlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gbWFwLmdldENlbnRlcigpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3Lnpvb20gPSBNYXRoLm1pbihtYXAuZ2V0Wm9vbSgpLCBtYXAuZ2V0TWF4Wm9vbSgpIHx8IEdlby5kZWZhdWx0X3ZpZXdfbWF4X3pvb20pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5zZXRWaWV3KHZpZXcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmltbWVkaWF0ZVJlZHJhdygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldmVyc2VUcmFuc2Zvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdtb3ZlJywgdGhpcy5ob29rcy5tb3ZlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3Muem9vbXN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5zdGFydFpvb20oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCd6b29tc3RhcnQnLCB0aGlzLmhvb2tzLnpvb21zdGFydCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLmRyYWdzdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS52aWV3LnNldFBhbm5pbmcodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ2RyYWdzdGFydCcsIHRoaXMuaG9va3MuZHJhZ3N0YXJ0KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MubW92ZWVuZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS52aWV3LnNldFBhbm5pbmcoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignbW92ZWVuZCcsIHRoaXMuaG9va3MubW92ZWVuZCk7XG5cbiAgICAgICAgICAgICAgICAvLyBGb3JjZSBsZWFmbGV0IHpvb20gYW5pbWF0aW9ucyBvZmZcbiAgICAgICAgICAgICAgICBtYXAuX3pvb21BbmltYXRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgLy8gTW9kaWZ5IGRlZmF1bHQgTGVhZmxldCBiZWhhdmlvcnNcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGlmeVNjcm9sbFdoZWVsQmVoYXZpb3IobWFwKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGlmeURvdWJsZUNsaWNrWm9vbShtYXApO1xuXG4gICAgICAgICAgICAgICAgLy8gU2V0dXAgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICB0aGlzLnNldHVwU2VsZWN0aW9uRXZlbnRIYW5kbGVycyhtYXApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uRXZlbnRzKHRoaXMub3B0aW9ucy5ldmVudHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIEdMIGNhbnZhcyB0byBsYXllciBjb250YWluZXJcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJbml0aWFsIHZpZXdcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZU9uRmlyc3RWaXNpYmxlKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gdGFuZ3JhbSBldmVudHNcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgICAgIG1vdmU6IHRoaXMub25UYW5ncmFtVmlld1VwZGF0ZS5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBVc2UgbGVhZmxldCdzIGV4aXN0aW5nIGV2ZW50IHN5c3RlbSBhcyB0aGUgY2FsbGJhY2sgbWVjaGFuaXNtXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5sb2FkKHRoaXMub3B0aW9ucy5zY2VuZSxcbiAgICAgICAgICAgICAgICAgICAgeyBjb25maWdfcGF0aDogdGhpcy5vcHRpb25zLnNjZW5lQmFzZVBhdGgsIGJsb2NraW5nOiBmYWxzZSB9KS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJzZVRyYW5zZm9ybSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2luaXQnKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvblJlbW92ZSAobWFwKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJCYXNlQ2xhc3MucHJvdG90eXBlLm9uUmVtb3ZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdyZXNpemUnLCB0aGlzLmhvb2tzLnJlc2l6ZSk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW92ZScsIHRoaXMuaG9va3MubW92ZSk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignem9vbXN0YXJ0JywgdGhpcy5ob29rcy56b29tc3RhcnQpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ2RyYWdzdGFydCcsIHRoaXMuaG9va3MuZHJhZ3N0YXJ0KTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdtb3ZlZW5kJywgdGhpcy5ob29rcy5tb3ZlZW5kKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdjbGljaycsIHRoaXMuaG9va3MuY2xpY2spO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ21vdXNlbW92ZScsIHRoaXMuaG9va3MubW91c2Vtb3ZlKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdtb3VzZW91dCcsIHRoaXMuaG9va3MubW91c2VvdXQpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLmhvb2tzLnZpc2liaWxpdHljaGFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MgPSB7fTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjcmVhdGVUaWxlIChjb29yZHMpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gY29vcmRzLnggKyAnLycgKyBjb29yZHMueSArICcvJyArIGNvb3Jkcy56O1xuICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBkaXYuc2V0QXR0cmlidXRlKCdkYXRhLXRpbGUta2V5Jywga2V5KTtcbiAgICAgICAgICAgICAgICBkaXYuc3R5bGUud2lkdGggPSAnMjU2cHgnO1xuICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5oZWlnaHQgPSAnMjU2cHgnO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93RGVidWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlYnVnX292ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS50ZXh0Q29udGVudCA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUubGVmdCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUudG9wID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5jb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUuZm9udFNpemUgPSAnMTZweCc7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUudGV4dE91dGxpbmUgPSAnMXB4ICMwMDAwMDAnO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLnBhZGRpbmcgPSAnOHB4JztcblxuICAgICAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZGVidWdfb3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3JkZXJTdHlsZSA9ICdzb2xpZCc7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3JkZXJDb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5ib3JkZXJXaWR0aCA9ICcxcHgnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBkaXY7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBNb2RpZnkgbGVhZmxldCdzIGRlZmF1bHQgc2Nyb2xsIHdoZWVsIGJlaGF2aW9yIHRvIHJlbmRlciBmcmFtZXMgbW9yZSBmcmVxdWVudGx5XG4gICAgICAgICAgICAvLyAoc2hvdWxkIGdlbmVyYWxseSBsZWFkIHRvIHNtb290aGVyIHNjcm9sbCB3aXRoIFRhbmdyYW0gZnJhbWUgcmUtcmVuZGVyKVxuICAgICAgICAgICAgbW9kaWZ5U2Nyb2xsV2hlZWxCZWhhdmlvciAobWFwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUudmlldy5jb250aW51b3VzX3pvb20gJiYgbWFwLnNjcm9sbFdoZWVsWm9vbSAmJiB0aGlzLm9wdGlvbnMubW9kaWZ5U2Nyb2xsV2hlZWwgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5vcHRpb25zLnpvb21TbmFwID0gMDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmFibGVkID0gbWFwLnNjcm9sbFdoZWVsWm9vbS5lbmFibGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uZGlzYWJsZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uX29uV2hlZWxTY3JvbGwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbHRhID0gTC5Eb21FdmVudC5nZXRXaGVlbERlbHRhKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVsdGEgKz0gZGVsdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0TW91c2VQb3MgPSB0aGlzLl9tYXAubW91c2VFdmVudFRvQ29udGFpbmVyUG9pbnQoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wZXJmb3JtWm9vbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgTC5Eb21FdmVudC5zdG9wKGUpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uX3BlcmZvcm1ab29tID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tID0gbWFwLmdldFpvb20oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLl9zdG9wKCk7IC8vIHN0b3AgcGFubmluZyBhbmQgZmx5IGFuaW1hdGlvbnMgaWYgYW55XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWx0YSA9IHRoaXMuX2RlbHRhIC8gKHRoaXMuX21hcC5vcHRpb25zLndoZWVsUHhQZXJab29tTGV2ZWwgKiA0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbHRhID0gMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh6b29tICsgZGVsdGEpID49IHRoaXMuX21hcC5nZXRNYXhab29tKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IHRoaXMuX21hcC5nZXRNYXhab29tKCkgLSB6b29tOyAvLyBkb24ndCBnbyBwYXN0IG1heCB6b29tXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVsdGEpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXAub3B0aW9ucy5zY3JvbGxXaGVlbFpvb20gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNldFpvb20oem9vbSArIGRlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNldFpvb21Bcm91bmQodGhpcy5fbGFzdE1vdXNlUG9zLCB6b29tICsgZGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gTW9kaWZ5IGxlYWZsZXQncyBkZWZhdWx0IGRvdWJsZS1jbGljayB6b29tIGJlaGF2aW9yLCB0byBtYXRjaCB0eXBpY2FsIHZlY3RvciBiYXNlbWFwIHByb2R1Y3RzXG4gICAgICAgICAgICBtb2RpZnlEb3VibGVDbGlja1pvb20gKG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLnZpZXcuY29udGludW91c196b29tICYmIG1hcC5kb3VibGVDbGlja1pvb20gJiYgdGhpcy5vcHRpb25zLm1vZGlmeURvdWJsZUNsaWNrWm9vbSAhPT0gZmFsc2UpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNb2RpZmllZCB2ZXJzaW9uIG9mIExlYWZsZXQncyBzZXRab29tQXJvdW5kIHRoYXQgZG9lc24ndCB0cmlnZ2VyIGEgbW92ZUVuZCBldmVudFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXRab29tQXJvdW5kTm9Nb3ZlRW5kID0gZnVuY3Rpb24gKG1hcCwgbGF0bG5nLCB6b29tLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGUgPSBtYXAuZ2V0Wm9vbVNjYWxlKHpvb20pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdIYWxmID0gbWFwLmdldFNpemUoKS5kaXZpZGVCeSgyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJQb2ludCA9IGxhdGxuZyBpbnN0YW5jZW9mIEwuUG9pbnQgPyBsYXRsbmcgOiBtYXAubGF0TG5nVG9Db250YWluZXJQb2ludChsYXRsbmcpLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyT2Zmc2V0ID0gY29udGFpbmVyUG9pbnQuc3VidHJhY3Qodmlld0hhbGYpLm11bHRpcGx5QnkoMSAtIDEgLyBzY2FsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2VudGVyID0gbWFwLmNvbnRhaW5lclBvaW50VG9MYXRMbmcodmlld0hhbGYuYWRkKGNlbnRlck9mZnNldCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLl9tb3ZlKG5ld0NlbnRlciwgem9vbSwgeyBmbHlUbzogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGlmaWVkIHZlcnNpb24gb2YgTGVhZmxldCdzIGZseVRvLCBmb3Igc2hvcnQgYW5pbWF0aW9ucyB6b29taW5nIGFyb3VuZCBhIHBvaW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZseUFyb3VuZCA9IGZ1bmN0aW9uIChtYXAsIHRhcmdldENlbnRlciwgdGFyZ2V0Wm9vbSwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRlID09PSBmYWxzZSB8fCAhTC5Ccm93c2VyLmFueTNkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcC5zZXRWaWV3KHRhcmdldENlbnRlciwgdGFyZ2V0Wm9vbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5fc3RvcCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnRab29tID0gbWFwLl96b29tO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDZW50ZXIgPSBMLmxhdExuZyh0YXJnZXRDZW50ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Wm9vbSA9IHRhcmdldFpvb20gPT09IHVuZGVmaW5lZCA/IHN0YXJ0Wm9vbSA6IHRhcmdldFpvb207XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRab29tID0gTWF0aC5taW4odGFyZ2V0Wm9vbSwgbWFwLmdldE1heFpvb20oKSk7IC8vIGRvbid0IGdvIHBhc3QgbWF4IHpvb21cblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZyb20gPSBtYXAucHJvamVjdChtYXAuZ2V0Q2VudGVyKCksIHN0YXJ0Wm9vbSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gPSBtYXAucHJvamVjdCh0YXJnZXRDZW50ZXIsIHN0YXJ0Wm9vbSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uID8gMTAwMCAqIG9wdGlvbnMuZHVyYXRpb24gOiA3NTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZnJhbWUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIGR1cmF0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXVzZSBpbnRlcm5hbCBmbHlUbyBmcmFtZSB0byBlbnN1cmUgdGhlc2UgYW5pbWF0aW9ucyBhcmUgY2FuY2VsZWQgbGlrZSBvdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLl9mbHlUb0ZyYW1lID0gTC5VdGlsLnJlcXVlc3RBbmltRnJhbWUoZnJhbWUsIG1hcCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlbnRlciA9IGZyb20uYWRkKHRvLnN1YnRyYWN0KGZyb20pLm11bHRpcGx5QnkodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBbY2VudGVyLngsIGNlbnRlci55XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gR2VvLm1ldGVyc1RvTGF0TG5nKGNlbnRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFpvb21Bcm91bmROb01vdmVFbmQobWFwLCB0YXJnZXRDZW50ZXIsIHN0YXJ0Wm9vbSArICh0YXJnZXRab29tIC0gc3RhcnRab29tKSAqIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFpvb21Bcm91bmROb01vdmVFbmQobWFwLCB0YXJnZXRDZW50ZXIsIHRhcmdldFpvb20pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX21vdmVFbmQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuX21vdmVTdGFydCh0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuY2FsbChtYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNb2RpZnkgdGhlIGRvdWJsZS1jbGljayB6b29tIGhhbmRsZXIgdG8gZG8gYSBzaG9ydCB6b29tIGFuaW1hdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmFibGVkID0gbWFwLmRvdWJsZUNsaWNrWm9vbS5lbmFibGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5kb3VibGVDbGlja1pvb20uZGlzYWJsZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIG1hcC5kb3VibGVDbGlja1pvb20uX29uRG91YmxlQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRab29tID0gbWFwLmdldFpvb20oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IG1hcC5vcHRpb25zLnpvb21EZWx0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tID0gZS5vcmlnaW5hbEV2ZW50LnNoaWZ0S2V5ID8gb2xkWm9vbSAtIGRlbHRhIDogb2xkWm9vbSArIGRlbHRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwLm9wdGlvbnMuZG91YmxlQ2xpY2tab29tID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZseUFyb3VuZChtYXAsIG1hcC5nZXRDZW50ZXIoKSwgem9vbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZseUFyb3VuZChtYXAsIG1hcC5jb250YWluZXJQb2ludFRvTGF0TG5nKGUuY29udGFpbmVyUG9pbnQpLCB6b29tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmRvdWJsZUNsaWNrWm9vbS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHVwZGF0ZVZpZXcgKCkge1xuICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5fbWFwLmdldENlbnRlcigpO1xuICAgICAgICAgICAgICAgIHZpZXcuem9vbSA9IE1hdGgubWluKHRoaXMuX21hcC5nZXRab29tKCksIHRoaXMuX21hcC5nZXRNYXhab29tKCkgfHwgR2VvLmRlZmF1bHRfdmlld19tYXhfem9vbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS52aWV3LnNldFZpZXcodmlldyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB1cGRhdGVTaXplICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5yZXNpemVNYXAoc2l6ZS54LCBzaXplLnkpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcmVzaXplT25GaXJzdFZpc2libGUgKCkge1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdF92aXNpYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLnZpc2liaWxpdHljaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdF92aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF92aXNpYmlsaXR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5ob29rcy52aXNpYmlsaXR5Y2hhbmdlKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9uVGFuZ3JhbVZpZXdVcGRhdGUgKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWFwIHx8IHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0VmlldyhbdGhpcy5zY2VuZS52aWV3LmNlbnRlci5sYXQsIHRoaXMuc2NlbmUudmlldy5jZW50ZXIubG5nXSwgdGhpcy5zY2VuZS52aWV3Lnpvb20sIHsgYW5pbWF0ZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXZlcnNlVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcmVuZGVyICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gUmV2ZXJzZSB0aGUgQ1NTIHBvc2l0aW9uaW5nIExlYWZsZXQgYXBwbGllcyB0byB0aGUgbGF5ZXIsIHNpbmNlIFRhbmdyYW0ncyBXZWJHTCBjYW52YXNcbiAgICAgICAgICAgIC8vIGlzIGV4cGVjdGVkIHRvIGJlICdhYnNvbHV0ZWx5JyBwb3NpdGlvbmVkLlxuICAgICAgICAgICAgcmV2ZXJzZVRyYW5zZm9ybSAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9tYXAgfHwgIXRoaXMuc2NlbmUgfHwgIXRoaXMuc2NlbmUuY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgdG9wX2xlZnQgPSB0aGlzLl9tYXAuY29udGFpbmVyUG9pbnRUb0xheWVyUG9pbnQoWzAsIDBdKTtcbiAgICAgICAgICAgICAgICBMLkRvbVV0aWwuc2V0UG9zaXRpb24odGhpcy5zY2VuZS5jb250YWluZXIsIHRvcF9sZWZ0KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIFRpZSBMZWFmbGV0IGV2ZW50IGhhbmRsZXJzIHRvIFRhbmdyYW0gZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgICAgIHNldHVwU2VsZWN0aW9uRXZlbnRIYW5kbGVycyAobWFwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5jbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuY2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RmVhdHVyZUF0KGV2ZW50LmNvbnRhaW5lclBvaW50KS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuKHNlbGVjdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gT2JqZWN0LmFzc2lnbih7fSwgc2VsZWN0aW9uLCB7IGxlYWZsZXRfZXZlbnQ6IGV2ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmNsaWNrKHJlc3VsdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ2NsaWNrJywgdGhpcy5ob29rcy5jbGljayk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLm1vdXNlbW92ZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuZ2V0RmVhdHVyZUF0KGV2ZW50LmNvbnRhaW5lclBvaW50KS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuKHNlbGVjdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gT2JqZWN0LmFzc2lnbih7fSwgc2VsZWN0aW9uLCB7IGxlYWZsZXRfZXZlbnQ6IGV2ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmhvdmVyKHJlc3VsdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ21vdXNlbW92ZScsIHRoaXMuaG9va3MubW91c2Vtb3ZlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MubW91c2VvdXQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBtb3VzZSBsZWF2ZXMgbWFwLCBzZW5kIGFuIGFkZGl0aW9uYWwgc2VsZWN0aW9uIGV2ZW50IHRvIGluZGljYXRlIG5vIGZlYXR1cmUgaXMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmhvdmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmhvdmVyKHsgY2hhbmdlZDogdHJ1ZSwgbGVhZmxldF9ldmVudDogZXZlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignbW91c2VvdXQnLCB0aGlzLmhvb2tzLm1vdXNlb3V0KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIFNldCB1c2VyLWRlZmluZWQgaGFuZGxlcnMgZm9yIGZlYXR1cmUgc2VsZWN0aW9uIGV2ZW50c1xuICAgICAgICAgICAgLy8gQ3VycmVudGx5IG9ubHkgb25lIGhhbmRsZXIgY2FuIGJlIGRlZmluZWQgZm9yIGVhY2ggZXZlbnQgdHlwZVxuICAgICAgICAgICAgLy8gRXZlbnQgdHlwZXMgYXJlOiBgY2xpY2tgLCBgaG92ZXJgIChsZWFmbGV0IGBtb3VzZW1vdmVgKVxuICAgICAgICAgICAgc2V0U2VsZWN0aW9uRXZlbnRzIChldmVudHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzID0gT2JqZWN0LmFzc2lnbih0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLCBldmVudHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgbGF5ZXIgY2xhc3NcbiAgICAgICAgTGVhZmxldExheWVyID0gbGF5ZXJCYXNlQ2xhc3MuZXh0ZW5kKGxheWVyQ2xhc3NDb25maWcpO1xuXG4gICAgICAgIC8vIFBvbHlmaWxsIHNvbWUgMS4wIG1ldGhvZHNcbiAgICAgICAgaWYgKHR5cGVvZiBMZWFmbGV0TGF5ZXIucmVtb3ZlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBMZWFmbGV0TGF5ZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ3JlbW92ZScpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIExlYWZsZXRMYXllci5sYXllckJhc2VDbGFzcyA9IGxheWVyQmFzZUNsYXNzO1xuICAgICAgICBMZWFmbGV0TGF5ZXIubGVhZmxldFZlcnNpb24gPSBsZWFmbGV0VmVyc2lvbjtcblxuICAgICAgICByZXR1cm4gbmV3IExlYWZsZXRMYXllcihvcHRpb25zKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi92ZWN0b3InO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcblxuY29uc3Qgc2hhZGVyU3JjX2FtYmllbnRMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvYW1iaWVudExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX2RpcmVjdGlvbmFsTGlnaHQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9nbC9zaGFkZXJzL2RpcmVjdGlvbmFsTGlnaHQuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfcG9pbnRMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvcG9pbnRMaWdodC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19zcG90TGlnaHQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9nbC9zaGFkZXJzL3Nwb3RMaWdodC5nbHNsJywgJ3V0ZjgnKTtcblxuLy8gQWJzdHJhY3QgbGlnaHRcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yICh2aWV3LCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5hbWJpZW50ID09IG51bGwgfHwgdHlwZW9mIGNvbmZpZy5hbWJpZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5hbWJpZW50ID0gR0xTTC5leHBhbmRWZWMzKGNvbmZpZy5hbWJpZW50IHx8IDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hbWJpZW50ID0gU3R5bGVQYXJzZXIucGFyc2VDb2xvcihjb25maWcuYW1iaWVudCkuc2xpY2UoMCwgMyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLmRpZmZ1c2UgPT0gbnVsbCB8fCB0eXBlb2YgY29uZmlnLmRpZmZ1c2UgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmRpZmZ1c2UgPSBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLmRpZmZ1c2UgIT0gbnVsbCA/IGNvbmZpZy5kaWZmdXNlIDogMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpZmZ1c2UgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGNvbmZpZy5kaWZmdXNlKS5zbGljZSgwLCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuc3BlY3VsYXIgPT0gbnVsbCB8fCB0eXBlb2YgY29uZmlnLnNwZWN1bGFyID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5zcGVjdWxhciA9IEdMU0wuZXhwYW5kVmVjMyhjb25maWcuc3BlY3VsYXIgfHwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNwZWN1bGFyID0gU3R5bGVQYXJzZXIucGFyc2VDb2xvcihjb25maWcuc3BlY3VsYXIpLnNsaWNlKDAsIDMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbGlnaHQgYnkgdHlwZSBuYW1lLCBmYWN0b3J5LXN0eWxlXG4gICAgLy8gJ2NvbmZpZycgbXVzdCBpbmNsdWRlICduYW1lJyBhbmQgJ3R5cGUnLCBhbG9uZyB3aXRoIGFueSBvdGhlciB0eXBlLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgICBzdGF0aWMgY3JlYXRlICh2aWV3LCBjb25maWcpIHtcbiAgICAgICAgaWYgKExpZ2h0LnR5cGVzW2NvbmZpZy50eXBlXSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMaWdodC50eXBlc1tjb25maWcudHlwZV0odmlldywgY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBsaWdodCBmb3IgYSBzdHlsZTogZnJhZ21lbnQgbGlnaHRpbmcsIHZlcnRleCBsaWdodGluZywgb3Igbm9uZVxuICAgIHN0YXRpYyBzZXRNb2RlIChtb2RlLCBzdHlsZSkge1xuICAgICAgICBpZiAobW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgbW9kZSA9ICdmcmFnbWVudCc7XG4gICAgICAgIH1cbiAgICAgICAgbW9kZSA9IExpZ2h0LmVuYWJsZWQgJiYgKChtb2RlICE9IG51bGwpID8gbW9kZSA6ICdmcmFnbWVudCcpOyAvLyBkZWZhdWx0IHRvIGZyYWdtZW50IGxpZ2h0aW5nXG4gICAgICAgIHN0eWxlLmRlZmluZXNbJ1RBTkdSQU1fTElHSFRJTkdfRlJBR01FTlQnXSA9IChtb2RlID09PSAnZnJhZ21lbnQnKTtcbiAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9MSUdIVElOR19WRVJURVgnXSA9IChtb2RlID09PSAndmVydGV4Jyk7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IGFsbCBwcm92aWRlZCBsaWdodCBkZWZpbml0aW9ucywgYW5kIGNhbGN1bGF0ZSBjdW11bGF0aXZlIGxpZ2h0IGZ1bmN0aW9uXG4gICAgc3RhdGljIGluamVjdCAobGlnaHRzKSB7XG4gICAgICAgIC8vIENsZWFyIHByZXZpb3VzIGluamVjdGlvbnNcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZW1vdmVCbG9jayhMaWdodC5ibG9jayk7XG5cbiAgICAgICAgLy8gSWYgbGlnaHRpbmcgaXMgZ2xvYmFsbHkgZGlzYWJsZWQsIG5vdGhpbmcgaXMgaW5qZWN0ZWQgKG1vc3RseSBmb3IgZGVidWdnaW5nIG9yIGxpdmUgZWRpdGluZylcbiAgICAgICAgaWYgKCFMaWdodC5lbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zdHJ1Y3QgY29kZSB0byBjYWxjdWxhdGUgZWFjaCBsaWdodCBpbnN0YW5jZVxuICAgICAgICBsZXQgY2FsY3VsYXRlTGlnaHRzID0gXCJcIjtcbiAgICAgICAgaWYgKGxpZ2h0cyAmJiBPYmplY3Qua2V5cyhsaWdodHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIENvbGxlY3QgdW5pcXVlcyB0eXBlcyBvZiBsaWdodHNcbiAgICAgICAgICAgIGxldCB0eXBlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgbGlnaHRfbmFtZSBpbiBsaWdodHMpIHtcbiAgICAgICAgICAgICAgICB0eXBlc1tsaWdodHNbbGlnaHRfbmFtZV0udHlwZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmplY3QgZWFjaCB0eXBlIG9mIGxpZ2h0XG4gICAgICAgICAgICBmb3IgKGxldCB0eXBlIGluIHR5cGVzKSB7XG4gICAgICAgICAgICAgICAgTGlnaHQudHlwZXNbdHlwZV0uaW5qZWN0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBwZXItaW5zdGFuY2UgYmxvY2tzIGFuZCBjb25zdHJ1Y3QgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIGNhbGN1bGF0ZSBlYWNoIGxpZ2h0XG4gICAgICAgICAgICBmb3IgKGxldCBsaWdodF9uYW1lIGluIGxpZ2h0cykge1xuICAgICAgICAgICAgICAgIC8vIERlZmluZSBpbnN0YW5jZVxuICAgICAgICAgICAgICAgIGxpZ2h0c1tsaWdodF9uYW1lXS5pbmplY3QoKTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgY2FsY3VsYXRpb24gZnVuY3Rpb24gdG8gdGhlIGxpc3RcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVMaWdodHMgKz0gYGNhbGN1bGF0ZUxpZ2h0KCR7bGlnaHRfbmFtZX0sIF9leWVUb1BvaW50LCBfbm9ybWFsKTtcXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2x1ZSB0b2dldGhlciB0aGUgZmluYWwgbGlnaHRpbmcgZnVuY3Rpb24gdGhhdCBzdW1zIGFsbCB0aGUgbGlnaHRzXG4gICAgICAgIGxldCBjYWxjdWxhdGVGdW5jdGlvbiA9IGBcbiAgICAgICAgICAgIHZlYzQgY2FsY3VsYXRlTGlnaHRpbmcoaW4gdmVjMyBfZXllVG9Qb2ludCwgaW4gdmVjMyBfbm9ybWFsLCBpbiB2ZWM0IF9jb2xvcikge1xuXG4gICAgICAgICAgICAgICAgLy8gRG8gaW5pdGlhbCBtYXRlcmlhbCBjYWxjdWxhdGlvbnMgb3ZlciBub3JtYWwsIGVtaXNzaW9uLCBhbWJpZW50LCBkaWZmdXNlIGFuZCBzcGVjdWxhciB2YWx1ZXNcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVNYXRlcmlhbChfZXllVG9Qb2ludCxfbm9ybWFsKTtcblxuICAgICAgICAgICAgICAgIC8vIFVuIHJvbGwgdGhlIGxvb3Agb2YgaW5kaXZpZHVhbCBsaWd0aHMgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgJHtjYWxjdWxhdGVMaWdodHN9XG5cbiAgICAgICAgICAgICAgICAvLyAgRmluYWwgbGlnaHQgaW50ZW5zaXR5IGNhbGN1bGF0aW9uXG4gICAgICAgICAgICAgICAgdmVjNCBjb2xvciA9IHZlYzQodmVjMygwLiksIF9jb2xvci5hKTsgLy8gc3RhcnQgd2l0aCB2ZXJ0ZXggY29sb3IgYWxwaGFcblxuICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX0VNSVNTSU9OXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLnJnYiA9IG1hdGVyaWFsLmVtaXNzaW9uLnJnYjtcbiAgICAgICAgICAgICAgICAgICAgY29sb3IuYSAqPSBtYXRlcmlhbC5lbWlzc2lvbi5hO1xuICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfQU1CSUVOVFxuICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgKz0gbGlnaHRfYWNjdW11bGF0b3JfYW1iaWVudC5yZ2IgKiBfY29sb3IucmdiICogbWF0ZXJpYWwuYW1iaWVudC5yZ2I7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLmEgKj0gbWF0ZXJpYWwuYW1iaWVudC5hO1xuICAgICAgICAgICAgICAgICNlbHNlXG4gICAgICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLnJnYiArPSBsaWdodF9hY2N1bXVsYXRvcl9hbWJpZW50LnJnYiAqIF9jb2xvci5yZ2IgKiBtYXRlcmlhbC5kaWZmdXNlLnJnYjtcbiAgICAgICAgICAgICAgICAgICAgI2VuZGlmXG4gICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLnJnYiArPSBsaWdodF9hY2N1bXVsYXRvcl9kaWZmdXNlLnJnYiAqIF9jb2xvci5yZ2IgKiBtYXRlcmlhbC5kaWZmdXNlLnJnYjtcbiAgICAgICAgICAgICAgICAgICAgY29sb3IuYSAqPSBtYXRlcmlhbC5kaWZmdXNlLmE7XG4gICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9TUEVDVUxBUlxuICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgKz0gbGlnaHRfYWNjdW11bGF0b3Jfc3BlY3VsYXIucmdiICogbWF0ZXJpYWwuc3BlY3VsYXIucmdiO1xuICAgICAgICAgICAgICAgICAgICBjb2xvci5hICo9IG1hdGVyaWFsLnNwZWN1bGFyLmE7XG4gICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAvLyBDbGFtcCBmaW5hbCBjb2xvclxuICAgICAgICAgICAgICAgIGNvbG9yID0gY2xhbXAoY29sb3IsIDAuMCwgMS4wKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjtcbiAgICAgICAgICAgIH1gO1xuXG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIGNhbGN1bGF0ZUZ1bmN0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBDb21tb24gaW5zdGFuY2UgZGVmaW5pdGlvblxuICAgIGluamVjdCAoKSB7XG4gICAgICAgIGxldCBpbnN0YW5jZSA9ICBgXG4gICAgICAgICAgICB1bmlmb3JtICR7dGhpcy5zdHJ1Y3RfbmFtZX0gdV8ke3RoaXMubmFtZX07XG4gICAgICAgICAgICAke3RoaXMuc3RydWN0X25hbWV9ICR7dGhpcy5uYW1lfTtcbiAgICAgICAgICAgIGA7XG4gICAgICAgIGxldCBhc3NpZ24gPSBgXG4gICAgICAgICAgICAke3RoaXMubmFtZX0gPSB1XyR7dGhpcy5uYW1lfTtcXG5cbiAgICAgICAgYDtcblxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBpbnN0YW5jZSk7XG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soJ3NldHVwJywgYXNzaWduKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbWV0aG9kIGNhbGxlZCBvbmNlIHBlciBmcmFtZVxuICAgIHVwZGF0ZSAoKSB7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uY2UgcGVyIGZyYW1lIHBlciBwcm9ncmFtIChlLmcuIGZvciBtYWluIHJlbmRlciBwYXNzLCB0aGVuIGZvciBlYWNoIGFkZGl0aW9uYWxcbiAgICAvLyBwYXNzIGZvciBmZWF0dXJlIHNlbGVjdGlvbiwgZXRjLilcbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIC8vICBUaHJlZSBjb21tb24gbGlnaHQgcHJvcGVydGllc1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uYW1iaWVudGAsIHRoaXMuYW1iaWVudCk7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5kaWZmdXNlYCwgdGhpcy5kaWZmdXNlKTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LnNwZWN1bGFyYCwgdGhpcy5zcGVjdWxhcik7XG4gICAgfVxuXG59XG5cbkxpZ2h0LnR5cGVzID0ge307IC8vIHJlZmVyZW5jZXMgdG8gc3ViY2xhc3NlcyBieSBzaG9ydCBuYW1lXG5MaWdodC5ibG9jayA9ICdsaWdodGluZyc7IC8vIHNoYWRlciBibG9jayBuYW1lXG5MaWdodC5lbmFibGVkID0gdHJ1ZTsgLy8gbGlnaHRpbmcgY2FuIGJlIGdsb2JhbGx5IGVuYWJsZWQvZGlzYWJsZWRcblxuXG4vLyBMaWdodCBzdWJjbGFzc2VzXG5jbGFzcyBBbWJpZW50TGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3VwZXIodmlldywgY29uZmlnKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2FtYmllbnQnO1xuICAgICAgICB0aGlzLnN0cnVjdF9uYW1lID0gJ0FtYmllbnRMaWdodCc7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IHN0cnVjdCBhbmQgY2FsY3VsYXRlIGZ1bmN0aW9uXG4gICAgc3RhdGljIGluamVjdCgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX2FtYmllbnRMaWdodCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uYW1iaWVudGAsIHRoaXMuYW1iaWVudCk7XG4gICAgfVxuXG59XG5MaWdodC50eXBlc1snYW1iaWVudCddID0gQW1iaWVudExpZ2h0O1xuXG5jbGFzcyBEaXJlY3Rpb25hbExpZ2h0IGV4dGVuZHMgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IodmlldywgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdkaXJlY3Rpb25hbCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnRGlyZWN0aW9uYWxMaWdodCc7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5kaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IGNvbmZpZy5kaXJlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBEZWZhdWx0IGRpcmVjdGlvbmFsIGxpZ2h0IG1haW50YWlucyBmdWxsIGludGVuc2l0eSBvbiBncm91bmQsIHdpdGggYmFzaWMgZXh0cnVzaW9uIHNoYWRpbmdcbiAgICAgICAgICAgIGxldCB0aGV0YSA9IDEzNTsgLy8gYW5nbGUgb2YgbGlnaHQgaW4geHkgcGxhbmUgKHJvdGF0ZWQgYXJvdW5kIHogYXhpcylcbiAgICAgICAgICAgIGxldCBzY2FsZSA9IE1hdGguc2luKE1hdGguUEkqNjAvMTgwKTsgLy8gc2NhbGluZyBmYWN0b3IgdG8ga2VlcCB0b3RhbCBkaXJlY3Rpb25hbCBpbnRlbnNpdHkgdG8gMC41XG4gICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBbXG4gICAgICAgICAgICAgICAgTWF0aC5jb3MoTWF0aC5QSSp0aGV0YS8xODApICogc2NhbGUsXG4gICAgICAgICAgICAgICAgTWF0aC5zaW4oTWF0aC5QSSp0aGV0YS8xODApICogc2NhbGUsXG4gICAgICAgICAgICAgICAgLTAuNVxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5hbWJpZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFtYmllbnQgPSBHTFNMLmV4cGFuZFZlYzMoMC41KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHRoaXMuX2RpcmVjdGlvbi5tYXAocGFyc2VGbG9hdCk7XG4gICAgfVxuXG4gICAgZ2V0IGRpcmVjdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXJlY3Rpb247XG4gICAgfVxuXG4gICAgc2V0IGRpcmVjdGlvbiAodikge1xuICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBWZWN0b3Iubm9ybWFsaXplKHYpO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBzdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIHNoYWRlclNyY19kaXJlY3Rpb25hbExpZ2h0KTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIHN1cGVyLnNldHVwUHJvZ3JhbShfcHJvZ3JhbSk7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5kaXJlY3Rpb25gLCB0aGlzLmRpcmVjdGlvbik7XG4gICAgfVxuXG59XG5MaWdodC50eXBlc1snZGlyZWN0aW9uYWwnXSA9IERpcmVjdGlvbmFsTGlnaHQ7XG5cblxuY2xhc3MgUG9pbnRMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yICh2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3VwZXIodmlldywgY29uZmlnKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3BvaW50JztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdQb2ludExpZ2h0JztcblxuICAgICAgICB0aGlzLnBvc2l0aW9uID0gY29uZmlnLnBvc2l0aW9uIHx8IFswLCAwLCAnMTAwcHgnXTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbl9leWUgPSBbXTsgLy8gcG9zaXRpb24gaW4gZXllc3BhY2VcbiAgICAgICAgdGhpcy5vcmlnaW4gPSBjb25maWcub3JpZ2luIHx8ICdncm91bmQnO1xuICAgICAgICB0aGlzLmF0dGVudWF0aW9uID0gIWlzTmFOKHBhcnNlRmxvYXQoY29uZmlnLmF0dGVudWF0aW9uKSkgPyBwYXJzZUZsb2F0KGNvbmZpZy5hdHRlbnVhdGlvbikgOiAwO1xuXG4gICAgICAgIGlmIChjb25maWcucmFkaXVzKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcucmFkaXVzKSAmJiBjb25maWcucmFkaXVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHRoaXMucmFkaXVzID0gY29uZmlnLnJhZGl1cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmFkaXVzID0gW251bGwsIGNvbmZpZy5yYWRpdXNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IHN0cnVjdCBhbmQgY2FsY3VsYXRlIGZ1bmN0aW9uXG4gICAgc3RhdGljIGluamVjdCAoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIHNoYWRlclNyY19wb2ludExpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3QgaXNudGFuY2Utc3BlY2lmaWMgc2V0dGluZ3NcbiAgICBpbmplY3QoKSB7XG4gICAgICAgIHN1cGVyLmluamVjdCgpO1xuXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX0VYUE9ORU5UJ10gPSAodGhpcy5hdHRlbnVhdGlvbiAhPT0gMCk7XG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX0lOTkVSX1JBRElVUyddID0gKHRoaXMucmFkaXVzICE9IG51bGwgJiYgdGhpcy5yYWRpdXNbMF0gIT0gbnVsbCk7XG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX09VVEVSX1JBRElVUyddID0gKHRoaXMucmFkaXVzICE9IG51bGwpO1xuICAgIH1cblxuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRXllUG9zaXRpb24oKTtcbiAgICB9XG5cbiAgICB1cGRhdGVFeWVQb3NpdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm9yaWdpbiA9PT0gJ3dvcmxkJykge1xuICAgICAgICAgICAgLy8gRm9yIHdvcmxkIG9yaWdpbiwgZm9ybWF0IGlzOiBbbG9uZ2l0dWRlLCBsYXRpdHVkZSwgbWV0ZXJzIChkZWZhdWx0KSBvciBwaXhlbHMgdy9weCB1bml0c11cblxuICAgICAgICAgICAgLy8gTW92ZSBsaWdodCdzIHdvcmxkIHBvc2l0aW9uIGludG8gY2FtZXJhIHNwYWNlXG4gICAgICAgICAgICBsZXQgW3gsIHldID0gR2VvLmxhdExuZ1RvTWV0ZXJzKHRoaXMucG9zaXRpb24pO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMF0gPSB4IC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMF07XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsxXSA9IHkgLSB0aGlzLnZpZXcuY2FtZXJhLnBvc2l0aW9uX21ldGVyc1sxXTtcblxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMl0gPSBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModGhpcy5wb3NpdGlvblsyXSxcbiAgICAgICAgICAgICAgICB7IHpvb206IHRoaXMudmlldy56b29tLCBtZXRlcnNfcGVyX3BpeGVsOiBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy52aWV3Lnpvb20pIH0pO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMl0gPSB0aGlzLnBvc2l0aW9uX2V5ZVsyXSAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzJdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMub3JpZ2luID09PSAnZ3JvdW5kJyB8fCB0aGlzLm9yaWdpbiA9PT0gJ2NhbWVyYScpIHtcbiAgICAgICAgICAgIC8vIEZvciBjYW1lcmEgb3IgZ3JvdW5kIG9yaWdpbiwgZm9ybWF0IGlzOiBbeCwgeSwgel0gaW4gbWV0ZXJzIChkZWZhdWx0KSBvciBwaXhlbHMgdy9weCB1bml0c1xuXG4gICAgICAgICAgICAvLyBMaWdodCBpcyBpbiBjYW1lcmEgc3BhY2UgYnkgZGVmYXVsdFxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWUgPSBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModGhpcy5wb3NpdGlvbixcbiAgICAgICAgICAgICAgICB7IHpvb206IHRoaXMudmlldy56b29tLCBtZXRlcnNfcGVyX3BpeGVsOiBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy52aWV3Lnpvb20pIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcmlnaW4gPT09ICdncm91bmQnKSB7XG4gICAgICAgICAgICAgICAgLy8gTGVhdmUgbGlnaHQncyB4eSBpbiBjYW1lcmEgc3BhY2UsIGJ1dCB6IG5lZWRzIHRvIGJlIG1vdmVkIHJlbGF0aXZlIHRvIGdyb3VuZCBwbGFuZVxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzJdID0gdGhpcy5wb3NpdGlvbl9leWVbMl0gLSB0aGlzLnZpZXcuY2FtZXJhLnBvc2l0aW9uX21ldGVyc1syXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVszXSA9IDE7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICBzdXBlci5zZXR1cFByb2dyYW0oX3Byb2dyYW0pO1xuXG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzRmdicsIGB1XyR7dGhpcy5uYW1lfS5wb3NpdGlvbmAsIHRoaXMucG9zaXRpb25fZXllKTtcblxuICAgICAgICBpZihTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9FWFBPTkVOVCddKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5hdHRlbnVhdGlvbkV4cG9uZW50YCwgdGhpcy5hdHRlbnVhdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZihTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9JTk5FUl9SQURJVVMnXSkge1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCBgdV8ke3RoaXMubmFtZX0uaW5uZXJSYWRpdXNgLFxuICAgICAgICAgICAgICAgIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh0aGlzLnJhZGl1c1swXSxcbiAgICAgICAgICAgICAgICAgICAgeyB6b29tOiB0aGlzLnZpZXcuem9vbSwgbWV0ZXJzX3Blcl9waXhlbDogR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMudmlldy56b29tKSB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9PVVRFUl9SQURJVVMnXSkge1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCBgdV8ke3RoaXMubmFtZX0ub3V0ZXJSYWRpdXNgLFxuICAgICAgICAgICAgICAgIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh0aGlzLnJhZGl1c1sxXSxcbiAgICAgICAgICAgICAgICAgICAgeyB6b29tOiB0aGlzLnZpZXcuem9vbSwgbWV0ZXJzX3Blcl9waXhlbDogR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMudmlldy56b29tKSB9KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5MaWdodC50eXBlc1sncG9pbnQnXSA9IFBvaW50TGlnaHQ7XG5cblxuY2xhc3MgU3BvdExpZ2h0IGV4dGVuZHMgUG9pbnRMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmlldywgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdzcG90bGlnaHQnO1xuICAgICAgICB0aGlzLnN0cnVjdF9uYW1lID0gJ1Nwb3RMaWdodCc7XG5cbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSB0aGlzLl9kaXJlY3Rpb24gPSAoY29uZmlnLmRpcmVjdGlvbiB8fCBbMCwgMCwgLTFdKS5tYXAocGFyc2VGbG9hdCk7IC8vIFt4LCB5LCB6XVxuICAgICAgICB0aGlzLmV4cG9uZW50ID0gY29uZmlnLmV4cG9uZW50ID8gcGFyc2VGbG9hdChjb25maWcuZXhwb25lbnQpIDogMC4yO1xuICAgICAgICB0aGlzLmFuZ2xlID0gY29uZmlnLmFuZ2xlID8gcGFyc2VGbG9hdChjb25maWcuYW5nbGUpIDogMjA7XG4gICAgfVxuXG4gICAgZ2V0IGRpcmVjdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXJlY3Rpb247XG4gICAgfVxuXG4gICAgc2V0IGRpcmVjdGlvbiAodikge1xuICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBWZWN0b3Iubm9ybWFsaXplKHYpO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBzdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QgKCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfc3BvdExpZ2h0KTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIHN1cGVyLnNldHVwUHJvZ3JhbShfcHJvZ3JhbSk7XG5cbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmRpcmVjdGlvbmAsIHRoaXMuZGlyZWN0aW9uKTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCBgdV8ke3RoaXMubmFtZX0uc3BvdENvc0N1dG9mZmAsIE1hdGguY29zKHRoaXMuYW5nbGUgKiAzLjE0MTU5IC8gMTgwKSk7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LnNwb3RFeHBvbmVudGAsIHRoaXMuZXhwb25lbnQpO1xuICAgIH1cblxufVxuTGlnaHQudHlwZXNbJ3Nwb3RsaWdodCddID0gU3BvdExpZ2h0O1xuIiwiaW1wb3J0IEdMU0wgZnJvbSAnLi9nbC9nbHNsJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfbWF0ZXJpYWwgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9nbC9zaGFkZXJzL21hdGVyaWFsLmdsc2wnLCAndXRmOCcpO1xuXG5jb25zdCBtYXRlcmlhbF9wcm9wcyA9IFsnZW1pc3Npb24nLCAnYW1iaWVudCcsICdkaWZmdXNlJywgJ3NwZWN1bGFyJ107XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hdGVyaWFsIHtcbiAgICBjb25zdHJ1Y3RvciAoY29uZmlnKSB7XG5cbiAgICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuXG4gICAgICAgIC8vIFRoZXNlIHByb3BlcnRpZXMgYWxsIGhhdmUgdGhlIHNhbWUgZGVmYXVsdHMsIHNvIHRoZXkgY2FuIGJlIHNldCBpbiBidWxrXG4gICAgICAgIG1hdGVyaWFsX3Byb3BzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLnRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmU6IHZhbHVlLnRleHR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nOiB2YWx1ZS5tYXBwaW5nIHx8ICdzcGhlcmVtYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IEdMU0wuZXhwYW5kVmVjMyh2YWx1ZS5zY2FsZSAhPSBudWxsID8gdmFsdWUuc2NhbGUgOiAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudDogR0xTTC5leHBhbmRWZWM0KHZhbHVlLmFtb3VudCAhPSBudWxsID8gdmFsdWUuYW1vdW50IDogMSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0geyBhbW91bnQ6IEdMU0wuZXhwYW5kVmVjNCh2YWx1ZSkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0geyBhbW91bnQ6IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IodmFsdWUpIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFeHRyYSBzcGVjdWxhciBwcm9wc1xuICAgICAgICBpZiAodGhpcy5zcGVjdWxhcikge1xuICAgICAgICAgICAgdGhpcy5zcGVjdWxhci5zaGluaW5lc3MgPSBjb25maWcuc2hpbmluZXNzID8gcGFyc2VGbG9hdChjb25maWcuc2hpbmluZXNzKSA6IDAuMjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vcm1hbCBtYXBwaW5nXG4gICAgICAgIGlmIChjb25maWcubm9ybWFsICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubm9ybWFsID0ge1xuICAgICAgICAgICAgICAgIHRleHR1cmU6IGNvbmZpZy5ub3JtYWwudGV4dHVyZSxcbiAgICAgICAgICAgICAgICBtYXBwaW5nOiBjb25maWcubm9ybWFsLm1hcHBpbmcgfHwgJ3RyaXBsYW5hcicsXG4gICAgICAgICAgICAgICAgc2NhbGU6IEdMU0wuZXhwYW5kVmVjMyhjb25maWcubm9ybWFsLnNjYWxlICE9IG51bGwgPyBjb25maWcubm9ybWFsLnNjYWxlIDogMSksXG4gICAgICAgICAgICAgICAgYW1vdW50OiBjb25maWcubm9ybWFsLmFtb3VudCAhPSBudWxsID8gY29uZmlnLm5vcm1hbC5hbW91bnQgOiAxXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIGEgbWF0ZXJpYWwgY29uZmlnIGJsb2NrIGhhcyBzdWZmaWNpZW50IHByb3BlcnRpZXMgdG8gY3JlYXRlIGEgbWF0ZXJpYWxcbiAgICBzdGF0aWMgaXNWYWxpZCAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5lbWlzc2lvbiA9PSBudWxsICYmXG4gICAgICAgICAgICBjb25maWcuYW1iaWVudCA9PSBudWxsICYmXG4gICAgICAgICAgICBjb25maWcuZGlmZnVzZSA9PSBudWxsICYmXG4gICAgICAgICAgICBjb25maWcuc3BlY3VsYXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaW5qZWN0IChzdHlsZSkge1xuICAgICAgICAvLyBGb3IgZWFjaCBwcm9wZXJ0eSwgc2V0cyBkZWZpbmVzIHRvIGNvbmZpZ3VyZSB0ZXh0dXJlIG1hcHBpbmcsIHdpdGggYSBwYXR0ZXJuIGxpa2U6XG4gICAgICAgIC8vICAgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFLCBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0VfVEVYVFVSRSwgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFX1RFWFRVUkVfU1BIRVJFTUFQXG4gICAgICAgIC8vIEFsc28gc2V0cyBmbGFncyB0byBrZWVwIHRyYWNrIG9mIGVhY2ggdW5pcXVlIG1hcHBpbmcgdHlwZSBiZWluZyB1c2VkLCBlLmcuOlxuICAgICAgICAvLyAgIFRBTkdSQU1fTUFURVJJQUxfVEVYVFVSRV9TUEhFUkVNQVBcbiAgICAgICAgLy8gRW5hYmxlcyB0ZXh0dXJlIGNvb3JkaW5hdGVzIGlmIG5lZWRlZCBhbmQgbm90IGFscmVhZHkgb25cbiAgICAgICAgbWF0ZXJpYWxfcHJvcHMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIGxldCBkZWYgPSBgVEFOR1JBTV9NQVRFUklBTF8ke3Byb3AudG9VcHBlckNhc2UoKX1gO1xuICAgICAgICAgICAgbGV0IHRleGRlZiA9IGRlZiArICdfVEVYVFVSRSc7XG4gICAgICAgICAgICBzdHlsZS5kZWZpbmVzW2RlZl0gPSAodGhpc1twcm9wXSAhPSBudWxsKTtcbiAgICAgICAgICAgIGlmICh0aGlzW3Byb3BdICYmIHRoaXNbcHJvcF0udGV4dHVyZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbdGV4ZGVmXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1t0ZXhkZWYgKyAnXycgKyB0aGlzW3Byb3BdLm1hcHBpbmcudG9VcHBlckNhc2UoKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbYFRBTkdSQU1fTUFURVJJQUxfVEVYVFVSRV8ke3RoaXNbcHJvcF0ubWFwcGluZy50b1VwcGVyQ2FzZSgpfWBdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBzdHlsZS50ZXhjb29yZHMgfHwgKHRoaXNbcHJvcF0ubWFwcGluZyA9PT0gJ3V2Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE5vcm1hbCBtYXBwaW5nXG4gICAgICAgIC8vIEFzIGFub3ZlLCBzZXRzIGZsYWdzIHRvIGtlZXAgdHJhY2sgb2YgZWFjaCB1bmlxdWUgbWFwcGluZyB0eXBlIGJlaW5nIHVzZWQsIGUuZy46XG4gICAgICAgIC8vICAgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFX1NQSEVSRU1BUFxuICAgICAgICBpZiAodGhpcy5ub3JtYWwgJiYgdGhpcy5ub3JtYWwudGV4dHVyZSkge1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9NQVRFUklBTF9OT1JNQUxfVEVYVFVSRSddID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbJ1RBTkdSQU1fTUFURVJJQUxfTk9STUFMX1RFWFRVUkVfJyArIHRoaXMubm9ybWFsLm1hcHBpbmcudG9VcHBlckNhc2UoKV0gPSB0cnVlO1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1tgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFXyR7dGhpcy5ub3JtYWwubWFwcGluZy50b1VwcGVyQ2FzZSgpfWBdID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHN0eWxlLnRleGNvb3JkcyB8fCAodGhpcy5ub3JtYWwubWFwcGluZyA9PT0gJ3V2Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS5yZXBsYWNlU2hhZGVyQmxvY2soTWF0ZXJpYWwuYmxvY2ssIHNoYWRlclNyY19tYXRlcmlhbCwgJ01hdGVyaWFsJyk7XG4gICAgICAgIHN0eWxlLmFkZFNoYWRlckJsb2NrKCdzZXR1cCcsICdcXG5tYXRlcmlhbCA9IHVfbWF0ZXJpYWw7XFxuJywgJ01hdGVyaWFsJyk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICAvLyBGb3IgZWFjaCBwcm9wZXJ0eSwgc2V0cyB1bmlmb3JtcyBpbiB0aGUgcGF0dGVybjpcbiAgICAgICAgLy8gdV9tYXRlcmlhbC5kaWZmdXNlLCB1X21hdGVyaWFsLmRpZmZ1c2VTY2FsZSB1X21hdGVyaWFsX2RpZmZ1c2VfdGV4dHVyZVxuICAgICAgICBtYXRlcmlhbF9wcm9wcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXNbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpc1twcm9wXS50ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9wcm9ncmFtLnNldFRleHR1cmVVbmlmb3JtKGB1X21hdGVyaWFsXyR7cHJvcH1fdGV4dHVyZWAsIHRoaXNbcHJvcF0udGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1X21hdGVyaWFsLiR7cHJvcH1TY2FsZWAsIHRoaXNbcHJvcF0uc2NhbGUpO1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCc0ZnYnLCBgdV9tYXRlcmlhbC4ke3Byb3B9YCwgdGhpc1twcm9wXS5hbW91bnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1twcm9wXS5hbW91bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnNGZ2JywgYHVfbWF0ZXJpYWwuJHtwcm9wfWAsIHRoaXNbcHJvcF0uYW1vdW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4dHJhIHNwZWN1bGFyIHByb3BzXG4gICAgICAgIGlmICh0aGlzLnNwZWN1bGFyKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X21hdGVyaWFsLnNoaW5pbmVzcycsIHRoaXMuc3BlY3VsYXIuc2hpbmluZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vcm1hbCBtYXBwaW5nXG4gICAgICAgIGlmICh0aGlzLm5vcm1hbCAmJiB0aGlzLm5vcm1hbC50ZXh0dXJlKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS5zZXRUZXh0dXJlVW5pZm9ybSgndV9tYXRlcmlhbF9ub3JtYWxfdGV4dHVyZScsIHRoaXMubm9ybWFsLnRleHR1cmUpO1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgJ3VfbWF0ZXJpYWwubm9ybWFsU2NhbGUnLCB0aGlzLm5vcm1hbC5zY2FsZSk7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X21hdGVyaWFsLm5vcm1hbEFtb3VudCcsIHRoaXMubm9ybWFsLmFtb3VudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbk1hdGVyaWFsLmJsb2NrID0gJ21hdGVyaWFsJztcbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5cbmltcG9ydCAnLi91dGlscy9wb2x5ZmlsbHMnO1xuXG4vLyBUaGUgbGVhZmxldCBsYXllciBwbHVnaW4gaXMgY3VycmVudGx5IHRoZSBwcmltYXJ5IHB1YmxpYyBBUElcbmltcG9ydCB7bGVhZmxldExheWVyfSBmcm9tICcuL2xlYWZsZXRfbGF5ZXInO1xuXG4vLyBUaGUgc2NlbmUgd29ya2VyIGlzIG9ubHkgYWN0aXZhdGVkIHdoZW4gYSB3b3JrZXIgdGhyZWFkIGlzIGluc3RhbnRpYXRlZCwgYnV0IG11c3QgYWx3YXlzIGJlIGxvYWRlZFxuaW1wb3J0IFNjZW5lIGZyb20gJy4vc2NlbmUnO1xuaW1wb3J0IHtTY2VuZVdvcmtlcn0gZnJvbSAnLi9zY2VuZV93b3JrZXInO1xuXG4vLyBBZGRpdGlvbmFsIG1vZHVsZXMgYXJlIGV4cG9zZWQgZm9yIGRlYnVnZ2luZ1xuaW1wb3J0IHZlcnNpb24gZnJvbSAnLi91dGlscy92ZXJzaW9uJztcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IFRocmVhZCBmcm9tICcuL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi92ZWN0b3InO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9zb3VyY2VzL2RhdGFfc291cmNlJztcbmltcG9ydCAnLi9zb3VyY2VzL2dlb2pzb24nO1xuaW1wb3J0ICcuL3NvdXJjZXMvdG9wb2pzb24nO1xuaW1wb3J0ICcuL3NvdXJjZXMvbXZ0JztcbmltcG9ydCAnLi9zb3VyY2VzL3Jhc3Rlcic7XG5pbXBvcnQgR0xTTCBmcm9tICcuL2dsL2dsc2wnO1xuaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgVmVydGV4RGF0YSBmcm9tICcuL2dsL3ZlcnRleF9kYXRhJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgTWF0ZXJpYWwgZnJvbSAnLi9tYXRlcmlhbCc7XG5pbXBvcnQgTGlnaHQgZnJvbSAnLi9saWdodCc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQge2xheWVyX2NhY2hlfSBmcm9tICcuL3N0eWxlcy9sYXllcic7XG5pbXBvcnQge1N0eWxlTWFuYWdlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tICcuL2xhYmVscy9jb2xsaXNpb24nO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi9zZWxlY3Rpb24nO1xuaW1wb3J0IENhbnZhc1RleHQgZnJvbSAnLi9zdHlsZXMvdGV4dC9jYW52YXNfdGV4dCc7XG5pbXBvcnQgZGVidWdTZXR0aW5ncyBmcm9tICcuL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgSlNaaXAgZnJvbSAnanN6aXAnO1xuXG4vLyBNYWtlIHNvbWUgbW9kdWxlcyBhY2Nlc3NpYmxlIGZvciBkZWJ1Z2dpbmdcbnZhciBkZWJ1ZyA9IHtcbiAgICBsb2csXG4gICAgeWFtbCxcbiAgICBUaHJlYWQsXG4gICAgVXRpbHMsXG4gICAgR2VvLFxuICAgIFZlY3RvcixcbiAgICBEYXRhU291cmNlLFxuICAgIEdMU0wsXG4gICAgU2hhZGVyUHJvZ3JhbSxcbiAgICBWZXJ0ZXhEYXRhLFxuICAgIFRleHR1cmUsXG4gICAgTWF0ZXJpYWwsXG4gICAgTGlnaHQsXG4gICAgU2NlbmUsXG4gICAgU2NlbmVXb3JrZXIsXG4gICAgV29ya2VyQnJva2VyLFxuICAgIGxheWVyX2NhY2hlLFxuICAgIFN0eWxlTWFuYWdlcixcbiAgICBTdHlsZVBhcnNlcixcbiAgICBDb2xsaXNpb24sXG4gICAgRmVhdHVyZVNlbGVjdGlvbixcbiAgICBDYW52YXNUZXh0LFxuICAgIGRlYnVnU2V0dGluZ3Ncbn07XG5cbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIFV0aWxzLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsKCk7XG5cbiAgICAvLyBBdHRhY2ggUHJvbWlzZSBwb2x5ZmlsbCB0byB3aW5kb3dcbiAgICAvLyBBbGxvd3MgRm9udEZhY2VPYnNlcnZlciB0byB1c2UgcG9seWZpbGwgKHdpdGhvdXQgbmVlZGluZyB0byBpbmNsdWRlIGl0cyBvd24gZHVwbGljYXRlIHBvbHlmaWxsKVxuICAgIGlmICh3aW5kb3cuUHJvbWlzZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdpbmRvdy5Qcm9taXNlID0gUHJvbWlzZTtcbiAgICAgICAgSlNaaXAuZXh0ZXJuYWwuUHJvbWlzZSA9IFByb21pc2U7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBsZWFmbGV0TGF5ZXIsXG4gICAgZGVidWcsXG4gICAgdmVyc2lvblxufTtcbiIsImltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0ICogYXMgVVJMcyBmcm9tICcuL3V0aWxzL3VybHMnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuaW1wb3J0IHN1YnNjcmliZU1peGluIGZyb20gJy4vdXRpbHMvc3Vic2NyaWJlJztcbmltcG9ydCBDb250ZXh0IGZyb20gJy4vZ2wvY29udGV4dCc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgVmVydGV4QXJyYXlPYmplY3QgZnJvbSAnLi9nbC92YW8nO1xuaW1wb3J0IHtTdHlsZU1hbmFnZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX21hbmFnZXInO1xuaW1wb3J0IHtTdHlsZX0gZnJvbSAnLi9zdHlsZXMvc3R5bGUnO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcbmltcG9ydCBTY2VuZUxvYWRlciBmcm9tICcuL3NjZW5lX2xvYWRlcic7XG5pbXBvcnQgVmlldyBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IExpZ2h0IGZyb20gJy4vbGlnaHQnO1xuaW1wb3J0IFRpbGVNYW5hZ2VyIGZyb20gJy4vdGlsZV9tYW5hZ2VyJztcbmltcG9ydCBEYXRhU291cmNlIGZyb20gJy4vc291cmNlcy9kYXRhX3NvdXJjZSc7XG5pbXBvcnQgRmVhdHVyZVNlbGVjdGlvbiBmcm9tICcuL3NlbGVjdGlvbic7XG5pbXBvcnQgUmVuZGVyU3RhdGVNYW5hZ2VyIGZyb20gJy4vZ2wvcmVuZGVyX3N0YXRlJztcbmltcG9ydCBGb250TWFuYWdlciBmcm9tICcuL3N0eWxlcy90ZXh0L2ZvbnRfbWFuYWdlcic7XG5pbXBvcnQgTWVkaWFDYXB0dXJlIGZyb20gJy4vdXRpbHMvbWVkaWFfY2FwdHVyZSc7XG5cbi8vIExvYWQgc2NlbmUgZGVmaW5pdGlvbjogcGFzcyBhbiBvYmplY3QgZGlyZWN0bHksIG9yIGEgVVJMIGFzIHN0cmluZyB0byBsb2FkIHJlbW90ZWx5XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY2VuZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWdfc291cmNlLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBzdWJzY3JpYmVNaXhpbih0aGlzKTtcblxuICAgICAgICB0aGlzLmlkID0gU2NlbmUuaWQrKztcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IG51bGw7IC8vIHdpbGwgYmUgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzY2VuZSBpcyBsb2FkZWRcbiAgICAgICAgdGhpcy5zb3VyY2VzID0ge307XG5cbiAgICAgICAgdGhpcy52aWV3ID0gbmV3IFZpZXcodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyID0gbmV3IFRpbGVNYW5hZ2VyKHsgc2NlbmU6IHRoaXMsIHZpZXc6IHRoaXMudmlldyB9KTtcbiAgICAgICAgdGhpcy5udW1fd29ya2VycyA9IG9wdGlvbnMubnVtV29ya2VycyB8fCAyO1xuICAgICAgICB0aGlzLndvcmtlcl91cmwgPSBvcHRpb25zLndvcmtlclVybDtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGlzYWJsZVZlcnRleEFycmF5T2JqZWN0cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgVXRpbHMudXNlX2hpZ2hfZGVuc2l0eV9kaXNwbGF5ID0gb3B0aW9ucy5oaWdoRGVuc2l0eURpc3BsYXkgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuaGlnaERlbnNpdHlEaXNwbGF5IDogdHJ1ZTtcbiAgICAgICAgVXRpbHMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb25maWdfc291cmNlID0gY29uZmlnX3NvdXJjZTtcbiAgICAgICAgdGhpcy5jb25maWdfYnVuZGxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb25maWdfc2VyaWFsaXplZCA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlID0gbnVsbDtcblxuICAgICAgICB0aGlzLnN0eWxlcyA9IG51bGw7XG4gICAgICAgIHRoaXMuc3R5bGVfbWFuYWdlciA9IG5ldyBTdHlsZU1hbmFnZXIoKTtcblxuICAgICAgICB0aGlzLmJ1aWxkaW5nID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFja3MgY3VycmVudCBzY2VuZSBidWlsZGluZyBzdGF0ZSAodGlsZXMgYmVpbmcgYnVpbHQsIGV0Yy4pXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgYSByZWRyYXdcbiAgICAgICAgdGhpcy5hbmltYXRlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCByZWRyYXcgZXZlcnkgZnJhbWVcbiAgICAgICAgdGhpcy5wcmVVcGRhdGUgPSBvcHRpb25zLnByZVVwZGF0ZTsgICAgICAgICAgICAgLy8gb3B0aW9uYWwgcHJlLXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgdGhpcy5wb3N0VXBkYXRlID0gb3B0aW9ucy5wb3N0VXBkYXRlOyAgICAgICAgICAgLy8gb3B0aW9uYWwgcG9zdC1yZW5kZXIgbG9vcCBob29rXG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3AgPSAhb3B0aW9ucy5kaXNhYmxlUmVuZGVyTG9vcDsgIC8vIGRpc2FibGUgcmVuZGVyIGxvb3AgLSBhcHAgd2lsbCBoYXZlIHRvIG1hbnVhbGx5IGNhbGwgU2NlbmUucmVuZGVyKCkgcGVyIGZyYW1lXG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3BfYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3Bfc3RvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbmRlcl9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMubGFzdF9yZW5kZXJfY291bnQgPSAwO1xuICAgICAgICB0aGlzLnJlbmRlcl9jb3VudF9jaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZnJhbWUgPSAwO1xuICAgICAgICB0aGlzLm1lZGlhX2NhcHR1cmUgPSBuZXcgTWVkaWFDYXB0dXJlKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbnRyb3NwZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcblxuICAgICAgICB0aGlzLmxpZ2h0cyA9IG51bGw7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGluZyA9IDA7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IFNjZW5lLmdlbmVyYXRpb247IC8vIGFuIGlkIHRoYXQgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBzY2VuZSBjb25maWcgaXMgaW52YWxpZGF0ZWRcbiAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSBTY2VuZS5nZW5lcmF0aW9uOyAvLyBsYXN0IGdlbmVyYXRpb24gaWQgd2l0aCBhIGNvbXBsZXRlIHZpZXdcbiAgICAgICAgdGhpcy5zZXR1cERlYnVnKCk7XG5cbiAgICAgICAgdGhpcy5sb2dfbGV2ZWwgPSBvcHRpb25zLmxvZ0xldmVsIHx8ICd3YXJuJztcbiAgICAgICAgbG9nLnNldExldmVsKHRoaXMubG9nX2xldmVsKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlIChjb25maWcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFNjZW5lKGNvbmZpZywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gTG9hZCBzY2VuZSAob3IgcmVsb2FkIGV4aXN0aW5nIHNjZW5lIGlmIG5vIG5ldyBzb3VyY2Ugc3BlY2lmaWVkKVxuICAgIC8vIE9wdGlvbnM6XG4gICAgLy8gICBgY29uZmlnX3BhdGhgOiBiYXNlIFVSTCBhZ2FpbnN0IHdoaWNoIHJvbyBzY2VuZSByZXNvdXJjZXMgc2hvdWxkIGJlIHJlc29sdmVkICh1c2VmdWwgZm9yIFBsYXkpIChkZWZhdWx0IG51bGxsKVxuICAgIC8vICAgYGJsb2NraW5nYDogc2hvdWxkIHJlbmRlcmluZyBibG9jayBvbiBzY2VuZSBsb2FkIGNvbXBsZXRpb24gKGRlZmF1bHQgdHJ1ZSlcbiAgICBsb2FkKGNvbmZpZ19zb3VyY2UgPSBudWxsLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXppbmc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0aW5nKys7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbHR5IGZvciBwYXNzaW5nIGBjb25maWdfcGF0aGAgc3RyaW5nIGFzIHNlY29uZCBhcmd1bWVudFxuICAgICAgICAvLyAoc2luY2UgdHJhbnNpdGlvbmVkIHRvIHVzaW5nIG9wdGlvbnMgYXJndW1lbnQgdG8gYWNjZXB0IG1vcmUgcGFyYW1ldGVycylcbiAgICAgICAgb3B0aW9ucyA9ICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpID8geyBjb25maWdfcGF0aDogb3B0aW9ucyB9IDogb3B0aW9ucztcbiAgICAgICAgbGV0IGNvbmZpZ19wYXRoID0gb3B0aW9ucy5jb25maWdfcGF0aDtcblxuICAgICAgICAvLyBTaG91bGQgcmVuZGVyaW5nIGJsb2NrIG9uIGxvYWQgKG5vdCBkZXNpcmFibGUgZm9yIGluaXRpYWwgbG9hZCwgb2Z0ZW4gZGVzaXJlZCBmb3IgbGl2ZSBzdHlsZS1zd2l0Y2hpbmcpXG4gICAgICAgIG9wdGlvbnMuYmxvY2tpbmcgPSAob3B0aW9ucy5ibG9ja2luZyAhPT0gdW5kZWZpbmVkKSA/IG9wdGlvbnMuYmxvY2tpbmcgOiB0cnVlO1xuXG4gICAgICAgIC8vIExvYWQgc2NlbmUgZGVmaW5pdGlvbiAoc291cmNlcywgc3R5bGVzLCBldGMuKSwgdGhlbiBjcmVhdGUgc3R5bGVzICYgd29ya2Vyc1xuICAgICAgICB0aGlzLmNyZWF0ZUNhbnZhcygpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IHRoaXMubG9hZFNjZW5lKGNvbmZpZ19zb3VyY2UsIGNvbmZpZ19wYXRoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5jcmVhdGVXb3JrZXJzKCkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldEZlYXR1cmVTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgICAgIC8vIFNjZW5lIGxvYWRlZCBmcm9tIGEgSlMgb2JqZWN0LCBvciBtb2RpZmllZCBieSBhIGBsb2FkYCBldmVudCwgbWF5IGNvbnRhaW4gY29tcGlsZWQgSlMgZnVuY3Rpb25zXG4gICAgICAgICAgICAgICAgLy8gd2hpY2ggbmVlZCB0byBiZSBzZXJpYWxpemVkLCB3aGlsZSBvbmUgbG9hZGVkIG9ubHkgZnJvbSBhIFVSTCBkb2VzIG5vdC5cbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVfZnVuY3MgPSAoKHR5cGVvZiB0aGlzLmNvbmZpZ19zb3VyY2UgPT09ICdvYmplY3QnKSB8fCB0aGlzLmhhc1N1YnNjcmliZXJzRm9yKCdsb2FkJykpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdXBkYXRpbmcgPSB0aGlzLnVwZGF0ZUNvbmZpZyh7IHNlcmlhbGl6ZV9mdW5jcywgZmFkZV9pbjogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9ja2luZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGluZy0tO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3NvdXJjZSA9IHRoaXMuY29uZmlnX3NvdXJjZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3BhdGggPSB0aGlzLmNvbmZpZ19wYXRoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyX2xvb3AgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dXBSZW5kZXJMb29wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnVwZGF0aW5nID0gMDtcblxuICAgICAgICAgICAgLy8gUmVwb3J0IGFuZCByZXZlcnQgdG8gbGFzdCB2YWxpZCBjb25maWcgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICBsZXQgdHlwZSwgbWVzc2FnZTtcbiAgICAgICAgICAgIGlmIChlcnJvci5uYW1lID09PSAnWUFNTEV4Y2VwdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gJ3lhbWwnO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnRXJyb3IgcGFyc2luZyBzY2VuZSBZQU1MJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IG1vcmUgZXJyb3IgdHlwZXNcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ0Vycm9yIGluaXRpYWxpemluZyBzY2VuZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgeyB0eXBlLCBtZXNzYWdlLCBlcnJvciwgdXJsOiB0aGlzLmNvbmZpZ19zb3VyY2UgfSk7XG5cbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgU2NlbmUubG9hZCgpIGZhaWxlZCB0byBsb2FkICR7dGhpcy5jb25maWdfc291cmNlfTogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBtZXNzYWdlLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgbG9nKCdpbmZvJywgYFNjZW5lLmxvYWQoKSByZXZlcnRpbmcgdG8gbGFzdCB2YWxpZCBjb25maWd1cmF0aW9uYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZCh0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3NvdXJjZSwgdGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBtZXNzYWdlLCBlcnJvcik7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6aW5nO1xuICAgIH1cblxuICAgIC8vIEZvciBBUEkgY29tcGF0aWJpbGl0eVxuICAgIHJlbG9hZChjb25maWdfc291cmNlID0gbnVsbCwgY29uZmlnX3BhdGggPSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWQoY29uZmlnX3NvdXJjZSwgY29uZmlnX3BhdGgpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9zdG9wID0gdHJ1ZTsgLy8gc2NoZWR1bGUgcmVuZGVyIGxvb3AgdG8gc3RvcFxuXG4gICAgICAgIHRoaXMuZGVzdHJveUxpc3RlbmVycygpO1xuXG4gICAgICAgIGlmICh0aGlzLmNhbnZhcyAmJiB0aGlzLmNhbnZhcy5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2FudmFzKTtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5nbCkge1xuICAgICAgICAgICAgVGV4dHVyZS5kZXN0cm95KHRoaXMuZ2wpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyLmRlc3Ryb3kodGhpcy5nbCk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlcyA9IHt9O1xuXG4gICAgICAgICAgICBTaGFkZXJQcm9ncmFtLnJlc2V0KCk7XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIGNvbnRleHQgbG9zc1xuICAgICAgICAgICAgbGV0IGV4dCA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJHTF9sb3NlX2NvbnRleHQnKTtcbiAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICBleHQubG9zZUNvbnRleHQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5nbCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNvdXJjZXMgPSB7fTtcblxuICAgICAgICB0aGlzLmRlc3Ryb3lXb3JrZXJzKCk7XG4gICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy50aWxlX21hbmFnZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGNyZWF0ZUNhbnZhcygpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyIHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUudG9wID0gMDtcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUubGVmdCA9IDA7XG5cbiAgICAgICAgLy8gRm9yY2UgdGFuZ3JhbSBjYW52YXMgdW5kZXJuZWF0aCBhbGwgbGVhZmxldCBsYXllcnMsIGFuZCBzZXQgYmFja2dyb3VuZCB0byB0cmFuc3BhcmVudFxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZ2wgPSBDb250ZXh0LmdldENvbnRleHQodGhpcy5jYW52YXMsIHtcbiAgICAgICAgICAgICAgICBhbHBoYTogdHJ1ZSwgcHJlbXVsdGlwbGllZEFscGhhOiB0cnVlLCAvLyBUT0RPOiB2YXJ5IHcvc2NlbmUgYWxwaGFcbiAgICAgICAgICAgICAgICBkZXZpY2VfcGl4ZWxfcmF0aW86IFV0aWxzLmRldmljZV9waXhlbF9yYXRpb1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ291bGRuJ3QgY3JlYXRlIFdlYkdMIGNvbnRleHQuIFwiICtcbiAgICAgICAgICAgICAgICBcIllvdXIgYnJvd3NlciBtYXkgbm90IHN1cHBvcnQgV2ViR0wsIG9yIGl0J3MgdHVybmVkIG9mZj8gXCIgK1xuICAgICAgICAgICAgICAgIFwiVmlzaXQgaHR0cDovL3dlYmdscmVwb3J0LmNvbS8gZm9yIG1vcmUgaW5mby5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzaXplTWFwKHRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoLCB0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQpO1xuICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5pbml0KHRoaXMuZ2wpO1xuICAgICAgICB0aGlzLnJlbmRlcl9zdGF0ZXMgPSBuZXcgUmVuZGVyU3RhdGVNYW5hZ2VyKHRoaXMuZ2wpO1xuICAgICAgICB0aGlzLm1lZGlhX2NhcHR1cmUuc2V0Q2FudmFzKHRoaXMuY2FudmFzKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIFVSTCB0byBsb2FkIHRoZSB3ZWIgd29ya2VyIGZyb21cbiAgICBnZXRXb3JrZXJVcmwoKSB7XG4gICAgICAgIGxldCB3b3JrZXJfdXJsID0gdGhpcy53b3JrZXJfdXJsIHx8IFVSTHMuZmluZEN1cnJlbnRVUkwoJ3RhbmdyYW0uZGVidWcuanMnLCAndGFuZ3JhbS5taW4uanMnKTtcblxuICAgICAgICBpZiAoIXdvcmtlcl91cmwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGxvYWQgd29ya2VyIGJlY2F1c2UgY291bGRuJ3QgZmluZCBiYXNlIFVSTCB0aGF0IGxpYnJhcnkgd2FzIGxvYWRlZCBmcm9tXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW1wb3J0IGN1c3RvbSBkYXRhIHNvdXJjZSBzY3JpcHRzIGFsb25nc2lkZSBjb3JlIGxpYnJhcnlcbiAgICAgICAgLy8gTk9URTogd29ya2Fyb3VuZCBmb3IgaXNzdWUgd2hlcmUgbGFyZ2UgbGlicmFyaWVzIGludGVybWl0dGVudGx5IGZhaWwgdG8gbG9hZCBpbiB3ZWIgd29ya2VycyxcbiAgICAgICAgLy8gd2hlbiBtdWx0aXBsZSBpbXBvcnRTY3JpcHRzKCkgY2FsbHMgYXJlIHVzZWQuIExvYWRpbmcgYWxsIHNjcmlwdHMgKGluY2x1ZGluZyBUYW5ncmFtIGl0c2VsZilcbiAgICAgICAgLy8gaW4gb25lIGNhbGwgYXQgYXQgd29ya2VyIGNyZWF0aW9uIHRpbWUgaGFzIG5vdCBleGhpYml0ZWQgdGhlIHNhbWUgaXNzdWUuXG4gICAgICAgIGxldCB1cmxzID0gWy4uLnRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0c107XG4gICAgICAgIHVybHMucHVzaCh3b3JrZXJfdXJsKTsgLy8gbG9hZCBUYW5ncmFtICpsYXN0KiAoaGFzIGJlZW4gbW9yZSByZWxpYWJsZSwgdGhvdWdoIHJlYXNvbiB1bmtub3duKVxuICAgICAgICBsZXQgYm9keSA9IGBpbXBvcnRTY3JpcHRzKCR7dXJscy5tYXAodXJsID0+IGAnJHt1cmx9J2ApLmpvaW4oJywnKX0pO2A7XG4gICAgICAgIHJldHVybiBVUkxzLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbYm9keV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnIH0pKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbGlzdCBvZiBhbnkgY3VzdG9tIGRhdGEgc291cmNlIHNjcmlwdHMgKGlmIGFueSlcbiAgICB1cGRhdGVEYXRhU291cmNlU2NyaXB0cyAoKSB7XG4gICAgICAgIGxldCBwcmV2X3NjcmlwdHMgPSBbLi4uKHRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0c3x8W10pXTsgLy8gc2F2ZSBsaXN0IG9mIHByZXZpb3VzbHkgbG9hZGVkIHNjcmlwdHNcbiAgICAgICAgbGV0IHNjcmlwdHMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbmZpZy5zb3VyY2VzKS5tYXAocyA9PiB0aGlzLmNvbmZpZy5zb3VyY2VzW3NdLnNjcmlwdHMpLmZpbHRlcih4ID0+IHgpO1xuICAgICAgICBpZiAoc2NyaXB0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgJ2xvYWRpbmcgY3VzdG9tIGRhdGEgc291cmNlIHNjcmlwdHMgaW4gd29ya2VyOicsIHNjcmlwdHMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0cyA9IFtdLmNvbmNhdCguLi5zY3JpcHRzKS5zb3J0KCk7XG5cbiAgICAgICAgLy8gU2NyaXB0cyBjaGFuZ2VkP1xuICAgICAgICByZXR1cm4gISh0aGlzLmRhdGFfc291cmNlX3NjcmlwdHMubGVuZ3RoID09PSBwcmV2X3NjcmlwdHMubGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLmRhdGFfc291cmNlX3NjcmlwdHMuZXZlcnkoKHYsIGkpID0+IHYgPT09IHByZXZfc2NyaXB0c1tpXSkpO1xuICAgIH1cblxuICAgIC8vIFdlYiB3b3JrZXJzIGhhbmRsZSBoZWF2eSBkdXR5IHRpbGUgY29uc3RydWN0aW9uOiBuZXR3b3JraW5nLCBnZW9tZXRyeSBwcm9jZXNzaW5nLCBldGMuXG4gICAgY3JlYXRlV29ya2VycygpIHtcbiAgICAgICAgLy8gUmVzZXQgb2xkIHdvcmtlcnMgKGlmIGFueSkgaWYgd2UgbmVlZCB0byByZS1pbnN0YW50aWF0ZSB3aXRoIG5ldyBleHRlcm5hbCBzY3JpcHRzXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZURhdGFTb3VyY2VTY3JpcHRzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVdvcmtlcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy53b3JrZXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlV29ya2Vycyh0aGlzLmdldFdvcmtlclVybCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgLy8gSW5zdGFudGlhdGUgd29ya2VycyBmcm9tIFVSTCwgaW5pdCBldmVudCBoYW5kbGVyc1xuICAgIG1ha2VXb3JrZXJzKHVybCkge1xuICAgICAgICB2YXIgcXVldWUgPSBbXTtcblxuICAgICAgICB0aGlzLndvcmtlcnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaWQ9MDsgaWQgPCB0aGlzLm51bV93b3JrZXJzOyBpZCsrKSB7XG4gICAgICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlcih1cmwpO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJzW2lkXSA9IHdvcmtlcjtcblxuICAgICAgICAgICAgV29ya2VyQnJva2VyLmFkZFdvcmtlcih3b3JrZXIpO1xuXG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgYFNjZW5lLm1ha2VXb3JrZXJzOiBpbml0aWFsaXppbmcgd29ya2VyICR7aWR9YCk7XG4gICAgICAgICAgICBsZXQgX2lkID0gaWQ7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh3b3JrZXIsICdzZWxmLmluaXQnLCB0aGlzLmlkLCBpZCwgdGhpcy5udW1fd29ya2VycywgdGhpcy5sb2dfbGV2ZWwsIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbykudGhlbihcbiAgICAgICAgICAgICAgICAoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBTY2VuZS5tYWtlV29ya2VyczogaW5pdGlhbGl6ZWQgd29ya2VyICR7aWR9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ2Vycm9yJywgYFNjZW5lLm1ha2VXb3JrZXJzOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSB3b3JrZXIgJHtfaWR9OmAsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmV4dF93b3JrZXIgPSAwO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocXVldWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgbG9nLnNldFdvcmtlcnModGhpcy53b3JrZXJzKTtcblxuICAgICAgICAgICAgLy8gTGV0IFZlcnRleEVsZW1lbnRzIGtub3cgaWYgMzIgYml0IGluZGljZXMgZm9yIGVsZW1lbnQgYXJyYXlzIGFyZSBhdmFpbGFibGVcbiAgICAgICAgICAgIGxldCBVaW50MzJfZmxhZyA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKFwiT0VTX2VsZW1lbnRfaW5kZXhfdWludFwiKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdWZXJ0ZXhFbGVtZW50cy5zZXRVaW50MzJGbGFnJywgVWludDMyX2ZsYWcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkZXN0cm95V29ya2VycygpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy53b3JrZXJzKSkge1xuICAgICAgICAgICAgbG9nLnNldFdvcmtlcnMobnVsbCk7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnMuZm9yRWFjaCgod29ya2VyKSA9PiB7XG4gICAgICAgICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnMgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXNzaWduIHRpbGUgdG8gd29ya2VyIHRocmVhZCBiYXNlZCBvbiBkYXRhIHNvdXJjZVxuICAgIGdldFdvcmtlckZvckRhdGFTb3VyY2Uoc291cmNlKSB7XG4gICAgICAgIGxldCB3b3JrZXI7XG5cbiAgICAgICAgaWYgKHNvdXJjZS50aWxlZCkge1xuICAgICAgICAgICAgLy8gUm91bmQgcm9iaW4gdGlsZWQgc291cmNlcyBhY3Jvc3MgYWxsIHdvcmtlcnNcbiAgICAgICAgICAgIHdvcmtlciA9IHRoaXMud29ya2Vyc1t0aGlzLm5leHRfd29ya2VyXTtcbiAgICAgICAgICAgIHRoaXMubmV4dF93b3JrZXIgPSAodGhpcy5uZXh0X3dvcmtlciArIDEpICUgdGhpcy53b3JrZXJzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFBpbiBhbGwgdGlsZXMgZnJvbSBlYWNoIG5vbi10aWxlZCBzb3VyY2UgdG8gYSBzaW5nbGUgd29ya2VyXG4gICAgICAgICAgICAvLyBQcmV2ZW50cyBkYXRhIGZvciB0aGVzZSBzb3VyY2VzIGZyb20gYmVpbmcgbG9hZGVkIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgICB3b3JrZXIgPSB0aGlzLndvcmtlcnNbc291cmNlLmlkICUgdGhpcy53b3JrZXJzLmxlbmd0aF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd29ya2VyO1xuICAgIH1cblxuICAgIC8vIFNjZW5lIGlzIHJlYWR5IGZvciByZW5kZXJpbmdcbiAgICByZWFkeSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXcucmVhZHkoKSB8fCBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZXNpemUgdGhlIG1hcCB3aGVuIGRldmljZSBwaXhlbCByYXRpbyBjaGFuZ2VzLCBlLmcuIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gZGlzcGxheXNcbiAgICB1cGRhdGVEZXZpY2VQaXhlbFJhdGlvICgpIHtcbiAgICAgICAgaWYgKFV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8oKSkge1xuICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbycsIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbylcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlYnVpbGQoKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlc2l6ZU1hcCh0aGlzLnZpZXcuc2l6ZS5jc3Mud2lkdGgsIHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2l6ZU1hcCh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGlmICh3aWR0aCA9PT0gMCAmJiBoZWlnaHQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXcuc2V0Vmlld3BvcnRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBpZiAodGhpcy5nbCkge1xuICAgICAgICAgICAgQ29udGV4dC5yZXNpemUodGhpcy5nbCwgd2lkdGgsIGhlaWdodCwgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlcXVlc3Qgc2NlbmUgYmUgcmVkcmF3biBhdCBuZXh0IGFuaW1hdGlvbiBsb29wXG4gICAgcmVxdWVzdFJlZHJhdygpIHtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVkcmF3IHNjZW5lIGltbWVkaWF0ZWx5IC0gZG9uJ3Qgd2FpdCBmb3IgYW5pbWF0aW9uIGxvb3BcbiAgICAvLyBVc2Ugc3BhcmluZ2x5LCBidXQgZm9yIGNhc2VzIHdoZXJlIHlvdSBuZWVkIHRoZSBjbG9zZXN0IHBvc3NpYmxlIHN5bmMgd2l0aCBvdGhlciBVSSBlbGVtZW50cyxcbiAgICAvLyBzdWNoIGFzIG90aGVyLCBub24tV2ViR0wgbWFwIGxheWVycyAoZS5nLiBMZWFmbGV0IHJhc3RlciBsYXllcnMsIG1hcmtlcnMsIGV0Yy4pXG4gICAgaW1tZWRpYXRlUmVkcmF3KCkge1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICByZW5kZXJMb29wICgpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUgPSB0cnVlOyAvLyBvbmx5IGxldCB0aGUgcmVuZGVyIGxvb3AgaW5zdGFudGlhdGUgb25jZVxuXG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAvLyBSZW5kZXIgdGhlIHNjZW5lXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVxdWVzdCB0aGUgbmV4dCBmcmFtZSBpZiBub3Qgc2NoZWR1bGVkIHRvIHN0b3BcbiAgICAgICAgaWYgKCF0aGlzLnJlbmRlcl9sb29wX3N0b3ApIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZW5kZXJMb29wLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9zdG9wID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcl9sb29wX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgdGhlIHJlbmRlciBsb29wXG4gICAgc2V0dXBSZW5kZXJMb29wKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVuZGVyX2xvb3BfYWN0aXZlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5yZW5kZXJMb29wKCk7IH0sIDApOyAvLyBkZWxheSBzdGFydCBieSBvbmUgdGlja1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICAvLyBSZW5kZXIgb24gZGVtYW5kXG4gICAgICAgIHZhciB3aWxsX3JlbmRlciA9ICEoXG4gICAgICAgICAgICB0aGlzLmRpcnR5ID09PSBmYWxzZSB8fFxuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9PT0gZmFsc2UgfHxcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmcgPiAwIHx8XG4gICAgICAgICAgICB0aGlzLnJlYWR5KCkgPT09IGZhbHNlXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUHJlLXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5wcmVVcGRhdGUod2lsbF9yZW5kZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmFpbCBpZiBubyBuZWVkIHRvIHJlbmRlclxuICAgICAgICBpZiAoIXdpbGxfcmVuZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlOyAvLyBzdWJjbGFzc2VzIGNhbiBzZXQgdGhpcyBiYWNrIHRvIHRydWUgd2hlbiBhbmltYXRpb24gaXMgbmVlZGVkXG5cbiAgICAgICAgLy8gUmVuZGVyIHRoZSBzY2VuZVxuICAgICAgICB0aGlzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8oKTtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3Q29tcGxldGUoKTsgLy8gZmlyZXMgZXZlbnQgd2hlbiByZW5kZXJlZCB0aWxlIHNldCBvciBzdHlsZSBjaGFuZ2VzXG4gICAgICAgIHRoaXMubWVkaWFfY2FwdHVyZS5jb21wbGV0ZVNjcmVlbnNob3QoKTsgLy8gY29tcGxldGVzIHNjcmVlbnNob3QgY2FwdHVyZSBpZiByZXF1ZXN0ZWRcblxuICAgICAgICAvLyBQb3N0LXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBvc3RVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdFVwZGF0ZSh3aWxsX3JlbmRlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWRyYXcgZXZlcnkgZnJhbWUgaWYgYW5pbWF0aW5nXG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGVkID09PSB0cnVlIHx8IHRoaXMudmlldy5pc0FuaW1hdGluZygpKSB7XG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZnJhbWUrKztcbiAgICAgICAgbG9nKCd0cmFjZScsICdTY2VuZS5yZW5kZXIoKScpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgLy8gVXBkYXRlIHN0eWxlcywgY2FtZXJhLCBsaWdodHNcbiAgICAgICAgdGhpcy52aWV3LnVwZGF0ZSgpO1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmxpZ2h0cykuZm9yRWFjaChpID0+IHRoaXMubGlnaHRzW2ldLnVwZGF0ZSgpKTtcblxuICAgICAgICAvLyBSZW5kZXIgbWFpbiBwYXNzXG4gICAgICAgIHRoaXMucmVuZGVyX2NvdW50ID0gdGhpcy5yZW5kZXJQYXNzKCk7XG5cbiAgICAgICAgLy8gUmVuZGVyIHNlbGVjdGlvbiBwYXNzIChpZiBuZWVkZWQpXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5wZW5kaW5nUmVxdWVzdHMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlldy5wYW5uaW5nIHx8IHRoaXMudmlldy56b29taW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXJQZW5kaW5nUmVxdWVzdHMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmJpbmQoKTsgICAgICAgICAgICAgICAgICAvLyBzd2l0Y2ggdG8gRkJPXG4gICAgICAgICAgICB0aGlzLnJlbmRlclBhc3MoXG4gICAgICAgICAgICAgICAgJ3NlbGVjdGlvbl9wcm9ncmFtJywgICAgICAgICAgICAgICAgLy8gcmVuZGVyIHcvYWx0ZXJuYXRlIHByb2dyYW1cbiAgICAgICAgICAgICAgICB7IGFsbG93X2JsZW5kOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJlYWQoKTsgICAgICAgICAgICAgICAgICAvLyByZWFkIHJlc3VsdHMgZnJvbSBzZWxlY3Rpb24gYnVmZmVyXG5cbiAgICAgICAgICAgIC8vIFJlc2V0IHRvIHNjcmVlbiBidWZmZXJcbiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyX2NvdW50ICE9PSB0aGlzLmxhc3RfcmVuZGVyX2NvdW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcl9jb3VudF9jaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgICAgICAgdGhpcy5nZXRGZWF0dXJlU2VsZWN0aW9uTWFwU2l6ZSgpLnRoZW4oc2l6ZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNpemUpIHsgLy8gcmV0dXJucyB1bmRlZmluZWQgaWYgcHJldmlvdXMgcmVxdWVzdCBwZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgIGxvZygnaW5mbycsIGBTY2VuZTogcmVuZGVyZWQgJHt0aGlzLnJlbmRlcl9jb3VudH0gcHJpbWl0aXZlcyAoJHtzaXplfSBmZWF0dXJlcyBpbiBzZWxlY3Rpb24gbWFwKWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFzdF9yZW5kZXJfY291bnQgPSB0aGlzLnJlbmRlcl9jb3VudDtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgYWxsIGFjdGl2ZSBzdHlsZXMsIGdyb3VwZWQgYnkgYmxlbmQvZGVwdGggdHlwZSAob3BhcXVlLCBvdmVybGF5LCBldGMuKSBhbmQgYnkgcHJvZ3JhbSAoc3R5bGUpXG4gICAgLy8gQ2FsbGVkIGJvdGggZm9yIG1haW4gcmVuZGVyIHBhc3MsIGFuZCBmb3Igc2Vjb25kYXJ5IHBhc3NlcyBsaWtlIHNlbGVjdGlvbiBidWZmZXJcbiAgICByZW5kZXJQYXNzKHByb2dyYW1fa2V5ID0gJ3Byb2dyYW0nLCB7IGFsbG93X2JsZW5kIH0gPSB7fSkge1xuICAgICAgICAvLyBvcHRpb25hbGx5IGZvcmNlIGFscGhhIG9mZiAoZS5nLiBmb3Igc2VsZWN0aW9uIHBhc3MpXG4gICAgICAgIGFsbG93X2JsZW5kID0gKGFsbG93X2JsZW5kID09IG51bGwpID8gdHJ1ZSA6IGFsbG93X2JsZW5kO1xuXG4gICAgICAgIHRoaXMuY2xlYXJGcmFtZSh7IGNsZWFyX2NvbG9yOiB0cnVlLCBjbGVhcl9kZXB0aDogdHJ1ZSB9KTtcblxuICAgICAgICAvLyBTb3J0IHN0eWxlcyBieSBibGVuZCBvcmRlclxuICAgICAgICBsZXQgc3R5bGVzID0gdGhpcy50aWxlX21hbmFnZXIuZ2V0QWN0aXZlU3R5bGVzKCkuXG4gICAgICAgICAgICBtYXAocyA9PiB0aGlzLnN0eWxlc1tzXSkuXG4gICAgICAgICAgICBmaWx0ZXIocyA9PiBzKS4gLy8gZ3VhcmQgYWdhaW5zdCBtaXNzaW5nIHN0eWxlcywgc3VjaCBhcyB3aGlsZSBsb2FkaW5nIGEgbmV3IHNjZW5lXG4gICAgICAgICAgICBzb3J0KFN0eWxlLmJsZW5kT3JkZXJTb3J0KTtcblxuICAgICAgICAvLyBSZW5kZXIgc3R5bGVzXG4gICAgICAgIGxldCBjb3VudCA9IDA7IC8vIGhvdyBtYW55IHByaW1pdGl2ZXMgd2VyZSByZW5kZXJlZFxuICAgICAgICBsZXQgbGFzdF9ibGVuZDtcbiAgICAgICAgZm9yIChsZXQgcz0wOyBzIDwgc3R5bGVzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSBzdHlsZXNbc107XG5cbiAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHJlbmRlciBzdGF0ZSB3aGVuIGJsZW5kIG1vZGUgY2hhbmdlc1xuICAgICAgICAgICAgaWYgKHN0eWxlLmJsZW5kICE9PSBsYXN0X2JsZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSxcbiAgICAgICAgICAgICAgICAgICAgU3R5bGUucmVuZGVyX3N0YXRlc1tzdHlsZS5ibGVuZF0sICAgICAgIC8vIHJlbmRlciBzdGF0ZSBmb3IgYmxlbmQgbW9kZVxuICAgICAgICAgICAgICAgICAgICB7IGJsZW5kOiAoYWxsb3dfYmxlbmQgJiYgc3R5bGUuYmxlbmQpIH0gLy8gZW5hYmxlL2Rpc2FibGUgYmxlbmRpbmcgKGUuZy4gbm8gYmxlbmQgZm9yIHNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UmVuZGVyU3RhdGUoc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY291bnQgKz0gdGhpcy5yZW5kZXJTdHlsZShzdHlsZS5uYW1lLCBwcm9ncmFtX2tleSk7XG4gICAgICAgICAgICBsYXN0X2JsZW5kID0gc3R5bGUuYmxlbmQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuXG4gICAgcmVuZGVyU3R5bGUoc3R5bGVfbmFtZSwgcHJvZ3JhbV9rZXkpIHtcbiAgICAgICAgbGV0IHN0eWxlID0gdGhpcy5zdHlsZXNbc3R5bGVfbmFtZV07XG4gICAgICAgIGxldCBmaXJzdF9mb3Jfc3R5bGUgPSB0cnVlO1xuICAgICAgICBsZXQgcmVuZGVyX2NvdW50ID0gMDtcbiAgICAgICAgbGV0IHByb2dyYW07XG5cbiAgICAgICAgLy8gUmVuZGVyIHRpbGUgR0wgZ2VvbWV0cmllc1xuICAgICAgICBsZXQgcmVuZGVyYWJsZV90aWxlcyA9IHRoaXMudGlsZV9tYW5hZ2VyLmdldFJlbmRlcmFibGVUaWxlcygpO1xuICAgICAgICBmb3IgKGxldCB0PTA7IHQgPCByZW5kZXJhYmxlX3RpbGVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHJlbmRlcmFibGVfdGlsZXNbdF07XG5cbiAgICAgICAgICAgIGlmICh0aWxlLm1lc2hlc1tzdHlsZV9uYW1lXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0eWxlLXNwZWNpZmljIHN0YXRlXG4gICAgICAgICAgICAvLyBPbmx5IHNldHVwIHN0eWxlIGlmIHJlbmRlcmluZyBmb3IgZmlyc3QgdGltZSB0aGlzIGZyYW1lXG4gICAgICAgICAgICAvLyAobGF6eSBpbml0LCBub3QgYWxsIHN0eWxlcyB3aWxsIGJlIHVzZWQgaW4gYWxsIHNjcmVlbiB2aWV3czsgc29tZSBzdHlsZXMgbWlnaHQgYmUgZGVmaW5lZCBidXQgbmV2ZXIgdXNlZClcbiAgICAgICAgICAgIGlmIChmaXJzdF9mb3Jfc3R5bGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBmaXJzdF9mb3Jfc3R5bGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBwcm9ncmFtID0gdGhpcy5zZXR1cFN0eWxlKHN0eWxlLCBwcm9ncmFtX2tleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2tpcCBwcm94eSB0aWxlcyBpZiBuZXcgdGlsZXMgaGF2ZSBmaW5pc2hlZCBsb2FkaW5nIHRoaXMgc3R5bGVcbiAgICAgICAgICAgIGlmICghdGlsZS5zaG91bGRQcm94eUZvclN0eWxlKHN0eWxlX25hbWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsIGBTY2VuZS5yZW5kZXJTdHlsZSgpOiBTa2lwIHByb3h5IHRpbGUgZm9yIHN0eWxlICcke3N0eWxlX25hbWV9JyBgLCB0aWxlLCB0aWxlLnByb3h5X2Zvcik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRpbGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgICAgIHRoaXMudmlldy5zZXR1cFRpbGUodGlsZSwgcHJvZ3JhbSk7XG5cbiAgICAgICAgICAgIC8vIFJlbmRlciB0aWxlXG4gICAgICAgICAgICBsZXQgbWVzaCA9IHRpbGUubWVzaGVzW3N0eWxlX25hbWVdO1xuICAgICAgICAgICAgaWYgKHN0eWxlLnJlbmRlcihtZXNoKSkge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IGluY3VyIGFkZGl0aW9uYWwgcmVuZGVycyB3aGlsZSB2aWV3cG9ydCBpcyBtb3ZpbmdcbiAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnZpZXcucGFubmluZyB8fCB0aGlzLnZpZXcuem9vbWluZykpIHtcbiAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RSZWRyYXcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZW5kZXJfY291bnQgKz0gbWVzaC5nZW9tZXRyeV9jb3VudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZW5kZXJfY291bnQ7XG4gICAgfVxuXG4gICAgc2V0dXBTdHlsZShzdHlsZSwgcHJvZ3JhbV9rZXkpIHtcbiAgICAgICAgLy8gR2V0IHNoYWRlciBwcm9ncmFtIGZyb20gc3R5bGUsIGxhemlseSBjb21waWxpbmcgaWYgbmVjZXNzYXJ5XG4gICAgICAgIGxldCBwcm9ncmFtO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcHJvZ3JhbSA9IHN0eWxlLmdldFByb2dyYW0ocHJvZ3JhbV9rZXkpO1xuICAgICAgICAgICAgaWYgKCFwcm9ncmFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3dhcm5pbmcnLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3N0eWxlcycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGNvbXBpbGluZyBzdHlsZSAke3N0eWxlLm5hbWV9YCxcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzaGFkZXJfZXJyb3JzOiBzdHlsZS5wcm9ncmFtICYmIHN0eWxlLnByb2dyYW0uc2hhZGVyX2Vycm9yc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwcm9ncmFtLnVzZSgpO1xuICAgICAgICBzdHlsZS5zZXR1cCgpO1xuXG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV90aW1lJywgdGhpcy5hbmltYXRlZCA/ICgoKCtuZXcgRGF0ZSgpKSAtIHRoaXMuc3RhcnRfdGltZSkgLyAxMDAwKSA6IDApO1xuICAgICAgICB0aGlzLnZpZXcuc2V0dXBQcm9ncmFtKHByb2dyYW0pO1xuICAgICAgICBmb3IgKGxldCBpIGluIHRoaXMubGlnaHRzKSB7XG4gICAgICAgICAgICB0aGlzLmxpZ2h0c1tpXS5zZXR1cFByb2dyYW0ocHJvZ3JhbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvZ3JhbTtcbiAgICB9XG5cbiAgICBjbGVhckZyYW1lKHsgY2xlYXJfY29sb3IsIGNsZWFyX2RlcHRoIH0gPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHRzXG4gICAgICAgIGNsZWFyX2NvbG9yID0gKGNsZWFyX2NvbG9yID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7IC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBjbGVhcl9kZXB0aCA9IChjbGVhcl9kZXB0aCA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlOyAvLyBkZWZhdWx0IHRydWVcblxuICAgICAgICAvLyBTZXQgR0wgc3RhdGVcbiAgICAgICAgdGhpcy5yZW5kZXJfc3RhdGVzLmRlcHRoX3dyaXRlLnNldCh7IGRlcHRoX3dyaXRlOiBjbGVhcl9kZXB0aCB9KTtcblxuICAgICAgICBsZXQgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBpZiAoY2xlYXJfY29sb3IgfHwgY2xlYXJfZGVwdGgpIHtcbiAgICAgICAgICAgIGxldCBtYXNrID0gKGNsZWFyX2NvbG9yICYmIGdsLkNPTE9SX0JVRkZFUl9CSVQpIHwgKGNsZWFyX2RlcHRoICYmIGdsLkRFUFRIX0JVRkZFUl9CSVQpO1xuICAgICAgICAgICAgZ2wuY2xlYXIobWFzayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRSZW5kZXJTdGF0ZSh7IGRlcHRoX3Rlc3QsIGRlcHRoX3dyaXRlLCBjdWxsX2ZhY2UsIGJsZW5kIH0gPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHRzXG4gICAgICAgIC8vIFRPRE86IHdoZW4gd2UgYWJzdHJhY3Qgb3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHJlbmRlciBwYXNzZXMsIHRoZXNlIGNhbiBiZSBwZXItcGFzcyBjb25maWcgb3B0aW9uc1xuICAgICAgICBsZXQgcmVuZGVyX3N0YXRlcyA9IHRoaXMucmVuZGVyX3N0YXRlcztcbiAgICAgICAgZGVwdGhfdGVzdCA9IChkZXB0aF90ZXN0ID09PSBmYWxzZSkgPyBmYWxzZSA6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuZGVwdGhfdGVzdDsgICAgICAvLyBkZWZhdWx0IHRydWVcbiAgICAgICAgZGVwdGhfd3JpdGUgPSAoZGVwdGhfd3JpdGUgPT09IGZhbHNlKSA/IGZhbHNlIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5kZXB0aF93cml0ZTsgICAvLyBkZWZhdWx0IHRydWVcbiAgICAgICAgY3VsbF9mYWNlID0gKGN1bGxfZmFjZSA9PT0gZmFsc2UpID8gZmFsc2UgOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmN1bGxpbmc7ICAgICAgICAgICAvLyBkZWZhdWx0IHRydWVcbiAgICAgICAgYmxlbmQgPSAoYmxlbmQgIT0gbnVsbCkgPyBibGVuZCA6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuYmxlbmRpbmc7ICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGZhbHNlXG5cbiAgICAgICAgLy8gUmVzZXQgZnJhbWUgc3RhdGVcbiAgICAgICAgbGV0IGdsID0gdGhpcy5nbDtcblxuICAgICAgICByZW5kZXJfc3RhdGVzLmRlcHRoX3Rlc3Quc2V0KHsgZGVwdGhfdGVzdDogZGVwdGhfdGVzdCB9KTtcbiAgICAgICAgcmVuZGVyX3N0YXRlcy5kZXB0aF93cml0ZS5zZXQoeyBkZXB0aF93cml0ZTogZGVwdGhfd3JpdGUgfSk7XG4gICAgICAgIHJlbmRlcl9zdGF0ZXMuY3VsbGluZy5zZXQoeyBjdWxsOiBjdWxsX2ZhY2UsIGZhY2U6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuY3VsbGluZ19mYWNlIH0pO1xuXG4gICAgICAgIC8vIEJsZW5kaW5nIG9mIGFscGhhIGNoYW5uZWwgaXMgbW9kaWZpZWQgdG8gYWNjb3VudCBmb3IgV2ViR0wgYWxwaGEgYmVoYXZpb3IsIHNlZTpcbiAgICAgICAgLy8gaHR0cDovL3dlYmdsZnVuZGFtZW50YWxzLm9yZy93ZWJnbC9sZXNzb25zL3dlYmdsLWFuZC1hbHBoYS5odG1sXG4gICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzExNTMzNDE2XG4gICAgICAgIGlmIChibGVuZCkge1xuICAgICAgICAgICAgLy8gT3BhcXVlOiBhbGwgc291cmNlLCBubyBkZXN0aW5hdGlvblxuICAgICAgICAgICAgaWYgKGJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYmxlbmQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUcmFkaXRpb25hbCBhbHBoYSBibGVuZGluZ1xuICAgICAgICAgICAgZWxzZSBpZiAoYmxlbmQgPT09ICdvdmVybGF5JyB8fCBibGVuZCA9PT0gJ2lubGF5Jykge1xuICAgICAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYmxlbmQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNyYzogZ2wuU1JDX0FMUEhBLCBkc3Q6IGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsXG4gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYTogZ2wuT05FLCBkc3RfYWxwaGE6IGdsLk9ORV9NSU5VU19TUkNfQUxQSEFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFkZGl0aXZlIGJsZW5kaW5nXG4gICAgICAgICAgICBlbHNlIGlmIChibGVuZCA9PT0gJ2FkZCcpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGdsLk9ORSwgZHN0OiBnbC5PTkVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE11bHRpcGxpY2F0aXZlIGJsZW5kaW5nXG4gICAgICAgICAgICBlbHNlIGlmIChibGVuZCA9PT0gJ211bHRpcGx5Jykge1xuICAgICAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYmxlbmQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNyYzogZ2wuWkVSTywgZHN0OiBnbC5TUkNfQ09MT1JcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHsgYmxlbmQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVxdWVzdCBmZWF0dXJlIHNlbGVjdGlvbiBhdCBnaXZlbiBwaXhlbC4gUnVucyBhc3luYyBhbmQgcmV0dXJucyByZXN1bHRzIHZpYSBhIHByb21pc2UuXG4gICAgZ2V0RmVhdHVyZUF0KHBpeGVsKSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIFwiU2NlbmUuZ2V0RmVhdHVyZUF0KCkgY2FsbGVkIGJlZm9yZSBzY2VuZSB3YXMgaW5pdGlhbGl6ZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQb2ludCBzY2FsZWQgdG8gWzAuLjFdIHJhbmdlXG4gICAgICAgIHZhciBwb2ludCA9IHtcbiAgICAgICAgICAgIHg6IHBpeGVsLnggKiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gLyB0aGlzLnZpZXcuc2l6ZS5kZXZpY2Uud2lkdGgsXG4gICAgICAgICAgICB5OiBwaXhlbC55ICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvIC8gdGhpcy52aWV3LnNpemUuZGV2aWNlLmhlaWdodFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlOyAvLyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgc2NlbmUgcmUtcmVuZGVycyBmb3IgdGhlc2UgdG8gYmUgcHJvY2Vzc2VkXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5nZXRGZWF0dXJlQXQocG9pbnQpLlxuICAgICAgICAgICAgdGhlbihzZWxlY3Rpb24gPT4gT2JqZWN0LmFzc2lnbihzZWxlY3Rpb24sIHsgcGl4ZWwgfSkpLlxuICAgICAgICAgICAgY2F0Y2goZXJyb3IgPT4gUHJvbWlzZS5yZXNvbHZlKHsgZXJyb3IgfSkpO1xuICAgIH1cblxuICAgIC8vIFJlYnVpbGQgZ2VvbWV0cnksIHdpdGhvdXQgcmUtcGFyc2luZyB0aGUgY29uZmlnIG9yIHJlLWNvbXBpbGluZyBzdHlsZXNcbiAgICAvLyBUT0RPOiBkZXRlY3Qgd2hpY2ggZWxlbWVudHMgbmVlZCB0byBiZSByZWZyZXNoZWQvcmVidWlsdCAoc3R5bGVzaGVldCBjaGFuZ2VzLCBldGMuKVxuICAgIHJlYnVpbGQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWJ1aWxkR2VvbWV0cnkob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gUmVidWlsZCBhbGwgdGlsZXNcbiAgICAvLyBzeW5jOiBib29sZWFuIG9mIHdoZXRoZXIgdG8gc3luYyB0aGUgY29uZmlnIG9iamVjdCB0byB0aGUgd29ya2VyXG4gICAgLy8gc291cmNlczogb3B0aW9uYWwgYXJyYXkgb2YgZGF0YSBzb3VyY2VzIHRvIHNlbGVjdGl2ZWx5IHJlYnVpbGQgKGJ5IGRlZmF1bHQgYWxsIG91ciByZWJ1aWx0KVxuICAgIHJlYnVpbGRHZW9tZXRyeSh7IHN5bmMgPSB0cnVlLCBzb3VyY2VzID0gbnVsbCwgc2VyaWFsaXplX2Z1bmNzLCBwcm9maWxlID0gZmFsc2UsIGZhZGVfaW4gPSBmYWxzZSB9ID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFNraXAgcmVidWlsZCBpZiBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgICAgICAgICBpZiAodGhpcy5idWlsZGluZykge1xuICAgICAgICAgICAgICAgIC8vIFF1ZXVlIHVwIHRvIG9uZSByZWJ1aWxkIGNhbGwgYXQgYSB0aW1lLCBvbmx5IHNhdmUgbGFzdCByZXF1ZXN0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmcucXVldWVkICYmIHRoaXMuYnVpbGRpbmcucXVldWVkLnJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgcHJldmlvdXMgcmVxdWVzdCB0aGF0IGl0IGRpZCBub3QgY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsICdTY2VuZS5yZWJ1aWxkOiByZXF1ZXN0IHN1cGVyY2VkZWQgYnkgYSBuZXdlciBjYWxsJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcucXVldWVkLnJlc29sdmUoZmFsc2UpOyAvLyBmYWxzZSBmbGFnIGluZGljYXRlcyByZWJ1aWxkIHJlcXVlc3Qgd2FzIHN1cGVyY2VkZWRcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTYXZlIHF1ZXVlZCByZXF1ZXN0XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZGluZy5xdWV1ZWQgPSB7IHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU2NlbmUucmVidWlsZCgpOiBxdWV1aW5nIHJlcXVlc3RgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHRpbGUgYnVpbGQgc3RhdGVcbiAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcgPSB7IHJlc29sdmUsIHJlamVjdCB9O1xuXG4gICAgICAgICAgICAvLyBQcm9maWxpbmdcbiAgICAgICAgICAgIGlmIChwcm9maWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZmlsZSgnU2NlbmUucmVidWlsZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgY29uZmlnIChpbiBjYXNlIEpTIG9iamVjdHMgd2VyZSBtYW5pcHVsYXRlZCBkaXJlY3RseSlcbiAgICAgICAgICAgIGlmIChzeW5jKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jQ29uZmlnVG9Xb3JrZXIoeyBzZXJpYWxpemVfZnVuY3MgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlc2V0RmVhdHVyZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5yZXNldFRpbWUoKTtcblxuICAgICAgICAgICAgLy8gUmVidWlsZCB2aXNpYmxlIHRpbGVzXG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5wcnVuZVRvVmlzaWJsZVRpbGVzKCk7XG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5mb3JFYWNoVGlsZSh0aWxlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZXMgfHwgc291cmNlcy5pbmRleE9mKHRpbGUuc291cmNlLm5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuYnVpbGRUaWxlKHRpbGUsIHsgZmFkZV9pbiB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLnVwZGF0ZVRpbGVzRm9yVmlldygpOyAvLyBwaWNrcyB1cCBhZGRpdGlvbmFsIHRpbGVzIGZvciBhbnkgbmV3L2NoYW5nZWQgZGF0YSBzb3VyY2VzXG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5jaGVja0J1aWxkUXVldWUoKTsgICAgLy8gcmVzb2x2ZSBpbW1lZGlhdGVseSBpZiBubyB0aWxlcyB0byBidWlsZFxuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFByb2ZpbGluZ1xuICAgICAgICAgICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9maWxlRW5kKCdTY2VuZS5yZWJ1aWxkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRpbGUgbWFuYWdlciBmaW5pc2hlZCBidWlsZGluZyB0aWxlc1xuICAgIC8vIFRPRE8gbW92ZSB0byB0aWxlIG1hbmFnZXJcbiAgICB0aWxlTWFuYWdlckJ1aWxkRG9uZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmcpIHtcbiAgICAgICAgICAgIGxvZygnaW5mbycsIGBTY2VuZTogYnVpbGQgZ2VvbWV0cnkgZmluaXNoZWRgKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nLnJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkaW5nLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFub3RoZXIgcmVidWlsZCBxdWV1ZWQ/XG4gICAgICAgICAgICB2YXIgcXVldWVkID0gdGhpcy5idWlsZGluZy5xdWV1ZWQ7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkaW5nID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChxdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYFNjZW5lOiBzdGFydGluZyBxdWV1ZWQgcmVidWlsZCgpIHJlcXVlc3RgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGQoKS50aGVuKHF1ZXVlZC5yZXNvbHZlLCBxdWV1ZWQucmVqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAgIExvYWQgKG9yIHJlbG9hZCkgdGhlIHNjZW5lIGNvbmZpZ1xuICAgICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICAgKi9cbiAgICBsb2FkU2NlbmUoY29uZmlnX3NvdXJjZSA9IG51bGwsIGNvbmZpZ19wYXRoID0gbnVsbCkge1xuICAgICAgICB0aGlzLmNvbmZpZ19zb3VyY2UgPSBjb25maWdfc291cmNlIHx8IHRoaXMuY29uZmlnX3NvdXJjZTtcbiAgICAgICAgdGhpcy5jb25maWdfZ2xvYmFsc19hcHBsaWVkID0gW107XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZ19zb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ19wYXRoID0gVVJMcy5wYXRoRm9yVVJMKGNvbmZpZ19wYXRoIHx8IHRoaXMuY29uZmlnX3NvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ19wYXRoID0gVVJMcy5wYXRoRm9yVVJMKGNvbmZpZ19wYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBTY2VuZUxvYWRlci5sb2FkU2NlbmUodGhpcy5jb25maWdfc291cmNlLCB0aGlzLmNvbmZpZ19wYXRoKS50aGVuKCh7Y29uZmlnLCBidW5kbGV9KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX2J1bmRsZSA9IGJ1bmRsZTtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignbG9hZCcsIHsgY29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHNvdXJjZSB0byBhIHNjZW5lLCBhcmd1bWVudHMgYG5hbWVgIGFuZCBgY29uZmlnYCBuZWVkIHRvIGJlIHByb3ZpZGVkOlxuICAgIC8vICAtIElmIHRoZSBuYW1lIGRvZXNuJ3QgbWF0Y2ggYSBzb3VyY2VzIGl0IHdpbGwgY3JlYXRlIGl0XG4gICAgLy8gIC0gdGhlIGBjb25maWdgIG9iaiBmb2xsb3cgdGhlIFlBTUwgc2NlbmUgc3BlYywgZXg6IGBgYHt0eXBlOiAnVG9wb0pTT04nLCB1cmw6IFwiLy92ZWN0b3IubWFwemVuLmNvbS9vc20vYWxsL3t6fS97eH0ve3l9LnRvcG9qc29uXCJdfWBgYFxuICAgIC8vICAgIHRoYXQgbG9va3MgbGlrZTpcbiAgICAvL1xuICAgIC8vICAgICAgc2NlbmUuc2V0RGF0YVNvdXJjZShcIm9zbVwiLCB7dHlwZTogJ1RvcG9KU09OJywgdXJsOiBcIi8vdmVjdG9yLm1hcHplbi5jb20vb3NtL2FsbC97en0ve3h9L3t5fS50b3BvanNvblwiIH0pO1xuICAgIC8vXG4gICAgLy8gIC0gYWxzbyBjYW4gYmUgcGFzcyBhIGBgYGRhdGFgYGAgb2JqOiBgYGB7dHlwZTogJ0dlb0pTT04nLCBkYXRhOiBKU09iaiBdfWBgYFxuICAgIC8vXG4gICAgLy8gICAgICB2YXIgZ2VvanNvbl9kYXRhID0ge307XG4gICAgLy8gICAgICAuLi5cbiAgICAvLyAgICAgIHNjZW5lLnNldERhdGFTb3VyY2UoXCJkeW5hbWljX2RhdGFcIiwge3R5cGU6ICdHZW9KU09OJywgZGF0YTogZ2VvanNvbl9kYXRhIH0pO1xuICAgIC8vXG4gICAgc2V0RGF0YVNvdXJjZSAobmFtZSwgY29uZmlnKSB7XG4gICAgICAgIGlmICghbmFtZSB8fCAhY29uZmlnIHx8ICFjb25maWcudHlwZSB8fCAoIWNvbmZpZy51cmwgJiYgIWNvbmZpZy5kYXRhKSkge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIFwiTm8gbmFtZSBwcm92aWRlZCBvciBub3QgYSB2YWxpZCBjb25maWc6XCIsIG5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9hZCA9ICh0aGlzLmNvbmZpZy5zb3VyY2VzW25hbWVdID09IG51bGwpO1xuICAgICAgICBsZXQgc291cmNlID0gdGhpcy5jb25maWcuc291cmNlc1tuYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZyk7XG5cbiAgICAgICAgLy8gQ29udmVydCByYXcgZGF0YSBpbnRvIGJsb2IgVVJMXG4gICAgICAgIGlmIChzb3VyY2UuZGF0YSAmJiB0eXBlb2Ygc291cmNlLmRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzb3VyY2UudXJsID0gVVJMcy5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHNvdXJjZS5kYXRhKV0pKTtcbiAgICAgICAgICAgIGRlbGV0ZSBzb3VyY2UuZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgcGF0aHMgcmVsYXRpdmUgdG8gcm9vdCBzY2VuZSBidW5kbGVcbiAgICAgICAgU2NlbmVMb2FkZXIubm9ybWFsaXplRGF0YVNvdXJjZShzb3VyY2UsIHRoaXMuY29uZmlnX2J1bmRsZSk7XG5cbiAgICAgICAgaWYgKGxvYWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNvbmZpZyh7IHJlYnVpbGQ6IHsgc291cmNlczogW25hbWVdIH0gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWJ1aWxkKHsgc291cmNlczogW25hbWVdIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlRGF0YVNvdXJjZXMoKSB7XG4gICAgICAgIGxldCByZXNldCA9IFtdOyAvLyBzb3VyY2VzIHRvIHJlc2V0XG4gICAgICAgIGxldCBwcmV2X3NvdXJjZV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlcyk7XG4gICAgICAgIGxldCBzb3VyY2VfaWQgPSAwO1xuXG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcy5jb25maWcuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuY29uZmlnLnNvdXJjZXNbbmFtZV07XG4gICAgICAgICAgICBsZXQgcHJldl9zb3VyY2UgPSB0aGlzLnNvdXJjZXNbbmFtZV07XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZSwgeyBuYW1lLCBpZDogc291cmNlX2lkKysgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VzW25hbWVdID0gRGF0YVNvdXJjZS5jcmVhdGUoY29uZmlnLCB0aGlzLnNvdXJjZXMpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zb3VyY2VzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zb3VyY2VzW25hbWVdO1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYENvdWxkIG5vdCBjcmVhdGUgZGF0YSBzb3VyY2U6ICR7ZS5tZXNzYWdlfWA7XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFNjZW5lOiAke21lc3NhZ2V9YCwgc291cmNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3dhcm5pbmcnLCB7IHR5cGU6ICdzb3VyY2VzJywgc291cmNlLCBtZXNzYWdlIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEYXRhIHNvdXJjZSBjaGFuZ2VkP1xuICAgICAgICAgICAgaWYgKERhdGFTb3VyY2UuY2hhbmdlZCh0aGlzLnNvdXJjZXNbbmFtZV0sIHByZXZfc291cmNlKSkge1xuICAgICAgICAgICAgICAgIHJlc2V0LnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3VyY2VzIHRoYXQgd2VyZSByZW1vdmVkXG4gICAgICAgIHByZXZfc291cmNlX25hbWVzLmZvckVhY2gocyA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnNvdXJjZXNbc10pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zb3VyY2VzW3NdOyAvLyBUT0RPOiByZW1vdmUgZnJvbSB3b3JrZXJzIHRvbz9cbiAgICAgICAgICAgICAgICByZXNldC5wdXNoKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZW1vdmUgdGlsZXMgZnJvbSBzb3VyY2VzIHRoYXQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgIGlmIChyZXNldC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5yZW1vdmVUaWxlcyh0aWxlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJlc2V0LmluZGV4T2YodGlsZS5zb3VyY2UubmFtZSkgPiAtMSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgc291cmNlcyB0aGF0IHdpbGwgZ2VuZXJhdGUgZ2VvbWV0cnkgdGlsZXNcbiAgICAgICAgLy8gKGFsbCBleGNlcHQgdGhvc2UgdGhhdCBhcmUgb25seSByYXN0ZXIgc291cmNlcyBhdHRhY2hlZCB0byBvdGhlciBzb3VyY2VzKVxuICAgICAgICBmb3IgKGxldCBsbiBpbiB0aGlzLmNvbmZpZy5sYXllcnMpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IHRoaXMuY29uZmlnLmxheWVyc1tsbl07XG4gICAgICAgICAgICBpZiAobGF5ZXIuZGF0YSAmJiB0aGlzLnNvdXJjZXNbbGF5ZXIuZGF0YS5zb3VyY2VdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VzW2xheWVyLmRhdGEuc291cmNlXS5idWlsZHNfZ2VvbWV0cnlfdGlsZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9hZCBhbGwgdGV4dHVyZXMgaW4gdGhlIHNjZW5lIGRlZmluaXRpb25cbiAgICBsb2FkVGV4dHVyZXMoKSB7XG4gICAgICAgIHJldHVybiBUZXh0dXJlLmNyZWF0ZUZyb21PYmplY3QodGhpcy5nbCwgdGhpcy5jb25maWcudGV4dHVyZXMpLlxuICAgICAgICAgICAgdGhlbigoKSA9PiBUZXh0dXJlLmNyZWF0ZURlZmF1bHQodGhpcy5nbCkpOyAvLyBjcmVhdGUgYSAnZGVmYXVsdCcgdGV4dHVyZSBmb3IgcGxhY2Vob2xkZXJzXG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIChjdXJyZW50bHkgbWFudWFsbHkpIGFmdGVyIHN0eWxlcyBhcmUgdXBkYXRlZCBpbiBzdHlsZXNoZWV0XG4gICAgdXBkYXRlU3R5bGVzKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQgJiYgIXRoaXMuaW5pdGlhbGl6aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NjZW5lLnVwZGF0ZVN0eWxlcygpIGNhbGxlZCBiZWZvcmUgc2NlbmUgd2FzIGluaXRpYWxpemVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAoUmUpYnVpbGQgc3R5bGVzIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuc3R5bGVzID0gdGhpcy5zdHlsZV9tYW5hZ2VyLmJ1aWxkKHRoaXMuY29uZmlnLnN0eWxlcyk7XG4gICAgICAgIHRoaXMuc3R5bGVfbWFuYWdlci5pbml0U3R5bGVzKHRoaXMpO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsbHkgc2V0IEdMIGNvbnRleHQgKHVzZWQgd2hlbiBpbml0aWFsaXppbmcgb3IgcmUtaW5pdGlhbGl6aW5nIEdMIHJlc291cmNlcylcbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzW3N0eWxlXS5zZXRHTCh0aGlzLmdsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBleHBsaWNpdGx5IHNldCBzY2VuZSBhbmltYXRpb24gZmxhZyBpZiBkZWZpbmVkLCBvdGhlcndpc2UgdHVybiBvbiBhbmltYXRpb24gaWYgdGhlcmUgYXJlIGFueSBhbmltYXRlZCBzdHlsZXNcbiAgICAgICAgdGhpcy5hbmltYXRlZCA9XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zY2VuZS5hbmltYXRlZCAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zY2VuZS5hbmltYXRlZCA6XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdHlsZXMpLnNvbWUocyA9PiB0aGlzLnN0eWxlc1tzXS5hbmltYXRlZCk7XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGFjdGl2ZSBjYW1lcmEgLSBmb3IgcHVibGljIEFQSVxuICAgIGdldEFjdGl2ZUNhbWVyYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRBY3RpdmVDYW1lcmEoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgYWN0aXZlIGNhbWVyYSAtIGZvciBwdWJsaWMgQVBJXG4gICAgc2V0QWN0aXZlQ2FtZXJhKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5zZXRBY3RpdmVDYW1lcmEobmFtZSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGxpZ2h0aW5nXG4gICAgY3JlYXRlTGlnaHRzKCkge1xuICAgICAgICB0aGlzLmxpZ2h0cyA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpIGluIHRoaXMuY29uZmlnLmxpZ2h0cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5saWdodHNbaV0gfHwgdHlwZW9mIHRoaXMuY29uZmlnLmxpZ2h0c1tpXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBsaWdodCA9IHRoaXMuY29uZmlnLmxpZ2h0c1tpXTtcbiAgICAgICAgICAgIGxpZ2h0Lm5hbWUgPSBpLnJlcGxhY2UoJy0nLCAnXycpOyAvLyBsaWdodCBuYW1lcyBhcmUgaW5qZWN0ZWQgaW4gc2hhZGVycywgY2FuJ3QgaGF2ZSBoeXBoZW5zXG4gICAgICAgICAgICBsaWdodC52aXNpYmxlID0gKGxpZ2h0LnZpc2libGUgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgICAgIGlmIChsaWdodC52aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saWdodHNbbGlnaHQubmFtZV0gPSBMaWdodC5jcmVhdGUodGhpcy52aWV3LCBsaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgTGlnaHQuaW5qZWN0KHRoaXMubGlnaHRzKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgYmFja2dyb3VuZCBjb2xvclxuICAgIHNldEJhY2tncm91bmQoKSB7XG4gICAgICAgIGxldCBiZyA9IHRoaXMuY29uZmlnLnNjZW5lLmJhY2tncm91bmQ7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHt9O1xuICAgICAgICBpZiAoYmcgJiYgYmcuY29sb3IpIHtcbiAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZC5jb2xvciA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoYmcuY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5iYWNrZ3JvdW5kLmNvbG9yKSB7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmQuY29sb3IgPSBbMCwgMCwgMCwgMF07IC8vIGRlZmF1bHQgYmFja2dyb3VuZCBUT0RPOiB2YXJ5IHcvc2NlbmUgYWxwaGFcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGJhY2tncm91bmQgaXMgZnVsbHkgb3BhcXVlLCBzZXQgY2FudmFzIGJhY2tncm91bmQgdG8gbWF0Y2hcbiAgICAgICAgaWYgKHRoaXMuYmFja2dyb3VuZC5jb2xvclszXSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUuYmFja2dyb3VuZENvbG9yID1cbiAgICAgICAgICAgICAgICBgcmdiYSgke3RoaXMuYmFja2dyb3VuZC5jb2xvci5tYXAoYyA9PiBNYXRoLmZsb29yKGMgKiAyNTUpKS5qb2luKCcsICcpfSlgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2wuY2xlYXJDb2xvciguLi50aGlzLmJhY2tncm91bmQuY29sb3IpO1xuICAgIH1cblxuICAgIC8vIFR1cm4gaW50cm9zcGVjdGlvbiBtb2RlIG9uL29mZlxuICAgIHNldEludHJvc3BlY3Rpb24gKHZhbCkge1xuICAgICAgICB0aGlzLmludHJvc3BlY3Rpb24gPSB2YWwgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRpbmcrKztcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ29uZmlnKCkudGhlbigoKSA9PiB0aGlzLnVwZGF0aW5nLS0pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzY2VuZSBjb25maWcsIGFuZCBvcHRpb25hbGx5IHJlYnVpbGQgZ2VvbWV0cnlcbiAgICAvLyByZWJ1aWxkIGNhbiBiZSBib29sZWFuLCBvciBhbiBvYmplY3QgY29udGFpbmluZyByZWJ1aWxkIG9wdGlvbnMgdG8gcGFzc3Rocm91Z2hcbiAgICB1cGRhdGVDb25maWcoeyByZWJ1aWxkID0gdHJ1ZSwgc2VyaWFsaXplX2Z1bmNzLCBmYWRlX2luID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9ICsrU2NlbmUuZ2VuZXJhdGlvbjtcbiAgICAgICAgdGhpcy51cGRhdGluZysrO1xuXG4gICAgICAgIHRoaXMuY29uZmlnID0gU2NlbmVMb2FkZXIuYXBwbHlHbG9iYWxQcm9wZXJ0aWVzKHRoaXMuY29uZmlnLCB0aGlzLmNvbmZpZ19nbG9iYWxzX2FwcGxpZWQpO1xuICAgICAgICBTY2VuZUxvYWRlci5ob2lzdFRleHR1cmVzKHRoaXMuY29uZmlnKTsgLy8gbW92ZSBpbmxpbmUgdGV4dHVyZXMgaW50byBnbG9iYWwgdGV4dHVyZSBzZXRcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyLmluaXQoKTtcbiAgICAgICAgdGhpcy52aWV3LnJlc2V0KCk7XG4gICAgICAgIHRoaXMuY3JlYXRlTGlnaHRzKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlRGF0YVNvdXJjZXMoKTtcbiAgICAgICAgdGhpcy5sb2FkVGV4dHVyZXMoKTtcbiAgICAgICAgdGhpcy5zZXRCYWNrZ3JvdW5kKCk7XG4gICAgICAgIEZvbnRNYW5hZ2VyLmxvYWRGb250cyh0aGlzLmNvbmZpZy5mb250cyk7XG5cbiAgICAgICAgLy8gVE9ETzogZGV0ZWN0IGNoYW5nZXMgdG8gc3R5bGVzPyBhbHJlYWR5IChjdXJyZW50bHkpIG5lZWQgdG8gcmVjb21waWxlIGFueXdheSB3aGVuIGNhbWVyYSBvciBsaWdodHMgY2hhbmdlXG4gICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKCk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWxseSByZWJ1aWxkIGdlb21ldHJ5XG4gICAgICAgIGxldCBkb25lID0gcmVidWlsZCA/XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGQoT2JqZWN0LmFzc2lnbih7IHNlcmlhbGl6ZV9mdW5jcywgZmFkZV9pbiB9LCB0eXBlb2YgcmVidWlsZCA9PT0gJ29iamVjdCcgJiYgcmVidWlsZCkpIDpcbiAgICAgICAgICAgIHRoaXMuc3luY0NvbmZpZ1RvV29ya2VyKHsgc2VyaWFsaXplX2Z1bmNzIH0pOyAvLyByZWJ1aWxkKCkgYWxzbyBzeW5jcyBjb25maWdcblxuICAgICAgICAvLyBGaW5pc2ggYnkgdXBkYXRpbmcgYm91bmRzIGFuZCByZS1yZW5kZXJpbmdcbiAgICAgICAgdGhpcy51cGRhdGluZy0tO1xuICAgICAgICB0aGlzLnZpZXcudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuXG4gICAgICAgIHJldHVybiBkb25lO1xuICAgIH1cblxuICAgIC8vIFNlcmlhbGl6ZSBjb25maWcgYW5kIHNlbmQgdG8gd29ya2VyXG4gICAgc3luY0NvbmZpZ1RvV29ya2VyKHsgc2VyaWFsaXplX2Z1bmNzID0gdHJ1ZSB9ID0ge30pIHtcbiAgICAgICAgLy8gVGVsbCB3b3JrZXJzIHdlJ3JlIGFib3V0IHRvIHJlYnVpbGQgKHNvIHRoZXkgY2FuIHVwZGF0ZSBzdHlsZXMsIGV0Yy4pXG4gICAgICAgIHRoaXMuY29uZmlnX3NlcmlhbGl6ZWQgPVxuICAgICAgICAgICAgc2VyaWFsaXplX2Z1bmNzID8gVXRpbHMuc2VyaWFsaXplV2l0aEZ1bmN0aW9ucyh0aGlzLmNvbmZpZykgOiBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZyk7XG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi51cGRhdGVDb25maWcnLCB7XG4gICAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnX3NlcmlhbGl6ZWQsXG4gICAgICAgICAgICBnZW5lcmF0aW9uOiB0aGlzLmdlbmVyYXRpb24sXG4gICAgICAgICAgICBpbnRyb3NwZWN0aW9uOiB0aGlzLmludHJvc3BlY3Rpb25cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIHRvIHJlbGF0ZWQgb2JqZWN0c1xuICAgIGNyZWF0ZUxpc3RlbmVycyAoKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0ge307XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMudmlldyA9IHtcbiAgICAgICAgICAgIG1vdmU6ICgpID0+IHRoaXMudHJpZ2dlcignbW92ZScpXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudmlldy5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudmlldyk7XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMudGV4dHVyZSA9IHtcbiAgICAgICAgICAgIHVwZGF0ZTogKCkgPT4gdGhpcy5kaXJ0eSA9IHRydWUsXG4gICAgICAgICAgICB3YXJuaW5nOiAoZGF0YSkgPT4gdGhpcy50cmlnZ2VyKCd3YXJuaW5nJywgT2JqZWN0LmFzc2lnbih7IHR5cGU6ICd0ZXh0dXJlcycgfSwgZGF0YSkpXG4gICAgICAgIH07XG4gICAgICAgIFRleHR1cmUuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnRleHR1cmUpO1xuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnNjZW5lX2xvYWRlciA9IHtcbiAgICAgICAgICAgIGVycm9yOiAoZGF0YSkgPT4gdGhpcy50cmlnZ2VyKCdlcnJvcicsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiAnc2NlbmUnIH0sIGRhdGEpKVxuICAgICAgICB9O1xuICAgICAgICBTY2VuZUxvYWRlci5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMuc2NlbmVfbG9hZGVyKTtcbiAgICB9XG5cbiAgICBkZXN0cm95TGlzdGVuZXJzICgpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZUFsbCgpO1xuICAgICAgICB0aGlzLnZpZXcudW5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudmlldyk7XG4gICAgICAgIFRleHR1cmUudW5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudGV4dHVyZSk7XG4gICAgICAgIFNjZW5lTG9hZGVyLnVuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnNjZW5lX2xvYWRlcik7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXNldEZlYXR1cmVTZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IEZlYXR1cmVTZWxlY3Rpb24odGhpcy5nbCwgdGhpcy53b3JrZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLndvcmtlcnMpIHtcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnJlc2V0RmVhdHVyZVNlbGVjdGlvbicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0cyB0aGUgY3VycmVudCBmZWF0dXJlIHNlbGVjdGlvbiBtYXAgc2l6ZSBhY3Jvc3MgYWxsIHdvcmtlcnMuIFJldHVybnMgYSBwcm9taXNlLlxuICAgIGdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5mZXRjaGluZ19zZWxlY3Rpb25fbWFwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIHJldHVybiB1bmRlZmluZWQgaWYgYWxyZWFkeSBwZW5kaW5nXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mZXRjaGluZ19zZWxlY3Rpb25fbWFwID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYuZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUnKVxuICAgICAgICAgICAgLnRoZW4oc2l6ZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hpbmdfc2VsZWN0aW9uX21hcCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBzaXplcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGludGVybmFsIGNsb2NrLCBtb3N0bHkgdXNlZnVsIGZvciBjb25zaXN0ZW50IGV4cGVyaWVuY2Ugd2hlbiBjaGFuZ2luZyBzdHlsZXMvZGVidWdnaW5nXG4gICAgcmVzZXRUaW1lKCkge1xuICAgICAgICB0aGlzLnN0YXJ0X3RpbWUgPSArbmV3IERhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBGaXJlcyBldmVudCB3aGVuIHJlbmRlcmVkIHRpbGUgc2V0IG9yIHN0eWxlIGNoYW5nZXNcbiAgICB1cGRhdGVWaWV3Q29tcGxldGUgKCkge1xuICAgICAgICBpZiAoKHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgfHwgdGhpcy5nZW5lcmF0aW9uICE9PSB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbikgJiZcbiAgICAgICAgICAgICF0aGlzLnRpbGVfbWFuYWdlci5pc0xvYWRpbmdWaXNpYmxlVGlsZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSB0aGlzLmdlbmVyYXRpb247XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3ZpZXdfY29tcGxldGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Vmlld0NvbXBsZXRlICgpIHtcbiAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFRha2UgYSBzY3JlZW5zaG90XG4gICAgLy8gQXN5bmNocm9ub3VzIGJlY2F1c2Ugd2UgaGF2ZSB0byB3YWl0IGZvciBuZXh0IHJlbmRlciB0byBjYXB0dXJlIGJ1ZmZlclxuICAgIC8vIFJldHVybnMgYSBwcm9taXNlXG4gICAgc2NyZWVuc2hvdCAoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZWRpYV9jYXB0dXJlLnNjcmVlbnNob3QoKTtcbiAgICB9XG5cbiAgICBzdGFydFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZWRpYV9jYXB0dXJlLnN0YXJ0VmlkZW9DYXB0dXJlKCk7XG4gICAgfVxuXG4gICAgc3RvcFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lZGlhX2NhcHR1cmUuc3RvcFZpZGVvQ2FwdHVyZSgpO1xuICAgIH1cblxuXG4gICAgLy8gU3RhdHMvZGVidWcvcHJvZmlsaW5nIG1ldGhvZHNcblxuICAgIC8vIFByb2ZpbGUgaGVscGVycywgaXNzdWVzIGEgcHJvZmlsZSBvbiBtYWluIHRocmVhZCAmIGFsbCB3b3JrZXJzXG4gICAgX3Byb2ZpbGUobmFtZSkge1xuICAgICAgICBjb25zb2xlLnByb2ZpbGUoYG1haW4gdGhyZWFkOiAke25hbWV9YCk7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnByb2ZpbGUnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBfcHJvZmlsZUVuZChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZUVuZChgbWFpbiB0aHJlYWQ6ICR7bmFtZX1gKTtcbiAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYucHJvZmlsZUVuZCcsIG5hbWUpO1xuICAgIH1cblxuICAgIC8vIERlYnVnIGNvbmZpZyBhbmQgZnVuY3Rpb25zXG4gICAgc2V0dXBEZWJ1ZyAoKSB7XG4gICAgICAgIGxldCBzY2VuZSA9IHRoaXM7XG4gICAgICAgIHRoaXMuZGVidWcgPSB7XG4gICAgICAgICAgICAvLyBSZWJ1aWxkIGdlb21ldHJ5IGEgZ2l2ZW4gIyBvZiB0aW1lcyBhbmQgcHJpbnQgYXZlcmFnZSwgbWluLCBtYXggdGltaW5nc1xuICAgICAgICAgICAgdGltZVJlYnVpbGQgKG51bSA9IDEsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgICAgIGxldCB0aW1lcyA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBjeWNsZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHNjZW5lLnJlYnVpbGQob3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lcy5wdXNoKCtuZXcgRGF0ZSgpIC0gc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZXMubGVuZ3RoIDwgbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdmcgPSB+fih0aW1lcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKSAvIHRpbWVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdpbmZvJywgYFByb2ZpbGVkIHJlYnVpbGQgJHtudW19IHRpbWVzOiAke2F2Z30gYXZnICgke01hdGgubWluKC4uLnRpbWVzKX0gbWluLCAke01hdGgubWF4KC4uLnRpbWVzKX0gbWF4KWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGN5Y2xlKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBSZXR1cm4gZ2VvbWV0cnkgY291bnRzIG9mIHZpc2libGUgdGlsZXMsIGdyb3VwZWQgYnkgc3R5bGUgbmFtZVxuICAgICAgICAgICAgZ2VvbWV0cnlDb3VudEJ5U3R5bGUgKCkge1xuICAgICAgICAgICAgICAgIGxldCBjb3VudHMgPSB7fTtcbiAgICAgICAgICAgICAgICBzY2VuZS50aWxlX21hbmFnZXIuZ2V0UmVuZGVyYWJsZVRpbGVzKCkuZm9yRWFjaCh0aWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGlsZS5tZXNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1tzdHlsZV0gPSBjb3VudHNbc3R5bGVdIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbc3R5bGVdICs9IHRpbGUubWVzaGVzW3N0eWxlXS5nZW9tZXRyeV9jb3VudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHM7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZW9tZXRyeUNvdW50QnlCYXNlU3R5bGUgKCkge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZV9jb3VudHMgPSBzY2VuZS5kZWJ1Zy5nZW9tZXRyeUNvdW50QnlTdHlsZSgpO1xuICAgICAgICAgICAgICAgIGxldCBjb3VudHMgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiBzdHlsZV9jb3VudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2UgPSBzY2VuZS5zdHlsZXNbc3R5bGVdLmJhc2VTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb3VudHNbYmFzZV0gPSBjb3VudHNbYmFzZV0gfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRzW2Jhc2VdICs9IHN0eWxlX2NvdW50c1tzdHlsZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG59XG5cblNjZW5lLmlkID0gMDsgICAgICAgICAvLyB1bmlxdWUgaWQgZm9yIGEgc2NlbmUgaW5zdGFuY2VcblNjZW5lLmdlbmVyYXRpb24gPSAwOyAvLyBpZCB0aGF0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIHNjZW5lIGNvbmZpZyBpcyByZS1wYXJzZWRcbiIsImltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCAqIGFzIFVSTHMgZnJvbSAnLi91dGlscy91cmxzJztcblxuaW1wb3J0IEpTWmlwIGZyb20gJ2pzemlwJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5leHBvcnQgY2xhc3MgU2NlbmVCdW5kbGUge1xuXG4gICAgY29uc3RydWN0b3IodXJsLCBwYXRoLCBwYXJlbnQgPSBudWxsKSB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuXG4gICAgICAgIC8vIElmIGEgYmFzZSBwYXRoIHdhcyBwcm92aWRlZCwgdXNlIGl0IGZvciByZXNvbHZpbmcgbG9jYWwgYnVuZGxlIHJlc291cmNlcyBvbmx5IGlmXG4gICAgICAgIC8vIHRoZSBiYXNlIHBhdGggaXMgYWJzb2x1dGUsIG9yIHRoaXMgYnVuZGxlJ3MgcGF0aCBpcyByZWxhdGl2ZVxuICAgICAgICBpZiAocGF0aCAmJiAoIVVSTHMuaXNSZWxhdGl2ZVVSTChwYXRoKSB8fCBVUkxzLmlzUmVsYXRpdmVVUkwodGhpcy51cmwpKSkge1xuICAgICAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IFVSTHMucGF0aEZvclVSTCh0aGlzLnVybCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBhdGhfZm9yX3BhcmVudCA9IHBhdGggfHwgdGhpcy5wYXRoOyAvLyBmb3IgcmVzb2x2aW5nIHBhdGhzIHJlbGF0aXZlIHRvIGEgcGFyZW50IGJ1bmRsZVxuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuICAgICAgICAvLyBBbiBhbmNlc3RvciBidW5kbGUgbWF5IGJlIGEgY29udGFpbmVyIChlLmcuIHppcCBmaWxlKSB0aGF0IG5lZWRzIHRvIHJlc29sdmUgcmVsYXRpdmUgcGF0aHNcbiAgICAgICAgLy8gZm9yIGFueSBzY2VuZXMgaXQgY29udGFpbnMsIGUuZy4gYHJvb3QuemlwYCBoYXMgYSBgcm9vdC55YW1sYCB0aGF0IGluY2x1ZGVzIGEgYGZvbGRlci9jaGlsZC55YW1sYDpcbiAgICAgICAgLy8gcmVzb3VyY2VzIHdpdGhpbiBgY2hpbGQueWFtbGAgbXVzdCBiZSByZXNvbHZlZCB0aHJvdWdoIHRoZSBidW5kbGUgZm9yIGByb290LnppcGBcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudC5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMucGFyZW50LmNvbnRhaW5lcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucGFyZW50LmlzQ29udGFpbmVyKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRSZXNvdXJjZSh0aGlzLnVybCk7XG4gICAgfVxuXG4gICAgLy8gSW5mbyBmb3IgcmV0cmlldmluZyBhIHNwZWNpZmljIHJlc291cmNlIGZyb20gdGhpcyBidW5kbGVcbiAgICAvLyB1cmw6IGZ1bGx5IHF1YWxpZmllZCBVUkwgdG8gcmV0cmlldmUgdGhlIGNvbnRlbnQgb2YgdGhlIHJlc291cmNlIChlLmcuIHppcHMgd2lsbCB0cmFuc2Zvcm0gdGhpcyB0byBibG9iIFVSTClcbiAgICAvLyBwYXRoOiBvcmlnaW5hbCBwYXRoIG9mIHRoZSByZXNvdXJjZSB3aXRoaW4gdGhlIGJ1bmRsZSAoZm9yIHJlc29sdmluZyBwYXRocyB1cCB0aGUgYnVuZGxlIHRyZWUpXG4gICAgLy8gdHlwZTogZmlsZSBleHRlbnNpb24gKHVzZWQgZm9yIGRldGVybWluaW5nIGJ1bmRsZSB0eXBlLCBgeWFtbGAgb3IgYHppcGApXG4gICAgcmVzb3VyY2VGb3IodXJsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsRm9yKHVybCksXG4gICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGhGb3IodXJsKSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZUZvcih1cmwpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdXJsRm9yKHVybCkge1xuICAgICAgICBpZiAoaXNHbG9iYWwodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVUkxzLmlzUmVsYXRpdmVVUkwodXJsKSAmJiB0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LnVybEZvcih0aGlzLnBhdGhfZm9yX3BhcmVudCArIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFVSTHMuYWRkQmFzZVVSTCh1cmwsIHRoaXMucGF0aCk7XG4gICAgfVxuXG4gICAgcGF0aEZvcih1cmwpIHtcbiAgICAgICAgcmV0dXJuIFVSTHMucGF0aEZvclVSTCh1cmwpO1xuICAgIH1cblxuICAgIHR5cGVGb3IodXJsKSB7XG4gICAgICAgIHJldHVybiBVUkxzLmV4dGVuc2lvbkZvclVSTCh1cmwpO1xuICAgIH1cblxuICAgIGlzQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBaaXBTY2VuZUJ1bmRsZSBleHRlbmRzIFNjZW5lQnVuZGxlIHtcblxuICAgIGNvbnN0cnVjdG9yKHVybCwgcGF0aCwgcGFyZW50KSB7XG4gICAgICAgIHN1cGVyKHVybCwgcGF0aCwgcGFyZW50KTtcbiAgICAgICAgdGhpcy56aXAgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbGVzID0ge307XG4gICAgICAgIHRoaXMucm9vdCA9IG51bGw7XG4gICAgICAgIHRoaXMucGF0aCA9ICcnO1xuICAgIH1cblxuICAgIGlzQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICB0aGlzLnppcCA9IG5ldyBKU1ppcCgpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuaW8odGhpcy51cmwsIDYwMDAwLCAnYXJyYXlidWZmZXInKVxuICAgICAgICAgICAgICAgIC50aGVuKGJvZHkgPT4gdGhpcy56aXAubG9hZEFzeW5jKGJvZHkpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucGFyc2VaaXBGaWxlcygpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMubG9hZFJvb3QoKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZSA9PiBQcm9taXNlLnJlamVjdChlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXJsRm9yKHVybCkge1xuICAgICAgICBpZiAoaXNHbG9iYWwodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVUkxzLmlzUmVsYXRpdmVVUkwodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXJsRm9yWmlwRmlsZShVUkxzLmZsYXR0ZW5SZWxhdGl2ZVVSTCh1cmwpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIudXJsRm9yKHVybCk7XG4gICAgfVxuXG4gICAgdHlwZUZvcih1cmwpIHtcbiAgICAgICAgaWYgKFVSTHMuaXNSZWxhdGl2ZVVSTCh1cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlRm9yWmlwRmlsZSh1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci50eXBlRm9yKHVybCk7XG4gICAgfVxuXG4gICAgbG9hZFJvb3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRSb290KClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IGxvYWRSZXNvdXJjZSh0aGlzLnVybEZvclppcEZpbGUodGhpcy5yb290KSkpO1xuICAgIH1cblxuICAgIGZpbmRSb290KCkge1xuICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGEgc2luZ2xlIFlBTUwgZmlsZSBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSB6aXBcbiAgICAgICAgY29uc3QgeWFtbHMgPSBPYmplY3Qua2V5cyh0aGlzLmZpbGVzKVxuICAgICAgICAgICAgLmZpbHRlcihwYXRoID0+IHRoaXMuZmlsZXNbcGF0aF0uZGVwdGggPT09IDApXG4gICAgICAgICAgICAuZmlsdGVyKHBhdGggPT4gVVJMcy5leHRlbnNpb25Gb3JVUkwocGF0aCkgPT09ICd5YW1sJyk7XG5cbiAgICAgICAgaWYgKHlhbWxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0geWFtbHNbMF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyByb290IGZvdW5kXG4gICAgICAgIGlmICghdGhpcy5yb290KSB7XG4gICAgICAgICAgICBsZXQgbXNnID0gYENvdWxkIG5vdCBmaW5kIHJvb3Qgc2NlbmUgZm9yIGJ1bmRsZSAnJHt0aGlzLnVybH0nOiBgO1xuICAgICAgICAgICAgbXNnICs9IGBUaGUgemlwIGFyY2hpdmUncyByb290IGxldmVsIG11c3QgY29udGFpbiBhIHNpbmdsZSBzY2VuZSBmaWxlIHdpdGggdGhlICcueWFtbCcgZXh0ZW5zaW9uLiBgO1xuICAgICAgICAgICAgaWYgKHlhbWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYEZvdW5kIG11bHRpcGxlIFlBTUwgZmlsZXMgYXQgdGhlIHJvb3QgbGV2ZWw6ICR7eWFtbHMubWFwKHIgPT4gJ1xcJycgKyByICsgJ1xcJycgKS5qb2luKCcsICcpfS5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbXNnICs9IGBGb3VuZCBOTyBZQU1MIGZpbGVzIGF0IHRoZSByb290IGxldmVsLmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoRXJyb3IobXNnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHBhcnNlWmlwRmlsZXMoKSB7XG4gICAgICAgIGxldCBwYXRocyA9IFtdO1xuICAgICAgICBsZXQgcXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy56aXAuZm9yRWFjaCgocGF0aCwgZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFmaWxlLmRpcikge1xuICAgICAgICAgICAgICAgIHBhdGhzLnB1c2gocGF0aCk7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaChmaWxlLmFzeW5jKCdhcnJheWJ1ZmZlcicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHF1ZXVlKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gcGF0aHNbaV07XG4gICAgICAgICAgICAgICAgbGV0IGRlcHRoID0gcGF0aC5zcGxpdCgnLycpLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlc1twYXRoXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YVtpXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogVVJMcy5leHRlbnNpb25Gb3JVUkwocGF0aCksXG4gICAgICAgICAgICAgICAgICAgIGRlcHRoXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXJsRm9yWmlwRmlsZShmaWxlKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbGVzW2ZpbGVdKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsZXNbZmlsZV0udXJsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlc1tmaWxlXS51cmwgPSBVUkxzLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbdGhpcy5maWxlc1tmaWxlXS5kYXRhXSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlc1tmaWxlXS51cmw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0eXBlRm9yWmlwRmlsZShmaWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVzW2ZpbGVdICYmIHRoaXMuZmlsZXNbZmlsZV0udHlwZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjZW5lQnVuZGxlKHVybCwgcGF0aCwgcGFyZW50LCB0eXBlID0gbnVsbCkge1xuICAgIGlmICh0eXBlID09PSAnemlwJyB8fCAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgVVJMcy5leHRlbnNpb25Gb3JVUkwodXJsKSA9PT0gJ3ppcCcpKSB7XG4gICAgICAgIHJldHVybiBuZXcgWmlwU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNjZW5lQnVuZGxlKHVybCwgcGF0aCwgcGFyZW50KTtcbn1cblxuLy8gUmVmZXJlbmNlcyBhIGdsb2JhbCBwcm9wZXJ0eT9cbmV4cG9ydCBmdW5jdGlvbiBpc0dsb2JhbCAodmFsKSB7XG4gICAgaWYgKHZhbCAmJiB2YWwuc2xpY2UoMCwgNykgPT09ICdnbG9iYWwuJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwYXJzZVJlc291cmNlIChib2R5KSB7XG4gICAgdmFyIGRhdGE7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8ganN5YW1sICdqc29uJyBvcHRpb24gYWxsb3dzIGR1cGxpY2F0ZSBrZXlzXG4gICAgICAgIC8vIEtlZXBpbmcgdGhpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBzaG91bGQgY29uc2lkZXIgbWlncmF0aW5nIHRvIHJlcXVpcmluZ1xuICAgICAgICAvLyB1bmlxdWUga2V5cywgYXMgdGhpcyBpcyBZQU1MIHNwZWMuIEJ1dCBUYW5ncmFtIEVTIGN1cnJlbnRseSBhY2NlcHRzIGR1cGUga2V5cyBhcyB3ZWxsLFxuICAgICAgICAvLyBzbyBzaG91bGQgY29uc2lkZXIgaG93IGJlc3QgdG8gdW5pZnkuXG4gICAgICAgIGRhdGEgPSB5YW1sLnNhZmVMb2FkKGJvZHksIHsganNvbjogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBsb2FkUmVzb3VyY2UgKHNvdXJjZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgVXRpbHMuaW8oc291cmNlKS50aGVuKChib2R5KSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBwYXJzZVJlc291cmNlKGJvZHkpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShzb3VyY2UpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQgKiBhcyBVUkxzIGZyb20gJy4vdXRpbHMvdXJscyc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4vdXRpbHMvbWVyZ2UnO1xuaW1wb3J0IHN1YnNjcmliZU1peGluIGZyb20gJy4vdXRpbHMvc3Vic2NyaWJlJztcbmltcG9ydCB7Y3JlYXRlU2NlbmVCdW5kbGUsIGlzR2xvYmFsfSBmcm9tICcuL3NjZW5lX2J1bmRsZSc7XG5cbnZhciBTY2VuZUxvYWRlcjtcblxuZXhwb3J0IGRlZmF1bHQgU2NlbmVMb2FkZXIgPSB7XG5cbiAgICAvLyBMb2FkIHNjZW5lcyBkZWZpbml0aW9ucyBmcm9tIFVSTCAmIHByb3Byb2Nlc3NcbiAgICBsb2FkU2NlbmUodXJsLCBwYXRoID0gbnVsbCkge1xuICAgICAgICBsZXQgZXJyb3JzID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRTY2VuZVJlY3Vyc2l2ZSh7IHVybCwgcGF0aCB9LCBudWxsLCBlcnJvcnMpLlxuICAgICAgICAgICAgdGhlbihyZXN1bHQgPT4gdGhpcy5maW5hbGl6ZShyZXN1bHQpKS5cbiAgICAgICAgICAgIHRoZW4oKHsgY29uZmlnLCBidW5kbGUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJvb3Qgc2NlbmUgZmFpbGVkIHRvIGxvYWQsIHJlamVjdCB3aXRoIGZpcnN0IGVycm9yXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcnNbMF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBzY2VuZSBsb2FkZWQsIGJ1dCBzb21lIGltcG9ydHMgaGFkIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMuZm9yRWFjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBGYWlsZWQgdG8gaW1wb3J0IHNjZW5lOiAke2Vycm9yLnVybH1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdlcnJvcicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcignZXJyb3InLCB7IHR5cGU6ICdzY2VuZV9pbXBvcnQnLCBtZXNzYWdlLCBlcnJvciwgdXJsOiBlcnJvci51cmwgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBjb25maWcsIGJ1bmRsZSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIExvYWRzIHNjZW5lIGZpbGVzIGZyb20gVVJMLCByZWN1cnNpdmVseSBsb2FkaW5nICdpbXBvcnQnIHNjZW5lc1xuICAgIC8vIE9wdGlvbmFsICppbml0aWFsKiBwYXRoIG9ubHkgKHdvbid0IGJlIHBhc3NlZCB0byByZWN1cnNpdmUgJ2ltcG9ydCcgY2FsbHMpXG4gICAgLy8gVXNlZnVsIGZvciBsb2FkaW5nIHJlc291cmNlcyBpbiBiYXNlIHNjZW5lIGZpbGUgZnJvbSBhIHNlcGFyYXRlIGxvY2F0aW9uXG4gICAgLy8gKGUuZy4gaW4gVGFuZ3JhbSBQbGF5LCB3aGVuIG1vZGlmaWVkIGxvY2FsIHNjZW5lIHNob3VsZCBzdGlsbCByZWZlciB0byBvcmlnaW5hbCByZXNvdXJjZSBVUkxzKVxuICAgIGxvYWRTY2VuZVJlY3Vyc2l2ZSh7IHVybCwgcGF0aCwgdHlwZSB9LCBwYXJlbnQsIGVycm9ycyA9IFtdKSB7XG4gICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBidW5kbGUgPSBjcmVhdGVTY2VuZUJ1bmRsZSh1cmwsIHBhdGgsIHBhcmVudCwgdHlwZSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1bmRsZS5sb2FkKCkudGhlbihjb25maWcgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5pbXBvcnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZShjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFjY2VwdCBzaW5nbGUgZW50cnkgb3IgYXJyYXlcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWcuaW1wb3J0KSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5pbXBvcnQgPSBbY29uZmlnLmltcG9ydF07IC8vIGNvbnZlcnQgdG8gYXJyYXlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ29sbGVjdCBVUkxzIG9mIHNjZW5lcyB0byBpbXBvcnRcbiAgICAgICAgICAgIGxldCBpbXBvcnRzID0gW107XG4gICAgICAgICAgICBjb25maWcuaW1wb3J0LmZvckVhY2godXJsID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHNjZW5lIG9iamVjdHMgdG8gVVJMc1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBVUkxzLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkodXJsKV0pKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpbXBvcnRzLnB1c2goYnVuZGxlLnJlc291cmNlRm9yKHVybCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLmltcG9ydDsgLy8gZG9uJ3Qgd2FudCB0byBtZXJnZSB0aGlzIHByb3BlcnR5XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLlxuICAgICAgICAgICAgICAgIGFsbChpbXBvcnRzLm1hcChyZXNvdXJjZSA9PiB0aGlzLmxvYWRTY2VuZVJlY3Vyc2l2ZShyZXNvdXJjZSwgYnVuZGxlLCBlcnJvcnMpKSkuXG4gICAgICAgICAgICAgICAgICAgIHRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZmlncyA9IHJlc3VsdHMubWFwKHIgPT4gci5jb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VPYmplY3RzKHt9LCAuLi5jb25maWdzLCBjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIC8vIENvbGxlY3Qgc2NlbmUgbG9hZCBlcnJvcnMgYXMgd2UgZ29cbiAgICAgICAgICAgIGVycm9yLnVybCA9IHVybDtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIE5vcm1hbGl6ZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIGFkanVzdCB3aXRoaW4gZWFjaCBsb2NhbCBzY2VuZSBmaWxlICh1c3VhbGx5IGJ5IHBhdGgpXG4gICAgbm9ybWFsaXplKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIHRoaXMubm9ybWFsaXplRGF0YVNvdXJjZXMoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZUZvbnRzKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVUZXh0dXJlcyhjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgIHJldHVybiB7IGNvbmZpZywgYnVuZGxlIH07XG4gICAgfSxcblxuICAgIC8vIEV4cGFuZCBwYXRocyBmb3IgZGF0YSBzb3VyY2VcbiAgICBub3JtYWxpemVEYXRhU291cmNlcyhjb25maWcsIGJ1bmRsZSkge1xuICAgICAgICBjb25maWcuc291cmNlcyA9IGNvbmZpZy5zb3VyY2VzIHx8IHt9O1xuXG4gICAgICAgIGZvciAobGV0IHNuIGluIGNvbmZpZy5zb3VyY2VzKSB7XG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZURhdGFTb3VyY2UoY29uZmlnLnNvdXJjZXNbc25dLCBidW5kbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9LFxuXG4gICAgbm9ybWFsaXplRGF0YVNvdXJjZShzb3VyY2UsIGJ1bmRsZSkge1xuICAgICAgICBzb3VyY2UudXJsID0gYnVuZGxlLnVybEZvcihzb3VyY2UudXJsKTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2Uuc2NyaXB0cykpIHtcbiAgICAgICAgICAgIHNvdXJjZS5zY3JpcHRzID0gc291cmNlLnNjcmlwdHMubWFwKHVybCA9PiBidW5kbGUudXJsRm9yKHVybCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIHBhdGhzIGZvciBmb250c1xuICAgIG5vcm1hbGl6ZUZvbnRzKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIGNvbmZpZy5mb250cyA9IGNvbmZpZy5mb250cyB8fCB7fTtcblxuICAgICAgICBmb3IgKGxldCBmYW1pbHkgaW4gY29uZmlnLmZvbnRzKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcuZm9udHNbZmFtaWx5XSkpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuZm9udHNbZmFtaWx5XS5mb3JFYWNoKGZhY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmYWNlLnVybCA9IGZhY2UudXJsICYmIGJ1bmRsZS51cmxGb3IoZmFjZS51cmwpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGZhY2UgPSBjb25maWcuZm9udHNbZmFtaWx5XTtcbiAgICAgICAgICAgICAgICBmYWNlLnVybCA9IGZhY2UudXJsICYmIGJ1bmRsZS51cmxGb3IoZmFjZS51cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIHBhdGhzIGFuZCBjZW50cmFsaXplIHRleHR1cmUgZGVmaW5pdGlvbnMgZm9yIGEgc2NlbmUgb2JqZWN0XG4gICAgbm9ybWFsaXplVGV4dHVyZXMoY29uZmlnLCBidW5kbGUpIHtcbiAgICAgICAgY29uZmlnLnRleHR1cmVzID0gY29uZmlnLnRleHR1cmVzIHx8IHt9O1xuXG4gICAgICAgIC8vIEFkZCBjdXJyZW50IHNjZW5lJ3MgYmFzZSBwYXRoIHRvIGdsb2JhbGx5IGRlZmluZWQgdGV4dHVyZXNcbiAgICAgICAgLy8gT25seSBhZGRzIHBhdGggZm9yIHRleHR1cmVzIHdpdGggcmVsYXRpdmUgVVJMcywgc28gdGV4dHVyZXMgaW4gaW1wb3J0ZWQgc2NlbmVzIGdldCB0aGUgYmFzZVxuICAgICAgICAvLyBwYXRoIG9mIHRoZWlyIGltbWVkaWF0ZSBzY2VuZSBmaWxlXG4gICAgICAgIGlmIChjb25maWcudGV4dHVyZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHRuIGluIGNvbmZpZy50ZXh0dXJlcykge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gY29uZmlnLnRleHR1cmVzW3RuXTtcbiAgICAgICAgICAgICAgICBpZiAodGV4dHVyZS51cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS51cmwgPSBidW5kbGUudXJsRm9yKHRleHR1cmUudXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNvbHZlIFVSTHMgZm9yIGlubGluZSB0ZXh0dXJlc1xuICAgICAgICBpZiAoY29uZmlnLnN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgc24gaW4gY29uZmlnLnN0eWxlcykge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IGNvbmZpZy5zdHlsZXNbc25dO1xuXG4gICAgICAgICAgICAgICAgLy8gU3R5bGUgYHRleHR1cmVgXG4gICAgICAgICAgICAgICAgbGV0IHRleCA9IHN0eWxlLnRleHR1cmU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXggPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdGV4XSAmJiAhaXNHbG9iYWwodGV4KSkge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXh0dXJlID0gYnVuZGxlLnVybEZvcih0ZXgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE1hdGVyaWFsXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLm1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIFsnZW1pc3Npb24nLCAnYW1iaWVudCcsICdkaWZmdXNlJywgJ3NwZWN1bGFyJywgJ25vcm1hbCddLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRlcmlhbCBwcm9wZXJ0eSBoYXMgYSB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4ID0gc3R5bGUubWF0ZXJpYWxbcHJvcF0gIT0gbnVsbCAmJiBzdHlsZS5tYXRlcmlhbFtwcm9wXS50ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXggPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdGV4XSAmJiAhaXNHbG9iYWwodGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLm1hdGVyaWFsW3Byb3BdLnRleHR1cmUgPSBidW5kbGUudXJsRm9yKHRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNoYWRlciB1bmlmb3Jtc1xuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgICAgICAgICAgR0xTTC5wYXJzZVVuaWZvcm1zKHN0eWxlLnNoYWRlcnMudW5pZm9ybXMpLmZvckVhY2goKHt0eXBlLCB2YWx1ZSwga2V5LCB1bmlmb3Jtc30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRleHR1cmUgYnkgVVJMIChzdHJpbmctbmFtZWQgdGV4dHVyZSBub3QgcmVmZXJlbmNpbmcgZXhpc3RpbmcgdGV4dHVyZSBkZWZpbml0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzYW1wbGVyMkQnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t2YWx1ZV0gJiYgIWlzR2xvYmFsKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zW2tleV0gPSBidW5kbGUudXJsRm9yKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9LFxuXG4gICAgLy8gU3Vic3RpdHV0ZXMgZ2xvYmFsIHNjZW5lIHByb3BlcnRpZXMgKHRob3NlIGRlZmluZWQgaW4gdGhlIGBjb25maWcuZ2xvYmFsYCBvYmplY3QpIGZvciBhbnkgc3R5bGUgdmFsdWVzXG4gICAgLy8gb2YgdGhlIGZvcm0gYGdsb2JhbC5gLCBmb3IgZXhhbXBsZSBgY29sb3I6IGdsb2JhbC5wYXJrX2NvbG9yYCB3b3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSB2YWx1ZSAoaWYgYW55KVxuICAgIC8vIGRlZmluZWQgZm9yIHRoZSBgcGFya19jb2xvcmAgcHJvcGVydHkgaW4gYGNvbmZpZy5nbG9iYWwucGFya19jb2xvcmAuXG4gICAgYXBwbHlHbG9iYWxQcm9wZXJ0aWVzKGNvbmZpZywgYXBwbGllZCkge1xuICAgICAgICBpZiAoIWNvbmZpZy5nbG9iYWwgfHwgT2JqZWN0LmtleXMoY29uZmlnLmdsb2JhbCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlnOyAvLyBubyBnbG9iYWwgcHJvcGVydGllcyB0byB0cmFuc2Zvcm1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIHByb3BlcnRpZXMgZnJvbSBnbG9iYWxzXG4gICAgICAgIGNvbnN0IHNlcGFyYXRvciA9ICc6JztcbiAgICAgICAgY29uc3QgcHJvcHMgPSBmbGF0dGVuUHJvcGVydGllcyhjb25maWcuZ2xvYmFsLCBzZXBhcmF0b3IpO1xuXG4gICAgICAgIC8vIFJlLWFwcGx5IHByZXZpb3VzbHkgYXBwbGllZCBwcm9wZXJ0aWVzXG4gICAgICAgIC8vIE5COiBhIGN1cnJlbnQgc2hvcnRjb21pbmcgaGVyZSBpcyB0aGF0IHlvdSBjYW5ub3QgXCJ1bi1saW5rXCIgYSB0YXJnZXQgcHJvcGVydHkgZnJvbSBhIGdsb2JhbFxuICAgICAgICAvLyBhdCBydW4tdGltZS4gT25jZSBhIGdsb2JhbCBwcm9wZXJ0eSBzdWJzdGl0dXRpb24gaGFzIGJlZW4gcmVjb3JkZXJkLCBpdCB3aWxsIGFsd2F5cyBiZSByZS1hcHBsaWVkXG4gICAgICAgIC8vIG9uIHN1YnNlcXVlbnQgc2NlbmUgdXBkYXRlcywgZXZlbiBpZiB0aGUgdGFyZ2V0IHByb3BlcnR5IHdhcyB1cGRhdGVkIHRvIGFub3RoZXIgbGl0ZXJhbCB2YWx1ZS5cbiAgICAgICAgLy8gVGhpcyBpcyB1bmxpa2VseSB0byBiZSBhIGNvbW1vbiBvY2N1cnJlbmNlIGFuIGFjY2VwdGFibGUgbGltaXRhdGlvbiBmb3Igbm93LlxuICAgICAgICBhcHBsaWVkLmZvckVhY2goKHsgcHJvcCwgdGFyZ2V0LCBrZXkgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgICAgICAgLy8gbG9nKCdpbmZvJywgYFJlLWFwcGx5aW5nICR7cHJvcH0gd2l0aCB2YWx1ZSAke3Byb3BzW3Byb3BdfSB0byBrZXkgJHtrZXl9IGluYCwgdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRmluZCBhbmQgYXBwbHkgbmV3IHByb3BlcnRpZXNcbiAgICAgICAgZnVuY3Rpb24gYXBwbHlQcm9wcyAob2JqLCB0YXJnZXQsIGtleSkge1xuICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmdcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3AgPSAob2JqLnNsaWNlKDAsIDcpID09PSAnZ2xvYmFsLicpICYmIChvYmouc2xpY2UoNykucmVwbGFjZSgvXFwuL2csIHNlcGFyYXRvcikpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wICYmIHByb3BzW3Byb3BdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSByZWNvcmQgb2Ygd2hlcmUgcHJvcGVydHkgaXMgYXBwbGllZFxuICAgICAgICAgICAgICAgICAgICBhcHBsaWVkLnB1c2goeyBwcm9wLCB0YXJnZXQsIGtleSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBBcHBseSBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICBvYmogPSBwcm9wc1twcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqW3BdID0gYXBwbHlQcm9wcyhvYmpbcF0sIG9iaiwgcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcHBseVByb3BzKGNvbmZpZyk7XG4gICAgfSxcblxuICAgIC8vIE1vdmUgaW5saW5lIChVUkwgc3RyaW5nKSB0ZXh0dXJlcyB0byB0aGUgc2NlbmUncyB0b3AtbGV2ZWwgc2V0IG9mIHRleHR1cmVzIChjb25maWcudGV4dHVyZXMpLlxuICAgIC8vIFRoZXJlIGFyZSAzIHN1Y2ggY2FzZXMgb2YgdGV4dHVyZXM6XG4gICAgLy8gLSBpbiBhIHN0eWxlJ3MgYHRleHR1cmVgIHByb3BlcnR5XG4gICAgLy8gLSBpbiBhIHN0eWxlJ3MgYG1hdGVyaWFsYCBwcm9wZXJ0aWVzXG4gICAgLy8gLSBpbiBhIHN0eWxlJ3MgY3VzdG9tIHVuaWZvcm1zIChgc2hhZGVycy51bmlmb3Jtc2ApXG4gICAgaG9pc3RUZXh0dXJlcyAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcuc3R5bGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzbiBpbiBjb25maWcuc3R5bGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gY29uZmlnLnN0eWxlc1tzbl07XG5cbiAgICAgICAgICAgICAgICAvLyBTdHlsZSBgdGV4dHVyZWBcbiAgICAgICAgICAgICAgICBsZXQgdGV4ID0gc3R5bGUudGV4dHVyZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRleCA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t0ZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB0ZXg7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaXNHbG9iYWwodXJsKSA/IGB0ZXh0dXJlLSR7dXJsfWAgOiB1cmw7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy50ZXh0dXJlc1tuYW1lXSA9IHsgdXJsIH07XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnRleHR1cmUgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE1hdGVyaWFsXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLm1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIFsnZW1pc3Npb24nLCAnYW1iaWVudCcsICdkaWZmdXNlJywgJ3NwZWN1bGFyJywgJ25vcm1hbCddLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRlcmlhbCBwcm9wZXJ0eSBoYXMgYSB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4ID0gc3R5bGUubWF0ZXJpYWxbcHJvcF0gIT0gbnVsbCAmJiBzdHlsZS5tYXRlcmlhbFtwcm9wXS50ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXggPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdGV4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB0ZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpc0dsb2JhbCh1cmwpID8gYHRleHR1cmUtJHt1cmx9YCA6IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudGV4dHVyZXNbbmFtZV0gPSB7IHVybCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLm1hdGVyaWFsW3Byb3BdLnRleHR1cmUgPSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaGFkZXIgdW5pZm9ybXNcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUuc2hhZGVycyAmJiBzdHlsZS5zaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgIEdMU0wucGFyc2VVbmlmb3JtcyhzdHlsZS5zaGFkZXJzLnVuaWZvcm1zKS5mb3JFYWNoKCh7dHlwZSwgdmFsdWUsIGtleSwgdW5pZm9ybXN9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXh0dXJlIGJ5IFVSTCAoc3RyaW5nLW5hbWVkIHRleHR1cmUgbm90IHJlZmVyZW5jaW5nIGV4aXN0aW5nIHRleHR1cmUgZGVmaW5pdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnc2FtcGxlcjJEJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaXNHbG9iYWwodXJsKSA/IGB0ZXh0dXJlLSR7dXJsfWAgOiB1cmw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRleHR1cmVzW25hbWVdID0geyB1cmwgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1trZXldID0gbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIE5vcm1hbGl6ZSBzb21lIHNjZW5lLXdpZGUgc2V0dGluZ3MgdGhhdCBhcHBseSB0byB0aGUgZmluYWwsIG1lcmdlZCBzY2VuZVxuICAgIGZpbmFsaXplKHsgY29uZmlnLCBidW5kbGUgfSkge1xuICAgICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHRvcC1sZXZlbCBwcm9wZXJ0aWVzXG4gICAgICAgIGNvbmZpZy5zY2VuZSA9IGNvbmZpZy5zY2VuZSB8fCB7fTtcbiAgICAgICAgY29uZmlnLmNhbWVyYXMgPSBjb25maWcuY2FtZXJhcyB8fCB7fTtcbiAgICAgICAgY29uZmlnLmxpZ2h0cyA9IGNvbmZpZy5saWdodHMgfHwge307XG4gICAgICAgIGNvbmZpZy5zdHlsZXMgPSBjb25maWcuc3R5bGVzIHx8IHt9O1xuICAgICAgICBjb25maWcubGF5ZXJzID0gY29uZmlnLmxheWVycyB8fCB7fTtcblxuICAgICAgICAvLyBJZiBvbmx5IG9uZSBjYW1lcmEgc3BlY2lmaWVkLCBzZXQgaXQgYXMgZGVmYXVsdFxuICAgICAgICBpZiAoY29uZmlnLmNhbWVyYSkge1xuICAgICAgICAgICAgY29uZmlnLmNhbWVyYXMuZGVmYXVsdCA9IGNvbmZpZy5jYW1lcmE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBubyBjYW1lcmFzIHNwZWNpZmllZCwgY3JlYXRlIG9uZVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlnLmNhbWVyYXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uZmlnLmNhbWVyYXMuZGVmYXVsdCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gbGlnaHRzIHNwZWNpZmllZCwgY3JlYXRlIGRlZmF1bHRcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbmZpZy5saWdodHMpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoY29uZmlnLmxpZ2h0cykuZXZlcnkoaSA9PiBjb25maWcubGlnaHRzW2ldLnZpc2libGUgPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgY29uZmlnLmxpZ2h0cy5kZWZhdWx0X2xpZ2h0ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdkaXJlY3Rpb25hbCdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBjb25maWcsIGJ1bmRsZSB9O1xuICAgIH1cblxufTtcblxuLy8gRmxhdHRlbiBuZXN0ZWQgcHJvcGVydGllcyBmb3Igc2ltcGxlciBzdHJpbmcgbG9vay11cHNcbi8vIGUuZy4gZ2xvYmFsLmJhY2tncm91bmQuY29sb3IgLT4gJ2dsb2JhbDpiYWNrZ3JvdW5kOmNvbG9yJ1xuZnVuY3Rpb24gZmxhdHRlblByb3BlcnRpZXMgKG9iaiwgc2VwYXJhdG9yID0gJzonLCBwcmVmaXggPSBudWxsLCBwcm9wcyA9IHt9KSB7XG4gICAgcHJlZml4ID0gcHJlZml4ID8gKHByZWZpeCArIHNlcGFyYXRvcikgOiAnJztcblxuICAgIGZvciAobGV0IHAgaW4gb2JqKSB7XG4gICAgICAgIGxldCBrZXkgPSBwcmVmaXggKyBwO1xuICAgICAgICBsZXQgdmFsID0gb2JqW3BdO1xuICAgICAgICBwcm9wc1trZXldID0gdmFsO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICBmbGF0dGVuUHJvcGVydGllcyh2YWwsIHNlcGFyYXRvciwga2V5LCBwcm9wcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BzO1xufVxuXG5zdWJzY3JpYmVNaXhpbihTY2VuZUxvYWRlcik7XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUqL1xuaW1wb3J0IFRocmVhZCBmcm9tICcuL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJzsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4vdXRpbHMvbWVyZ2UnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcbmltcG9ydCBEYXRhU291cmNlIGZyb20gJy4vc291cmNlcy9kYXRhX3NvdXJjZSc7XG5pbXBvcnQgRmVhdHVyZVNlbGVjdGlvbiBmcm9tICcuL3NlbGVjdGlvbic7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IHtTdHlsZU1hbmFnZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX21hbmFnZXInO1xuaW1wb3J0IHtwYXJzZUxheWVyc30gZnJvbSAnLi9zdHlsZXMvbGF5ZXInO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC90ZXh0dXJlJztcblxuZXhwb3J0IHZhciBTY2VuZVdvcmtlciA9IHNlbGY7XG5cbi8vIFdvcmtlciBmdW5jdGlvbmFsaXR5IHdpbGwgb25seSBiZSBkZWZpbmVkIGluIHdvcmtlciB0aHJlYWRcbmlmIChUaHJlYWQuaXNfd29ya2VyKSB7XG5cbk9iamVjdC5hc3NpZ24oc2VsZiwge1xuXG4gICAgRmVhdHVyZVNlbGVjdGlvbixcblxuICAgIHNvdXJjZXM6IHt9LFxuICAgIHN0eWxlczoge30sXG4gICAgbGF5ZXJzOiB7fSxcbiAgICB0aWxlczoge30sXG4gICAgb2JqZWN0czoge30sXG4gICAgY29uZmlnOiB7fSwgICAgIC8vIHJhdyBjb25maWcgKGUuZy4gZnVuY3Rpb25zLCBldGMuIG5vdCBleHBhbmRlZClcblxuICAgIC8vIEluaXRpYWxpemUgd29ya2VyXG4gICAgaW5pdCAoc2NlbmVfaWQsIHdvcmtlcl9pZCwgbnVtX3dvcmtlcnMsIGxvZ19sZXZlbCwgZGV2aWNlX3BpeGVsX3JhdGlvKSB7XG4gICAgICAgIHNlbGYuc2NlbmVfaWQgPSBzY2VuZV9pZDtcbiAgICAgICAgc2VsZi5fd29ya2VyX2lkID0gd29ya2VyX2lkO1xuICAgICAgICBzZWxmLm51bV93b3JrZXJzID0gbnVtX3dvcmtlcnM7XG4gICAgICAgIGxvZy5zZXRMZXZlbChsb2dfbGV2ZWwpO1xuICAgICAgICBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gPSBkZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIEZlYXR1cmVTZWxlY3Rpb24uc2V0UHJlZml4KHNlbGYuX3dvcmtlcl9pZCk7XG4gICAgICAgIHNlbGYuc3R5bGVfbWFuYWdlciA9IG5ldyBTdHlsZU1hbmFnZXIoKTtcbiAgICAgICAgcmV0dXJuIHdvcmtlcl9pZDtcbiAgICB9LFxuXG4gICAgLy8gU3RhcnRzIGEgY29uZmlnIHJlZnJlc2hcbiAgICB1cGRhdGVDb25maWcgKHsgY29uZmlnLCBnZW5lcmF0aW9uLCBpbnRyb3NwZWN0aW9uIH0pIHtcbiAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShjb25maWcpO1xuXG4gICAgICAgIHNlbGYubGFzdF9jb25maWcgPSBtZXJnZU9iamVjdHMoe30sIHNlbGYuY29uZmlnKTtcbiAgICAgICAgc2VsZi5jb25maWcgPSBtZXJnZU9iamVjdHMoe30sIGNvbmZpZyk7XG4gICAgICAgIHNlbGYuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247XG4gICAgICAgIHNlbGYuaW50cm9zcGVjdGlvbiA9IGludHJvc3BlY3Rpb247XG5cbiAgICAgICAgLy8gRGF0YSBibG9jayBmdW5jdGlvbnMgYXJlIG5vdCBjb250ZXh0IHdyYXBwZWQgbGlrZSB0aGUgcmVzdCBvZiB0aGUgc3R5bGUgZnVuY3Rpb25zIGFyZVxuICAgICAgICAvLyBUT0RPOiBwcm9iYWJseSB3YW50IGEgY2xlYW5lciB3YXkgdG8gZXhjbHVkZSB0aGVzZVxuICAgICAgICBmb3IgKGxldCBsYXllciBpbiBjb25maWcubGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmxheWVyc1tsYXllcl0pIHtcbiAgICAgICAgICAgICAgICBjb25maWcubGF5ZXJzW2xheWVyXS5kYXRhID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKGNvbmZpZy5sYXllcnNbbGF5ZXJdLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXhwYW5kIGdsb2JhbCBwcm9wZXJ0aWVzXG4gICAgICAgIHNlbGYuZ2xvYmFsID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKGNvbmZpZy5nbG9iYWwpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBkYXRhIHNvdXJjZXNcbiAgICAgICAgc2VsZi5jcmVhdGVEYXRhU291cmNlcyhjb25maWcpO1xuXG4gICAgICAgIC8vIEV4cGFuZCBzdHlsZXNcbiAgICAgICAgY29uZmlnLnN0eWxlcyA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcuc3R5bGVzLCBTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24pO1xuICAgICAgICBzZWxmLnN0eWxlcyA9IHNlbGYuc3R5bGVfbWFuYWdlci5idWlsZChjb25maWcuc3R5bGVzKTtcbiAgICAgICAgc2VsZi5zdHlsZV9tYW5hZ2VyLmluaXRTdHlsZXMoe1xuICAgICAgICAgICAgZ2VuZXJhdGlvbjogc2VsZi5nZW5lcmF0aW9uLFxuICAgICAgICAgICAgc3R5bGVzOiBzZWxmLnN0eWxlcyxcbiAgICAgICAgICAgIHNvdXJjZXM6IHNlbGYuc291cmNlcyxcbiAgICAgICAgICAgIGludHJvc3BlY3Rpb246IHNlbGYuaW50cm9zcGVjdGlvblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQYXJzZSBlYWNoIHRvcC1sZXZlbCBsYXllciBhcyBhIHNlcGFyYXRlIHRyZWVcbiAgICAgICAgc2VsZi5sYXllcnMgPSBwYXJzZUxheWVycyhjb25maWcubGF5ZXJzLCBzZWxmLnN0eWxlX21hbmFnZXIuc3R5bGVzKTtcblxuICAgICAgICAvLyBTeW5jIHRldHh1cmUgaW5mbyBmcm9tIG1haW4gdGhyZWFkXG4gICAgICAgIHNlbGYuc3luY2luZ190ZXh0dXJlcyA9IHNlbGYuc3luY1RleHR1cmVzKGNvbmZpZy50ZXh0dXJlcyk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHByb21pc2UgZm9yIHdoZW4gY29uZmlnIHJlZnJlc2ggZmluaXNoZXNcbiAgICAgICAgc2VsZi5jb25maWd1cmluZyA9IHNlbGYuc3luY2luZ190ZXh0dXJlcy50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgdXBkYXRlZCBjb25maWdgKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIENyZWF0ZSBkYXRhIHNvdXJjZXMgYW5kIGNsZWFyIHRpbGUgY2FjaGUgaWYgbmVjZXNzYXJ5XG4gICAgY3JlYXRlRGF0YVNvdXJjZXMgKGNvbmZpZykge1xuICAgICAgICBjb25maWcuc291cmNlcyA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcuc291cmNlcyk7IC8vIHBhcnNlIG5ldyBzb3VyY2VzXG4gICAgICAgIHNlbGYuc291cmNlcyA9IHt9OyAvLyBjbGVhciBwcmV2aW91cyBzb3VyY2VzXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gY29uZmlnLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2U7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHNvdXJjZSA9IERhdGFTb3VyY2UuY3JlYXRlKE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZy5zb3VyY2VzW25hbWVdLCB7bmFtZX0pLCBzZWxmLnNvdXJjZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5zb3VyY2VzW25hbWVdID0gc291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgdGlsZSBjYWNoZSBpZiBkYXRhIHNvdXJjZSBjb25maWcgY2hhbmdlZFxuICAgICAgICBpZiAoIXNlbGYuY29uZmlnLnNvdXJjZXMgfHxcbiAgICAgICAgICAgICFzZWxmLmxhc3RfY29uZmlnLnNvdXJjZXMgfHxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHNlbGYuY29uZmlnLnNvdXJjZXMpLnNvbWUocyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNlbGYuY29uZmlnLnNvdXJjZXNbc10pICE9PSBKU09OLnN0cmluZ2lmeShzZWxmLmxhc3RfY29uZmlnLnNvdXJjZXNbc10pO1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIHNlbGYudGlsZXMgPSB7fTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdoZW4gY29uZmlnIHJlZnJlc2ggaXMgZmluaXNoZWRcbiAgICBhd2FpdENvbmZpZ3VyYXRpb24gKCkge1xuICAgICAgICByZXR1cm4gc2VsZi5jb25maWd1cmluZztcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgYSB0aWxlOiBsb2FkIGZyb20gdGlsZSBzb3VyY2UgaWYgYnVpbGRpbmcgZm9yIGZpcnN0IHRpbWUsIG90aGVyd2lzZSByZWJ1aWxkIHdpdGggZXhpc3RpbmcgZGF0YVxuICAgIGJ1aWxkVGlsZSAoeyB0aWxlIH0pIHtcbiAgICAgICAgLy8gVGlsZSBjYWNoZWQ/XG4gICAgICAgIGlmIChzZWxmLmdldFRpbGUodGlsZS5rZXkpICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgbG9hZGluZz9cbiAgICAgICAgICAgIGlmIChzZWxmLmdldFRpbGUodGlsZS5rZXkpLmxvYWRpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgdGlsZSBjYWNoZVxuICAgICAgICB0aWxlID0gc2VsZi50aWxlc1t0aWxlLmtleV0gPSBPYmplY3QuYXNzaWduKHNlbGYuZ2V0VGlsZSh0aWxlLmtleSkgfHwge30sIHRpbGUpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBjb25maWcgKHN0eWxlcywgZXRjLiksIHRoZW4gYnVpbGQgdGlsZVxuICAgICAgICByZXR1cm4gc2VsZi5hd2FpdENvbmZpZ3VyYXRpb24oKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEZpcnN0IHRpbWUgYnVpbGRpbmcgdGhlIHRpbGVcbiAgICAgICAgICAgIGlmICh0aWxlLmxvYWRlZCAhPT0gdHJ1ZSkge1xuXG4gICAgICAgICAgICAgICAgdGlsZS5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aWxlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRpbGUuZXJyb3IgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgc2VsZi5sb2FkVGlsZVNvdXJjZURhdGEodGlsZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5nZXRUaWxlKHRpbGUua2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBzdG9wIHRpbGUgYnVpbGQgYWZ0ZXIgZGF0YSBzb3VyY2UgbG9hZCBiZWNhdXNlIHRpbGUgd2FzIHJlbW92ZWQ6ICR7dGlsZS5rZXl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBXYXJuIGFuZCBjb250aW51ZSBvbiBkYXRhIHNvdXJjZSBlcnJvclxuICAgICAgICAgICAgICAgICAgICBpZiAodGlsZS5zb3VyY2VfZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYHRpbGUgbG9hZCBlcnJvcihzKSBmb3IgJHt0aWxlLmtleX06ICR7dGlsZS5zb3VyY2VfZGF0YS5lcnJvcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRpbGUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIFRpbGUuYnVpbGRHZW9tZXRyeSh0aWxlLCBzZWxmKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUuZXJyb3IgPSBlcnJvci5zdGFjaztcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdlcnJvcicsIGB0aWxlIGxvYWQgZXJyb3IgZm9yICR7dGlsZS5rZXl9OiAke3RpbGUuZXJyb3J9YCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBlcnJvciB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoYFRpbGVNYW5hZ2VyXyR7c2VsZi5zY2VuZV9pZH0uYnVpbGRUaWxlRXJyb3JgLCBUaWxlLnNsaWNlKHRpbGUpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRpbGUgYWxyZWFkeSBsb2FkZWQsIGp1c3QgcmVidWlsZFxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGB1c2VkIHdvcmtlciBjYWNoZSBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuXG4gICAgICAgICAgICAgICAgLy8gQnVpbGQgZ2VvbWV0cnlcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBUaWxlLmJ1aWxkR2VvbWV0cnkodGlsZSwgc2VsZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgZXJyb3IgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5lcnJvciA9IGVycm9yLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShgVGlsZU1hbmFnZXJfJHtzZWxmLnNjZW5lX2lkfS5idWlsZFRpbGVFcnJvcmAsIFRpbGUuc2xpY2UodGlsZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIExvYWQgdGhpcyB0aWxlJ3MgZGF0YSBzb3VyY2VcbiAgICBsb2FkVGlsZVNvdXJjZURhdGEgKHRpbGUpIHtcbiAgICAgICAgaWYgKHNlbGYuc291cmNlc1t0aWxlLnNvdXJjZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnNvdXJjZXNbdGlsZS5zb3VyY2VdLmxvYWQodGlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aWxlLnNvdXJjZV9kYXRhID0ge307XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFRpbGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBzZWxmLnRpbGVzW2tleV07XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSB0aWxlXG4gICAgcmVtb3ZlVGlsZSAoa2V5KSB7XG4gICAgICAgIHZhciB0aWxlID0gc2VsZi50aWxlc1trZXldO1xuXG4gICAgICAgIGlmICh0aWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIENhbmNlbCBpZiBsb2FkaW5nXG4gICAgICAgICAgICBpZiAodGlsZS5sb2FkaW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBjYW5jZWwgdGlsZSBsb2FkIGZvciAke2tleX1gKTtcbiAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBUaWxlLmNhbmNlbCh0aWxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gY2FjaGVcbiAgICAgICAgICAgIEZlYXR1cmVTZWxlY3Rpb24uY2xlYXJUaWxlKGtleSk7XG4gICAgICAgICAgICBkZWxldGUgc2VsZi50aWxlc1trZXldO1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGByZW1vdmUgdGlsZSBmcm9tIGNhY2hlIGZvciAke2tleX1gKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBHZXQgYSBmZWF0dXJlIGZyb20gdGhlIHNlbGVjdGlvbiBtYXBcbiAgICBnZXRGZWF0dXJlU2VsZWN0aW9uICh7IGlkLCBrZXkgfSA9IHt9KSB7XG4gICAgICAgIHZhciBzZWxlY3Rpb24gPSBGZWF0dXJlU2VsZWN0aW9uLm1hcFtrZXldO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICBmZWF0dXJlOiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5mZWF0dXJlKVxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyBSZXNldHMgdGhlIGZlYXR1cmUgc2VsZWN0aW9uIHN0YXRlXG4gICAgcmVzZXRGZWF0dXJlU2VsZWN0aW9uICgpIHtcbiAgICAgICAgRmVhdHVyZVNlbGVjdGlvbi5yZXNldCgpO1xuICAgIH0sXG5cbiAgICAvLyBTZWxlY3Rpb24gbWFwIHNpemUgZm9yIHRoaXMgd29ya2VyXG4gICAgZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUgKCkge1xuICAgICAgICByZXR1cm4gRmVhdHVyZVNlbGVjdGlvbi5nZXRNYXBTaXplKCk7XG4gICAgfSxcblxuICAgIC8vIFRleHR1cmUgaW5mbyBuZWVkcyB0byBiZSBzeW5jZWQgZnJvbSBtYWluIHRocmVhZCwgZS5nLiB3aWR0aC9oZWlnaHQsIHdoaWNoIHdlIG9ubHkga25vdyBhZnRlciB0aGUgdGV4dHVyZSBsb2Fkc1xuICAgIHN5bmNUZXh0dXJlcyAodGV4X2NvbmZpZykge1xuICAgICAgICBsZXQgdGV4dHVyZXMgPSBbXTtcbiAgICAgICAgaWYgKHRleF9jb25maWcpIHtcbiAgICAgICAgICAgIHRleHR1cmVzLnB1c2goLi4uT2JqZWN0LmtleXModGV4X2NvbmZpZykpO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nKCd0cmFjZScsICdzeW5jIHRleHR1cmVzIHRvIHdvcmtlcjonLCB0ZXh0dXJlcyk7XG4gICAgICAgIGlmICh0ZXh0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gVGV4dHVyZS5zeW5jVGV4dHVyZXNUb1dvcmtlcih0ZXh0dXJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH0sXG5cbiAgICAvLyBTeW5jIGRldmljZSBwaXhlbCByYXRpbyBmcm9tIG1haW4gdGhyZWFkXG4gICAgdXBkYXRlRGV2aWNlUGl4ZWxSYXRpbyAoZGV2aWNlX3BpeGVsX3JhdGlvKSB7XG4gICAgICAgIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyA9IGRldmljZV9waXhlbF9yYXRpbztcbiAgICB9LFxuXG4gICAgLy8gUHJvZmlsaW5nIGhlbHBlcnNcbiAgICBwcm9maWxlIChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZShgd29ya2VyICR7c2VsZi5fd29ya2VyX2lkfTogJHtuYW1lfWApO1xuICAgIH0sXG5cbiAgICBwcm9maWxlRW5kIChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZUVuZChgd29ya2VyICR7c2VsZi5fd29ya2VyX2lkfTogJHtuYW1lfWApO1xuICAgIH1cblxufSk7XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ3NlbGYnLCBzZWxmKTtcblxufVxuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGZWF0dXJlU2VsZWN0aW9uIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCB3b3JrZXJzKSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy53b3JrZXJzID0gd29ya2VyczsgLy8gcG9vbCBvZiB3b3JrZXJzIHRvIHJlcXVlc3QgZmVhdHVyZSBsb29rLXVwcyBmcm9tLCBrZXllZCBieSBpZFxuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICBpbml0KCkge1xuICAgICAgICAvLyBTZWxlY3Rpb24gc3RhdGUgdHJhY2tpbmdcbiAgICAgICAgdGhpcy5yZXF1ZXN0cyA9IHt9OyAvLyBwZW5kaW5nIHNlbGVjdGlvbiByZXF1ZXN0c1xuICAgICAgICB0aGlzLmZlYXR1cmUgPSBudWxsOyAvLyBjdXJyZW50bHkgc2VsZWN0ZWQgZmVhdHVyZVxuICAgICAgICB0aGlzLnJlYWRfZGVsYXkgPSA1OyAvLyBkZWxheSB0aW1lIGZyb20gc2VsZWN0aW9uIHJlbmRlciB0byBmcmFtZWJ1ZmZlciBzYW1wbGUsIHRvIGF2b2lkIENQVS9HUFUgc3luYyBsb2NrXG4gICAgICAgIHRoaXMucmVhZF9kZWxheV90aW1lciA9IG51bGw7IC8vIGN1cnJlbnQgdGltZXIgKHNldFRpbWVvdXQpIGZvciBkZWxheWVkIHNlbGVjdGlvbiByZWFkc1xuXG4gICAgICAgIHRoaXMucGl4ZWwgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgdGhpcy5waXhlbDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLnBpeGVsLmJ1ZmZlcik7XG5cbiAgICAgICAgLy8gRnJhbWUgYnVmZmVyIGZvciBzZWxlY3Rpb25cbiAgICAgICAgLy8gVE9ETzogaW5pdGlhdGUgbGF6aWx5IGluIGNhc2Ugd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnkgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuZmJvID0gdGhpcy5nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmZibyk7XG4gICAgICAgIHRoaXMuZmJvX3NpemUgPSB7IHdpZHRoOiAyNTYsIGhlaWdodDogMjU2IH07IC8vIFRPRE86IG1ha2UgY29uZmlndXJhYmxlIC8gYWRhcHRpdmUgYmFzZWQgb24gY2FudmFzIHNpemVcbiAgICAgICAgdGhpcy5mYm9fc2l6ZS5hc3BlY3QgPSB0aGlzLmZib19zaXplLndpZHRoIC8gdGhpcy5mYm9fc2l6ZS5oZWlnaHQ7XG5cbiAgICAgICAgLy8gVGV4dHVyZSBmb3IgdGhlIEZCTyBjb2xvciBhdHRhY2htZW50XG4gICAgICAgIHZhciBmYm9fdGV4dHVyZSA9IFRleHR1cmUuY3JlYXRlKCB0aGlzLmdsLCAnc2VsZWN0aW9uX2ZibycsIHsgZmlsdGVyaW5nOiAnbmVhcmVzdCcgfSk7XG4gICAgICAgIGZib190ZXh0dXJlLnNldERhdGEodGhpcy5mYm9fc2l6ZS53aWR0aCwgdGhpcy5mYm9fc2l6ZS5oZWlnaHQsIG51bGwsIHsgZmlsdGVyaW5nOiAnbmVhcmVzdCcgfSk7XG4gICAgICAgIHRoaXMuZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQodGhpcy5nbC5GUkFNRUJVRkZFUiwgdGhpcy5nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgdGhpcy5nbC5URVhUVVJFXzJELCBmYm9fdGV4dHVyZS50ZXh0dXJlLCAwKTtcblxuICAgICAgICAvLyBSZW5kZXJidWZmZXIgZm9yIHRoZSBGQk8gZGVwdGggYXR0YWNobWVudFxuICAgICAgICB2YXIgZmJvX2RlcHRoX3JiID0gdGhpcy5nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcbiAgICAgICAgdGhpcy5nbC5iaW5kUmVuZGVyYnVmZmVyKHRoaXMuZ2wuUkVOREVSQlVGRkVSLCBmYm9fZGVwdGhfcmIpO1xuICAgICAgICB0aGlzLmdsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UodGhpcy5nbC5SRU5ERVJCVUZGRVIsIHRoaXMuZ2wuREVQVEhfQ09NUE9ORU5UMTYsIHRoaXMuZmJvX3NpemUud2lkdGgsIHRoaXMuZmJvX3NpemUuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmdsLkRFUFRIX0FUVEFDSE1FTlQsIHRoaXMuZ2wuUkVOREVSQlVGRkVSLCBmYm9fZGVwdGhfcmIpO1xuXG4gICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmdsICYmIHRoaXMuZmJvKSB7XG4gICAgICAgICAgICB0aGlzLmdsLmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMuZmJvKTtcbiAgICAgICAgICAgIHRoaXMuZmJvID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogZnJlZSB0ZXh0dXJlP1xuICAgIH1cblxuICAgIGJpbmQoKSB7XG4gICAgICAgIC8vIFN3aXRjaCB0byBGQk9cbiAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgdGhpcy5mYm8pO1xuICAgICAgICB0aGlzLmdsLnZpZXdwb3J0KDAsIDAsIHRoaXMuZmJvX3NpemUud2lkdGgsIHRoaXMuZmJvX3NpemUuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBSZXF1ZXN0IGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgLy8gUnVucyBhc3luY2hyb25vdXNseSwgc2NoZWR1bGVzIHNlbGVjdGlvbiBidWZmZXIgdG8gYmUgdXBkYXRlZFxuICAgIGdldEZlYXR1cmVBdChwb2ludCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gUXVldWUgcmVxdWVzdHMgZm9yIGZlYXR1cmUgc2VsZWN0aW9uLCBhbmQgdGhleSB3aWxsIGJlIHBpY2tlZCB1cCBieSB0aGUgcmVuZGVyIGxvb3BcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3JlcXVlc3RfaWQgPSAodGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZCArIDEpIHx8IDA7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RzW3RoaXMuc2VsZWN0aW9uX3JlcXVlc3RfaWRdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdwb2ludCcsXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuc2VsZWN0aW9uX3JlcXVlc3RfaWQsXG4gICAgICAgICAgICAgICAgcG9pbnQsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICByZWplY3RcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFueSBwZW5kaW5nIHNlbGVjdGlvbiByZXF1ZXN0c1xuICAgIHBlbmRpbmdSZXF1ZXN0cygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucmVxdWVzdHMpLmxlbmd0aCAmJiB0aGlzLnJlcXVlc3RzO1xuICAgIH1cblxuICAgIGNsZWFyUGVuZGluZ1JlcXVlc3RzKCkge1xuICAgICAgICBmb3IgKHZhciByIGluIHRoaXMucmVxdWVzdHMpIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0c1tyXTtcblxuICAgICAgICAgICAgLy8gVGhpcyByZXF1ZXN0IHdhcyBhbHJlYWR5IHNlbnQgdG8gdGhlIHdvcmtlciwgd2UncmUganVzdCBhd2FpdGluZyBpdHMgcmVwbHlcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LnNlbnQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVqZWN0IHJlcXVlc3Qgc2luY2UgaXQgd2lsbCBuZXZlciBiZSBmdWxmaWxsZWRcbiAgICAgICAgICAgIC8vIFRPRE86IHBhc3MgYSByZWFzb24gZm9yIHJlamVjdGlvbj9cbiAgICAgICAgICAgIHJlcXVlc3QucmVqZWN0KHsgcmVxdWVzdCB9KTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJlcXVlc3RzW3JdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVhZCBwZW5kaW5nIHJlc3VsdHMgZnJvbSB0aGUgc2VsZWN0aW9uIGJ1ZmZlci4gQ2FsbGVkIGFmdGVyIHJlbmRlcmluZyB0byBzZWxlY3Rpb24gYnVmZmVyLlxuICAgIHJlYWQoKSB7XG4gICAgICAgIC8vIERlbGF5IHJlYWRpbmcgdGhlIHBpeGVsIHJlc3VsdCBmcm9tIHRoZSBzZWxlY3Rpb24gYnVmZmVyIHRvIGF2b2lkIENQVS9HUFUgc3luYyBsb2NrLlxuICAgICAgICAvLyBDYWxsaW5nIHJlYWRQaXhlbHMgc3luY2hyb25vdXNseSBjYXVzZWQgYSBtYXNzaXZlIHBlcmZvcm1hbmNlIGhpdCwgcHJlc3VtYWJseSBzaW5jZSBpdFxuICAgICAgICAvLyBmb3JjZWQgdGhpcyBmdW5jdGlvbiB0byB3YWl0IGZvciB0aGUgR1BVIHRvIGZpbmlzaCByZW5kZXJpbmcgYW5kIHJldHJpZXZlIHRoZSB0ZXh0dXJlIGNvbnRlbnRzLlxuICAgICAgICBpZiAodGhpcy5yZWFkX2RlbGF5X3RpbWVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlYWRfZGVsYXlfdGltZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVhZF9kZWxheV90aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcblxuICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCB0aGlzLmZibyk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIHIgaW4gdGhpcy5yZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0c1tyXTtcblxuICAgICAgICAgICAgICAgIC8vIFRoaXMgcmVxdWVzdCB3YXMgYWxyZWFkeSBzZW50IHRvIHRoZSB3b3JrZXIsIHdlJ3JlIGp1c3QgYXdhaXRpbmcgaXRzIHJlcGx5XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3Quc2VudCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIHNlbGVjdGlvbiB0eXBlcywgc3VjaCBhcyBmZWF0dXJlcyB3aXRoaW4gYSBib3hcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC50eXBlICE9PSAncG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIHNlbGVjdGlvbiBtYXAgYWdhaW5zdCBGQk9cbiAgICAgICAgICAgICAgICBnbC5yZWFkUGl4ZWxzKFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKHJlcXVlc3QucG9pbnQueCAqIHRoaXMuZmJvX3NpemUud2lkdGgpLFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKCgxIC0gcmVxdWVzdC5wb2ludC55KSAqIHRoaXMuZmJvX3NpemUuaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgMSwgMSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgdGhpcy5waXhlbCk7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmVfa2V5ID0gKHRoaXMucGl4ZWxbMF0gKyAodGhpcy5waXhlbFsxXSA8PCA4KSArICh0aGlzLnBpeGVsWzJdIDw8IDE2KSArICh0aGlzLnBpeGVsWzNdIDw8IDI0KSkgPj4+IDA7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBmZWF0dXJlIGZvdW5kLCBhc2sgYXBwcm9wcmlhdGUgd2ViIHdvcmtlciB0byBsb29rdXAgZmVhdHVyZVxuICAgICAgICAgICAgICAgIHZhciB3b3JrZXJfaWQgPSB0aGlzLnBpeGVsWzNdO1xuICAgICAgICAgICAgICAgIGlmICh3b3JrZXJfaWQgIT09IDI1NSkgeyAvLyAyNTUgaW5kaWNhdGVzIGFuIGVtcHR5IHNlbGVjdGlvbiBidWZmZXIgcGl4ZWxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMud29ya2Vyc1t3b3JrZXJfaWRdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtlcnNbd29ya2VyX2lkXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VsZi5nZXRGZWF0dXJlU2VsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiByZXF1ZXN0LmlkLCBrZXk6IGZlYXR1cmVfa2V5IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihtZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaFJlYWQobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBObyBmZWF0dXJlIGZvdW5kLCBidXQgc3RpbGwgbmVlZCB0byByZXNvbHZlIHByb21pc2VcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5pc2hSZWFkKHsgaWQ6IHJlcXVlc3QuaWQsIGZlYXR1cmU6IG51bGwgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVxdWVzdC5zZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcblxuICAgICAgICB9LCB0aGlzLnJlYWRfZGVsYXkpO1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIGEgd2ViIHdvcmtlciBmaW5kcyBhIGZlYXR1cmUgaW4gdGhlIHNlbGVjdGlvbiBidWZmZXJcbiAgICBmaW5pc2hSZWFkIChtZXNzYWdlKSB7XG4gICAgICAgIHZhciByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0c1ttZXNzYWdlLmlkXTtcbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgXCJGZWF0dXJlU2VsZWN0aW9uLmZpbmlzaFJlYWQoKTogY291bGQgbm90IGZpbmQgbWVzc2FnZVwiLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybjsgLy8gcmVxdWVzdCB3YXMgY2xlYXJlZCBiZWZvcmUgaXQgcmV0dXJuZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmZWF0dXJlID0gbWVzc2FnZS5mZWF0dXJlO1xuICAgICAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoKGZlYXR1cmUgIT0gbnVsbCAmJiB0aGlzLmZlYXR1cmUgPT0gbnVsbCkgfHxcbiAgICAgICAgICAgIChmZWF0dXJlID09IG51bGwgJiYgdGhpcy5mZWF0dXJlICE9IG51bGwpIHx8XG4gICAgICAgICAgICAoZmVhdHVyZSAhPSBudWxsICYmIHRoaXMuZmVhdHVyZSAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZmVhdHVyZSkgIT09IEpTT04uc3RyaW5naWZ5KHRoaXMuZmVhdHVyZSkpKSB7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7IC8vIHN0b3JlIHRoZSBtb3N0IHJlY2VudGx5IHNlbGVjdGVkIGZlYXR1cmVcblxuICAgICAgICAvLyBSZXNvbHZlIHRoZSByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3QucmVzb2x2ZSh7IGZlYXR1cmUsIGNoYW5nZWQsIHJlcXVlc3QgfSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnJlcXVlc3RzW21lc3NhZ2UuaWRdOyAvLyBkb25lIHByb2Nlc3NpbmcgdGhpcyByZXF1ZXN0XG4gICAgfVxuXG5cbiAgICAvLyBTZWxlY3Rpb24gbWFwIGdlbmVyYXRpb25cbiAgICAvLyBFYWNoIHdvcmtlciB3aWxsIGNyZWF0ZSBpdHMgb3duIGluZGVwZW5kZW50LCAnbG9jYWwnIHNlbGVjdGlvbiBtYXBcblxuICAgIC8vIENyZWF0ZSBhIHVuaXF1ZSAzMi1iaXQgY29sb3IgdG8gaWRlbnRpZnkgYSBmZWF0dXJlXG4gICAgLy8gV29ya2VycyBpbmRlcGVuZGVudGx5IGNyZWF0ZS9tb2RpZnkgc2VsZWN0aW9uIGNvbG9ycyBpbiB0aGVpciBvd24gdGhyZWFkcywgYnV0IHdlIGFsc29cbiAgICAvLyBuZWVkIHRoZSBtYWluIHRocmVhZCB0byBrbm93IHdoZXJlIGVhY2ggZmVhdHVyZSBjb2xvciBvcmlnaW5hdGVkLiBUbyBhY2NvbXBsaXNoIHRoaXMsXG4gICAgLy8gd2UgcGFydGl0aW9uIHRoZSBtYXAgYnkgc2V0dGluZyB0aGUgNHRoIGNvbXBvbmVudCAoYWxwaGEgY2hhbm5lbCkgdG8gdGhlIHdvcmtlcidzIGlkLlxuICAgIHN0YXRpYyBtYWtlRW50cnkodGlsZSkge1xuICAgICAgICAvLyAzMi1iaXQgY29sb3Iga2V5XG4gICAgICAgIHRoaXMubWFwX2VudHJ5Kys7XG4gICAgICAgIHZhciBpciA9IHRoaXMubWFwX2VudHJ5ICYgMjU1O1xuICAgICAgICB2YXIgaWcgPSAodGhpcy5tYXBfZW50cnkgPj4gOCkgJiAyNTU7XG4gICAgICAgIHZhciBpYiA9ICh0aGlzLm1hcF9lbnRyeSA+PiAxNikgJiAyNTU7XG4gICAgICAgIHZhciBpYSA9IHRoaXMubWFwX3ByZWZpeDtcbiAgICAgICAgdmFyIHIgPSBpciAvIDI1NTtcbiAgICAgICAgdmFyIGcgPSBpZyAvIDI1NTtcbiAgICAgICAgdmFyIGIgPSBpYiAvIDI1NTtcbiAgICAgICAgdmFyIGEgPSBpYSAvIDI1NTtcbiAgICAgICAgdmFyIGtleSA9IChpciArIChpZyA8PCA4KSArIChpYiA8PCAxNikgKyAoaWEgPDwgMjQpKSA+Pj4gMDsgLy8gbmVlZCB1bnNpZ25lZCByaWdodCBzaGlmdCB0byBjb252ZXJ0IHRvIHBvc2l0aXZlICNcblxuICAgICAgICB0aGlzLm1hcFtrZXldID0ge1xuICAgICAgICAgICAgY29sb3I6IFtyLCBnLCBiLCBhXSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5tYXBfc2l6ZSsrO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGlsZS1zcGVjaWZpYyB0cmFja2luZyBpbmZvXG4gICAgICAgIGlmICghdGhpcy50aWxlc1t0aWxlLmtleV0pIHtcbiAgICAgICAgICAgIHRoaXMudGlsZXNbdGlsZS5rZXldID0ge1xuICAgICAgICAgICAgICAgIGVudHJpZXM6IFtdLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBvZiBmZWF0dXJlIGVudHJpZXMgaW4gdGhpcyB0aHJlYWRcbiAgICAgICAgICAgICAgICB0aWxlOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWJzZXQgb2YgdGlsZSBwcm9wZXJ0aWVzIHRvIHBhc3MgYmFjayB3aXRoIGZlYXR1cmVcbiAgICAgICAgICAgICAgICAgICAga2V5OiB0aWxlLmtleSxcbiAgICAgICAgICAgICAgICAgICAgY29vcmRzOiB0aWxlLmNvb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVfem9vbTogdGlsZS5zdHlsZV96b29tLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHRpbGUuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uOiB0aWxlLmdlbmVyYXRpb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aWxlc1t0aWxlLmtleV0uZW50cmllcy5wdXNoKGtleSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubWFwW2tleV07XG4gICAgfVxuXG4gICAgc3RhdGljIG1ha2VDb2xvcihmZWF0dXJlLCB0aWxlLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBzZWxlY3RvciA9IHRoaXMubWFrZUVudHJ5KHRpbGUpO1xuICAgICAgICBzZWxlY3Rvci5mZWF0dXJlID0ge1xuICAgICAgICAgICAgaWQ6IGZlYXR1cmUuaWQsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBzb3VyY2VfbmFtZTogY29udGV4dC5zb3VyY2UsXG4gICAgICAgICAgICBzb3VyY2VfbGF5ZXI6IGNvbnRleHQubGF5ZXIsXG4gICAgICAgICAgICBsYXllcnM6IGNvbnRleHQubGF5ZXJzLFxuICAgICAgICAgICAgdGlsZTogdGhpcy50aWxlc1t0aWxlLmtleV0udGlsZVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBzZWxlY3Rvci5jb2xvcjtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMudGlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5tYXAgPSB7fTtcbiAgICAgICAgdGhpcy5tYXBfc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMubWFwX2VudHJ5ID0gMDtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYXJUaWxlKGtleSkge1xuICAgICAgICBpZiAodGhpcy50aWxlc1trZXldKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVzW2tleV0uZW50cmllcy5mb3JFYWNoKGsgPT4gZGVsZXRlIHRoaXMubWFwW2tdKTtcbiAgICAgICAgICAgIHRoaXMubWFwX3NpemUgLT0gdGhpcy50aWxlc1trZXldLmVudHJpZXMubGVuZ3RoO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMudGlsZXNba2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRNYXBTaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBfc2l6ZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgc2V0UHJlZml4KHByZWZpeCkge1xuICAgICAgICB0aGlzLm1hcF9wcmVmaXggPSBwcmVmaXg7XG4gICAgfVxuXG59XG5cbi8vIFN0YXRpYyBwcm9wZXJ0aWVzXG5GZWF0dXJlU2VsZWN0aW9uLm1hcCA9IHt9OyAgIC8vIHRoaXMgd2lsbCBiZSB1bmlxdWUgcGVyIG1vZHVsZSBpbnN0YW5jZSAoc28gdW5pcXVlIHBlciB3b3JrZXIpXG5GZWF0dXJlU2VsZWN0aW9uLnRpbGVzID0ge307IC8vIHNlbGVjdGlvbiBrZXlzLCBieSB0aWxlXG5GZWF0dXJlU2VsZWN0aW9uLm1hcF9zaXplID0gMDtcbkZlYXR1cmVTZWxlY3Rpb24ubWFwX2VudHJ5ID0gMDtcbkZlYXR1cmVTZWxlY3Rpb24ubWFwX3ByZWZpeCA9IDA7IC8vIHNldCBieSB3b3JrZXIgdG8gd29ya2VyIGlkICNcbkZlYXR1cmVTZWxlY3Rpb24uZGVmYXVsdENvbG9yID0gWzAsIDAsIDAsIDFdO1xuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlICovXG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5pbXBvcnQge01ldGhvZE5vdEltcGxlbWVudGVkfSBmcm9tICcuLi91dGlscy9lcnJvcnMnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCAqIGFzIFVSTHMgZnJvbSAnLi4vdXRpbHMvdXJscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGFTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3IgKGNvbmZpZywgc291cmNlcykge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsgLy8gc2F2ZSBvcmlnaW5hbCBjb25maWdcbiAgICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlczsgLy8gZnVsbCBzZXQgb2YgZGF0YSBzb3VyY2VzIFRPRE86IGNlbnRyYWxpemUgdGhlc2UgbGlrZSB0ZXh0dXJlcz9cbiAgICAgICAgdGhpcy5pZCA9IGNvbmZpZy5pZDtcbiAgICAgICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgICAgIHRoaXMucGFkX3NjYWxlID0gY29uZmlnLnBhZF9zY2FsZSB8fCAwLjAwMDE7IC8vIHNjYWxlIHRpbGUgdXAgYnkgc21hbGwgZmFjdG9yIHRvIGNvdmVyIHNlYW1zXG4gICAgICAgIHRoaXMuZGVmYXVsdF93aW5kaW5nID0gbnVsbDsgLy8gd2luZGluZyBvcmRlciB3aWxsIGFkYXB0IHRvIGRhdGEgc291cmNlXG4gICAgICAgIHRoaXMucmFzdGVycyA9IFtdOyAvLyBhdHRhY2hlZCByYXN0ZXIgdGlsZSBzb3VyY2VzXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5yYXN0ZXJzKSkgeyAvLyBjb3B5IHVuaXF1ZSBzZXQgb2YgcmFzdGVyIHNvdXJjZXNcbiAgICAgICAgICAgIGNvbmZpZy5yYXN0ZXJzLmZvckVhY2gociA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmFzdGVycy5pbmRleE9mKHIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJhc3RlcnMucHVzaChyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSBzb3VyY2UgZGF0YVxuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IGNvbmZpZy50cmFuc2Zvcm07XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLmJpbmQodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCBhZGRpdGlvbmFsIGRhdGEgdG8gcGFzcyB0byB0aGUgdHJhbnNmb3JtIGZ1bmN0aW9uXG4gICAgICAgIHRoaXMuZXh0cmFfZGF0YSA9IGNvbmZpZy5leHRyYV9kYXRhO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgc2NyaXB0cyBtYWRlIGF2YWlsYWJsZSB0byB0aGUgdHJhbnNmb3JtIGZ1bmN0aW9uXG4gICAgICAgIC8vIE5PVEU6IHRoZXNlIGFyZSBsb2FkZWQgYWxvbmdzaWRlIHRoZSBsaWJyYXJ5IHdoZW4gdGhlIHdvcmtlcnMgYXJlIGluc3RhbnRpYXRlZFxuICAgICAgICB0aGlzLnNjcmlwdHMgPSBjb25maWcuc2NyaXB0cztcblxuICAgICAgICAvLyBvdmVyem9vbSB3aWxsIGFwcGx5IGZvciB6b29tcyBoaWdoZXIgdGhhbiB0aGlzXG4gICAgICAgIHRoaXMubWF4X3pvb20gPSAoY29uZmlnLm1heF96b29tICE9IG51bGwpID8gY29uZmlnLm1heF96b29tIDogR2VvLmRlZmF1bHRfc291cmNlX21heF96b29tO1xuXG4gICAgICAgIC8vIG5vIHRpbGVzIHdpbGwgYmUgcmVxdWVzdGVkIG9yIGRpc3BsYXllZCBvdXRzaWRlIG9mIHRoZXNlIG1pbi9tYXggdmFsdWVzXG4gICAgICAgIHRoaXMubWluX2Rpc3BsYXlfem9vbSA9IChjb25maWcubWluX2Rpc3BsYXlfem9vbSAhPSBudWxsKSA/IGNvbmZpZy5taW5fZGlzcGxheV96b29tIDogMDtcbiAgICAgICAgdGhpcy5tYXhfZGlzcGxheV96b29tID0gKGNvbmZpZy5tYXhfZGlzcGxheV96b29tICE9IG51bGwpID8gY29uZmlnLm1heF9kaXNwbGF5X3pvb20gOiBudWxsO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIHRpbGUgc291cmNlIGJ5IHR5cGUsIGZhY3Rvcnktc3R5bGVcbiAgICBzdGF0aWMgY3JlYXRlIChzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgaWYgKERhdGFTb3VyY2UudHlwZXNbc291cmNlLnR5cGVdKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGFTb3VyY2UudHlwZXNbc291cmNlLnR5cGVdKHNvdXJjZSwgc291cmNlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBhIGRhdGEgc291cmNlIGRlZmluaXRpb24gY2hhbmdlZFxuICAgIHN0YXRpYyBjaGFuZ2VkIChzb3VyY2UsIHByZXZfc291cmNlKSB7XG4gICAgICAgIGlmICghc291cmNlIHx8ICFwcmV2X3NvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3VyID0gT2JqZWN0LmFzc2lnbih7fSwgc291cmNlLmNvbmZpZywgeyBpZDogbnVsbCB9KTsgLy8gbnVsbCBvdXQgaWRzIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gY29tcGFyZSB0aGVtXG4gICAgICAgIGxldCBwcmV2ID0gT2JqZWN0LmFzc2lnbih7fSwgcHJldl9zb3VyY2UuY29uZmlnLCB7IGlkOiBudWxsIH0pO1xuXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShjdXIpICE9PSBKU09OLnN0cmluZ2lmeShwcmV2KTtcbiAgICB9XG5cbiAgICAvLyBNZXJjYXRvciBwcm9qZWN0aW9uXG4gICAgc3RhdGljIHByb2plY3REYXRhIChzb3VyY2UpIHtcbiAgICAgICAgdmFyIHRpbWVyID0gK25ldyBEYXRlKCk7XG4gICAgICAgIGZvciAodmFyIHQgaW4gc291cmNlLmxheWVycykge1xuICAgICAgICAgICAgdmFyIG51bV9mZWF0dXJlcyA9IHNvdXJjZS5sYXllcnNbdF0uZmVhdHVyZXMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICh2YXIgZj0wOyBmIDwgbnVtX2ZlYXR1cmVzOyBmKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZSA9IHNvdXJjZS5sYXllcnNbdF0uZmVhdHVyZXNbZl07XG4gICAgICAgICAgICAgICAgR2VvLnRyYW5zZm9ybUdlb21ldHJ5KGZlYXR1cmUuZ2VvbWV0cnksIGNvb3JkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIFt4LCB5XSA9IEdlby5sYXRMbmdUb01ldGVycyhjb29yZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvb3JkWzBdID0geDtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSB5O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNvdXJjZS5kZWJ1ZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzb3VyY2UuZGVidWcucHJvamVjdGlvbiA9ICtuZXcgRGF0ZSgpIC0gdGltZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgUmUtc2NhbGUgZ2VvbWV0cmllcyB3aXRoaW4gZWFjaCBzb3VyY2UgdG8gaW50ZXJuYWwgdGlsZSB1bml0c1xuICAgICovXG4gICAgc3RhdGljIHNjYWxlRGF0YSAoc291cmNlLCB7Y29vcmRzOiB7en0sIG1pbiwgbWF4fSkge1xuICAgICAgICBsZXQgdW5pdHNfcGVyX21ldGVyID0gR2VvLnVuaXRzUGVyTWV0ZXIoeik7XG4gICAgICAgIGZvciAodmFyIHQgaW4gc291cmNlLmxheWVycykge1xuICAgICAgICAgICAgdmFyIG51bV9mZWF0dXJlcyA9IHNvdXJjZS5sYXllcnNbdF0uZmVhdHVyZXMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICh2YXIgZj0wOyBmIDwgbnVtX2ZlYXR1cmVzOyBmKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZSA9IHNvdXJjZS5sYXllcnNbdF0uZmVhdHVyZXNbZl07XG4gICAgICAgICAgICAgICAgR2VvLnRyYW5zZm9ybUdlb21ldHJ5KGZlYXR1cmUuZ2VvbWV0cnksIGNvb3JkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMF0gPSAoY29vcmRbMF0gLSBtaW4ueCkgKiB1bml0c19wZXJfbWV0ZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvb3JkWzFdID0gKGNvb3JkWzFdIC0gbWluLnkpICogdW5pdHNfcGVyX21ldGVyICogLTE7IC8vIGZsaXAgY29vcmRzIHBvc2l0aXZlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKGRlc3QpIHtcbiAgICAgICAgZGVzdC5zb3VyY2VfZGF0YSA9IHt9O1xuICAgICAgICBkZXN0LnNvdXJjZV9kYXRhLmxheWVycyA9IHt9O1xuICAgICAgICBkZXN0LnBhZF9zY2FsZSA9IHRoaXMucGFkX3NjYWxlO1xuICAgICAgICBkZXN0LnJhc3RlcnMgPSBbLi4udGhpcy5yYXN0ZXJzXTsgLy8gY29weSBsaXN0IG9mIHJhc3RlcnMgdG8gbG9hZCBmb3IgdGlsZVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkKGRlc3QpLnRoZW4oKGRlc3QpID0+IHtcbiAgICAgICAgICAgIC8vIFBvc3QtcHJvY2Vzc2luZ1xuICAgICAgICAgICAgZm9yIChsZXQgbGF5ZXIgaW4gZGVzdC5zb3VyY2VfZGF0YS5sYXllcnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGRlc3Quc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuZmVhdHVyZXMuZm9yRWFjaChmZWF0dXJlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEdlby50cmFuc2Zvcm1HZW9tZXRyeShmZWF0dXJlLmdlb21ldHJ5LCBjb29yZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmxpcCBZIGNvb3Jkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWzFdID0gLWNvb3JkWzFdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2xpZ2h0bHkgc2NhbGUgdXAgdGlsZSB0byBjb3ZlciBzZWFtc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhZF9zY2FsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZFswXSA9IE1hdGgucm91bmQoY29vcmRbMF0gKiAoMSArIHRoaXMucGFkX3NjYWxlKSAtIChHZW8udGlsZV9zY2FsZSAqIHRoaXMucGFkX3NjYWxlLzIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSBNYXRoLnJvdW5kKGNvb3JkWzFdICogKDEgKyB0aGlzLnBhZF9zY2FsZSkgLSAoR2VvLnRpbGVfc2NhbGUgKiB0aGlzLnBhZF9zY2FsZS8yKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBmaXJzdCBlbmNvdW50ZXJlZCBwb2x5Z29uIHdpbmRpbmcgb3JkZXIgYXMgZGVmYXVsdCBmb3IgZGF0YSBzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGVmYXVsdFdpbmRpbmcoZmVhdHVyZS5nZW9tZXRyeSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVzdC5kZWZhdWx0X3dpbmRpbmcgPSB0aGlzLmRlZmF1bHRfd2luZGluZyB8fCAnQ0NXJztcbiAgICAgICAgICAgIHJldHVybiBkZXN0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTdWItY2xhc3NlcyBtdXN0IGltcGxlbWVudFxuICAgIF9sb2FkKGRlc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkKCdfbG9hZCcpO1xuICAgIH1cblxuICAgIC8vIEluZmVyIHdpbmRpbmcgZm9yIGRhdGEgc291cmNlIGZyb20gZmlyc3QgcmluZyBvZiBwcm92aWRlZCBnZW9tZXRyeVxuICAgIHVwZGF0ZURlZmF1bHRXaW5kaW5nIChnZW9tKSB7XG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRfd2luZGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZ2VvbS50eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRfd2luZGluZyA9IEdlby5yaW5nV2luZGluZyhnZW9tLmNvb3JkaW5hdGVzWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGdlb20udHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRfd2luZGluZyA9IEdlby5yaW5nV2luZGluZyhnZW9tLmNvb3JkaW5hdGVzWzBdWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0X3dpbmRpbmc7XG4gICAgfVxuXG4gICAgLy8gQWxsIGRhdGEgc291cmNlcyBzdXBwb3J0IGEgbWluIHpvb20sIHRpbGVkIHNvdXJjZXMgY2FuIHN1YmNsYXNzIGZvciBtb3JlIHNwZWNpZmljIGxpbWl0cyAoZS5nLiBib3VuZGluZyBib3gpXG4gICAgaW5jbHVkZXNUaWxlIChjb29yZHMsIHN0eWxlX3pvb20pIHtcbiAgICAgICAgLy8gTGltaXQgYnkgdGhpcyBkYXRhIHNvdXJjZVxuICAgICAgICBpZiAoY29vcmRzLnogPCB0aGlzLm1pbl9kaXNwbGF5X3pvb20gfHwgKHRoaXMubWF4X2Rpc3BsYXlfem9vbSAhPSBudWxsICYmIHN0eWxlX3pvb20gPiB0aGlzLm1heF9kaXNwbGF5X3pvb20pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMaW1pdCBieSBhbnkgZGVwZW5kZW50IHJhc3RlciBzb3VyY2VzXG4gICAgICAgIGZvciAobGV0IHI9MDsgciA8IHRoaXMucmFzdGVycy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlX25hbWUgPSB0aGlzLnJhc3RlcnNbcl07XG4gICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VzW3NvdXJjZV9uYW1lXSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlc1tzb3VyY2VfbmFtZV0gIT09IHRoaXMgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5zb3VyY2VzW3NvdXJjZV9uYW1lXS5pbmNsdWRlc1RpbGUoY29vcmRzLCBjb29yZHMueikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBhIG5ldyBkYXRhIHNvdXJjZSB0eXBlLCB1bmRlciBhIHR5cGUgbmFtZVxuICAgIHN0YXRpYyByZWdpc3Rlcih0eXBlX2NsYXNzLCB0eXBlX25hbWUpIHtcbiAgICAgICAgaWYgKCF0eXBlX2NsYXNzIHx8ICF0eXBlX25hbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIERhdGFTb3VyY2UudHlwZXNbdHlwZV9uYW1lXSA9IHR5cGVfY2xhc3M7XG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UudHlwZXMgPSB7fTsgLy8gc2V0IG9mIHN1cHBvcnRlZCBkYXRhIHNvdXJjZSBjbGFzc2VzLCByZWZlcmVuY2VkIGJ5IHR5cGUgbmFtZVxuXG5cbi8qKiogR2VuZXJpYyBuZXR3b3JrIGxvYWRpbmcgc291cmNlIC0gYWJzdHJhY3QgY2xhc3MgKioqL1xuXG5sZXQgbmV0d29ya19yZXF1ZXN0X2lkID0gMDsgLy8gdXNlZCB0byBuYW1lc3BhY2UgVVJMIHJlcXVlc3RzXG5cbmV4cG9ydCBjbGFzcyBOZXR3b3JrU291cmNlIGV4dGVuZHMgRGF0YVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG4gICAgICAgIHRoaXMudXJsID0gVVJMcy5hZGRQYXJhbXNUb1VSTChzb3VyY2UudXJsLCBzb3VyY2UudXJsX3BhcmFtcyk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VfdHlwZSA9IFwiXCI7IC8vIHVzZSB0byBzZXQgZXhwbGljaXQgWEhSIHR5cGVcblxuICAgICAgICBpZiAodGhpcy51cmwgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ05ldHdvcmsgZGF0YSBzb3VyY2UgbXVzdCBwcm92aWRlIGEgYHVybGAgcHJvcGVydHknKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9sb2FkIChkZXN0KSB7XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLmZvcm1hdFVybCh0aGlzLnVybCwgZGVzdCk7XG5cbiAgICAgICAgbGV0IHNvdXJjZV9kYXRhID0gZGVzdC5zb3VyY2VfZGF0YTtcbiAgICAgICAgc291cmNlX2RhdGEudXJsID0gdXJsO1xuICAgICAgICBkZXN0LmRlYnVnID0gZGVzdC5kZWJ1ZyB8fCB7fTtcbiAgICAgICAgZGVzdC5kZWJ1Zy5uZXR3b3JrID0gK25ldyBEYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNvdXJjZV9kYXRhLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIC8vIEZvciB0ZXN0aW5nIG5ldHdvcmsgZXJyb3JzXG4gICAgICAgICAgICAvLyB2YXIgcHJvbWlzZSA9IFV0aWxzLmlvKHVybCwgNjAgKiAxMDAsIHRoaXMucmVzcG9uc2VfdHlwZSk7XG4gICAgICAgICAgICAvLyBpZiAoTWF0aC5yYW5kb20oKSA8IC43KSB7XG4gICAgICAgICAgICAvLyAgICAgcHJvbWlzZSA9IFByb21pc2UucmVqZWN0KEVycm9yKCdmYWtlIGRhdGEgc291cmNlIGVycm9yJykpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgLy8gcHJvbWlzZS50aGVuKChib2R5KSA9PiB7XG5cbiAgICAgICAgICAgIGxldCByZXF1ZXN0X2lkID0gKG5ldHdvcmtfcmVxdWVzdF9pZCsrKSArICctJyArIHVybDtcbiAgICAgICAgICAgIGxldCBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMDAsIHRoaXMucmVzcG9uc2VfdHlwZSwgJ0dFVCcsIHt9LCByZXF1ZXN0X2lkKTtcbiAgICAgICAgICAgIHNvdXJjZV9kYXRhLnJlcXVlc3RfaWQgPSByZXF1ZXN0X2lkO1xuXG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICBkZXN0LmRlYnVnLnJlc3BvbnNlX3NpemUgPSBib2R5Lmxlbmd0aCB8fCBib2R5LmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5uZXR3b3JrID0gK25ldyBEYXRlKCkgLSBkZXN0LmRlYnVnLm5ldHdvcms7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5wYXJzaW5nID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZVNvdXJjZURhdGEoZGVzdCwgc291cmNlX2RhdGEsIGJvZHkpO1xuICAgICAgICAgICAgICAgIGRlc3QuZGVidWcucGFyc2luZyA9ICtuZXcgRGF0ZSgpIC0gZGVzdC5kZWJ1Zy5wYXJzaW5nO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGVzdCk7XG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfZGF0YS5lcnJvciA9IGVycm9yLnN0YWNrO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGVzdCk7IC8vIHJlc29sdmUgcmVxdWVzdCBidXQgcGFzcyBhbG9uZyBlcnJvclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN1Yi1jbGFzc2VzIG11c3QgaW1wbGVtZW50OlxuXG4gICAgZm9ybWF0VXJsICh1cmxfdGVtcGxhdGUsIGRlc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkKCdmb3JtYXRVcmwnKTtcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKGRlc3QsIHNvdXJjZSwgcmVwb25zZSkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ3BhcnNlU291cmNlRGF0YScpO1xuICAgIH1cbn1cblxuXG4vKioqIEdlbmVyaWMgbmV0d29yayB0aWxlIGxvYWRpbmcgLSBhYnN0cmFjdCBjbGFzcyAqKiovXG5cbmV4cG9ydCBjbGFzcyBOZXR3b3JrVGlsZVNvdXJjZSBleHRlbmRzIE5ldHdvcmtTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3IgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuXG4gICAgICAgIHRoaXMudGlsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhcnNlQm91bmRzKHNvdXJjZSk7XG5cbiAgICAgICAgLy8gaW5kaWNhdGVzIGlmIHNvdXJjZSBzaG91bGQgYnVpbGQgZ2VvbWV0cnkgdGlsZXMsIGVuYWJsZWQgZm9yIHNvdXJjZXMgcmVmZXJlbmNlZCBpbiB0aGUgc2NlbmUncyBsYXllcnMsXG4gICAgICAgIC8vIGFuZCBsZWZ0IGRpc2FibGVkIGZvciBzb3VyY2VzIHRoYXQgYXJlIG5ldmVyIHJlZmVyZW5jZWQsIG9yIG9ubHkgdXNlZCBhcyByYXN0ZXIgdGV4dHVyZXNcbiAgICAgICAgdGhpcy5idWlsZHNfZ2VvbWV0cnlfdGlsZXMgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnRtcyA9IChzb3VyY2UudG1zID09PSB0cnVlKTsgLy8gb3B0aW9uYWxseSBmbGlwIHRpbGUgY29vcmRzIGZvciBUTVNcbiAgICAgICAgdGhpcy51cmxfaG9zdHMgPSBudWxsO1xuICAgICAgICB2YXIgaG9zdF9tYXRjaCA9IHRoaXMudXJsLm1hdGNoKC97czpcXFsoW159K10rKVxcXX0vKTtcbiAgICAgICAgaWYgKGhvc3RfbWF0Y2ggIT0gbnVsbCAmJiBob3N0X21hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMudXJsX2hvc3RzID0gaG9zdF9tYXRjaFsxXS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgdGhpcy5uZXh0X2hvc3QgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IGJvdW5kcyBmcm9tIHNvdXJjZSBjb25maWcgcGFyYW1ldGVyc1xuICAgIHBhcnNlQm91bmRzIChzb3VyY2UpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlLmJvdW5kcykgJiYgc291cmNlLmJvdW5kcy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzID0gc291cmNlLmJvdW5kcztcbiAgICAgICAgICAgIGxldCBbdywgcywgZSwgbl0gPSB0aGlzLmJvdW5kcztcbiAgICAgICAgICAgIHRoaXMuYm91bmRzX21ldGVycyA9IHtcbiAgICAgICAgICAgICAgICBtaW46IEdlby5sYXRMbmdUb01ldGVycyhbdywgbl0pLFxuICAgICAgICAgICAgICAgIG1heDogR2VvLmxhdExuZ1RvTWV0ZXJzKFtlLCBzXSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNfdGlsZXMgPSB7IG1pbjoge30sIG1heDoge30gfTsgLy8gbWF4IHRpbGUgYm91bmRzIHBlciB6b29tIChsYXppbHkgZXZhbHVhdGVkKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aWxlIGlzIG91dHNpZGUgZGF0YSBzb3VyY2UncyBib3VuZHMsIHRydWUgaWYgd2l0aGluXG4gICAgY2hlY2tCb3VuZHMgKGNvb3Jkcykge1xuICAgICAgICAvLyBDaGVjayB0aWxlIGJvdW5kc1xuICAgICAgICBpZiAodGhpcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIGNvb3JkcyA9IEdlby53cmFwVGlsZShjb29yZHMsIHsgeDogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgbGV0IG1pbiA9IHRoaXMuYm91bmRzX3RpbGVzLm1pbltjb29yZHMuel07XG4gICAgICAgICAgICBpZiAoIW1pbikge1xuICAgICAgICAgICAgICAgIG1pbiA9IHRoaXMuYm91bmRzX3RpbGVzLm1pbltjb29yZHMuel0gPSBHZW8udGlsZUZvck1ldGVycyh0aGlzLmJvdW5kc19tZXRlcnMubWluLCBjb29yZHMueik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBtYXggPSB0aGlzLmJvdW5kc190aWxlcy5tYXhbY29vcmRzLnpdO1xuICAgICAgICAgICAgaWYgKCFtYXgpIHtcbiAgICAgICAgICAgICAgICBtYXggPSB0aGlzLmJvdW5kc190aWxlcy5tYXhbY29vcmRzLnpdID0gR2VvLnRpbGVGb3JNZXRlcnModGhpcy5ib3VuZHNfbWV0ZXJzLm1heCwgY29vcmRzLnopO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29vcmRzLnggPCBtaW4ueCB8fCBjb29yZHMueCA+IG1heC54IHx8XG4gICAgICAgICAgICAgICAgY29vcmRzLnkgPCBtaW4ueSB8fCBjb29yZHMueSA+IG1heC55KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGluY2x1ZGVzVGlsZSAoY29vcmRzLCBzdHlsZV96b29tKSB7XG4gICAgICAgIGlmICghc3VwZXIuaW5jbHVkZXNUaWxlKGNvb3Jkcywgc3R5bGVfem9vbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRpbGUgYm91bmRzXG4gICAgICAgIGlmICghdGhpcy5jaGVja0JvdW5kcyhjb29yZHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9ybWF0VXJsKHVybF90ZW1wbGF0ZSwgdGlsZSkge1xuICAgICAgICBsZXQgY29vcmRzID0gR2VvLndyYXBUaWxlKHRpbGUuY29vcmRzLCB7IHg6IHRydWUgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMudG1zKSB7XG4gICAgICAgICAgICBjb29yZHMueSA9IE1hdGgucG93KDIsIGNvb3Jkcy56KSAtIDEgLSBjb29yZHMueTsgLy8gb3B0aW9uYWxseSBmbGlwIHRpbGUgY29vcmRzIGZvciBUTVNcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB1cmwgPSB1cmxfdGVtcGxhdGUucmVwbGFjZSgne3h9JywgY29vcmRzLngpLnJlcGxhY2UoJ3t5fScsIGNvb3Jkcy55KS5yZXBsYWNlKCd7en0nLCBjb29yZHMueik7XG5cbiAgICAgICAgaWYgKHRoaXMudXJsX2hvc3RzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKC97czpcXFsoW159K10rKVxcXX0vLCB0aGlzLnVybF9ob3N0c1t0aGlzLm5leHRfaG9zdF0pO1xuICAgICAgICAgICAgdGhpcy5uZXh0X2hvc3QgPSAodGhpcy5uZXh0X2hvc3QgKyAxKSAlIHRoaXMudXJsX2hvc3RzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cblxuICAgIC8vIENoZWNrcyBmb3IgdGhlIHgveS96IHRpbGUgcGF0dGVybiBpbiBVUkwgdGVtcGxhdGVcbiAgICB1cmxIYXNUaWxlUGF0dGVybih1cmwpIHtcbiAgICAgICAgcmV0dXJuIHVybCAmJlxuICAgICAgICAgICAgdXJsLnNlYXJjaCgne3h9JykgPiAtMSAmJlxuICAgICAgICAgICAgdXJsLnNlYXJjaCgne3l9JykgPiAtMSAmJlxuICAgICAgICAgICAgdXJsLnNlYXJjaCgne3p9JykgPiAtMTtcbiAgICB9XG5cbn1cbiIsImltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBEYXRhU291cmNlLCB7TmV0d29ya1NvdXJjZSwgTmV0d29ya1RpbGVTb3VyY2V9IGZyb20gJy4vZGF0YV9zb3VyY2UnO1xuaW1wb3J0IHtkZWNvZGVNdWx0aVBvbHlnb259IGZyb20gJy4vbXZ0JztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuLy8gRm9yIHRpbGluZyBHZW9KU09OIGNsaWVudC1zaWRlXG5pbXBvcnQgZ2VvanNvbnZ0IGZyb20gJ2dlb2pzb24tdnQnO1xuXG4vKipcbiBHZW9KU09OIHN0YW5kYWxvbmUgKG5vbi10aWxlZCkgc291cmNlXG4gVXNlcyBnZW9qc29uLXZ0IHNwbGl0IGludG8gdGlsZXMgY2xpZW50LXNpZGVcbiovXG5cbmV4cG9ydCBjbGFzcyBHZW9KU09OU291cmNlIGV4dGVuZHMgTmV0d29ya1NvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgdGhpcy5sb2FkX2RhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLnRpbGVfaW5kZXhlcyA9IHt9OyAvLyBnZW9qc29uLXZ0IHRpbGUgaW5kaWNlcywgYnkgbGF5ZXIgbmFtZVxuICAgICAgICB0aGlzLm1heF96b29tID0gTWF0aC5tYXgodGhpcy5tYXhfem9vbSB8fCAwLCAxNSk7IC8vIFRPRE86IG1heCB6b29tIDwgMTUgY2F1c2VzIGFydGlmYWN0cy9uby1kcmF3IGF0IDIwLCBpbnZlc3RpZ2F0ZVxuICAgICAgICB0aGlzLnBhZF9zY2FsZSA9IDA7IC8vIHdlIGRvbid0IHdhbnQgcGFkZGluZyBvbiBhdXRvLXRpbGVkIHNvdXJjZXNcbiAgICB9XG5cbiAgICBfbG9hZChkZXN0KSB7XG4gICAgICAgIGlmICghdGhpcy5sb2FkX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZF9kYXRhID0gc3VwZXIuX2xvYWQoeyBzb3VyY2VfZGF0YTogeyBsYXllcnM6IHt9IH0gfSkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAvLyBXYXJuIGFuZCBjb250aW51ZSBvbiBkYXRhIHNvdXJjZSBlcnJvclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLnNvdXJjZV9kYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBkYXRhIHNvdXJjZSBsb2FkIGVycm9yKHMpIGZvciBzb3VyY2UgJyR7dGhpcy5uYW1lfScsIFVSTCAnJHt0aGlzLnVybH0nOiAke2RhdGEuc291cmNlX2RhdGEuZXJyb3J9YCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGxheWVycyA9IGRhdGEuc291cmNlX2RhdGEubGF5ZXJzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGxheWVyX25hbWUgaW4gbGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlsZV9pbmRleGVzW2xheWVyX25hbWVdID0gZ2VvanNvbnZ0KGxheWVyc1tsYXllcl9uYW1lXSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXhfem9vbSwgIC8vIG1heCB6b29tIHRvIHByZXNlcnZlIGRldGFpbCBvblxuICAgICAgICAgICAgICAgICAgICAgICAgdG9sZXJhbmNlOiAzLCAvLyBzaW1wbGlmaWNhdGlvbiB0b2xlcmFuY2UgKGhpZ2hlciBtZWFucyBzaW1wbGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50OiBHZW8udGlsZV9zY2FsZSwgLy8gdGlsZSBleHRlbnQgKGJvdGggd2lkdGggYW5kIGhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogMC4wMDAxICAgICAvLyB0aWxlIGJ1ZmZlciBvbiBlYWNoIHNpZGVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkX2RhdGEudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBsYXllcl9uYW1lIGluIHRoaXMudGlsZV9pbmRleGVzKSB7XG4gICAgICAgICAgICAgICAgZGVzdC5zb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJfbmFtZV0gPSB0aGlzLmdldFRpbGVGZWF0dXJlcyhkZXN0LCBsYXllcl9uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZXN0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRUaWxlRmVhdHVyZXModGlsZSwgbGF5ZXJfbmFtZSkge1xuICAgICAgICBsZXQgY29vcmRzID0gR2VvLndyYXBUaWxlKHRpbGUuY29vcmRzLCB7IHg6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCBhIHBhcnRpY3VsYXIgdGlsZVxuICAgICAgICBsZXQgdCA9IHRoaXMudGlsZV9pbmRleGVzW2xheWVyX25hbWVdLmdldFRpbGUoY29vcmRzLnosIGNvb3Jkcy54LCBjb29yZHMueSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBmcm9tIE1WVC1zdHlsZSBKU09OIHN0cnVjdCB0byBHZW9KU09OXG4gICAgICAgIGxldCBjb2xsZWN0aW9uO1xuICAgICAgICBpZiAodCAmJiB0LmZlYXR1cmVzKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IFtdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0LmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IHQuZmVhdHVyZXNbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBHZW9KU09OIGZlYXR1cmVcbiAgICAgICAgICAgICAgICBsZXQgZiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeToge30sXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUudGFnc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS50eXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5Lm1hcChjb29yZCA9PiBbY29vcmRbMF0sIGNvb3JkWzFdXSk7XG4gICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkudHlwZSA9ICdNdWx0aVBvaW50JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZmVhdHVyZS50eXBlID09PSAyIHx8IGZlYXR1cmUudHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzID0gZmVhdHVyZS5nZW9tZXRyeS5tYXAocmluZyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgcmluZy5tYXAoY29vcmQgPT4gW2Nvb3JkWzBdLCBjb29yZFsxXV0pXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS50eXBlID0gJ011bHRpTGluZVN0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeSA9IGRlY29kZU11bHRpUG9seWdvbihmLmdlb21ldHJ5KTsgLy8gdW4tZmxhdHRlbiByaW5nc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuZ2VvbWV0cnkgPT0gbnVsbCkgeyAvLyBza2lwIHBvbHlzIHRoYXQgY291bGRuJ3QgYmUgZGVjb2RlZCAoZS5nLiBkZWdlbmVyYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmZlYXR1cmVzLnB1c2goZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG5cbiAgICBmb3JtYXRVcmwgKGRlc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXJsO1xuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgcGFyc2VkX3Jlc3BvbnNlID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICAgIGxldCBsYXllcnMgPSB0aGlzLmdldExheWVycyhwYXJzZWRfcmVzcG9uc2UpO1xuICAgICAgICBzb3VyY2UubGF5ZXJzID0gdGhpcy5wcmVwcm9jZXNzTGF5ZXJzKGxheWVycyk7XG4gICAgfVxuXG4gICAgcHJlcHJvY2Vzc0xheWVycyAobGF5ZXJzKXtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGxheWVycykge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gbGF5ZXJzW2tleV07XG4gICAgICAgICAgICB0aGlzLnByZXByb2Nlc3NGZWF0dXJlcyhsYXllci5mZWF0dXJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBvcHRpb25hbCBkYXRhIHRyYW5zZm9ybVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMobGF5ZXJzKS5sZW5ndGggPT09IDEgJiYgbGF5ZXJzLl9kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzLl9kZWZhdWx0ID0gdGhpcy50cmFuc2Zvcm0obGF5ZXJzLl9kZWZhdWx0LCB0aGlzLmV4dHJhX2RhdGEpOyAvLyBzaW5nbGUtbGF5ZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxheWVycyA9IHRoaXMudHJhbnNmb3JtKGxheWVycywgdGhpcy5leHRyYV9kYXRhKTsgLy8gbXVsdGlwbGUgbGF5ZXJzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGF5ZXJzO1xuICAgIH1cblxuICAgIC8vIFByZXByb2Nlc3MgZmVhdHVyZXMuIEN1cnJlbnRseSB1c2VkIHRvIGFkZCBhIG5ldyBcImNlbnRyb2lkXCIgZmVhdHVyZSBmb3IgcG9seWdvbiBsYWJlbGluZ1xuICAgIHByZXByb2Nlc3NGZWF0dXJlcyAoZmVhdHVyZXMpIHtcbiAgICAgICAgLy8gRGVmaW5lIGNlbnRyb2lkcyBmb3IgcG9seWdvbnMgZm9yIGNlbnRyb2lkIGxhYmVsIHBsYWNlbWVudFxuICAgICAgICAvLyBBdm9pZHMgcmVkdW5kYW50IGxhYmVsIHBsYWNlbWVudCBmb3IgZWFjaCBnZW5lcmF0ZWQgdGlsZSBhdCBoaWdoZXIgem9vbSBsZXZlbHNcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmdlbmVyYXRlX2xhYmVsX2NlbnRyb2lkcyl7XG4gICAgICAgICAgICBsZXQgZmVhdHVyZXNfY2VudHJvaWQgPSBbXTtcbiAgICAgICAgICAgIGxldCBjZW50cm9pZF9wcm9wZXJ0aWVzID0ge1wibGFiZWxfcGxhY2VtZW50XCIgOiB0cnVlfTtcblxuICAgICAgICAgICAgZmVhdHVyZXMuZm9yRWFjaChmZWF0dXJlID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY29vcmRpbmF0ZXMsIGNlbnRyb2lkX2ZlYXR1cmU7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmZWF0dXJlLmdlb21ldHJ5LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUG9seWdvbic6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyA9IGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZW50cm9pZF9mZWF0dXJlID0gZ2V0Q2VudHJvaWRGZWF0dXJlRm9yUG9seWdvbihjb29yZGluYXRlcywgZmVhdHVyZS5wcm9wZXJ0aWVzLCBjZW50cm9pZF9wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzX2NlbnRyb2lkLnB1c2goY2VudHJvaWRfZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTXVsdGlQb2x5Z29uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBjZW50cm9pZCBmZWF0dXJlIGZvciBsYXJnZXN0IHBvbHlnb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXhfYXJlYSA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXhfYXJlYV9pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29vcmRpbmF0ZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFyZWEgPSBHZW8ucG9seWdvbkFyZWEoY29vcmRpbmF0ZXNbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJlYSA+IG1heF9hcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hcmVhID0gYXJlYTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FyZWFfaW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjZW50cm9pZF9mZWF0dXJlID0gZ2V0Q2VudHJvaWRGZWF0dXJlRm9yUG9seWdvbihjb29yZGluYXRlc1ttYXhfYXJlYV9pbmRleF0sIGZlYXR1cmUucHJvcGVydGllcywgY2VudHJvaWRfcHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlc19jZW50cm9pZC5wdXNoKGNlbnRyb2lkX2ZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGFwcGVuZCBjZW50cm9pZCBmZWF0dXJlcyB0byBmZWF0dXJlcyBhcnJheVxuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZmVhdHVyZXMsIGZlYXR1cmVzX2NlbnRyb2lkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmZWF0dXJlcztcbiAgICB9XG5cbiAgICAvLyBEZXRlY3Qgc2luZ2xlIG9yIG11bHRpcGxlIGxheWVycyBpbiByZXR1cm5lZCBkYXRhXG4gICAgZ2V0TGF5ZXJzIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlczogW2RhdGFdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgX2RlZmF1bHQ6IGRhdGFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG4vKipcbiBHZW9KU09OIHZlY3RvciB0aWxlc1xuIEBjbGFzcyBHZW9KU09OVGlsZVNvdXJjZVxuKi9cbmV4cG9ydCBjbGFzcyBHZW9KU09OVGlsZVNvdXJjZSBleHRlbmRzIE5ldHdvcmtUaWxlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBVUkwgdGlsZSBwYXR0ZXJuLCBpZiBub3QgZm91bmQsIHRyZWF0IGFzIHN0YW5kYWxvbmUgR2VvSlNPTi9Ub3BvSlNPTiBvYmplY3RcbiAgICAgICAgaWYgKCF0aGlzLnVybEhhc1RpbGVQYXR0ZXJuKHRoaXMudXJsKSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaW5zdGFuY2UgdHlwZSBmcm9tIHBhcmVudCBjbGFzc1xuICAgICAgICAgICAgaWYgKHNvdXJjZS50eXBlID09PSAnR2VvSlNPTicpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGluc3RhbmNlIHR5cGVcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdlb0pTT05Tb3VyY2Uoc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFBhc3MgYmFjayB0byBwYXJlbnQgY2xhc3MgdG8gaW5zdGFudGlhdGVcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlR2VvSlNPTihkYXRhLCB0aWxlLCBzb3VyY2UpO1xuICAgIH1cblxuICAgIHByZXBhcmVHZW9KU09OIChkYXRhLCB0aWxlLCBzb3VyY2UpIHtcbiAgICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgZGF0YSB0cmFuc2Zvcm1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMudHJhbnNmb3JtKGRhdGEsIHRoaXMuZXh0cmFfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBzb3VyY2UubGF5ZXJzID0gR2VvSlNPTlNvdXJjZS5wcm90b3R5cGUuZ2V0TGF5ZXJzKGRhdGEpO1xuXG4gICAgICAgIC8vIEEgXCJzeW50aGV0aWNcIiB0aWxlIHRoYXQgYWRqdXN0cyB0aGUgdGlsZSBtaW4gYW5jaG9yIHRvIGFjY291bnQgZm9yIHRpbGUgbG9uZ2l0dWRlIHdyYXBwaW5nXG4gICAgICAgIGxldCBhbmNob3IgPSB7XG4gICAgICAgICAgICBjb29yZHM6IHRpbGUuY29vcmRzLFxuICAgICAgICAgICAgbWluOiBHZW8ubWV0ZXJzRm9yVGlsZShHZW8ud3JhcFRpbGUodGlsZS5jb29yZHMsIHsgeDogdHJ1ZSB9KSlcbiAgICAgICAgfTtcblxuICAgICAgICBEYXRhU291cmNlLnByb2plY3REYXRhKHNvdXJjZSk7IC8vIG1lcmNhdG9yIHByb2plY3Rpb25cbiAgICAgICAgRGF0YVNvdXJjZS5zY2FsZURhdGEoc291cmNlLCBhbmNob3IpOyAvLyByZS1zY2FsZSBmcm9tIG1ldGVycyB0byBsb2NhbCB0aWxlIGNvb3Jkc1xuICAgIH1cblxufVxuXG5EYXRhU291cmNlLnJlZ2lzdGVyKEdlb0pTT05UaWxlU291cmNlLCAnR2VvSlNPTicpOyAgICAgIC8vIHByZWZlcmVkIHNob3J0ZXIgbmFtZVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGNlbnRyb2lkIHBvaW50IGZlYXR1cmUgZnJvbSBwb2x5Z29uIGNvb3JkaW5hdGVzIGFuZCBwcm92aWRlZCBmZWF0dXJlIG1ldGEtZGF0YVxuZnVuY3Rpb24gZ2V0Q2VudHJvaWRGZWF0dXJlRm9yUG9seWdvbiAoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG5ld1Byb3BlcnRpZXMpIHtcbiAgICBsZXQgY2VudHJvaWQgPSBHZW8uY2VudHJvaWQoY29vcmRpbmF0ZXMpO1xuXG4gICAgLy8gY2xvbmUgcHJvcGVydGllcyBhbmQgbWl4aXggbmV3UHJvcGVydGllc1xuICAgIGxldCBjZW50cm9pZF9wcm9wZXJ0aWVzID0ge307XG4gICAgT2JqZWN0LmFzc2lnbihjZW50cm9pZF9wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBuZXdQcm9wZXJ0aWVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiRmVhdHVyZVwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiBjZW50cm9pZF9wcm9wZXJ0aWVzLFxuICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgdHlwZTogXCJQb2ludFwiLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IGNlbnRyb2lkXG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiaW1wb3J0IERhdGFTb3VyY2UsIHtOZXR3b3JrVGlsZVNvdXJjZX0gZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmltcG9ydCBQYmYgZnJvbSAncGJmJztcbmltcG9ydCB7VmVjdG9yVGlsZSwgVmVjdG9yVGlsZUZlYXR1cmV9IGZyb20gJ3ZlY3Rvci10aWxlJztcblxuLyoqXG4gTWFwYm94IFZlY3RvciBUaWxlIGZvcm1hdFxuIEBjbGFzcyBNVlRTb3VyY2VcbiovXG5leHBvcnQgY2xhc3MgTVZUU291cmNlIGV4dGVuZHMgTmV0d29ya1RpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3IgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuICAgICAgICB0aGlzLnJlc3BvbnNlX3R5cGUgPSBcImFycmF5YnVmZmVyXCI7IC8vIGJpbmFyeSBkYXRhXG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIC8vIENvbnZlcnQgTWFwYm94IHZlY3RvciB0aWxlIHRvIEdlb0pTT05cbiAgICAgICAgdmFyIGRhdGEgPSBuZXcgVWludDhBcnJheShyZXNwb25zZSk7XG4gICAgICAgIHZhciBidWZmZXIgPSBuZXcgUGJmKGRhdGEpO1xuICAgICAgICBzb3VyY2UuZGF0YSA9IG5ldyBWZWN0b3JUaWxlKGJ1ZmZlcik7XG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSB0aGlzLnRvR2VvSlNPTihzb3VyY2UuZGF0YSk7XG5cbiAgICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgZGF0YSB0cmFuc2Zvcm1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc291cmNlLmxheWVycyA9IHRoaXMudHJhbnNmb3JtKHNvdXJjZS5sYXllcnMsIHRoaXMuZXh0cmFfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgc291cmNlLmRhdGE7IC8vIGNvbW1lbnQgb3V0IHRvIHNhdmUgcmF3IGRhdGEgZm9yIGRlYnVnZ2luZ1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBsYXllcnMvZmVhdHVyZXMgdXNpbmcgTWFwYm94IGxpYiBBUEksIGNvbnZlcnQgdG8gR2VvSlNPTiBmZWF0dXJlc1xuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGgga2V5cyBmb3IgZWFjaCBsYXllciwgZS5nLiB7IGxheWVyOiBnZW9qc29uIH1cbiAgICB0b0dlb0pTT04gKHRpbGUpIHtcbiAgICAgICAgdmFyIGxheWVycyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBsIGluIHRpbGUubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbGF5ZXIgPSB0aWxlLmxheWVyc1tsXTtcbiAgICAgICAgICAgIHZhciBzY2FsZSA9IEdlby50aWxlX3NjYWxlIC8gbGF5ZXIuZXh0ZW50O1xuICAgICAgICAgICAgdmFyIGxheWVyX2dlb2pzb24gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICBmZWF0dXJlczogW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAodmFyIGY9MDsgZiA8IGxheWVyLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmUgPSBsYXllci5mZWF0dXJlKGYpO1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlX2dlb2pzb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHt9LFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdmFyIGdlb21ldHJ5ID0gZmVhdHVyZV9nZW9qc29uLmdlb21ldHJ5O1xuICAgICAgICAgICAgICAgIHZhciBjb29yZGluYXRlcyA9IGZlYXR1cmUubG9hZEdlb21ldHJ5KCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgcj0wOyByIDwgY29vcmRpbmF0ZXMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJpbmcgPSBjb29yZGluYXRlc1tyXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYz0wOyBjIDwgcmluZy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmluZ1tjXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nW2NdLnggKiBzY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nW2NdLnkgKiBzY2FsZVxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuXG4gICAgICAgICAgICAgICAgaWYgKFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdQb2ludCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkudHlwZSA9ICdQb2ludCc7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1bMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS50eXBlID0gJ0xpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBnZW9tZXRyeS5jb29yZGluYXRlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1tmZWF0dXJlLnR5cGVdID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBkZWNvZGVNdWx0aVBvbHlnb24oZ2VvbWV0cnkpOyAvLyB1bi1mbGF0dGVuIHJpbmdzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGF5ZXJfZ2VvanNvbi5mZWF0dXJlcy5wdXNoKGZlYXR1cmVfZ2VvanNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXllcnNbbF0gPSBsYXllcl9nZW9qc29uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG59XG5cbi8vIERlY29kZSBtdWx0aXBvbHlnb25zLCB3aGljaCBhcmUgZW5jb2RlZCBhcyBhIHNpbmdsZSBzZXQgb2YgcmluZ3Ncbi8vIFdpbmRpbmcgb3JkZXIgb2YgZmlyc3QgcmluZyBpcyBhc3N1bWVkIHRvIGluZGljYXRlIGV4dGVyaW9yIHJpbmcsXG4vLyB0aGUgb3Bwb3NpdGUgd2luZGluZyBvcmRlciBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHBvbHlnb24uXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlTXVsdGlQb2x5Z29uIChnZW9tKSB7XG4gICAgbGV0IHBvbHlzID0gW107XG4gICAgbGV0IHBvbHkgPSBbXTtcbiAgICBsZXQgb3V0ZXJfd2luZGluZztcbiAgICBmb3IgKGxldCByPTA7IHIgPCBnZW9tLmNvb3JkaW5hdGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGxldCByaW5nID0gZ2VvbS5jb29yZGluYXRlc1tyXTtcbiAgICAgICAgbGV0IHdpbmRpbmcgPSBHZW8ucmluZ1dpbmRpbmcocmluZyk7XG4gICAgICAgIGlmICh3aW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIHplcm8tYXJlYSByaW5nc1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0ZXJfd2luZGluZyA9IG91dGVyX3dpbmRpbmcgfHwgd2luZGluZzsgLy8gYXNzdW1lIGZpcnN0IHJpbmcgaW5kaWNhdGVzIG91dGVyIHJpbmcgd2luZGluZ1xuXG4gICAgICAgIGlmICh3aW5kaW5nID09PSBvdXRlcl93aW5kaW5nICYmIHBvbHkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcG9seXMucHVzaChwb2x5KTtcbiAgICAgICAgICAgIHBvbHkgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBwb2x5LnB1c2gocmluZyk7XG4gICAgfVxuICAgIGlmIChwb2x5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgcG9seXMucHVzaChwb2x5KTtcbiAgICB9XG5cbiAgICAvLyBTaW5nbGUgb3IgbXVsdGk/XG4gICAgaWYgKHBvbHlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBnZW9tLnR5cGUgPSAnUG9seWdvbic7XG4gICAgICAgIGdlb20uY29vcmRpbmF0ZXMgPSBwb2x5c1swXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocG9seXMubGVuZ3RoID4gMSkge1xuICAgICAgICBnZW9tLnR5cGUgPSAnTXVsdGlQb2x5Z29uJztcbiAgICAgICAgZ2VvbS5jb29yZGluYXRlcyA9IHBvbHlzO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZ2VvbSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdlb207XG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoTVZUU291cmNlLCAnTVZUJyk7XG4iLCJpbXBvcnQgRGF0YVNvdXJjZSwge05ldHdvcmtUaWxlU291cmNlfSBmcm9tICcuL2RhdGFfc291cmNlJztcbmltcG9ydCBUaWxlIGZyb20gJy4uL3RpbGUnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5leHBvcnQgY2xhc3MgUmFzdGVyVGlsZVNvdXJjZSBleHRlbmRzIE5ldHdvcmtUaWxlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuXG4gICAgICAgIGlmICh0aGlzLnJhc3RlcnMuaW5kZXhPZih0aGlzLm5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5yYXN0ZXJzLnVuc2hpZnQodGhpcy5uYW1lKTsgLy8gYWRkIHRoaXMgcmFzdGVyIGFzIHRoZSBmaXJzdFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nID0gc291cmNlLmZpbHRlcmluZzsgLy8gb3B0aW9uYWwgdGV4dHVyZSBmaWx0ZXJpbmcgKG5lYXJlc3QsIGxpbmVhciwgbWlwbWFwKVxuXG4gICAgICAgIC8vIHNhdmUgdGV4dHVyZSBvYmplY3RzIGJ5IHRpbGUga2V5LCBzbyBVUkwgcmVtYWlucyBzdGFibGUgaWYgdGlsZSBpcyBidWlsdCBtdWx0aXBsZSB0aW1lcyxcbiAgICAgICAgLy8gZS5nLiBhdm9pZCByZS1sb2FkaW5nIHRoZSBzYW1lIHRpbGUgdGV4dHVyZSB1bmRlciBhIGRpZmZlcmVudCBzdWJkb21haW4gd2hlbiB1c2luZyB0aWxlIGhvc3RzXG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSB7fTtcbiAgICB9XG5cbiAgICBsb2FkKHRpbGUpIHtcbiAgICAgICAgdGlsZS5zb3VyY2VfZGF0YSA9IHt9O1xuICAgICAgICB0aWxlLnNvdXJjZV9kYXRhLmxheWVycyA9IHt9O1xuICAgICAgICB0aWxlLnBhZF9zY2FsZSA9IHRoaXMucGFkX3NjYWxlO1xuICAgICAgICB0aWxlLnJhc3RlcnMgPSBbLi4udGhpcy5yYXN0ZXJzXTsgLy8gY29weSBsaXN0IG9mIHJhc3RlcnMgdG8gbG9hZCBmb3IgdGlsZVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIGEgc2luZ2xlIHF1YWQgdGhhdCBmaWxscyB0aGUgZW50aXJlIHRpbGVcbiAgICAgICAgbGV0IHNjYWxlID0gR2VvLnRpbGVfc2NhbGU7XG4gICAgICAgIHRpbGUuc291cmNlX2RhdGEubGF5ZXJzID0ge1xuICAgICAgICAgICAgX2RlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbe1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXM6IFtbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDBdLCBbc2NhbGUsIDBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzY2FsZSwgLXNjYWxlXSwgWzAsIC1zY2FsZV0sIFswLCAwXVxuICAgICAgICAgICAgICAgICAgICAgICAgXV1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge31cbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRpbGUuZGVmYXVsdF93aW5kaW5nID0gJ0NXJztcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aWxlKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGV4dHVyZSBpbmZvIGZvciBhIHJhc3RlciB0aWxlXG4gICAgdGlsZVRleHR1cmUgKHRpbGUpIHtcbiAgICAgICAgbGV0IGtleSA9IHRpbGUuY29vcmRzLmtleTtcbiAgICAgICAgaWYgKCF0aGlzLnRleHR1cmVzW2tleV0pIHtcbiAgICAgICAgICAgIGxldCBjb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVXaXRoTWF4Wm9vbSh0aWxlLmNvb3JkcywgdGhpcy5tYXhfem9vbSk7XG4gICAgICAgICAgICBsZXQgdXJsID0gdGhpcy5mb3JtYXRVcmwodGhpcy51cmwsIHsgY29vcmRzIH0pO1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlc1trZXldID0geyB1cmwsIGZpbHRlcmluZzogdGhpcy5maWx0ZXJpbmcsIGNvb3JkcyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRleHR1cmVzW2tleV07XG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoUmFzdGVyVGlsZVNvdXJjZSwgJ1Jhc3RlcicpO1xuIiwiaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQge0dlb0pTT05Tb3VyY2UsIEdlb0pTT05UaWxlU291cmNlfSBmcm9tICcuL2dlb2pzb24nO1xuXG5pbXBvcnQgKiBhcyB0b3BvanNvbiBmcm9tICd0b3BvanNvbi1jbGllbnQnO1xuXG4vKipcbiBUb3BvSlNPTiBzdGFuZGFsb25lIChub24tdGlsZWQpIHNvdXJjZVxuIFVzZXMgZ2VvanNvbi12dCBzcGxpdCBpbnRvIHRpbGVzIGNsaWVudC1zaWRlXG4qL1xuXG5leHBvcnQgY2xhc3MgVG9wb0pTT05Tb3VyY2UgZXh0ZW5kcyBHZW9KU09OU291cmNlIHtcblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICBkYXRhID0gdGhpcy50b0dlb0pTT04oZGF0YSk7XG5cbiAgICAgICAgbGV0IGxheWVycyA9IHRoaXMuZ2V0TGF5ZXJzKGRhdGEpO1xuICAgICAgICBzdXBlci5wcmVwcm9jZXNzTGF5ZXJzKGxheWVycyk7XG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSBsYXllcnM7XG4gICAgfVxuXG4gICAgdG9HZW9KU09OIChkYXRhKSB7XG4gICAgICAgIC8vIFNpbmdsZSBsYXllclxuICAgICAgICBpZiAoZGF0YS5vYmplY3RzICYmXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhLm9iamVjdHMpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gT2JqZWN0LmtleXMoZGF0YS5vYmplY3RzKVswXTtcbiAgICAgICAgICAgIGRhdGEgPSBnZXRUb3BvSlNPTkZlYXR1cmUoZGF0YSwgZGF0YS5vYmplY3RzW2xheWVyXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTXVsdGlwbGUgbGF5ZXJzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxheWVycyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEub2JqZWN0cykge1xuICAgICAgICAgICAgICAgIGxheWVyc1trZXldID0gZ2V0VG9wb0pTT05GZWF0dXJlKGRhdGEsIGRhdGEub2JqZWN0c1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGEgPSBsYXllcnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG59XG5cbmZ1bmN0aW9uIGdldFRvcG9KU09ORmVhdHVyZSAodG9wb2xvZ3ksIG9iamVjdCkge1xuICAgIGxldCBmZWF0dXJlID0gdG9wb2pzb24uZmVhdHVyZSh0b3BvbG9neSwgb2JqZWN0KTtcblxuICAgIC8vIENvbnZlcnQgc2luZ2xlIGZlYXR1cmUgdG8gYSBmZWF0dXJlIGNvbGxlY3Rpb25cbiAgICBpZiAoZmVhdHVyZS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgZmVhdHVyZSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICBmZWF0dXJlczogW2ZlYXR1cmVdXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5cbi8qKlxuIFRvcG9KU09OIHZlY3RvciB0aWxlc1xuIEBjbGFzcyBUb3BvSlNPTlRpbGVTb3VyY2VcbiovXG5leHBvcnQgY2xhc3MgVG9wb0pTT05UaWxlU291cmNlIGV4dGVuZHMgR2VvSlNPTlRpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSB3aXRoIG5vbi10aWxlZCBzb3VyY2UgaWYgdGlsZWQgc291cmNlIGZhaWxlZCB0byBpbnN0YW50aWF0ZVxuICAgICAgICBpZiAoIXRoaXMudXJsSGFzVGlsZVBhdHRlcm4odGhpcy51cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRvcG9KU09OU291cmNlKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgZGF0YSA9IFRvcG9KU09OU291cmNlLnByb3RvdHlwZS50b0dlb0pTT04oZGF0YSk7XG4gICAgICAgIHRoaXMucHJlcGFyZUdlb0pTT04oZGF0YSwgdGlsZSwgc291cmNlKTtcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS5yZWdpc3RlcihUb3BvSlNPTlRpbGVTb3VyY2UsICdUb3BvSlNPTicpOyAgICAgICAgLy8gcHJlZmVyZWQgc2hvcnRlciBuYW1lXG4iLCJmdW5jdGlvbiBub3ROdWxsKHgpICB7IHJldHVybiB4ICE9IG51bGw7IH1cbmZ1bmN0aW9uIHdyYXAoeCkgICAgIHsgcmV0dXJuICcoJyArIHggKyAnKSc7fVxuXG5mdW5jdGlvbiBtYXliZVF1b3RlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICdcIicgKyB2YWx1ZSArICdcIic7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gbG9va1VwKGtleSkge1xuICAgIGlmIChrZXlbMF0gPT09ICckJykge1xuICAgICAgICByZXR1cm4gJ2NvbnRleHRbXFwnJyArIGtleS5zdWJzdHJpbmcoMSkgKyAnXFwnXSc7XG4gICAgfVxuICAgIHJldHVybiAnY29udGV4dC5mZWF0dXJlLnByb3BlcnRpZXNbXFwnJyArIGtleSArICdcXCddJztcbn1cblxuZnVuY3Rpb24gbnVsbFZhbHVlKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gJyB0cnVlICc7XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5RXF1YWwoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB3cmFwKG1heWJlUXVvdGUodmFsdWUpICsgJyA9PT0gJyArIGxvb2tVcChrZXkpKTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlPcihrZXksIHZhbHVlcykge1xuICAgIHJldHVybiB3cmFwKHZhbHVlcy5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHByb3BlcnR5RXF1YWwoa2V5LCB4KTsgfSkuam9pbignIHx8ICcpKTtcbn1cblxuZnVuY3Rpb24gcHJpbnROZXN0ZWQodmFsdWVzLCBqb2luZXIpIHtcbiAgICByZXR1cm4gd3JhcCh2YWx1ZXMuZmlsdGVyKG5vdE51bGwpLm1hcChmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gd3JhcCh4LmpvaW4oJyAmJiAnKSk7XG4gICAgfSkuam9pbignICcgKyBqb2luZXIgKyAnICcpKTtcbn1cblxuZnVuY3Rpb24gYW55KF8sIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHJldHVybiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPiAwKSA/IHByaW50TmVzdGVkKHZhbHVlcy5tYXAoZnVuY3Rpb24odikgeyByZXR1cm4gcGFyc2VGaWx0ZXIodiwgb3B0aW9ucyk7IH0pLCAnfHwnKSA6ICd0cnVlJztcbn1cblxuZnVuY3Rpb24gYWxsKF8sIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHJldHVybiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPiAwKSA/IHByaW50TmVzdGVkKHZhbHVlcy5tYXAoZnVuY3Rpb24odikgeyByZXR1cm4gcGFyc2VGaWx0ZXIodiwgb3B0aW9ucyk7IH0pLCAnJiYnKSA6ICd0cnVlJztcbn1cblxuZnVuY3Rpb24gbm90KGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gJyEnICsgd3JhcChwYXJzZUZpbHRlcih2YWx1ZSwgb3B0aW9ucykuam9pbignICYmICcpKTtcbn1cblxuZnVuY3Rpb24gbm9uZShrZXksIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHJldHVybiAnIScgKyB3cmFwKGFueShudWxsLCB2YWx1ZXMsIG9wdGlvbnMpKTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlNYXRjaGVzQm9vbGVhbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHdyYXAobG9va1VwKGtleSkgKyAodmFsdWUgPyAnICE9ICcgOiAnID09ICcpICArICdudWxsJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmdlTWF0Y2goa2V5LCB2YWx1ZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTtcbiAgICB2YXIgdHJhbnNmb3JtID0gb3B0aW9ucyAmJiAodHlwZW9mIG9wdGlvbnMucmFuZ2VUcmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpICYmIG9wdGlvbnMucmFuZ2VUcmFuc2Zvcm07XG5cbiAgICBpZiAodmFsdWVzLm1heCkge1xuICAgICAgICB2YXIgbWF4ID0gdHJhbnNmb3JtID8gdHJhbnNmb3JtKHZhbHVlcy5tYXgpIDogdmFsdWVzLm1heDtcbiAgICAgICAgZXhwcmVzc2lvbnMucHVzaCgnJyArIGxvb2tVcChrZXkpICsgJyA8ICcgKyBtYXgpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZXMubWluKSB7XG4gICAgICAgIHZhciBtaW4gPSB0cmFuc2Zvcm0gPyBtaW4gPSB0cmFuc2Zvcm0odmFsdWVzLm1pbikgOiB2YWx1ZXMubWluO1xuICAgICAgICBleHByZXNzaW9ucy5wdXNoKCcnICsgbG9va1VwKGtleSkgKyAnID49ICcgKyBtaW4pO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwKGV4cHJlc3Npb25zLmpvaW4oJyAmJiAnKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRmlsdGVyKGZpbHRlciwgb3B0aW9ucykge1xuICAgIHZhciBmaWx0ZXJBU1QgPSBbXTtcblxuICAgIC8vIEZ1bmN0aW9uIGZpbHRlclxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBbd3JhcChmaWx0ZXIudG9TdHJpbmcoKSArICcoY29udGV4dCknKV07XG4gICAgfVxuICAgIC8vIEFycmF5IGZpbHRlciwgaW1wbGljaXQgJ2FueSdcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHtcbiAgICAgICAgcmV0dXJuIFthbnkobnVsbCwgZmlsdGVyLCBvcHRpb25zKV07XG4gICAgfVxuICAgIC8vIE51bGwgZmlsdGVyIG9iamVjdFxuICAgIGVsc2UgaWYgKGZpbHRlciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbJ3RydWUnXTtcbiAgICB9XG5cbiAgICAvLyBPYmplY3QgZmlsdGVyLCBlLmcuIGltcGxpY2l0ICdhbGwnXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmaWx0ZXIpO1xuICAgIGZvciAodmFyIGs9MDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNba107XG5cbiAgICAgICAgdmFyIHZhbHVlID0gZmlsdGVyW2tleV0sXG4gICAgICAgICAgICB0eXBlICA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChwcm9wZXJ0eUVxdWFsKGtleSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHByb3BlcnR5TWF0Y2hlc0Jvb2xlYW4oa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ25vdCcpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG5vdChrZXksIHZhbHVlLCBvcHRpb25zKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnYW55Jykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2goYW55KGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChhbGwoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChub25lKGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gocHJvcGVydHlPcihrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLm1heCB8fCB2YWx1ZS5taW4pIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChyYW5nZU1hdGNoKGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChudWxsVmFsdWUoa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIFF1ZXJ5IHN5dG5heDogJyArIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBrZXlzLmxlbmd0aCA9PT0gMCA/IFsndHJ1ZSddIDogZmlsdGVyQVNUO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJUb1N0cmluZyhmaWx0ZXJBU1QpIHtcbiAgICByZXR1cm4gd3JhcChmaWx0ZXJBU1Quam9pbignICYmICcpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmlsdGVyKGZpbHRlciwgb3B0aW9ucykge1xuICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTsgfVxuICAgIC8vIGpzaGludCBldmlsOiB0cnVlXG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbignY29udGV4dCcsICdyZXR1cm4gJyArIGZpbHRlclRvU3RyaW5nKHBhcnNlRmlsdGVyKGZpbHRlciwgb3B0aW9ucykpICsgJzsnKTtcbn1cbiIsImltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4uL3V0aWxzL21lcmdlJztcbmltcG9ydCB7YnVpbGRGaWx0ZXJ9IGZyb20gJy4vZmlsdGVyJztcblxuZXhwb3J0IGNvbnN0IHdoaXRlTGlzdCA9IFsnZmlsdGVyJywgJ2RyYXcnLCAndmlzaWJsZScsICdkYXRhJ107XG5cbmV4cG9ydCBjb25zdCBsYXllcl9jYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBjYWNoZUtleSAobGF5ZXJzKSB7XG4gICAgaWYgKGxheWVycy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHZhciBrID0gbGF5ZXJzWzBdO1xuICAgICAgICBmb3IgKHZhciBpPTE7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGsgKz0gJy8nICsgbGF5ZXJzW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGs7XG4gICAgfVxuICAgIHJldHVybiBsYXllcnNbMF07XG59XG5cbi8vIE1lcmdlIG1hdGNoaW5nIGxheWVyIHRyZWVzIGludG8gYSBmaW5hbCBkcmF3IGdyb3VwXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUcmVlcyhtYXRjaGluZ1RyZWVzLCBncm91cCkge1xuICAgIGxldCBkcmF3cywgdHJlZURlcHRoID0gMDtcblxuICAgIGxldCBkcmF3ID0ge1xuICAgICAgICB2aXNpYmxlOiB0cnVlIC8vIHZpc2libGUgYnkgZGVmYXVsdFxuICAgIH07XG5cbiAgICAvLyBGaW5kIGRlZXBlc3QgdHJlZVxuICAgIGZvciAobGV0IHQ9MDsgdCA8IG1hdGNoaW5nVHJlZXMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgaWYgKG1hdGNoaW5nVHJlZXNbdF0ubGVuZ3RoID4gdHJlZURlcHRoKSB7XG4gICAgICAgICAgICB0cmVlRGVwdGggPSBtYXRjaGluZ1RyZWVzW3RdLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIGxheWVycyB0byBwYXJzZVxuICAgIGlmICh0cmVlRGVwdGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSB0cmVlcyBpbiBwYXJhbGxlbFxuICAgIGZvciAobGV0IHg9MDsgeCA8IHRyZWVEZXB0aDsgeCsrKSB7XG4gICAgICAgIC8vIFB1bGwgb3V0IHRoZSByZXF1ZXN0ZWQgZHJhdyBncm91cCwgZm9yIGVhY2ggdHJlZSwgYXQgdGhpcyBkZXB0aFxuICAgICAgICBkcmF3cyA9IG1hdGNoaW5nVHJlZXMubWFwKHRyZWUgPT4gdHJlZVt4XSAmJiB0cmVlW3hdW2dyb3VwXSk7XG4gICAgICAgIGlmIChkcmF3cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBieSBsYXllciBuYW1lIGJlZm9yZSBtZXJnaW5nLCBzbyBsYXllcnMgYXJlIGFwcGxpZWQgZGV0ZXJtaW5pc3RpY2FsbHlcbiAgICAgICAgLy8gd2hlbiBtdWx0aXBsZSBsYXllcnMgbW9kaWZ5IHRoZSBzYW1lIHByb3BlcnRpZXNcbiAgICAgICAgZHJhd3Muc29ydCgoYSwgYikgPT4gKGEgJiYgYS5sYXllcl9uYW1lKSA+IChiICYmIGIubGF5ZXJfbmFtZSkgPyAxIDogLTEpO1xuXG4gICAgICAgIC8vIE1lcmdlIGRyYXcgb2JqZWN0c1xuICAgICAgICBtZXJnZU9iamVjdHMoZHJhdywgLi4uZHJhd3MpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBsYXllciBuYW1lcywgdGhleSB3ZXJlIG9ubHkgdXNlZCB0cmFuc2llbnRseSB0byBzb3J0IGFuZCBjYWxjdWxhdGUgZmluYWwgbGF5ZXJcbiAgICAgICAgLy8gKGZpbmFsIG1lcmdlZCBuYW1lcyB3aWxsIG5vdCBiZSBhY2N1cmF0ZSBzaW5jZSBvbmx5IG9uZSB0cmVlIGNhbiB3aW4pXG4gICAgICAgIGRlbGV0ZSBkcmF3LmxheWVyX25hbWU7XG4gICAgfVxuXG4gICAgLy8gU2hvcnQtY2lyY3VpdCBpZiBub3QgdmlzaWJsZVxuICAgIGlmIChkcmF3LnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBkcmF3O1xufVxuXG5jb25zdCBibGFja2xpc3QgPSBbJ2FueScsICdhbGwnLCAnbm90JywgJ25vbmUnXTtcblxuY2xhc3MgTGF5ZXIge1xuXG4gICAgY29uc3RydWN0b3IoeyBsYXllciwgbmFtZSwgcGFyZW50LCBkcmF3LCB2aXNpYmxlLCBmaWx0ZXIgfSkge1xuICAgICAgICB0aGlzLmlkID0gTGF5ZXIuaWQrKztcbiAgICAgICAgdGhpcy5jb25maWcgPSBsYXllcjtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuZnVsbF9uYW1lID0gdGhpcy5wYXJlbnQgPyAodGhpcy5wYXJlbnQuZnVsbF9uYW1lICsgJzonICsgdGhpcy5uYW1lKSA6IHRoaXMubmFtZTtcbiAgICAgICAgdGhpcy5kcmF3ID0gZHJhdztcbiAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgIHRoaXMuaXNfYnVpbHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdmlzaWJsZSAhPT0gdW5kZWZpbmVkID8gdmlzaWJsZSA6ICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC52aXNpYmxlKTtcblxuICAgICAgICAvLyBEZW5vcm1hbGl6ZSBsYXllciBuYW1lIHRvIGRyYXcgZ3JvdXBzXG4gICAgICAgIGlmICh0aGlzLmRyYXcpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGdyb3VwIGluIHRoaXMuZHJhdykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyYXdbZ3JvdXBdID09IG51bGwgfHwgdHlwZW9mIHRoaXMuZHJhd1tncm91cF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgZHJhdyBncm91cFxuICAgICAgICAgICAgICAgICAgICBsZXQgbXNnID0gYERyYXcgZ3JvdXAgJyR7Z3JvdXB9JyBmb3IgbGF5ZXIgJHt0aGlzLmZ1bGxfbmFtZX0gaXMgaW52YWxpZCwgbXVzdCBiZSBhbiBvYmplY3QsIGA7XG4gICAgICAgICAgICAgICAgICAgIG1zZyArPSBgYnV0IHdhcyBzZXQgdG8gXFxgJHtncm91cH06ICR7dGhpcy5kcmF3W2dyb3VwXX1cXGAgaW5zdGVhZGA7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7IC8vIFRPRE86IGZpcmUgZXh0ZXJuYWwgZXZlbnQgdGhhdCBjbGllbnRzIHRvIHN1YnNjcmliZSB0b1xuXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRyYXdbZ3JvdXBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3W2dyb3VwXS5sYXllcl9uYW1lID0gdGhpcy5mdWxsX25hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVpbGQgKCkge1xuICAgICAgICBsb2coJ3RyYWNlJywgYEJ1aWxkaW5nIGxheWVyICcke3RoaXMuZnVsbF9uYW1lfSdgKTtcbiAgICAgICAgdGhpcy5idWlsZEZpbHRlcigpO1xuICAgICAgICB0aGlzLmJ1aWxkRHJhdygpO1xuICAgICAgICB0aGlzLmlzX2J1aWx0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBidWlsZERyYXcoKSB7XG4gICAgICAgIHRoaXMuZHJhdyA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyh0aGlzLmRyYXcsIFN0eWxlUGFyc2VyLndyYXBGdW5jdGlvbik7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlZERyYXcgPSBjYWxjdWxhdGVEcmF3KHRoaXMpO1xuICAgIH1cblxuICAgIGJ1aWxkRmlsdGVyKCkge1xuICAgICAgICB0aGlzLmZpbHRlcl9vcmlnaW5hbCA9IHRoaXMuZmlsdGVyO1xuICAgICAgICB0aGlzLmZpbHRlciA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyh0aGlzLmZpbHRlciwgU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uKTtcblxuICAgICAgICBsZXQgdHlwZSA9IHR5cGVvZiB0aGlzLmZpbHRlcjtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyICE9IG51bGwgJiYgdHlwZSAhPT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gSW52YWxpZCBmaWx0ZXJcbiAgICAgICAgICAgIGxldCBtc2cgPSBgRmlsdGVyIGZvciBsYXllciAke3RoaXMuZnVsbF9uYW1lfSBpcyBpbnZhbGlkLCBmaWx0ZXIgdmFsdWUgbXVzdCBiZSBhbiBvYmplY3Qgb3IgZnVuY3Rpb24sIGA7XG4gICAgICAgICAgICBtc2cgKz0gYGJ1dCB3YXMgc2V0IHRvIFxcYGZpbHRlcjogJHt0aGlzLmZpbHRlcn1cXGAgaW5zdGVhZGA7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBtc2cpOyAvLyBUT0RPOiBmaXJlIGV4dGVybmFsIGV2ZW50IHRoYXQgY2xpZW50cyB0byBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkWm9vbXMoKTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQcm9wTWF0Y2hlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyICE9IG51bGwgJiYgKHR5cGVvZiB0aGlzLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJyB8fCBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcikubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlciA9IGJ1aWxkRmlsdGVyKHRoaXMuZmlsdGVyLCBGaWx0ZXJPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIGZpbHRlclxuICAgICAgICAgICAgbGV0IG1zZyA9IGBGaWx0ZXIgZm9yIGxheWVyICR7dGhpcy5mdWxsX25hbWV9IGlzIGludmFsaWQsIFxcYGZpbHRlcjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlcil9XFxgIGA7XG4gICAgICAgICAgICBtc2cgKz0gYGZhaWxlZCB3aXRoIGVycm9yICcke2UubWVzc2FnZX0nLCBzdGFjayB0cmFjZTogJHtlLnN0YWNrfWA7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBtc2cpOyAvLyBUT0RPOiBmaXJlIGV4dGVybmFsIGV2ZW50IHRoYXQgY2xpZW50cyB0byBzdWJzY3JpYmUgdG9cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFpvb21zIG9mdGVuIGN1bGwgbGFyZ2Ugc3dhdGhzIG9mIHRoZSBsYXllciB0cmVlLCBzbyB0aGV5IGdldCBzcGVjaWFsIHRyZWF0bWVudCBhbmQgYXJlIGNoZWNrZWQgZmlyc3RcbiAgICBidWlsZFpvb21zKCkge1xuICAgICAgICBsZXQgem9vbSA9IHRoaXMuZmlsdGVyICYmIHRoaXMuZmlsdGVyLiR6b29tO1xuICAgICAgICBsZXQgenR5cGUgPSB0eXBlb2Ygem9vbTtcbiAgICAgICAgaWYgKHpvb20gIT0gbnVsbCAmJiB6dHlwZSAhPT0gJ2Z1bmN0aW9uJykgeyAvLyBkb24ndCBhY2NlbGVyYXRlIGZ1bmN0aW9uLWJhc2VkIGZpbHRlcnNcbiAgICAgICAgICAgIHRoaXMuem9vbXMgPSB7fTtcblxuICAgICAgICAgICAgaWYgKHp0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuem9vbXNbem9vbV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh6b29tKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHo9MDsgeiA8IHpvb20ubGVuZ3RoOyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tc1t6b29tW3pdXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoenR5cGUgPT09ICdvYmplY3QnICYmICh6b29tLm1pbiAhPSBudWxsIHx8IHpvb20ubWF4ICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHptaW4gPSB6b29tLm1pbiB8fCAwO1xuICAgICAgICAgICAgICAgIGxldCB6bWF4ID0gem9vbS5tYXggfHwgMjU7IC8vIFRPRE86IHJlcGxhY2UgY29uc3RhbnQgZm9yIG1heCBwb3NzaWJsZSB6b29tXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgej16bWluOyB6IDwgem1heDsgeisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbXNbel0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsdGVyLiR6b29tOyAvLyBkb24ndCBwcm9jZXNzIHpvb20gdGhyb3VnaCB1c3VhbCBnZW5lcmljIGZpbHRlciBsb2dpY1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVpbGRQcm9wTWF0Y2hlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlciB8fCBBcnJheS5pc0FycmF5KHRoaXMuZmlsdGVyKSB8fCB0eXBlb2YgdGhpcy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoYmxhY2tsaXN0LmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gdGhpcy5maWx0ZXJba2V5XTtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHR5cGVvZiB2YWw7XG4gICAgICAgICAgICAgICAgbGV0IGFycmF5ID0gQXJyYXkuaXNBcnJheSh2YWwpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCEoYXJyYXkgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoa2V5WzBdID09PSAnJCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29udGV4dCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzID0gdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcy5wdXNoKFtrZXkuc3Vic3RyaW5nKDEpLCBhcnJheSA/IHZhbCA6IFt2YWxdXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBGZWF0dXJlIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMgPSB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzLnB1c2goW2tleSwgYXJyYXkgPyB2YWwgOiBbdmFsXV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbHRlcltrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkb1Byb3BNYXRjaGVzIChjb250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByPTA7IHIgPCB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlc1tyXTtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gY29udGV4dC5mZWF0dXJlLnByb3BlcnRpZXNbbWF0Y2hbMF1dO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBtYXRjaFsxXS5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXNbcl07XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IGNvbnRleHRbbWF0Y2hbMF1dO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBtYXRjaFsxXS5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBkb2VzTWF0Y2ggKGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzX2J1aWx0KSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB6b29tIHByZS1maWx0ZXI6IHNraXAgcmVzdCBvZiBmaWx0ZXIgaWYgb3V0IG9mIGxheWVyIHpvb20gcmFuZ2VcbiAgICAgICAgaWYgKHRoaXMuem9vbXMgIT0gbnVsbCAmJiAhdGhpcy56b29tc1tjb250ZXh0Lnpvb21dKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkaXJlY3QgZmVhdHVyZSBwcm9wZXJ0eSBtYXRjaGVzXG4gICAgICAgIGlmICghdGhpcy5kb1Byb3BNYXRjaGVzKGNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbnkgcmVtYWluaW5nIGZpbHRlciAobW9yZSBjb21wbGV4IG1hdGNoZXMgb3IgZHluYW1pYyBmdW5jdGlvbilcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyIGluc3RhbmNlb2YgRnVuY3Rpb24pe1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgZnVuY3Rpb24gZXJyb3JcbiAgICAgICAgICAgICAgICBsZXQgbXNnID0gYEZpbHRlciBmb3IgdGhpcyAke3RoaXMuZnVsbF9uYW1lfTogXFxgZmlsdGVyOiAke3RoaXMuZmlsdGVyX29yaWdpbmFsfVxcYCBgO1xuICAgICAgICAgICAgICAgIG1zZyArPSBgZmFpbGVkIHdpdGggZXJyb3IgJyR7ZXJyb3IubWVzc2FnZX0nLCBzdGFjayB0cmFjZTogJHtlcnJvci5zdGFja31gO1xuICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBtc2csIGNvbnRleHQuZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIgPT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5MYXllci5pZCA9IDA7XG5cblxuZXhwb3J0IGNsYXNzIExheWVyTGVhZiBleHRlbmRzIExheWVyIHtcbiAgICBjb25zdHJ1Y3RvciAoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuaXNfbGVhZiA9IHRydWU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBMYXllclRyZWUgZXh0ZW5kcyBMYXllciB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICB0aGlzLmlzX3RyZWUgPSB0cnVlO1xuICAgICAgICB0aGlzLmxheWVycyA9IGNvbmZpZy5sYXllcnMgfHwgW107XG4gICAgfVxuXG4gICAgYWRkTGF5ZXIgKGxheWVyKSB7XG4gICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgIH1cblxuICAgIGJ1aWxkRHJhd0dyb3VwcyAoY29udGV4dCkge1xuICAgICAgICBsZXQgbGF5ZXJzID0gW10sIGxheWVyX2lkcyA9IFtdO1xuICAgICAgICBtYXRjaEZlYXR1cmUoY29udGV4dCwgW3RoaXNdLCBsYXllcnMsIGxheWVyX2lkcyk7XG5cbiAgICAgICAgaWYgKGxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgY2FjaGVfa2V5ID0gY2FjaGVLZXkobGF5ZXJfaWRzKTtcblxuICAgICAgICAgICAgLy8gT25seSBldmFsdWF0ZSBlYWNoIGxheWVyIGNvbWJpbmF0aW9uIG9uY2UgKHVuZGVmaW5lZCBtZWFucyBub3QgeWV0IGV2YWx1YXRlZCxcbiAgICAgICAgICAgIC8vIG51bGwgbWVhbnMgZXZhbHVhdGVkIHdpdGggbm8gZHJhdyBvYmplY3QpXG4gICAgICAgICAgICBpZiAobGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gRmluZCBhbGwgdGhlIHVuaXF1ZSB2aXNpYmxlIGRyYXcgYmxvY2tzIGZvciB0aGlzIGxheWVyIHRyZWVcbiAgICAgICAgICAgICAgICBsZXQgZHJhd19ncm91cHMgPSBsYXllcnMubWFwKHggPT4geCAmJiB4LnZpc2libGUgIT09IGZhbHNlICYmIHguY2FsY3VsYXRlZERyYXcpO1xuICAgICAgICAgICAgICAgIGxldCBkcmF3X2tleXMgPSB7fTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHI9MDsgciA8IGRyYXdfZ3JvdXBzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXllciA9IGRyYXdfZ3JvdXBzW3JdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBnPTA7IGcgPCBsYXllci5sZW5ndGg7IGcrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwID0gbGF5ZXJbZ107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gZ3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2tleXNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgZWFjaCBkcmF3IGdyb3VwXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZHJhd19rZXkgaW4gZHJhd19rZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV0gPSBsYXllcl9jYWNoZVtjYWNoZV9rZXldIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XSA9IG1lcmdlVHJlZXMoZHJhd19ncm91cHMsIGRyYXdfa2V5KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHNhdmUgdGhlIG9uZXMgdGhhdCB3ZXJlbid0IG51bGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV0ua2V5ID0gY2FjaGVfa2V5ICsgJy8nICsgZHJhd19rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XS5sYXllcnMgPSBsYXllcnMubWFwKHggPT4geCAmJiB4LmZ1bGxfbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBObyBsYXllcnMgZXZhbHVhdGVkXG4gICAgICAgICAgICAgICAgaWYgKGxheWVyX2NhY2hlW2NhY2hlX2tleV0gJiYgT2JqZWN0LmtleXMobGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsYXllcl9jYWNoZVtjYWNoZV9rZXldO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmNvbnN0IEZpbHRlck9wdGlvbnMgPSB7XG4gICAgLy8gSGFuZGxlIHVuaXQgY29udmVyc2lvbnMgb24gZmlsdGVyIHJhbmdlc1xuICAgIHJhbmdlVHJhbnNmb3JtKHZhbCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKS5zbGljZSgtMykgPT09ICdweDInKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7cGFyc2VGbG9hdCh2YWwpfSAqIGNvbnRleHQubWV0ZXJzX3Blcl9waXhlbF9zcWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBpc1doaXRlTGlzdGVkKGtleSkge1xuICAgIHJldHVybiB3aGl0ZUxpc3QuaW5kZXhPZihrZXkpID4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHkob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBQcm9wcyhvYmopIHtcbiAgICBsZXQgd2hpdGVMaXN0ZWQgPSB7fSwgbm9uV2hpdGVMaXN0ZWQgPSB7fTtcblxuICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKGlzV2hpdGVMaXN0ZWQoa2V5KSkge1xuICAgICAgICAgICAgd2hpdGVMaXN0ZWRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9uV2hpdGVMaXN0ZWRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbd2hpdGVMaXN0ZWQsIG5vbldoaXRlTGlzdGVkXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZURyYXcobGF5ZXIpIHtcblxuICAgIGxldCBkcmF3ICA9IFtdO1xuXG4gICAgaWYgKGxheWVyLnBhcmVudCkge1xuICAgICAgICBsZXQgY3MgPSBsYXllci5wYXJlbnQuY2FsY3VsYXRlZERyYXcgfHwgW107XG4gICAgICAgIGRyYXcucHVzaCguLi5jcyk7XG4gICAgfVxuXG4gICAgZHJhdy5wdXNoKGxheWVyLmRyYXcpO1xuICAgIHJldHVybiBkcmF3O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMYXllclRyZWUobmFtZSwgbGF5ZXIsIHBhcmVudCwgc3R5bGVzKSB7XG5cbiAgICBsZXQgcHJvcGVydGllcyA9IHsgbmFtZSwgbGF5ZXIsIHBhcmVudCB9O1xuICAgIGxldCBbd2hpdGVMaXN0ZWQsIG5vbldoaXRlTGlzdGVkXSA9IGdyb3VwUHJvcHMobGF5ZXIpO1xuICAgIGxldCBlbXB0eSA9IGlzRW1wdHkobm9uV2hpdGVMaXN0ZWQpO1xuICAgIGxldCBDcmVhdGU7XG5cbiAgICBpZiAoZW1wdHkgJiYgcGFyZW50ICE9IG51bGwpIHtcbiAgICAgICAgQ3JlYXRlID0gTGF5ZXJMZWFmO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIENyZWF0ZSA9IExheWVyVHJlZTtcbiAgICB9XG5cbiAgICBsZXQgciA9IG5ldyBDcmVhdGUoT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCB3aGl0ZUxpc3RlZCkpO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICBwYXJlbnQuYWRkTGF5ZXIocik7XG4gICAgfVxuXG4gICAgaWYgKCFlbXB0eSkge1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gbm9uV2hpdGVMaXN0ZWQpIHtcbiAgICAgICAgICAgIGxldCBwcm9wZXJ0eSA9IG5vbldoaXRlTGlzdGVkW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICBwYXJzZUxheWVyVHJlZShrZXksIHByb3BlcnR5LCByLCBzdHlsZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGxheWVyXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBMYXllciB2YWx1ZSBtdXN0IGJlIGFuIG9iamVjdDogY2Fubm90IGNyZWF0ZSBsYXllciAnJHtrZXl9OiAke0pTT04uc3RyaW5naWZ5KHByb3BlcnR5KX0nYDtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYCwgdW5kZXIgcGFyZW50IGxheWVyICcke3IuZnVsbF9uYW1lfScuYDtcblxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwYXJlbnQgaXMgYSBzdHlsZSBuYW1lLCB0aGlzIG1heSBiZSBhbiBpbmNvcnJlY3RseSBuZXN0ZWQgbGF5ZXJcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGVzW3IubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAgVGhlIHBhcmVudCBuYW1lICcke3IubmFtZX0nIGlzIGFsc28gdGhlIG5hbWUgb2YgYSBzdHlsZSwgZGlkIHlvdSBtZWFuIHRvIGNyZWF0ZSBhICdkcmF3JyBncm91cGA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSBgIHVuZGVyICcke3BhcmVudC5uYW1lfSdgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1zZyArPSBgIGluc3RlYWQ/YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgbXNnKTsgLy8gVE9ETzogZmlyZSBleHRlcm5hbCBldmVudCB0aGF0IGNsaWVudHMgdG8gc3Vic2NyaWJlIHRvXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiByO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxheWVycyAobGF5ZXJzLCBzdHlsZXMpIHtcbiAgICBsZXQgbGF5ZXJfdHJlZXMgPSB7fTtcblxuICAgIGZvciAobGV0IGtleSBpbiBsYXllcnMpIHtcbiAgICAgICAgbGV0IGxheWVyID0gbGF5ZXJzW2tleV07XG4gICAgICAgIGlmIChsYXllcikge1xuICAgICAgICAgICAgbGF5ZXJfdHJlZXNba2V5XSA9IHBhcnNlTGF5ZXJUcmVlKGtleSwgbGF5ZXIsIG51bGwsIHN0eWxlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGF5ZXJfdHJlZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEZlYXR1cmUoY29udGV4dCwgbGF5ZXJzLCBjb2xsZWN0ZWRfbGF5ZXJzLCBjb2xsZWN0ZWRfbGF5ZXJzX2lkcykge1xuICAgIGxldCBtYXRjaGVkID0gZmFsc2U7XG4gICAgbGV0IGNoaWxkTWF0Y2hlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGxheWVycy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICBmb3IgKGxldCByPTA7IHIgPCBsYXllcnMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBsYXllcnNbcl07XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuaXNfbGVhZikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQuZG9lc01hdGNoKGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVycy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnNfaWRzLnB1c2goY3VycmVudC5pZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50LmlzX3RyZWUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50LmRvZXNNYXRjaChjb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgY2hpbGRNYXRjaGVkID0gbWF0Y2hGZWF0dXJlKFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmxheWVycyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVycyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVyc19pZHNcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZE1hdGNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVycy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzX2lkcy5wdXNoKGN1cnJlbnQuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVkO1xufVxuIiwiLy8gUmVuZGVycyBhbiBhcnJheSBzcGVjaWZ5aW5nIGEgbGluZSBwYXR0ZXJuIG9mIGFsdGVybmF0aW5nIGRhc2hlcyBhbmQgc3BhY2VzLFxuLy8gc2ltaWxhciB0byBhbiBTVkcgYGRhc2hhcnJheWAgb3IgQ2FudmFzIHNldExpbmVEYXNoKCksIGludG8gYSBieXRlIGFycmF5IG9mIFJHQkEgcGl4ZWxzXG4vLyBSZXR1cm5zOlxuLy8ge1xuLy8gICAgcGl4ZWw6IHJlbmRlcmVkIGltYWdlIGluIFVpbnQ4QXJyYXkgYnVmZmVyXG4vLyAgICBsZW5ndGg6IHBpeGVsIGxlbmd0aCBvZiByZW5kZXJlZCBkYXNoIHBhdHRlcm4gKHN1bSBvZiBhbGwgZGFzaGVzIGFuZCBzcGFjZXMpXG4vLyB9XG4vL1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL1NWRy9wYWludGluZy5odG1sI1N0cm9rZURhc2hhcnJheVByb3BlcnR5XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TVkcvQXR0cmlidXRlL3N0cm9rZS1kYXNoYXJyYXlcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQvc2V0TGluZURhc2hcblxuY29uc3QgZGVmYXVsdF9kYXNoX2NvbG9yID0gWzI1NSwgMjU1LCAyNTUsIDI1NV07XG5jb25zdCBkZWZhdWx0X2JhY2tncm91bmRfY29sb3IgPSBbMCwgMCwgMCwgMF07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbmRlckRhc2hBcnJheSAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgZGFzaF9waXhlbCA9IG9wdGlvbnMuZGFzaF9jb2xvciB8fCBkZWZhdWx0X2Rhc2hfY29sb3I7XG4gICAgY29uc3QgYmFja2dyb3VuZF9jb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZF9jb2xvciB8fCBkZWZhdWx0X2JhY2tncm91bmRfY29sb3I7XG4gICAgY29uc3QgZGFzaGVzID0gcGF0dGVybjtcbiAgICBjb25zdCBzY2FsZSA9IG9wdGlvbnMuc2NhbGUgfHwgMTtcblxuICAgIC8vIElmIHBhdHRlcm4gaXMgb2RkLCByZXBlYXQgaXQgdG8gbWFrZSBpdCBldmVuIChzZWUgU1ZHIHNwZWMpXG4gICAgaWYgKGRhc2hlcy5sZW5ndGggJSAyID09PSAxKSB7XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGRhc2hlcywgZGFzaGVzKTtcbiAgICB9XG5cbiAgICBsZXQgZGFzaCA9IHRydWU7XG4gICAgbGV0IHBpeGVscyA9IFtdO1xuICAgIGZvciAobGV0IGk9MDsgaSA8IGRhc2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgc2VnbWVudCA9IE1hdGguZmxvb3IoZGFzaGVzW2ldICogc2NhbGUpO1xuICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzZWdtZW50OyBzKyspIHtcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHBpeGVscywgZGFzaCA/IGRhc2hfcGl4ZWwgOiBiYWNrZ3JvdW5kX2NvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBkYXNoID0gIWRhc2g7IC8vIGFsdGVybmF0ZSBiZXR3ZWVuIGRhc2hlcyBhbmQgc3BhY2VzXG4gICAgfVxuXG4gICAgcGl4ZWxzID0gbmV3IFVpbnQ4QXJyYXkocGl4ZWxzKTsgLy8gY29udmVydCB0byB0eXBlZCBhcnJheVxuICAgIGNvbnN0IGxlbmd0aCA9IHBpeGVscy5sZW5ndGggLyA0OyAvLyBvbmUgUkdCQSBieXRlIHNlcXVlbmNlcyB0byBvbmUgcGl4ZWxcblxuICAgIHJldHVybiB7IHBpeGVscywgbGVuZ3RoIH07XG59XG4iLCIvLyBMaW5lIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IGdsIGZyb20gJy4uLy4uL2dsL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi8uLi9nbC90ZXh0dXJlJztcbmltcG9ydCBWZXJ0ZXhMYXlvdXQgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2xheW91dCc7XG5pbXBvcnQge2J1aWxkUG9seWxpbmVzfSBmcm9tICcuLi8uLi9idWlsZGVycy9wb2x5bGluZXMnO1xuaW1wb3J0IHJlbmRlckRhc2hBcnJheSBmcm9tICcuL2Rhc2hhcnJheSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQge3NoYWRlclNyY19wb2x5Z29uc1ZlcnRleCwgc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnR9IGZyb20gJy4uL3BvbHlnb25zL3BvbHlnb25zJztcblxuZXhwb3J0IHZhciBMaW5lcyA9IE9iamVjdC5jcmVhdGUoU3R5bGUpO1xuXG5PYmplY3QuYXNzaWduKExpbmVzLCB7XG4gICAgbmFtZTogJ2xpbmVzJyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcbiAgICB2ZXJ0ZXhfc2hhZGVyX3NyYzogc2hhZGVyU3JjX3BvbHlnb25zVmVydGV4LFxuICAgIGZyYWdtZW50X3NoYWRlcl9zcmM6IHNoYWRlclNyY19wb2x5Z29uc0ZyYWdtZW50LFxuICAgIHNlbGVjdGlvbjogdHJ1ZSwgLy8gdHVybiBmZWF0dXJlIHNlbGVjdGlvbiBvblxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgU3R5bGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIEJhc2ljIGF0dHJpYnV0ZXMsIG90aGVycyBjYW4gYmUgYWRkZWQgKHNlZSB0ZXh0dXJlIFVWcyBiZWxvdylcbiAgICAgICAgdmFyIGF0dHJpYnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3Bvc2l0aW9uJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX2V4dHJ1ZGUnLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBUZWxsIHRoZSBzaGFkZXIgd2Ugd2FudCBhIG9yZGVyIGluIHZlcnRleCBhdHRyaWJ1dGVzLCBhbmQgdG8gZXh0cnVkZSBsaW5lc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9MQVlFUl9PUkRFUiA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0VYVFJVREVfTElORVMgPSB0cnVlO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2Ffc2VsZWN0aW9uX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIGxpbmUgdGV4dHVyZSBvciBkYXNoIGFycmF5XG4gICAgICAgIC8vIChsYXR0ZXIgd2lsbCBiZSByZW5kZXJlZCBhdCBjb21waWxlLXRpbWUsIHdoZW4gR0wgY29udGV4dCBhdmFpbGFibGUpXG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUgfHwgdGhpcy5kYXNoKSB7XG4gICAgICAgICAgICB0aGlzLnRleGNvb3JkcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCB0ZXh0dXJlIFVWc1xuICAgICAgICBpZiAodGhpcy50ZXhjb29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1RFWFRVUkVfQ09PUkRTID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gU2NhbGluZyBmYWN0b3IgdG8gYWRkIHByZWNpc2lvbiB0byBsaW5lIHRleHR1cmUgViBjb29yZGluYXRlIHBhY2tlZCBhcyBub3JtYWxpemVkIHNob3J0XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFID0gMTtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1ZfU0NBTEVfQURKVVNUID0gR2VvLnRpbGVfc2NhbGUgKiB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFO1xuXG4gICAgICAgICAgICAvLyBBZGQgdmVydGV4IGF0dHJpYnV0ZSBmb3IgVVZzIG9ubHkgd2hlbiBuZWVkZWRcbiAgICAgICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3RleGNvb3JkJywgc2l6ZTogMiwgdHlwZTogZ2wuVU5TSUdORURfU0hPUlQsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQgPSBuZXcgVmVydGV4TGF5b3V0KGF0dHJpYnMpO1xuXG4gICAgICAgIC8vIEFkZGl0aW9uYWwgc2luZ2xlLWFsbG9jYXRlZCBvYmplY3QgdXNlZCBmb3IgaG9sZGluZyBvdXRsaW5lIHN0eWxlIGFzIGl0IGlzIHByb2Nlc3NlZFxuICAgICAgICAvLyBTZXBhcmF0ZSBmcm9tIHRoaXMuZmVhdHVyZV9zdHlsZSBzbyB0aGF0IG91dGxpbmUgcHJvcGVydGllcyBkbyBub3Qgb3ZlcndyaXRlIGNhbGN1bGF0ZWRcbiAgICAgICAgLy8gaW5saW5lIHByb3BlcnRpZXMgKG91dGxpbmUgY2FsbCBpcyBtYWRlICp3aXRoaW4qIHRoZSBpbmxpbmUgY2FsbClcbiAgICAgICAgdGhpcy5vdXRsaW5lX2ZlYXR1cmVfc3R5bGUgPSB7fTtcbiAgICAgICAgdGhpcy5pbmxpbmVfZmVhdHVyZV9zdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTsgLy8gc2F2ZSByZWZlcmVuY2UgdG8gbWFpbiBjb21wdXRlZCBzdHlsZSBvYmplY3RcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGVcbiAgICBjb21waWxlU2V0dXAgKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZV9zZXR1cCkge1xuICAgICAgICAgICAgdGhpcy5wYXJzZUxpbmVUZXh0dXJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0eWxlLmNvbXBpbGVTZXR1cC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICAvLyBPcHRpb25hbGx5IGFwcGx5IGEgZGFzaCBhcnJheSBwYXR0ZXJuIHRvIHRoaXMgbGluZVxuICAgIHBhcnNlTGluZVRleHR1cmUgKCkge1xuICAgICAgICAvLyBTcGVjaWZ5IGEgbGluZSBwYXR0ZXJuXG4gICAgICAgIGlmICh0aGlzLmRhc2gpIHtcbiAgICAgICAgICAgIC8vIE9wdGlvbmFsIGJhY2tncm91bmQgY29sb3IgZm9yIGRhc2ggcGF0dGVybiAoZGVmYXVsdHMgdHJhbnNwYXJlbnQpXG4gICAgICAgICAgICBpZiAodGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvciA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IodGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xJTkVfQkFDS0dST1VORF9DT0xPUiA9XG4gICAgICAgICAgICAgICAgICAgIGB2ZWMzKCR7dGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3Iuc2xpY2UoMCwgMykuam9pbignLCAnKX0pYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRqdXN0IHRleGNvb3JkIHNjYWxlIHRvIGFsbG93IGZvciBkYXNoIHBhdHRlcm5zIHRoYXQgYXJlIGEgZnJhY3Rpb24gb2YgbGluZSB3aWR0aFxuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fREFTSF9TQ0FMRSA9IDIwO1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVl9TQ0FMRV9BREpVU1QgPSBHZW8udGlsZV9zY2FsZSAqIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEU7XG5cbiAgICAgICAgICAgIC8vIFJlbmRlciBsaW5lIHBhdHRlcm5cbiAgICAgICAgICAgIGNvbnN0IGRhc2ggPSByZW5kZXJEYXNoQXJyYXkodGhpcy5kYXNoLCB7IHNjYWxlOiB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFIH0pO1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gJ18nICsgdGhpcy5uYW1lICsgJ19kYXNoYXJyYXknO1xuICAgICAgICAgICAgVGV4dHVyZS5jcmVhdGUodGhpcy5nbCwgdGhpcy50ZXh0dXJlLCB7XG4gICAgICAgICAgICAgICAgZGF0YTogZGFzaC5waXhlbHMsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBkYXNoLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6ICduZWFyZXN0J1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTcGVjaWZ5IGEgbGluZSB0ZXh0dXJlIChlaXRoZXIgZGlyZWN0bHksIG9yIHJlbmRlcmVkIGRhc2ggcGF0dGVybiBmcm9tIGFib3ZlKVxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9MSU5FX1RFWFRVUkUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fQUxQSEFfVEVTVCA9IDAuNTsgLy8gcGl4ZWxzIGJlbG93IHRoaXMgdGhyZXNob2xkIGFyZSB0cmFuc3BhcmVudFxuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zID0gdGhpcy5zaGFkZXJzLnVuaWZvcm1zIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfdGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmVfcmF0aW8gPSAxO1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgbGluZSBwYXR0ZXJuIGFzcGVjdCByYXRpbyBhZnRlciB0ZXh0dXJlIGxvYWRzXG4gICAgICAgICAgICBUZXh0dXJlLmdldEluZm8odGhpcy50ZXh0dXJlKS50aGVuKHRleHR1cmUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmVfcmF0aW8gPSB0ZXh0dXJlLmhlaWdodCAvIHRleHR1cmUud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQ2FsY3VsYXRlIHdpZHRoIGF0IHpvb20gZ2l2ZW4gaW4gYGNvbnRleHRgXG4gICAgY2FsY1dpZHRoICh3aWR0aCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gKHdpZHRoICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KHdpZHRoLCBjb250ZXh0KSkgfHwgMDtcbiAgICB9LFxuXG4gICAgLy8gQ2FsY3VsYXRlIHdpZHRoIGF0IG5leHQgem9vbSAodXNlZCBmb3IgbGluZSB3aWR0aCBpbnRlcnBvbGF0aW9uKVxuICAgIGNhbGNXaWR0aE5leHRab29tICh3aWR0aCwgY29udGV4dCkge1xuICAgICAgICBjb250ZXh0Lnpvb20rKztcbiAgICAgICAgbGV0IHZhbCA9IHRoaXMuY2FsY1dpZHRoKHdpZHRoLCBjb250ZXh0KTtcbiAgICAgICAgY29udGV4dC56b29tLS07XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIF9wYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlO1xuXG4gICAgICAgIC8vIGxpbmUgd2lkdGggaW4gbWV0ZXJzXG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuY2FsY1dpZHRoKGRyYXcud2lkdGgsIGNvbnRleHQpO1xuICAgICAgICBpZiAod2lkdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIHNraXAgbGluZXMgd2l0aCBuZWdhdGl2ZSB3aWR0aFxuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0X3dpZHRoID0gdGhpcy5jYWxjV2lkdGhOZXh0Wm9vbShkcmF3Lm5leHRfd2lkdGgsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICgod2lkdGggPT09IDAgJiYgbmV4dF93aWR0aCA9PT0gMCkgfHwgbmV4dF93aWR0aCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCBsaW5lcyB0aGF0IGRvbid0IGludGVycG9sYXRlIHRvIGEgcG9zaXRpdmUgdmFsdWUgYXQgbmV4dCB6b29tXG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb252ZXJ0IHRvIHVuaXRzIGFuZCByZWxhdGl2ZSBjaGFuZ2UgZnJvbSBwcmV2aW91cyB6b29tXG4gICAgICAgIC8vIE5COiBtdWx0aXBseSBieSAyIGJlY2F1c2UgYSBnaXZlbiB3aWR0aCBpcyB0d2ljZSBhcyBiaWcgaW4gc2NyZWVuIHNwYWNlIGF0IHRoZSBuZXh0IHpvb21cbiAgICAgICAgc3R5bGUud2lkdGggPSB3aWR0aCAqIGNvbnRleHQudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tO1xuICAgICAgICBzdHlsZS5uZXh0X3dpZHRoID0gKG5leHRfd2lkdGggKiAyKSAtIHdpZHRoO1xuICAgICAgICBzdHlsZS5uZXh0X3dpZHRoICo9IGNvbnRleHQudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tO1xuICAgICAgICBzdHlsZS5uZXh0X3dpZHRoIC89IDI7IC8vIE5COiBkaXZpZGUgYnkgMiBiZWNhdXNlIGV4dHJ1c2lvbiB3aWR0aCBpcyBoYWx2ZWQgaW4gYnVpbGRlciAtIHJlbW92ZT9cblxuICAgICAgICBzdHlsZS5jb2xvciA9IHRoaXMucGFyc2VDb2xvcihkcmF3LmNvbG9yLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzdHlsZS5jb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGVpZ2h0IGRlZmF1bHRzIHRvIGZlYXR1cmUgaGVpZ2h0LCBidXQgZXh0cnVkZSBzdHlsZSBjYW4gZHluYW1pY2FsbHkgYWRqdXN0IGhlaWdodCBieSByZXR1cm5pbmcgYSBudW1iZXIgb3IgYXJyYXkgKGluc3RlYWQgb2YgYSBib29sZWFuKVxuICAgICAgICBzdHlsZS56ID0gKGRyYXcueiAmJiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkRGlzdGFuY2VQcm9wZXJ0eShkcmF3LnogfHwgMCwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG4gICAgICAgIHN0eWxlLmhlaWdodCA9IGZlYXR1cmUucHJvcGVydGllcy5oZWlnaHQgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuaGVpZ2h0O1xuICAgICAgICBzdHlsZS5leHRydWRlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuZXh0cnVkZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHN0eWxlLmV4dHJ1ZGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc3R5bGUuZXh0cnVkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUuZXh0cnVkZSkpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmFpc2UgbGluZSBoZWlnaHQgaWYgZXh0cnVkZWRcbiAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUgJiYgc3R5bGUuaGVpZ2h0KSB7XG4gICAgICAgICAgICBzdHlsZS56ICs9IHN0eWxlLmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnogKj0gR2VvLmhlaWdodF9zY2FsZTsgICAgICAgIC8vIHByb3ZpZGUgc3ViLW1ldGVyIHByZWNpc2lvbiBvZiBoZWlnaHQgdmFsdWVzXG4gICAgICAgIHN0eWxlLmhlaWdodCAqPSBHZW8uaGVpZ2h0X3NjYWxlO1xuXG4gICAgICAgIHN0eWxlLmNhcCA9IGRyYXcuY2FwO1xuICAgICAgICBzdHlsZS5qb2luID0gZHJhdy5qb2luO1xuICAgICAgICBzdHlsZS5taXRlcl9saW1pdCA9IGRyYXcubWl0ZXJfbGltaXQ7XG4gICAgICAgIHN0eWxlLnRpbGVfZWRnZXMgPSBkcmF3LnRpbGVfZWRnZXM7IC8vIHVzdWFsbHkgYWN0aXZhdGVkIGZvciBkZWJ1Z2dpbmcsIG9yIHJhcmUgdmlzdWFsaXphdGlvbiBuZWVkc1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhbiBvdXRsaW5lIHN0eWxlXG4gICAgICAgIC8vIFJldXNhYmxlIG91dGxpbmUgc3R5bGUgb2JqZWN0LCBtYXJrZWQgYXMgYWxyZWFkeSB3cmFwcGVkIGluIGNhY2hlIG9iamVjdHMgKHByZXByb2Nlc3NlZCA9IHRydWUpXG4gICAgICAgIHN0eWxlLm91dGxpbmUgPSBzdHlsZS5vdXRsaW5lIHx8IHsgd2lkdGg6IHt9LCBuZXh0X3dpZHRoOiB7fSwgcHJlcHJvY2Vzc2VkOiB0cnVlIH07XG5cbiAgICAgICAgaWYgKGRyYXcub3V0bGluZSAmJiBkcmF3Lm91dGxpbmUudmlzaWJsZSAhPT0gZmFsc2UgJiYgZHJhdy5vdXRsaW5lLmNvbG9yICYmIGRyYXcub3V0bGluZS53aWR0aCkge1xuICAgICAgICAgICAgLy8gb3V0bGluZSB3aWR0aCBpbiBtZXRlcnNcbiAgICAgICAgICAgIC8vIE5COiBtdWx0aXBseSBieSAyIGJlY2F1c2Ugb3V0bGluZSBpcyBhcHBsaWVkIG9uIGJvdGggc2lkZXMgb2YgbGluZVxuICAgICAgICAgICAgbGV0IG91dGxpbmVfd2lkdGggPSB0aGlzLmNhbGNXaWR0aChkcmF3Lm91dGxpbmUud2lkdGgsIGNvbnRleHQpICogMjtcbiAgICAgICAgICAgIGxldCBvdXRsaW5lX25leHRfd2lkdGggPSB0aGlzLmNhbGNXaWR0aE5leHRab29tKGRyYXcub3V0bGluZS5uZXh0X3dpZHRoLCBjb250ZXh0KSAqIDI7XG5cbiAgICAgICAgICAgIGlmICgob3V0bGluZV93aWR0aCA9PT0gMCAmJiBvdXRsaW5lX25leHRfd2lkdGggPT09IDApIHx8IG91dGxpbmVfd2lkdGggPCAwIHx8IG91dGxpbmVfbmV4dF93aWR0aCA8IDApIHtcbiAgICAgICAgICAgICAgICAvLyBza2lwIGxpbmVzIHRoYXQgZG9uJ3QgaW50ZXJwb2xhdGUgYmV0d2VlbiB6ZXJvIG9yIGdyZWF0ZXIgd2lkdGhcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm5leHRfd2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuY29sb3IgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTWFpbnRhaW4gY29uc2lzdGVudCBvdXRsaW5lIHdpZHRoIGFyb3VuZCB0aGUgbGluZSBmaWxsXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSA9IG91dGxpbmVfd2lkdGggKyB3aWR0aDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm5leHRfd2lkdGgudmFsdWUgPSBvdXRsaW5lX25leHRfd2lkdGggKyBuZXh0X3dpZHRoO1xuXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jb2xvciA9IGRyYXcub3V0bGluZS5jb2xvcjtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmNhcCA9IGRyYXcub3V0bGluZS5jYXAgfHwgZHJhdy5jYXA7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5qb2luID0gZHJhdy5vdXRsaW5lLmpvaW4gfHwgZHJhdy5qb2luO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUubWl0ZXJfbGltaXQgPSBkcmF3Lm91dGxpbmUubWl0ZXJfbGltaXQgfHwgZHJhdy5taXRlcl9saW1pdDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLnN0eWxlID0gZHJhdy5vdXRsaW5lLnN0eWxlIHx8IHRoaXMubmFtZTtcblxuICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgZGVmaW5lZCBvdXRsaW5lIG9yZGVyLCBvciBpbmhlcml0ZWQgZnJvbSBpbm5lciBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKGRyYXcub3V0bGluZS5vcmRlcikge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyID0gdGhpcy5wYXJzZU9yZGVyKGRyYXcub3V0bGluZS5vcmRlciwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyID0gc3R5bGUub3JkZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgbGV0IG91dGxpbmUgYmUgYWJvdmUgaW5uZXIgbGluZVxuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5vdXRsaW5lLm9yZGVyID4gc3R5bGUub3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5vcmRlciA9IHN0eWxlLm9yZGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE91dGxpbmVzIGFyZSBhbHdheXMgYXQgaGFsZi1sYXllciBpbnRlcnZhbHMgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aCBpbm5lciBsaW5lc1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUub3JkZXIgLT0gMC41O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm5leHRfd2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jb2xvciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgfSxcblxuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIGRyYXcuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5jb2xvcik7XG4gICAgICAgIGRyYXcud2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuICAgICAgICBkcmF3Lm5leHRfd2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpOyAvLyB3aWR0aCB3aWxsIGJlIGNvbXB1dGVkIGZvciBuZXh0IHpvb21cbiAgICAgICAgZHJhdy56ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnosIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuXG4gICAgICAgIGlmIChkcmF3Lm91dGxpbmUpIHtcbiAgICAgICAgICAgIGRyYXcub3V0bGluZS5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZUNvbG9yUHJvcGVydHlDYWNoZShkcmF3Lm91dGxpbmUuY29sb3IpO1xuICAgICAgICAgICAgZHJhdy5vdXRsaW5lLndpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm91dGxpbmUud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuICAgICAgICAgICAgZHJhdy5vdXRsaW5lLm5leHRfd2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub3V0bGluZS53aWR0aCwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7IC8vIHdpZHRoIHJlLWNvbXB1dGVkIGZvciBuZXh0IHpvb21cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBcInRlbXBsYXRlXCIgdGhhdCBzZXRzIGNvbnN0YW50IGF0dGlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXgsIHdoaWNoIGlzIHRoZW4gbW9kaWZpZWQgcGVyIHZlcnRleCBvciBwZXIgZmVhdHVyZS5cbiAgICAgKiBBIHBsYWluIEpTIGFycmF5IG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAgKi9cbiAgICBtYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuXG4gICAgICAgIC8vIHBvc2l0aW9uIC0geCAmIHkgY29vcmRzIHdpbGwgYmUgZmlsbGVkIGluIHBlci12ZXJ0ZXggYmVsb3dcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUueiB8fCAwO1xuXG4gICAgICAgIC8vIGxheWVyIG9yZGVyIC0gdyBjb29yZCBvZiAncG9zaXRpb24nIGF0dHJpYnV0ZSAoZm9yIHBhY2tpbmcgZWZmaWNpZW5jeSlcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHRoaXMuc2NhbGVPcmRlcihzdHlsZS5vcmRlcik7XG5cbiAgICAgICAgLy8gZXh0cnVzaW9uIHZlY3RvclxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuXG4gICAgICAgIC8vIHNjYWxpbmcgdG8gcHJldmlvdXMgYW5kIG5leHQgem9vbVxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUubmV4dF93aWR0aDtcblxuICAgICAgICAvLyBjb2xvclxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMF0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsxXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzJdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbM10gKiAyNTU7XG5cbiAgICAgICAgLy8gc2VsZWN0aW9uIGNvbG9yXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclswXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMV0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzJdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclszXSAqIDI1NTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0ZXh0dXJlIFVWcyB0byB0ZW1wbGF0ZSBvbmx5IGlmIG5lZWRlZFxuICAgICAgICBpZiAodGhpcy50ZXhjb29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy52ZXJ0ZXhfdGVtcGxhdGU7XG4gICAgfSxcblxuICAgIGJ1aWxkTGluZXMobGluZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICAvLyBPdXRsaW5lIChidWlsZCBmaXJzdCBzbyB0aGF0IGJsZW5kZWQgZ2VvbWV0cnkgd2l0aG91dCBhIGRlcHRoIHRlc3QgaXMgZHJhd24gZmlyc3QvdW5kZXIgdGhlIGlubmVyIGxpbmUpXG4gICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHRoaXMub3V0bGluZV9mZWF0dXJlX3N0eWxlOyAvLyBzd2FwIGluIG91dGxpbmUtc3BlY2lmaWMgc3R5bGUgaG9sZGVyXG4gICAgICAgIGlmIChzdHlsZS5vdXRsaW5lICYmIHN0eWxlLm91dGxpbmUuY29sb3IgIT0gbnVsbCAmJiBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBvdXRsaW5lX3N0eWxlID0gdGhpcy5zdHlsZXNbc3R5bGUub3V0bGluZS5zdHlsZV07XG4gICAgICAgICAgICBpZiAob3V0bGluZV9zdHlsZSkge1xuICAgICAgICAgICAgICAgIG91dGxpbmVfc3R5bGUuYWRkRmVhdHVyZShjb250ZXh0LmZlYXR1cmUsIHN0eWxlLm91dGxpbmUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFpbiBsaW5lXG4gICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHRoaXMuaW5saW5lX2ZlYXR1cmVfc3R5bGU7IC8vIHJlc3RvcmUgY2FsY3VsYXRlZCBzdHlsZSBmb3IgaW5saW5lXG4gICAgICAgIGxldCB2ZXJ0ZXhfdGVtcGxhdGUgPSB0aGlzLm1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSk7XG4gICAgICAgIGJ1aWxkUG9seWxpbmVzKFxuICAgICAgICAgICAgbGluZXMsXG4gICAgICAgICAgICBzdHlsZS53aWR0aCxcbiAgICAgICAgICAgIHZlcnRleF9kYXRhLFxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhcDogc3R5bGUuY2FwLFxuICAgICAgICAgICAgICAgIGpvaW46IHN0eWxlLmpvaW4sXG4gICAgICAgICAgICAgICAgbWl0ZXJfbGltaXQ6IHN0eWxlLm1pdGVyX2xpbWl0LFxuICAgICAgICAgICAgICAgIHNjYWxpbmdfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX2V4dHJ1ZGUsXG4gICAgICAgICAgICAgICAgc2NhbGluZ19ub3JtYWxpemU6IDI1NiwgLy8gdmFsdWVzIGhhdmUgYW4gOC1iaXQgZnJhY3Rpb25cbiAgICAgICAgICAgICAgICB0ZXhjb29yZF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfdGV4Y29vcmQsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfd2lkdGg6IChzdHlsZS53aWR0aCB8fCBzdHlsZS5uZXh0X3dpZHRoKSAvIGNvbnRleHQudGlsZS5vdmVyem9vbTIsIC8vIFVWcyBjYW4ndCBjYWxjIGZvciB6ZXJvLXdpZHRoLCB1c2UgbmV4dCB6b29tIHdpZHRoIGluIHRoYXQgY2FzZVxuICAgICAgICAgICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZTogNjU1MzUsIC8vIHNjYWxlIFVWcyB0byB1bnNpZ25lZCBzaG9ydHNcbiAgICAgICAgICAgICAgICBjbG9zZWRfcG9seWdvbjogb3B0aW9ucyAmJiBvcHRpb25zLmNsb3NlZF9wb2x5Z29uLFxuICAgICAgICAgICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzOiAhc3R5bGUudGlsZV9lZGdlcyAmJiBvcHRpb25zICYmIG9wdGlvbnMucmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgICAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZTogR2VvLnRpbGVfc2NhbGUgKiBjb250ZXh0LnRpbGUucGFkX3NjYWxlICogNFxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBidWlsZFBvbHlnb25zKHBvbHlnb25zLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gUmVuZGVyIHBvbHlnb25zIGFzIGluZGl2aWR1YWwgbGluZXNcbiAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgcG9seWdvbnMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lcyhwb2x5Z29uc1twXSwgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0LCB7IGNsb3NlZF9wb2x5Z29uOiB0cnVlLCByZW1vdmVfdGlsZV9lZGdlczogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxufSk7XG4iLCIvLyBQb2ludCArIHRleHQgbGFiZWwgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCBsb2cgZnJvbSAnLi4vLi4vdXRpbHMvbG9nJztcbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgZ2wgZnJvbSAnLi4vLi4vZ2wvY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBWZXJ0ZXhMYXlvdXQgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2xheW91dCc7XG5pbXBvcnQge2J1aWxkUXVhZHNGb3JQb2ludHN9IGZyb20gJy4uLy4uL2J1aWxkZXJzL3BvaW50cyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi8uLi9nbC90ZXh0dXJlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi4vLi4vdmVjdG9yJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi4vLi4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgTGFiZWxQb2ludCBmcm9tICcuLi8uLi9sYWJlbHMvbGFiZWxfcG9pbnQnO1xuaW1wb3J0IHBsYWNlUG9pbnRzT25MaW5lIGZyb20gJy4uLy4uL2xhYmVscy9wb2ludF9wbGFjZW1lbnQnO1xuaW1wb3J0IHtUZXh0TGFiZWxzfSBmcm9tICcuLi90ZXh0L3RleHRfbGFiZWxzJztcbmltcG9ydCB7VklFV19QQU5fU05BUF9USU1FfSBmcm9tICcuLi8uLi92aWV3JztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoYWRlclNyY19wb2ludHNWZXJ0ZXggPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2ludHNfdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3BvaW50c0ZyYWdtZW50ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9pbnRzX2ZyYWdtZW50Lmdsc2wnLCAndXRmOCcpO1xuXG5jb25zdCBQTEFDRU1FTlQgPSBMYWJlbFBvaW50LlBMQUNFTUVOVDtcblxuZXhwb3J0IHZhciBQb2ludHMgPSBPYmplY3QuY3JlYXRlKFN0eWxlKTtcblxuLy8gTWl4aW4gdGV4dCBsYWJlbCBtZXRob2RzXG5PYmplY3QuYXNzaWduKFBvaW50cywgVGV4dExhYmVscyk7XG5cbk9iamVjdC5hc3NpZ24oUG9pbnRzLCB7XG4gICAgbmFtZTogJ3BvaW50cycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgY29sbGlzaW9uOiB0cnVlLCAgLy8gc3R5bGUgaW5jbHVkZXMgYSBjb2xsaXNpb24gcGFzc1xuICAgIGJsZW5kOiAnb3ZlcmxheScsIC8vIG92ZXJsYXlzIGRyYXduIG9uIHRvcCBvZiBhbGwgb3RoZXIgc3R5bGVzLCB3aXRoIGJsZW5kaW5nXG5cbiAgICBpbml0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBTdHlsZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgLy8gQmFzZSBzaGFkZXJzXG4gICAgICAgIHRoaXMudmVydGV4X3NoYWRlcl9zcmMgPSBzaGFkZXJTcmNfcG9pbnRzVmVydGV4O1xuICAgICAgICB0aGlzLmZyYWdtZW50X3NoYWRlcl9zcmMgPSBzaGFkZXJTcmNfcG9pbnRzRnJhZ21lbnQ7XG5cbiAgICAgICAgdmFyIGF0dHJpYnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3Bvc2l0aW9uJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3NoYXBlJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3RleGNvb3JkJywgc2l6ZTogMiwgdHlwZTogZ2wuVU5TSUdORURfU0hPUlQsIG5vcm1hbGl6ZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2Ffb2Zmc2V0Jywgc2l6ZTogMiwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9XG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV9zZWxlY3Rpb25fY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0pO1xuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG5cbiAgICAgICAgLy8gSWYgd2UncmUgbm90IHJlbmRlcmluZyBhcyBvdmVybGF5LCB3ZSBuZWVkIGEgbGF5ZXIgYXR0cmlidXRlXG4gICAgICAgIGlmICh0aGlzLmJsZW5kICE9PSAnb3ZlcmxheScpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xBWUVSX09SREVSID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuc3VyZSBhIGxhYmVsIHRleHR1cmUgaXMgYWx3YXlzIGJvdW5kIChhdm9pZCBDaHJvbWUgJ25vIHRleHR1cmUgYm91bmQgdG8gdW5pdCcgd2FybmluZ3MpXG4gICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3JtcyA9IHRoaXMuc2hhZGVycy51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfbGFiZWxfdGV4dHVyZSA9IFRleHR1cmUuZGVmYXVsdDtcblxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9QT0lOVF9URVhUVVJFID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmFibGUgZHVhbCBwb2ludC90ZXh0IG1vZGVcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTVVMVElfU0FNUExFUiA9IHRydWU7XG5cbiAgICAgICAgLy8gRmFkZSBvdXQgd2hlbiB0aWxlIGlzIHpvb21pbmcgb3V0LCBlLmcuIGFjdGluZyBhcyBwcm94eSB0aWxlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9PTl9aT09NX09VVF9SQVRFID0gMjsgLy8gZmFkZSBhdCAyeCwgZS5nLiBmdWxseSB0cmFuc3BhcmVudCBhdCAwLjUgem9vbSBsZXZlbCBhd2F5XG5cbiAgICAgICAgLy8gRmFkZSBpbiAoZGVwZW5kaW5nIG9uIHRpbGUgcHJveHkgc3RhdHVzKVxuICAgICAgICBpZiAoZGVidWdTZXR0aW5ncy5zdXBwcmVzc19sYWJlbF9mYWRlX2luID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IDA7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX0lOX1JBVEUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mYWRlX2luX3RpbWUgPSAwLjE1OyAvLyB0aW1lIGluIHNlY29uZHNcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfSU5fUkFURSA9IDEgLyB0aGlzLmZhZGVfaW5fdGltZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNuYXAgcG9pbnRzIHRvIHBpeGVsIGdyaWQgYWZ0ZXIgcGFubmluZyBzdG9wXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLnN1cHByZXNzX2xhYmVsX3NuYXBfYW5pbWF0aW9uICE9PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9WSUVXX1BBTl9TTkFQX1JBVEUgPSAxIC8gVklFV19QQU5fU05BUF9USU1FOyAvLyBpbnZlcnNlIHRpbWUgaW4gc2Vjb25kc1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb2xsaXNpb25fZ3JvdXBfcG9pbnRzID0gdGhpcy5uYW1lKyctcG9pbnRzJztcbiAgICAgICAgdGhpcy5jb2xsaXNpb25fZ3JvdXBfdGV4dCA9IHRoaXMubmFtZSsnLXRleHQnO1xuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9LFxuXG4gICAgcmVzZXQgKCkge1xuICAgICAgICB0aGlzLnF1ZXVlcyA9IHt9O1xuICAgICAgICB0aGlzLnJlc2V0VGV4dCgpO1xuICAgICAgICB0aGlzLnRleHR1cmVfbWlzc2luZ19zcHJpdGVzID0ge307IC8vIHRyYWNrIHdoaWNoIG1pc3Npbmcgc3ByaXRlcyB3ZSd2ZSBmb3VuZCAocmVkdWNlIGR1cGUgbG9nIG1lc3NhZ2VzKVxuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZSB0byBxdWV1ZSBmZWF0dXJlcyBpbnN0ZWFkIG9mIHByb2Nlc3NpbmcgaW1tZWRpYXRlbHlcbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGxlZCBoZXJlIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgZGVsYXllZCB1bnRpbCB0aGUgZmVhdHVyZSBxdWV1ZSBpcyBwYXJzZWQsXG4gICAgICAgIC8vIGFuZCB3ZSB3YW50IHRoZSBwcmVwcm9jZXNzaW5nIGRvbmUgYmVmb3JlIHdlIGV2YWx1YXRlIHRleHQgc3R5bGUgYmVsb3dcbiAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3R5bGUgPSB7fTtcbiAgICAgICAgc3R5bGUuY29sb3IgPSB0aGlzLnBhcnNlQ29sb3IoZHJhdy5jb2xvciwgY29udGV4dCk7XG5cbiAgICAgICAgLy8gUG9pbnQgc3R5bGluZ1xuXG4gICAgICAgIC8vIHJlcXVpcmUgY29sb3Igb3IgdGV4dHVyZVxuICAgICAgICBpZiAoIXN0eWxlLmNvbG9yICYmICF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNwcml0ZSA9IHN0eWxlLnNwcml0ZSA9IFN0eWxlUGFyc2VyLmV2YWxQcm9wZXJ0eShkcmF3LnNwcml0ZSwgY29udGV4dCk7XG4gICAgICAgIHN0eWxlLnNwcml0ZV9kZWZhdWx0ID0gZHJhdy5zcHJpdGVfZGVmYXVsdDsgLy8gb3B0aW9uYWwgZmFsbGJhY2sgaWYgJ3Nwcml0ZScgbm90IGZvdW5kXG5cbiAgICAgICAgLy8gaWYgcG9pbnQgaGFzIHRleHR1cmUgYW5kIHNwcml0ZXMsIHJlcXVpcmUgYSB2YWxpZCBzcHJpdGUgdG8gZHJhd1xuICAgICAgICBpZiAodGhpcy50ZXh0dXJlICYmIFRleHR1cmUudGV4dHVyZXNbdGhpcy50ZXh0dXJlXSAmJiBUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0uc3ByaXRlcykge1xuICAgICAgICAgICAgaWYgKCFzcHJpdGUgJiYgIXN0eWxlLnNwcml0ZV9kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIVRleHR1cmUudGV4dHVyZXNbdGhpcy50ZXh0dXJlXS5zcHJpdGVzW3Nwcml0ZV0pIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBzcHJpdGUgbm90IGZvdW5kLCBjaGVjayBmb3IgZGVmYXVsdCBzcHJpdGVcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUuc3ByaXRlX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ByaXRlID0gc3R5bGUuc3ByaXRlX2RlZmF1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghVGV4dHVyZS50ZXh0dXJlc1t0aGlzLnRleHR1cmVdLnNwcml0ZXNbc3ByaXRlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFN0eWxlOiBpbiBzdHlsZSAnJHt0aGlzLm5hbWV9JywgY291bGQgbm90IGZpbmQgZGVmYXVsdCBzcHJpdGUgJyR7c3ByaXRlfScgZm9yIHRleHR1cmUgJyR7dGhpcy50ZXh0dXJlfSdgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRleHR1cmVfbWlzc2luZ19zcHJpdGVzW3Nwcml0ZV0pIHsgLy8gb25seSBsb2cgZWFjaCBtaXNzaW5nIHNwcml0ZSBvbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYFN0eWxlOiBpbiBzdHlsZSAnJHt0aGlzLm5hbWV9JywgY291bGQgbm90IGZpbmQgc3ByaXRlICcke3Nwcml0ZX0nIGZvciB0ZXh0dXJlICcke3RoaXMudGV4dHVyZX0nYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmVfbWlzc2luZ19zcHJpdGVzW3Nwcml0ZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3ByaXRlKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBzcHJpdGUgJyR7c3ByaXRlfScgd2FzIHNwZWNpZmllZCwgYnV0IHRleHR1cmUgJyR7dGhpcy50ZXh0dXJlfScgaGFzIG5vIHNwcml0ZXNgKTtcbiAgICAgICAgICAgIHNwcml0ZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXRzIHRleGNvb3JkIHNjYWxlIGlmIG5lZWRlZCAoZS5nLiBmb3Igc3ByaXRlIHN1Yi1hcmVhKVxuICAgICAgICBsZXQgc3ByaXRlX2luZm87XG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUgJiYgc3ByaXRlKSB7XG4gICAgICAgICAgICBzcHJpdGVfaW5mbyA9IFRleHR1cmUuZ2V0U3ByaXRlSW5mbyh0aGlzLnRleHR1cmUsIHNwcml0ZSk7XG4gICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBzcHJpdGVfaW5mby50ZXhjb29yZHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcG9pbnRzIGNhbiBiZSBwbGFjZWQgb2ZmIHRoZSBncm91bmRcbiAgICAgICAgc3R5bGUueiA9IChkcmF3LnogJiYgU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkoZHJhdy56LCBjb250ZXh0KSkgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuejtcblxuICAgICAgICAvLyBwb2ludCBzaXplIGRlZmluZWQgZXhwbGljaXRseSwgb3IgZGVmYXVsdHMgdG8gc3ByaXRlIHNpemUsIG9yIGdlbmVyaWMgZmFsbGJhY2tcbiAgICAgICAgc3R5bGUuc2l6ZSA9IGRyYXcuc2l6ZTtcbiAgICAgICAgaWYgKCFzdHlsZS5zaXplKSB7XG4gICAgICAgICAgICBpZiAoc3ByaXRlX2luZm8pIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gc3ByaXRlX2luZm8uc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSBbMTYsIDE2XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLnNpemUgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoc3R5bGUuc2l6ZSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaXplIHdpbGwgYmUgc2NhbGVkIHRvIDE2LWJpdCBzaWduZWQgaW50LCBzbyBtYXggYWxsb3dlZCB3aWR0aCArIGhlaWdodCBvZiAyNTYgcGl4ZWxzXG4gICAgICAgIHN0eWxlLnNpemUgPSBbXG4gICAgICAgICAgICBNYXRoLm1pbigoc3R5bGUuc2l6ZVswXSB8fCBzdHlsZS5zaXplKSwgMjU2KSxcbiAgICAgICAgICAgIE1hdGgubWluKChzdHlsZS5zaXplWzFdIHx8IHN0eWxlLnNpemUpLCAyNTYpXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gUGxhY2VtZW50IHN0cmF0ZWd5XG4gICAgICAgIHN0eWxlLnBsYWNlbWVudCA9IGRyYXcucGxhY2VtZW50O1xuICAgICAgICBzdHlsZS5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBTcGFjaW5nIHBhcmFtZXRlciAoaW4gcGl4ZWxzKSB0byBlcXVhbGx5IHNwYWNlIHBvaW50cyBhbG9uZyBhIGxpbmVcbiAgICAgICAgaWYgKHN0eWxlLnBsYWNlbWVudCA9PT0gUExBQ0VNRU5ULlNQQUNFRCAmJiBkcmF3LnBsYWNlbWVudF9zcGFjaW5nKSB7XG4gICAgICAgICAgICBzdHlsZS5wbGFjZW1lbnRfc3BhY2luZyA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnBsYWNlbWVudF9zcGFjaW5nLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFuZ2xlIHBhcmFtZXRlciAoY2FuIGJlIGEgbnVtYmVyIG9yIHRoZSBzdHJpbmcgXCJhdXRvXCIpXG4gICAgICAgIHN0eWxlLmFuZ2xlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuYW5nbGUsIGNvbnRleHQpO1xuXG4gICAgICAgIHN0eWxlLnRpbGVfZWRnZXMgPSBkcmF3LnRpbGVfZWRnZXM7IC8vIHVzdWFsbHkgYWN0aXZhdGVkIGZvciBkZWJ1Z2dpbmcsIG9yIHJhcmUgdmlzdWFsaXphdGlvbiBuZWVkc1xuXG4gICAgICAgIHN0eWxlLnNhbXBsZXIgPSAwOyAvLyAwID0gc3ByaXRlc1xuXG4gICAgICAgIHRoaXMuY29tcHV0ZUxheW91dChzdHlsZSwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSk7XG5cbiAgICAgICAgLy8gVGV4dCBzdHlsaW5nXG4gICAgICAgIGxldCB0ZiA9XG4gICAgICAgICAgICBkcmF3LnRleHQgJiZcbiAgICAgICAgICAgIGRyYXcudGV4dC52aXNpYmxlICE9PSBmYWxzZSAmJiAvLyBleHBsaWNpdGx5IGhhbmRsZSBgdmlzaWJsZWAgcHJvcGVydHkgZm9yIG5lc3RlZCB0ZXh0XG4gICAgICAgICAgICB0aGlzLnBhcnNlVGV4dEZlYXR1cmUoZmVhdHVyZSwgZHJhdy50ZXh0LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICBpZiAodGYpIHtcbiAgICAgICAgICAgIHRmLmxheW91dC5wYXJlbnQgPSBzdHlsZTsgLy8gcGFyZW50IHBvaW50IHdpbGwgYXBwbHkgYWRkaXRpb25hbCBhbmNob3Ivb2Zmc2V0IHRvIHRleHRcblxuICAgICAgICAgICAgLy8gVGV4dCBsYWJlbHMgaGF2ZSBhIGRlZmF1bHQgcHJpb3JpdHkgb2YgMC41IGJlbG93IHRoZWlyIHBhcmVudCBwb2ludCAoKzAuNSwgcHJpb3JpdHkgaXMgbG93ZXItaXMtYmV0dGVyKVxuICAgICAgICAgICAgLy8gVGhpcyBjYW4gYmUgb3ZlcnJpZGVuLCBhcyBsb25nIGFzIGl0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVmYXVsdFxuICAgICAgICAgICAgdGYubGF5b3V0LnByaW9yaXR5ID0gZHJhdy50ZXh0LnByaW9yaXR5ID8gTWF0aC5tYXgodGYubGF5b3V0LnByaW9yaXR5LCBzdHlsZS5wcmlvcml0eSArIDAuNSkgOiAoc3R5bGUucHJpb3JpdHkgKyAwLjUpO1xuXG4gICAgICAgICAgICAvLyBUZXh0IGxhYmVscyBhdHRhY2hlZCB0byBwb2ludHMgc2hvdWxkIG5vdCBiZSBtb3ZlZCBpbnRvIHRpbGVcbiAgICAgICAgICAgIC8vICh0aGV5IHNob3VsZCBzdGF5IGZpeGVkIHJlbGF0aXZlIHRvIHRoZSBwb2ludClcbiAgICAgICAgICAgIHRmLmxheW91dC5tb3ZlX2ludG9fdGlsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBDb2xsaXNpb24uYWRkU3R5bGUodGhpcy5jb2xsaXNpb25fZ3JvdXBfdGV4dCwgdGlsZS5rZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUXVldWUgdGhlIGZlYXR1cmUgZm9yIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRhKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldLnB1c2goe1xuICAgICAgICAgICAgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgc3R5bGUsXG4gICAgICAgICAgICB0ZXh0X2ZlYXR1cmU6IHRmXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggY29sbGlzaW9uIG1hbmFnZXJcbiAgICAgICAgQ29sbGlzaW9uLmFkZFN0eWxlKHRoaXMuY29sbGlzaW9uX2dyb3VwX3BvaW50cywgdGlsZS5rZXkpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0gPSBbXTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLnN0YXJ0RGF0YS5jYWxsKHRoaXMsIHRpbGUpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIGVuZERhdGEgKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU3R5bGUgJHt0aGlzLm5hbWV9OiBzdG9wIHRpbGUgYnVpbGQgYmVjYXVzZSB0aWxlIHdhcyBjYW5jZWxlZDogJHt0aWxlLmtleX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBxdWV1ZSA9IHRoaXMucXVldWVzW3RpbGUua2V5XTtcbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldID0gW107XG5cbiAgICAgICAgLy8gRm9yIGVhY2ggcG9pbnQgZmVhdHVyZSwgY3JlYXRlIG9uZSBvciBtb3JlIGxhYmVsc1xuICAgICAgICBsZXQgdGV4dF9vYmpzID0gW107XG4gICAgICAgIGxldCBwb2ludF9vYmpzID0gW107XG5cbiAgICAgICAgcXVldWUuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHEuc3R5bGU7XG4gICAgICAgICAgICBsZXQgZmVhdHVyZSA9IHEuZmVhdHVyZTtcbiAgICAgICAgICAgIGxldCBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG5cbiAgICAgICAgICAgIGxldCBmZWF0dXJlX2xhYmVscyA9IHRoaXMuYnVpbGRMYWJlbHMoc3R5bGUuc2l6ZSwgZ2VvbWV0cnksIHN0eWxlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdHVyZV9sYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBmZWF0dXJlX2xhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgcG9pbnRfb2JqID0ge1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICBkcmF3OiBxLmRyYXcsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHEuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBwb2ludF9vYmpzLnB1c2gocG9pbnRfb2JqKTtcblxuICAgICAgICAgICAgICAgIGlmIChxLnRleHRfZmVhdHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9vYmogPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHJhdzogcS50ZXh0X2ZlYXR1cmUuZHJhdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHEuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHEudGV4dF9mZWF0dXJlLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3NldHRpbmdzX2tleTogcS50ZXh0X2ZlYXR1cmUudGV4dF9zZXR0aW5nc19rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ6IHEudGV4dF9mZWF0dXJlLmxheW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2xhYmVsOiBsYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlZDogcG9pbnRfb2JqICAgLy8gbGluayBzbyB0ZXh0IG9ubHkgcmVuZGVycyB3aGVuIHBhcmVudCBwb2ludCBpcyBwbGFjZWRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9vYmpzLnB1c2godGV4dF9vYmopO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFVubGVzcyB0ZXh0IGZlYXR1cmUgaXMgb3B0aW9uYWwsIGNyZWF0ZSBhIHR3by13YXkgbGluayBzbyB0aGF0IHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB3aWxsIG9ubHkgcmVuZGVyIHdoZW4gdGV4dCBpcyBhbHNvIHBsYWNlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXEuZHJhdy50ZXh0Lm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9vYmoubGlua2VkID0gdGV4dF9vYmo7IC8vIHR3by13YXkgbGlua1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDb2xsaWRlIGJvdGggcG9pbnRzIGFuZCB0ZXh0LCB0aGVuIGJ1aWxkIGZlYXR1cmVzXG4gICAgICAgIHJldHVybiBQcm9taXNlLlxuICAgICAgICAgICAgYWxsKFtcbiAgICAgICAgICAgICAgICAvLyBQb2ludHNcbiAgICAgICAgICAgICAgICBDb2xsaXNpb24uY29sbGlkZShwb2ludF9vYmpzLCB0aGlzLmNvbGxpc2lvbl9ncm91cF9wb2ludHMsIHRpbGUua2V5KS50aGVuKHBvaW50X29ianMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwb2ludF9vYmpzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSBxLnN0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlLmxhYmVsID0gcS5sYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlLmFkZEZlYXR1cmUuY2FsbCh0aGlzLCBxLmZlYXR1cmUsIHEuZHJhdywgcS5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgLy8gTGFiZWxzXG4gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlVGV4dExhYmVscyh0aWxlLCB0aGlzLmNvbGxpc2lvbl9ncm91cF90ZXh0LCB0ZXh0X29ianMpLlxuICAgICAgICAgICAgICAgICAgICB0aGVuKGxhYmVscyA9PiB0aGlzLmNvbGxpZGVBbmRSZW5kZXJUZXh0TGFiZWxzKHRpbGUsIHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQsIGxhYmVscykpXG4gICAgICAgICAgICBdKS50aGVuKChbLCB7IGxhYmVscywgdGV4dHMsIHRleHR1cmUgfV0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGxhYmVsc1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbHMgJiYgdGV4dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgcXVldWVkIGZlYXR1cmVzXG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gcS50ZXh0X3NldHRpbmdzX2tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV0gJiYgdGV4dHNbdGV4dF9zZXR0aW5nc19rZXldW3EudGV4dF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIHN0eWxpbmcgb2JqZWN0IGV4cGVjdGVkIGJ5IFN0eWxlIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5sYWJlbCA9IHEubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gdGV4dF9pbmZvLnNpemUubG9naWNhbF9zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gdGV4dF9pbmZvLmFsaWduW3EubGFiZWwuYWxpZ25dLnRleGNvb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFuZ2xlID0gcS5sYWJlbC5hbmdsZSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2FtcGxlciA9IDE7IC8vIG5vbi0wID0gbGFiZWxzXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlLmFkZEZlYXR1cmUuY2FsbCh0aGlzLCBxLmZlYXR1cmUsIHEuZHJhdywgcS5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZnJlZVRleHQodGlsZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBGaW5pc2ggdGlsZSBtZXNoXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlLmVuZERhdGEuY2FsbCh0aGlzLCB0aWxlKS50aGVuKHRpbGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCB0aWxlLXNwZWNpZmljIGxhYmVsIGF0bGFzIHRvIG1lc2ggYXMgYSB0ZXh0dXJlIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHR1cmUgJiYgdGlsZV9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudW5pZm9ybXMgPSB0aWxlX2RhdGEudW5pZm9ybXMgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMgPSB0aWxlX2RhdGEudGV4dHVyZXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3Jtcy51X2xhYmVsX3RleHR1cmUgPSB0ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnRleHR1cmVzLnB1c2godGV4dHVyZSk7IC8vIGFzc2lnbiB0ZXh0dXJlIG93bmVyc2hpcCB0byB0aWxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICBkcmF3LmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcuY29sb3IpO1xuICAgICAgICBkcmF3LnogPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcueiwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG5cbiAgICAgICAgLy8gU2l6ZSAoMWQgdmFsdWUgb3IgMmQgYXJyYXkpXG4gICAgICAgIGRyYXcuc2l6ZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5zaXplLCB2ID0+IEFycmF5LmlzQXJyYXkodikgPyB2Lm1hcChwYXJzZUZsb2F0KSA6IHBhcnNlRmxvYXQodikpO1xuXG4gICAgICAgIC8vIE9mZnNldCAoMmQgYXJyYXkpXG4gICAgICAgIGRyYXcub2Zmc2V0ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm9mZnNldCwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lm1hcChwYXJzZUZsb2F0KSkgfHwgMCk7XG5cbiAgICAgICAgLy8gQnVmZmVyICgxZCB2YWx1ZSBvciAyZCBhcnJheSwgZXhwYW5kIDFkIHRvIDJkKVxuICAgICAgICBkcmF3LmJ1ZmZlciA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5idWZmZXIsIHYgPT4gKEFycmF5LmlzQXJyYXkodikgPyB2IDogW3YsIHZdKS5tYXAocGFyc2VGbG9hdCkgfHwgMCk7XG5cbiAgICAgICAgLy8gUmVwZWF0IHJ1bGVzIC0gbm8gcmVwZWF0IGxpbWl0YXRpb24gZm9yIHBvaW50cyBieSBkZWZhdWx0XG4gICAgICAgIGRyYXcucmVwZWF0X2Rpc3RhbmNlID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnJlcGVhdF9kaXN0YW5jZSwgcGFyc2VGbG9hdCk7XG5cbiAgICAgICAgLy8gUGxhY2VtZW50IHN0cmF0ZWdpZXNcbiAgICAgICAgZHJhdy5wbGFjZW1lbnQgPSBQTEFDRU1FTlRbZHJhdy5wbGFjZW1lbnQgJiYgZHJhdy5wbGFjZW1lbnQudG9VcHBlckNhc2UoKV07XG4gICAgICAgIGlmIChkcmF3LnBsYWNlbWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICBkcmF3LnBsYWNlbWVudCA9IFBMQUNFTUVOVC5WRVJURVg7XG4gICAgICAgIH1cblxuICAgICAgICBkcmF3LnBsYWNlbWVudF9zcGFjaW5nID0gZHJhdy5wbGFjZW1lbnRfc3BhY2luZyAhPSBudWxsID8gZHJhdy5wbGFjZW1lbnRfc3BhY2luZyA6IDgwOyAvLyBkZWZhdWx0IHNwYWNpbmdcbiAgICAgICAgZHJhdy5wbGFjZW1lbnRfc3BhY2luZyA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5wbGFjZW1lbnRfc3BhY2luZywgcGFyc2VGbG9hdCk7XG5cbiAgICAgICAgZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA9IGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gIT0gbnVsbCA/IGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gOiAxO1xuICAgICAgICBkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvLCBwYXJzZUZsb2F0KTtcblxuICAgICAgICBpZiAodHlwZW9mIGRyYXcuYW5nbGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBkcmF3LmFuZ2xlID0gZHJhdy5hbmdsZSAqIE1hdGguUEkgLyAxODA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkcmF3LmFuZ2xlID0gZHJhdy5hbmdsZSB8fCAwOyAvLyBhbmdsZSBjYW4gYmUgYSBzdHJpbmcgbGlrZSBcImF1dG9cIiAodXNlIGFuZ2xlIG9mIGdlb21ldHJ5KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgdGV4dCBzdHlsaW5nXG4gICAgICAgIGRyYXcudGV4dCA9IHRoaXMucHJlcHJvY2Vzc1RleHQoZHJhdy50ZXh0KTsgLy8gd2lsbCByZXR1cm4gbnVsbCBpZiB2YWxpZCB0ZXh0IHN0eWxpbmcgd2Fzbid0IHByb3ZpZGVkXG4gICAgICAgIGlmIChkcmF3LnRleHQpIHtcbiAgICAgICAgICAgIGRyYXcudGV4dC5rZXkgPSBkcmF3LmtleTsgLy8gY29weSBsYXllciBrZXkgZm9yIHVzZSBhcyBsYWJlbCByZXBlYXQgZ3JvdXBcbiAgICAgICAgICAgIGRyYXcudGV4dC5yZXBlYXRfZ3JvdXAgPSBkcmF3LnRleHQucmVwZWF0X2dyb3VwIHx8IGRyYXcucmVwZWF0X2dyb3VwOyAvLyBpbmhlcml0IHJlcGVhdCBncm91cCBieSBkZWZhdWx0XG4gICAgICAgICAgICBkcmF3LnRleHQuYW5jaG9yID0gZHJhdy50ZXh0LmFuY2hvciB8fCB0aGlzLmRlZmF1bHRfYW5jaG9yO1xuICAgICAgICAgICAgZHJhdy50ZXh0Lm9wdGlvbmFsID0gKHR5cGVvZiBkcmF3LnRleHQub3B0aW9uYWwgPT09ICdib29sZWFuJykgPyBkcmF3LnRleHQub3B0aW9uYWwgOiBmYWxzZTsgLy8gZGVmYXVsdCB0ZXh0IHRvIHJlcXVpcmVkXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLy8gRGVmYXVsdCB0byB0cnlpbmcgYWxsIGFuY2hvciBwbGFjZW1lbnRzXG4gICAgZGVmYXVsdF9hbmNob3I6IFsnYm90dG9tJywgJ3RvcCcsICdyaWdodCcsICdsZWZ0J10sXG5cbiAgICAvLyBDb21wdXRlIGxhYmVsIGxheW91dC1yZWxhdGVkIHByb3BlcnRpZXNcbiAgICBjb21wdXRlTGF5b3V0ICh0YXJnZXQsIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpIHtcbiAgICAgICAgbGV0IGxheW91dCA9IHRhcmdldCB8fCB7fTtcbiAgICAgICAgbGF5b3V0LmlkID0gZmVhdHVyZTtcbiAgICAgICAgbGF5b3V0LnVuaXRzX3Blcl9waXhlbCA9IHRpbGUudW5pdHNfcGVyX3BpeGVsIHx8IDE7XG5cbiAgICAgICAgLy8gY29sbGlzaW9uIGZsYWdcbiAgICAgICAgbGF5b3V0LmNvbGxpZGUgPSAoZHJhdy5jb2xsaWRlID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7XG5cbiAgICAgICAgLy8gdGlsZSBib3VuZGFyeSBoYW5kbGluZ1xuICAgICAgICBsYXlvdXQuY3VsbF9mcm9tX3RpbGUgPSAoZHJhdy5jdWxsX2Zyb21fdGlsZSAhPSBudWxsKSA/IGRyYXcuY3VsbF9mcm9tX3RpbGUgOiBmYWxzZTtcblxuICAgICAgICAvLyBwb2ludHMgc2hvdWxkIG5vdCBtb3ZlIGludG8gdGlsZSBpZiBvdmVyIHRpbGUgYm91bmRhcnlcbiAgICAgICAgbGF5b3V0Lm1vdmVfaW50b190aWxlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gbGFiZWwgYW5jaG9ycyAocG9pbnQgbGFiZWxzIG9ubHkpXG4gICAgICAgIC8vIGxhYmVsIHBvc2l0aW9uIHdpbGwgYmUgYWRqdXN0ZWQgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbiwgcmVsYXRpdmUgdG8gaXRzIG9yaWdpbmFsIHBvaW50XG4gICAgICAgIC8vIG9uZSBvZjogbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0b3AtbGVmdCwgdG9wLXJpZ2h0LCBib3R0b20tbGVmdCwgYm90dG9tLXJpZ2h0XG4gICAgICAgIGxheW91dC5hbmNob3IgPSBkcmF3LmFuY2hvcjtcblxuICAgICAgICAvLyBsYWJlbCBvZmZzZXQgYW5kIGJ1ZmZlciBpbiBwaXhlbCAoYXBwbGllZCBpbiBzY3JlZW4gc3BhY2UpXG4gICAgICAgIGxheW91dC5vZmZzZXQgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5vZmZzZXQsIGNvbnRleHQpIHx8IFN0eWxlUGFyc2VyLnplcm9QYWlyO1xuICAgICAgICBsYXlvdXQuYnVmZmVyID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuYnVmZmVyLCBjb250ZXh0KSB8fCBTdHlsZVBhcnNlci56ZXJvUGFpcjtcblxuICAgICAgICAvLyByZXBlYXQgcnVsZXNcbiAgICAgICAgbGF5b3V0LnJlcGVhdF9kaXN0YW5jZSA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnJlcGVhdF9kaXN0YW5jZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChsYXlvdXQucmVwZWF0X2Rpc3RhbmNlKSB7XG4gICAgICAgICAgICBsYXlvdXQucmVwZWF0X2Rpc3RhbmNlICo9IGxheW91dC51bml0c19wZXJfcGl4ZWw7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZHJhdy5yZXBlYXRfZ3JvdXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5yZXBlYXRfZ3JvdXAoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZHJhdy5yZXBlYXRfZ3JvdXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9ncm91cCA9IGRyYXcucmVwZWF0X2dyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9ncm91cCA9IGRyYXcua2V5OyAvLyBkZWZhdWx0IHRvIHVuaXF1ZSBzZXQgb2YgbWF0Y2hpbmcgbGF5ZXJzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsYWJlbCBwcmlvcml0eSAobG93ZXIgaXMgaGlnaGVyKVxuICAgICAgICBsZXQgcHJpb3JpdHkgPSBkcmF3LnByaW9yaXR5O1xuICAgICAgICBpZiAocHJpb3JpdHkgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcmlvcml0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gcHJpb3JpdHkoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmlvcml0eSA9IC0xID4+PiAwOyAvLyBkZWZhdWx0IHRvIG1heCBwcmlvcml0eSB2YWx1ZSBpZiBub25lIHNldFxuICAgICAgICB9XG4gICAgICAgIGxheW91dC5wcmlvcml0eSA9IHByaW9yaXR5O1xuXG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfSxcblxuICAgIC8vIEltcGxlbWVudHMgbGFiZWwgYnVpbGRpbmcgZm9yIFRleHRMYWJlbHMgbWl4aW5cbiAgICBidWlsZFRleHRMYWJlbHMgKHRpbGVfa2V5LCBmZWF0dXJlX3F1ZXVlKSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZj0wOyBmIDwgZmVhdHVyZV9xdWV1ZS5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgbGV0IGZxID0gZmVhdHVyZV9xdWV1ZVtmXTtcbiAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0aGlzLnRleHRzW3RpbGVfa2V5XVtmcS50ZXh0X3NldHRpbmdzX2tleV1bZnEudGV4dF07XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHRleHRfaW5mby5zaXplLmNvbGxpc2lvbl9zaXplO1xuICAgICAgICAgICAgZnEubGFiZWwgPSBuZXcgTGFiZWxQb2ludChmcS5wb2ludF9sYWJlbC5wb3NpdGlvbiwgc2l6ZSwgZnEubGF5b3V0KTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKGZxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZHMgb25lIG9yIG1vcmUgcG9pbnQgbGFiZWxzIGZvciBhIGdlb21ldHJ5XG4gICAgYnVpbGRMYWJlbHMgKHNpemUsIGdlb21ldHJ5LCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcblxuICAgICAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2ludFwiKSB7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChnZW9tZXRyeS5jb29yZGluYXRlcywgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlQb2ludFwiKSB7XG4gICAgICAgICAgICBsZXQgcG9pbnRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChwb2ludCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTGluZVN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgbGV0IHBvaW50X2xhYmVscyA9IHBsYWNlUG9pbnRzT25MaW5lKGxpbmUsIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludF9sYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChwb2ludF9sYWJlbHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBsaW5lcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgbG4gPSAwOyBsbiA8IGxpbmVzLmxlbmd0aDsgbG4rKykge1xuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbbG5dO1xuICAgICAgICAgICAgICAgIGxldCBwb2ludF9sYWJlbHMgPSBwbGFjZVBvaW50c09uTGluZShsaW5lLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChwb2ludF9sYWJlbHNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvbHlnb25cIikge1xuICAgICAgICAgICAgLy8gUG9pbnQgYXQgcG9seWdvbiBjZW50cm9pZCAob2Ygb3V0ZXIgcmluZylcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnBsYWNlbWVudCA9PT0gUExBQ0VNRU5ULkNFTlRST0lEKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNlbnRyb2lkID0gR2VvLmNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUG9pbnQgYXQgZWFjaCBwb2x5Z29uIHZlcnRleCAoYWxsIHJpbmdzKVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJpbmdzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbG4gPSAwOyBsbiA8IHJpbmdzLmxlbmd0aDsgbG4rKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9pbnRfbGFiZWxzID0gcGxhY2VQb2ludHNPbkxpbmUocmluZ3NbbG5dLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludF9sYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvbHlnb25cIikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGxhY2VtZW50ID09PSBQTEFDRU1FTlQuQ0VOVFJPSUQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8ubXVsdGlDZW50cm9pZChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoY2VudHJvaWQsIHNpemUsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwb2x5cyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgcG9seXMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJpbmdzID0gcG9seXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGxuID0gMDsgbG4gPCByaW5ncy5sZW5ndGg7IGxuKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb2ludF9sYWJlbHMgPSBwbGFjZVBvaW50c09uTGluZShyaW5nc1tsbl0sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludF9sYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChwb2ludF9sYWJlbHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxhYmVscztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBcInRlbXBsYXRlXCIgdGhhdCBzZXRzIGNvbnN0YW50IGF0dGlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXgsIHdoaWNoIGlzIHRoZW4gbW9kaWZpZWQgcGVyIHZlcnRleCBvciBwZXIgZmVhdHVyZS5cbiAgICAgKiBBIHBsYWluIEpTIGFycmF5IG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAgKi9cbiAgICBtYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpIHtcbiAgICAgICAgbGV0IGNvbG9yID0gc3R5bGUuY29sb3IgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG5cbiAgICAgICAgLy8gcG9zaXRpb24gLSB4ICYgeSBjb29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gcGVyLXZlcnRleCBiZWxvd1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9wb3NpdGlvbicsIDAsIHsgc2l6ZTogMiB9KTtcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfcG9zaXRpb24nLCBzdHlsZS56IHx8IDAsIHsgc2l6ZTogMSwgb2Zmc2V0OiAyIH0pO1xuICAgICAgICAvLyBsYXllciBvcmRlciAtIHcgY29vcmQgb2YgJ3Bvc2l0aW9uJyBhdHRyaWJ1dGUgKGZvciBwYWNraW5nIGVmZmljaWVuY3kpXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3Bvc2l0aW9uJywgdGhpcy5zY2FsZU9yZGVyKHN0eWxlLm9yZGVyKSwgeyBzaXplOiAxLCBvZmZzZXQ6IDMgfSk7XG5cbiAgICAgICAgLy8gc2NhbGluZyB2ZWN0b3IgLSAoeCwgeSkgY29tcG9uZW50cyBwZXIgcGl4ZWwsIHogPSBhbmdsZSwgdyA9IHNjYWxpbmcgZmFjdG9yXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3NoYXBlJywgMCwgeyBzaXplOiA0IH0pO1xuXG4gICAgICAgIC8vIHRleHR1cmUgY29vcmRzXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3RleGNvb3JkJywgMCwgeyBzaXplOiAyIH0pO1xuXG4gICAgICAgIC8vIG9mZnNldHNcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2Ffb2Zmc2V0JywgMCwgeyBzaXplOiAyIH0pO1xuXG4gICAgICAgIC8vIGNvbG9yXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX2NvbG9yJywgVmVjdG9yLm11bHQoY29sb3IsIDI1NSksIHsgc2l6ZTogNCB9KTtcblxuICAgICAgICAvLyBzZWxlY3Rpb24gY29sb3JcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9zZWxlY3Rpb25fY29sb3InLCBWZWN0b3IubXVsdChzdHlsZS5zZWxlY3Rpb25fY29sb3IsIDI1NSksIHsgc2l6ZTogNCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRleF90ZW1wbGF0ZTtcbiAgICB9LFxuXG4gICAgYnVpbGRRdWFkKHBvaW50cywgc2l6ZSwgYW5nbGUsIHNhbXBsZXIsIG9mZnNldCwgdGV4Y29vcmRfc2NhbGUsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUpIHtcbiAgICAgICAgYnVpbGRRdWFkc0ZvclBvaW50cyhcbiAgICAgICAgICAgIHBvaW50cyxcbiAgICAgICAgICAgIHZlcnRleF9kYXRhLFxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRleGNvb3JkX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV90ZXhjb29yZCxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbl9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgc2hhcGVfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3NoYXBlLFxuICAgICAgICAgICAgICAgIG9mZnNldF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfb2Zmc2V0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHF1YWQ6IHNpemUsXG4gICAgICAgICAgICAgICAgcXVhZF9ub3JtYWxpemU6IDI1NiwgICAgLy8gdmFsdWVzIGhhdmUgYW4gOC1iaXQgZnJhY3Rpb25cbiAgICAgICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICAgICAgYW5nbGU6IGFuZ2xlICogNDA5NiwgICAgLy8gdmFsdWVzIGhhdmUgYSAxMi1iaXQgZnJhY3Rpb25cbiAgICAgICAgICAgICAgICBzaGFwZV93OiBzYW1wbGVyLFxuICAgICAgICAgICAgICAgIHRleGNvb3JkX3NjYWxlLFxuICAgICAgICAgICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZTogNjU1MzVcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgcXVhZCBmb3IgcG9pbnQgc3ByaXRlXG4gICAgYnVpbGQgKHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICBsZXQgbGFiZWwgPSBzdHlsZS5sYWJlbDtcbiAgICAgICAgaWYgKGxhYmVsLm51bV9zZWdtZW50cykge1xuICAgICAgICAgICAgdGhpcy5idWlsZEFydGljdWxhdGVkTGFiZWwobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGFiZWwobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYnVpbGRMYWJlbCAobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuICAgICAgICBsZXQgYW5nbGUgPSBsYWJlbC5hbmdsZSB8fCBzdHlsZS5hbmdsZTtcblxuICAgICAgICB0aGlzLmJ1aWxkUXVhZChcbiAgICAgICAgICAgIFtsYWJlbC5wb3NpdGlvbl0sICAgICAgICAgICAgICAgLy8gcG9zaXRpb25cbiAgICAgICAgICAgIHN0eWxlLnNpemUsICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBpbiBwaXhlbHNcbiAgICAgICAgICAgIGFuZ2xlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5nbGUgaW4gcmFkaWFuc1xuICAgICAgICAgICAgc3R5bGUuc2FtcGxlciwgICAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIHNhbXBsZXIgdG8gdXNlXG4gICAgICAgICAgICBsYWJlbC5vZmZzZXQsICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBmcm9tIGNlbnRlciBpbiBwaXhlbHNcbiAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcywgICAgICAgICAgICAgICAgLy8gdGV4dHVyZSBVVnNcbiAgICAgICAgICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUgICAgLy8gVkJPIGFuZCBkYXRhIGZvciBjdXJyZW50IHZlcnRleFxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBidWlsZEFydGljdWxhdGVkTGFiZWwgKGxhYmVsLCBzdHlsZSwgdmVydGV4X2RhdGEpIHtcbiAgICAgICAgbGV0IHZlcnRleF90ZW1wbGF0ZSA9IHRoaXMubWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhYmVsLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgIGxldCBhbmdsZSA9IGxhYmVsLmFuZ2xlW2ldO1xuICAgICAgICAgICAgbGV0IHNpemUgPSBzdHlsZS5zaXplW2ldO1xuICAgICAgICAgICAgbGV0IG9mZnNldCA9IGxhYmVsLm9mZnNldHNbaV07XG4gICAgICAgICAgICBsZXQgdGV4Y29vcmQgPSBzdHlsZS50ZXhjb29yZHNbaV07XG5cbiAgICAgICAgICAgIHRoaXMuYnVpbGRRdWFkKFxuICAgICAgICAgICAgICAgIFtsYWJlbC5wb3NpdGlvbl0sICAgICAgICAgICAgICAgLy8gcG9zaXRpb25cbiAgICAgICAgICAgICAgICBzaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgaW4gcGl4ZWxzXG4gICAgICAgICAgICAgICAgYW5nbGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmdsZSBpbiBkZWdyZWVzXG4gICAgICAgICAgICAgICAgc3R5bGUuc2FtcGxlciwgICAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIHNhbXBsZXIgdG8gdXNlXG4gICAgICAgICAgICAgICAgb2Zmc2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgZnJvbSBjZW50ZXIgaW4gcGl4ZWxzXG4gICAgICAgICAgICAgICAgdGV4Y29vcmQsICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUgICAgLy8gVkJPIGFuZCBkYXRhIGZvciBjdXJyZW50IHZlcnRleFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZSB0byBwYXNzLXRocm91Z2ggdG8gZ2VuZXJpYyBwb2ludCBidWlsZGVyXG4gICAgYnVpbGRMaW5lcyAobGluZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICB0aGlzLmJ1aWxkKHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgfSxcblxuICAgIGJ1aWxkUG9pbnRzIChwb2ludHMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICB0aGlzLmJ1aWxkKHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgfSxcblxuICAgIGJ1aWxkUG9seWdvbnMgKHBvaW50cywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVpbGQoc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICB9LFxuXG4gICAgbWFrZU1lc2ggKHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAvLyBBZGQgbGFiZWwgZmFkZSB0aW1lXG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7IGZhZGVfaW5fdGltZTogdGhpcy5mYWRlX2luX3RpbWUgfSk7XG4gICAgICAgIHJldHVybiBTdHlsZS5tYWtlTWVzaC5jYWxsKHRoaXMsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIG9wdGlvbnMpO1xuICAgIH1cblxufSk7XG4iLCIvLyBQb2x5Z29uIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IGdsIGZyb20gJy4uLy4uL2dsL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVmVydGV4TGF5b3V0IGZyb20gJy4uLy4uL2dsL3ZlcnRleF9sYXlvdXQnO1xuaW1wb3J0IHtidWlsZFBvbHlnb25zLCBidWlsZEV4dHJ1ZGVkUG9seWdvbnN9IGZyb20gJy4uLy4uL2J1aWxkZXJzL3BvbHlnb25zJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL3BvbHlnb25zX3ZlcnRleC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19wb2x5Z29uc0ZyYWdtZW50ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9seWdvbnNfZnJhZ21lbnQuZ2xzbCcsICd1dGY4Jyk7XG5cbmV4cG9ydCB2YXIgUG9seWdvbnMgPSBPYmplY3QuY3JlYXRlKFN0eWxlKTtcblxuLy8gZXhwb3J0IHNoYWRlcnMgZm9yIHVzZSBpbiBsaW5lcy5qc1xuZXhwb3J0IHtcbiAgICBzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXgsXG4gICAgc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnRcbn07XG5cbk9iamVjdC5hc3NpZ24oUG9seWdvbnMsIHtcbiAgICBuYW1lOiAncG9seWdvbnMnLFxuICAgIGJ1aWx0X2luOiB0cnVlLFxuICAgIHZlcnRleF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXgsXG4gICAgZnJhZ21lbnRfc2hhZGVyX3NyYzogc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnQsXG5cbiAgICBpbml0KCkge1xuICAgICAgICBTdHlsZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgLy8gQmFzaWMgYXR0cmlidXRlcywgb3RoZXJzIGNhbiBiZSBhZGRlZCAoc2VlIHRleHR1cmUgVVZzIGJlbG93KVxuICAgICAgICB2YXIgYXR0cmlicyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfcG9zaXRpb24nLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2Ffbm9ybWFsJywgc2l6ZTogMywgdHlwZTogZ2wuQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9LCAvLyBnZXRzIHBhZGRlZCB0byA0LWJ5dGVzXG4gICAgICAgICAgICB7IG5hbWU6ICdhX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9XG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gVGVsbCB0aGUgc2hhZGVyIHdlIGhhdmUgYSBub3JtYWwgYW5kIG9yZGVyIGF0dHJpYnV0ZXNcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTk9STUFMX0FUVFJJQlVURSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xBWUVSX09SREVSID0gdHJ1ZTtcblxuICAgICAgICAvLyBGZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3NlbGVjdGlvbl9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgdGV4dHVyZSBVVnNcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9URVhUVVJFX0NPT1JEUyA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIEFkZCB2ZXJ0ZXggYXR0cmlidXRlIGZvciBVVnMgb25seSB3aGVuIG5lZWRlZFxuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2FfdGV4Y29vcmQnLCBzaXplOiAyLCB0eXBlOiBnbC5VTlNJR05FRF9TSE9SVCwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG4gICAgfSxcblxuICAgIF9wYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlO1xuXG4gICAgICAgIHN0eWxlLmNvbG9yID0gdGhpcy5wYXJzZUNvbG9yKGRyYXcuY29sb3IsIGNvbnRleHQpO1xuICAgICAgICBpZiAoIXN0eWxlLmNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG4gICAgICAgIHN0eWxlLnogKj0gR2VvLmhlaWdodF9zY2FsZTsgLy8gcHJvdmlkZSBzdWItbWV0ZXIgcHJlY2lzaW9uIG9mIGhlaWdodCB2YWx1ZXNcblxuICAgICAgICBzdHlsZS5leHRydWRlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuZXh0cnVkZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlKSB7XG4gICAgICAgICAgICAvLyB1c2UgZmVhdHVyZSdzIGhlaWdodCBhbmQgbWluX2hlaWdodCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IGZlYXR1cmUucHJvcGVydGllcy5oZWlnaHQgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgPSBmZWF0dXJlLnByb3BlcnRpZXMubWluX2hlaWdodCB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5taW5faGVpZ2h0O1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBleHBsaWNpdCBoZWlnaHQsIG5vIG1pbl9oZWlnaHRcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzdHlsZS5leHRydWRlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlLmV4dHJ1ZGU7XG4gICAgICAgICAgICAgICAgc3R5bGUubWluX2hlaWdodCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBleHBsaWNpdCBoZWlnaHQgYW5kIG1pbl9oZWlnaHRcbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUuZXh0cnVkZSkpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5taW5faGVpZ2h0ID0gc3R5bGUuZXh0cnVkZVswXTtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlWzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHlsZS5oZWlnaHQgKj0gR2VvLmhlaWdodF9zY2FsZTsgICAgICAgLy8gcHJvdmlkZSBzdWItbWV0ZXIgcHJlY2lzaW9uIG9mIGhlaWdodCB2YWx1ZXNcbiAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgKj0gR2VvLmhlaWdodF9zY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnRpbGVfZWRnZXMgPSBkcmF3LnRpbGVfZWRnZXM7IC8vIHVzdWFsbHkgYWN0aXZhdGVkIGZvciBkZWJ1Z2dpbmcsIG9yIHJhcmUgdmlzdWFsaXphdGlvbiBuZWVkc1xuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgZHJhdy5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZUNvbG9yUHJvcGVydHlDYWNoZShkcmF3LmNvbG9yKTtcbiAgICAgICAgZHJhdy56ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnosIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBcInRlbXBsYXRlXCIgdGhhdCBzZXRzIGNvbnN0YW50IGF0dGlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXgsIHdoaWNoIGlzIHRoZW4gbW9kaWZpZWQgcGVyIHZlcnRleCBvciBwZXIgZmVhdHVyZS5cbiAgICAgKiBBIHBsYWluIEpTIGFycmF5IG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAgKi9cbiAgICBtYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuXG4gICAgICAgIC8vIHBvc2l0aW9uIC0geCAmIHkgY29vcmRzIHdpbGwgYmUgZmlsbGVkIGluIHBlci12ZXJ0ZXggYmVsb3dcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUueiB8fCAwO1xuXG4gICAgICAgIC8vIGxheWVyIG9yZGVyIC0gdyBjb29yZCBvZiAncG9zaXRpb24nIGF0dHJpYnV0ZSAoZm9yIHBhY2tpbmcgZWZmaWNpZW5jeSlcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHRoaXMuc2NhbGVPcmRlcihzdHlsZS5vcmRlcik7XG5cbiAgICAgICAgLy8gbm9ybWFsXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDEgKiAxMjc7XG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzBdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMV0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzNdICogMjU1O1xuXG4gICAgICAgIC8vIHNlbGVjdGlvbiBjb2xvclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMF0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzFdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbM10gKiAyNTU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGV4dHVyZSBVVnMgdG8gdGVtcGxhdGUgb25seSBpZiBuZWVkZWRcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4X3RlbXBsYXRlO1xuICAgIH0sXG5cbiAgICBidWlsZFBvbHlnb25zKHBvbHlnb25zLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHZlcnRleF90ZW1wbGF0ZSA9IHRoaXMubWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB0ZXhjb29yZF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfdGV4Y29vcmQsXG4gICAgICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemU6IDY1NTM1LCAvLyBzY2FsZSBVVnMgdG8gdW5zaWduZWQgc2hvcnRzXG4gICAgICAgICAgICByZW1vdmVfdGlsZV9lZGdlczogIXN0eWxlLnRpbGVfZWRnZXMsXG4gICAgICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlOiBHZW8udGlsZV9zY2FsZSAqIGNvbnRleHQudGlsZS5wYWRfc2NhbGUgKiA0LFxuICAgICAgICAgICAgd2luZGluZzogY29udGV4dC53aW5kaW5nXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRXh0cnVkZWQgcG9seWdvbnMgKGUuZy4gM0QgYnVpbGRpbmdzKVxuICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSAmJiBzdHlsZS5oZWlnaHQpIHtcbiAgICAgICAgICAgIGJ1aWxkRXh0cnVkZWRQb2x5Z29ucyhcbiAgICAgICAgICAgICAgICBwb2x5Z29ucyxcbiAgICAgICAgICAgICAgICBzdHlsZS56LCBzdHlsZS5oZWlnaHQsIHN0eWxlLm1pbl9oZWlnaHQsXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9ub3JtYWwsXG4gICAgICAgICAgICAgICAgMTI3LCAvLyBzY2FsZSBub3JtYWxzIHRvIHNpZ25lZCBieXRlc1xuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVndWxhciBwb2x5Z29uc1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1aWxkUG9seWdvbnMoXG4gICAgICAgICAgICAgICAgcG9seWdvbnMsXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG59KTtcbiIsIi8vIFJhc3RlciB0aWxlIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IHtQb2x5Z29uc30gZnJvbSAnLi4vcG9seWdvbnMvcG9seWdvbnMnO1xuXG5leHBvcnQgbGV0IFJhc3RlclN0eWxlID0gT2JqZWN0LmNyZWF0ZShQb2x5Z29ucyk7XG5cbk9iamVjdC5hc3NpZ24oUmFzdGVyU3R5bGUsIHtcbiAgICBuYW1lOiAncmFzdGVyJyxcbiAgICBzdXBlcjogUG9seWdvbnMsXG4gICAgYnVpbHRfaW46IHRydWUsXG5cbiAgICBpbml0KCkge1xuICAgICAgICAvLyBSZXF1aXJlZCBmb3IgcmFzdGVyIHRpbGVzXG4gICAgICAgIHRoaXMucmFzdGVyID0gdGhpcy5yYXN0ZXIgfHwgJ2NvbG9yJztcblxuICAgICAgICB0aGlzLnN1cGVyLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGZhbHNlOyAvLyByYXN0ZXIgc3R5bGVzIGNhbid0IHN1cHBvcnQgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICB9LFxuXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgLy8gUmFzdGVyIHRpbGVzIGRlZmF1bHQgdG8gd2hpdGUgdmVydGV4IGNvbG9yLCBhcyB0aGlzIGNvbG9yIHdpbGwgdGludCB0aGUgdW5kZXJseWluZyB0ZXh0dXJlXG4gICAgICAgIGRyYXcuY29sb3IgPSBkcmF3LmNvbG9yIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLmNvbG9yO1xuICAgICAgICByZXR1cm4gdGhpcy5zdXBlci5fcHJlcHJvY2Vzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxufSk7XG4iLCIvLyBSZW5kZXJpbmcgc3R5bGVzXG5cbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4uL3NlbGVjdGlvbic7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgVkJPTWVzaCBmcm9tICcuLi9nbC92Ym9fbWVzaCc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9nbC90ZXh0dXJlJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuLi9tYXRlcmlhbCc7XG5pbXBvcnQgTGlnaHQgZnJvbSAnLi4vbGlnaHQnO1xuaW1wb3J0IHtSYXN0ZXJUaWxlU291cmNlfSBmcm9tICcuLi9zb3VyY2VzL3Jhc3Rlcic7XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4uL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX3NlbGVjdGlvbkZyYWdtZW50ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9zZWxlY3Rpb25fZnJhZ21lbnQuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfcmFzdGVycyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvcmFzdGVycy5nbHNsJywgJ3V0ZjgnKTtcblxuLy8gQmFzZSBjbGFzc1xuXG5leHBvcnQgdmFyIFN0eWxlID0ge1xuICAgIGluaXQgKHsgZ2VuZXJhdGlvbiwgc3R5bGVzLCBzb3VyY2VzID0ge30sIGludHJvc3BlY3Rpb24gfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247ICAgICAgICAgICAgICAgLy8gc2NlbmUgZ2VuZXJhdGlvbiBpZCB0aGlzIHN0eWxlIHdhcyBjcmVhdGVkIGZvclxuICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlczsgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0eWxlcyBmb3Igc2NlbmVcbiAgICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlczsgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHNvdXJjZXMgZm9yIHNjZW5lXG4gICAgICAgIHRoaXMuZGVmaW5lcyA9ICh0aGlzLmhhc093blByb3BlcnR5KCdkZWZpbmVzJykgJiYgdGhpcy5kZWZpbmVzKSB8fCB7fTsgLy8gI2RlZmluZXMgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgc2hhZGVyc1xuICAgICAgICB0aGlzLnNoYWRlcnMgPSAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnc2hhZGVycycpICYmIHRoaXMuc2hhZGVycykgfHwge307IC8vIHNoYWRlciBjdXN0b21pemF0aW9uICh1bmlmb3JtcywgZGVmaW5lcywgYmxvY2tzLCBldGMuKVxuICAgICAgICB0aGlzLmludHJvc3BlY3Rpb24gPSBpbnRyb3NwZWN0aW9uIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uIHx8IHRoaXMuaW50cm9zcGVjdGlvbiB8fCBmYWxzZTsgICAvLyBmbGFnIGluZGljYXRpbmcgaWYgdGhpcyBzdHlsZSBzdXBwb3J0cyBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICB0aGlzLmNvbXBpbGVfc2V0dXAgPSBmYWxzZTsgICAgICAgICAgICAgICAgIC8vIG9uZS10aW1lIHNldHVwIHN0ZXBzIGZvciBwcm9ncmFtIGNvbXBpbGF0aW9uXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0wgcHJvZ3JhbSByZWZlcmVuY2UgKGZvciBtYWluIHJlbmRlciBwYXNzKVxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbnVsbDsgICAgICAgICAgICAgIC8vIEdMIHByb2dyYW0gcmVmZXJlbmNlIGZvciBmZWF0dXJlIHNlbGVjdGlvbiByZW5kZXIgcGFzc1xuICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSB7fTsgICAgICAgICAgICAgICAgICAgIC8vIHN0eWxlIGZvciBmZWF0dXJlIGN1cnJlbnRseSBiZWluZyBwYXJzZWQsIHNoYXJlZCB0byBsZXNzZW4gR0MvbWVtb3J5IHRocmFzaFxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZSA9IFtdOyAgICAgICAgICAgICAgICAgIC8vIHNoYXJlZCBzaW5nbGUtdmVydGV4IHRlbXBsYXRlLCBmaWxsZWQgb3V0IGJ5IGVhY2ggc3R5bGVcbiAgICAgICAgdGhpcy50aWxlX2RhdGEgPSB7fTtcblxuICAgICAgICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdGhpcyBvYmplY3QgdG8gYmUgY2FsbGVkIGZyb20gd29ya2VyIHRocmVhZHNcbiAgICAgICAgdGhpcy5tYWluX3RocmVhZF90YXJnZXQgPSBbJ1N0eWxlJywgdGhpcy5uYW1lLCB0aGlzLmdlbmVyYXRpb25dLmpvaW4oJy8nKTtcbiAgICAgICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0LCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgd29ybGQgY29vcmRzIHRvIHdyYXAgZXZlcnkgMTAwLDAwMCBtZXRlcnMsIGNhbiB0dXJuIG9mZiBieSBzZXR0aW5nIHRoaXMgdG8gJ2ZhbHNlJ1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9XT1JMRF9QT1NJVElPTl9XUkFQID0gMTAwMDAwO1xuXG4gICAgICAgIC8vIEJsZW5kaW5nXG4gICAgICAgIHRoaXMuYmxlbmQgPSB0aGlzLmJsZW5kIHx8ICdvcGFxdWUnOyAgICAgICAgLy8gZGVmYXVsdDogb3BhcXVlIHN0eWxlcyBhcmUgZHJhd24gZmlyc3QsIHdpdGhvdXQgYmxlbmRpbmdcbiAgICAgICAgdGhpcy5kZWZpbmVzW2BUQU5HUkFNX0JMRU5EXyR7dGhpcy5ibGVuZC50b1VwcGVyQ2FzZSgpfWBdID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuYmxlbmRfb3JkZXIgPT0gbnVsbCkgeyAvLyBjb250cm9scyBvcmRlciBvZiByZW5kZXJpbmcgZm9yIHN0eWxlcyB3L25vbi1vcGFxdWUgYmxlbmRpbmdcbiAgICAgICAgICAgIHRoaXMuYmxlbmRfb3JkZXIgPSAtMTsgLy8gZGVmYXVsdHMgdG8gZmlyc3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBzdHlsZSBkZWZpbmVzIGl0cyBvd24gbWF0ZXJpYWwsIHJlcGxhY2UgdGhlIGluaGVyaXRlZCBtYXRlcmlhbCBpbnN0YW5jZVxuICAgICAgICBpZiAoISh0aGlzLm1hdGVyaWFsIGluc3RhbmNlb2YgTWF0ZXJpYWwpKSB7XG4gICAgICAgICAgICBpZiAoIU1hdGVyaWFsLmlzVmFsaWQodGhpcy5tYXRlcmlhbCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMubWF0ZXJpYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHRoaXMubWF0ZXJpYWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuaW5qZWN0KHRoaXMpO1xuXG4gICAgICAgIC8vIFNldCBsaWdodGluZyBtb2RlOiBmcmFnbWVudCwgdmVydGV4LCBvciBub25lIChzcGVjaWZpZWQgYXMgJ2ZhbHNlJylcbiAgICAgICAgTGlnaHQuc2V0TW9kZSh0aGlzLmxpZ2h0aW5nLCB0aGlzKTtcblxuICAgICAgICAvLyBTZXR1cCByYXN0ZXIgc2FtcGxlcnMgaWYgbmVlZGVkXG4gICAgICAgIHRoaXMuc2V0dXBSYXN0ZXJzKCk7XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSxcblxuICAgIGRlc3Ryb3kgKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0uZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbl9wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgcmVzZXQgKCkge1xuICAgIH0sXG5cbiAgICBiYXNlU3R5bGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlIHx8IHRoaXMubmFtZTtcbiAgICB9LFxuXG4gICAgZmlsbFZlcnRleFRlbXBsYXRlKGF0dHJpYnV0ZSwgdmFsdWUsIHsgc2l6ZSwgb2Zmc2V0IH0pIHtcbiAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCA9PT0gdW5kZWZpbmVkKSA/IDAgOiBvZmZzZXQ7XG5cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4W2F0dHJpYnV0ZV07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBubyBpbmRleCBmb3VuZCBpbiB2ZXJ0ZXggbGF5b3V0IGZvciBhdHRyaWJ1dGUgJyR7YXR0cmlidXRlfSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbHVlLmxlbmd0aCA+IGkgPyB2YWx1ZVtpXSA6IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaW5kZXggKyBpICsgb2Zmc2V0XSA9IHY7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqKiBTdHlsZSBwYXJzaW5nIGFuZCBnZW9tZXRyeSBjb25zdHJ1Y3Rpb24gKioqL1xuXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3QgdG8gaG9sZCBmZWF0dXJlIGRhdGEgKGZvciBhIHRpbGUgb3Igb3RoZXIgb2JqZWN0KVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogbnVsbCxcbiAgICAgICAgICAgIHVuaWZvcm1zOiB7fSxcbiAgICAgICAgICAgIHRleHR1cmVzOiBbXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldO1xuICAgIH0sXG5cbiAgICAvLyBGaW5hbGl6ZXMgYW4gb2JqZWN0IGhvbGRpbmcgZmVhdHVyZSBkYXRhIChmb3IgYSB0aWxlIG9yIG90aGVyIG9iamVjdClcbiAgICBlbmREYXRhICh0aWxlKSB7XG4gICAgICAgIHZhciB0aWxlX2RhdGEgPSB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV07XG4gICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRpbGVfZGF0YSAmJiB0aWxlX2RhdGEudmVydGV4X2RhdGEgJiYgdGlsZV9kYXRhLnZlcnRleF9kYXRhLnZlcnRleF9jb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIE9ubHkga2VlcCBmaW5hbCBieXRlIGJ1ZmZlclxuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9kYXRhLmVuZCgpO1xuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS5lbGVtZW50X2J1ZmZlcjtcbiAgICAgICAgICAgIHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YSA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfYnVmZmVyOyAvLyBjb252ZXJ0IGZyb20gaW5zdGFuY2UgdG8gcmF3IHR5cGVkIGFycmF5XG5cbiAgICAgICAgICAgIC8vIExvYWQgcmFzdGVyIHRpbGVzIHBhc3NlZCBmcm9tIGRhdGEgc291cmNlXG4gICAgICAgICAgICAvLyBCbG9ja3MgbWVzaCBjb21wbGV0aW9uIHRvIGF2b2lkIGZsaWNrZXJpbmdcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmFzdGVyVGV4dHVyZXModGlsZSwgdGlsZV9kYXRhKS50aGVuKCgpID0+IHRpbGVfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOyAvLyBkb24ndCBzZW5kIHRpbGUgZGF0YSBiYWNrIGlmIGRvZXNuJ3QgaGF2ZSBnZW9tZXRyeVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEhhcyBtZXNoIGRhdGEgZm9yIGEgZ2l2ZW4gdGlsZT9cbiAgICBoYXNEYXRhRm9yVGlsZSAodGlsZV9rZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZV9kYXRhW3RpbGVfa2V5XSAhPSBudWxsO1xuICAgIH0sXG5cbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0YSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHlsZSA9IHRoaXMucGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNraXAgZmVhdHVyZT9cbiAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyc3QgZmVhdHVyZSBpbiB0aGlzIHJlbmRlciBzdHlsZT9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSA9IHRoaXMudmVydGV4X2xheW91dC5jcmVhdGVWZXJ0ZXhEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1aWxkR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgc3R5bGUsIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIGJ1aWxkR2VvbWV0cnkgKGdlb21ldHJ5LCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvbHlnb25zKFtnZW9tZXRyeS5jb29yZGluYXRlc10sIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQb2x5Z29ucyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lcyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZXMoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgICAgICBzdHlsZS5vcmRlciA9IHRoaXMucGFyc2VPcmRlcihkcmF3Lm9yZGVyLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gKG9ubHkgaWYgc3R5bGUgc3VwcG9ydHMgaXQpXG4gICAgICAgICAgICB2YXIgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgc3R5bGUuaW50ZXJhY3RpdmUgPSB0aGlzLmludHJvc3BlY3Rpb24gfHwgZHJhdy5pbnRlcmFjdGl2ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoc3R5bGUuaW50ZXJhY3RpdmUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBmZWF0dXJlIGlzIG1hcmtlZCBhcyBzZWxlY3RhYmxlXG4gICAgICAgICAgICBpZiAoc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNlbGVjdGlvbl9jb2xvciA9IEZlYXR1cmVTZWxlY3Rpb24ubWFrZUNvbG9yKGZlYXR1cmUsIGNvbnRleHQudGlsZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zZWxlY3Rpb25fY29sb3IgPSBGZWF0dXJlU2VsZWN0aW9uLmRlZmF1bHRDb2xvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5fcGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCAnU3R5bGUucGFyc2VGZWF0dXJlOiBzdHlsZSBwYXJzaW5nIGVycm9yJywgZmVhdHVyZSwgc3R5bGUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgfSxcblxuICAgIHByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgLy8gUHJlcHJvY2VzcyBmaXJzdCB0aW1lXG4gICAgICAgIGlmICghZHJhdy5wcmVwcm9jZXNzZWQpIHtcbiAgICAgICAgICAgIGRyYXcgPSB0aGlzLl9wcmVwcm9jZXNzKGRyYXcpOyAvLyBvcHRpb25hbCBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHJhdy5wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBvcHRpb25hbGx5IGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIFBhcnNlIGFuIG9yZGVyIHZhbHVlXG4gICAgcGFyc2VPcmRlciAob3JkZXIsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgIGlmICh0eXBlb2Ygb3JkZXIgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gU3R5bGVQYXJzZXIuY2FsY3VsYXRlT3JkZXIob3JkZXIsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIGZpbmFsIHByZWNpc2lvbiBmb3IgaGFsZi1sYXllcnMgKGZvciBvdXRsaW5lcylcbiAgICBzY2FsZU9yZGVyIChvcmRlcikge1xuICAgICAgICByZXR1cm4gb3JkZXIgKiAyO1xuICAgIH0sXG5cbiAgICAvLyBQYXJzZSBhIGNvbG9yIG9mIGNob29zZSBhIGRlZmF1bHQgaWYgYWNjZXB0YWJsZSwgcmV0dXJuIHVuZGVmaW5lZCBpZiBjb2xvciBtaXNzaW5nXG4gICAgcGFyc2VDb2xvcihjb2xvciwgY29udGV4dCkge1xuICAgICAgICAvLyBOZWVkIGVpdGhlciBhIGNvbG9yLCBvciBhIHNoYWRlciBibG9jayBmb3IgJ2NvbG9yJyBvciAnZmlsdGVyJ1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShjb2xvciwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcy5jb2xvciB8fCB0aGlzLnNoYWRlcnMuYmxvY2tzLmZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmRlZmF1bHRzLmNvbG9yO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIGZ1bmN0aW9ucyBhcmUgbm8tb3BzIHVudGlsIG92ZXJyaWRlblxuICAgIGJ1aWxkUG9seWdvbnMgKCkge30sXG4gICAgYnVpbGRMaW5lcyAoKSB7fSxcbiAgICBidWlsZFBvaW50cyAoKSB7fSxcblxuXG4gICAgLyoqKiBHTCBzdGF0ZSBhbmQgcmVuZGVyaW5nICoqKi9cblxuICAgIHNldEdMIChnbCkge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMubWF4X3RleHR1cmVfc2l6ZSA9IFRleHR1cmUuZ2V0TWF4VGV4dHVyZVNpemUodGhpcy5nbCk7XG4gICAgfSxcblxuICAgIG1ha2VNZXNoICh2ZXJ0ZXhfZGF0YSwgdmVydGV4X2VsZW1lbnRzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWQk9NZXNoKHRoaXMuZ2wsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIHRoaXMudmVydGV4X2xheW91dCwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIHJlbmRlciAobWVzaCkge1xuICAgICAgICByZXR1cm4gbWVzaC5yZW5kZXIoKTtcbiAgICB9LFxuXG4gICAgLy8gR2V0IGEgc3BlY2lmaWMgcHJvZ3JhbSwgY29tcGlsaW5nIGlmIG5lY2Vzc2FyeVxuICAgIGdldFByb2dyYW0gKGtleSA9ICdwcm9ncmFtJykge1xuICAgICAgICB0aGlzLmNvbXBpbGVTZXR1cCgpO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzW2tleV07XG4gICAgICAgIGlmICghcHJvZ3JhbSB8fCBwcm9ncmFtLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByb2dyYW0uY29tcGlsZWQpIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgQ29tcGlsaW5nIHN0eWxlICcke3RoaXMubmFtZX0nLCBwcm9ncmFtIGtleSAnJHtrZXl9J2ApO1xuICAgICAgICAgICAgcHJvZ3JhbS5jb21waWxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfSxcblxuICAgIC8vIE9uZS10aW1lIHNldHVwIGZvciBjb21waWxpbmcgc3R5bGUncyBwcm9ncmFtc1xuICAgIGNvbXBpbGVTZXR1cCAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGVfc2V0dXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5nbCkge1xuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBzdHlsZS5jb21waWxlKCk6IHNraXBwaW5nIGZvciAke3RoaXMubmFtZX0gYmVjYXVzZSBubyBHTCBjb250ZXh0YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgZGVmaW5lcyAmIGZvciBzZWxlY3Rpb24gKG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBzaW5jZSB0aGUgZmlyc3QgaXMgc3RvcmVkIGFzIGEgcmVmZXJlbmNlIGJ5IHRoZSBwcm9ncmFtKVxuICAgICAgICB2YXIgZGVmaW5lcyA9IHRoaXMuYnVpbGREZWZpbmVMaXN0KCk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGlvbl9kZWZpbmVzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmaW5lcyk7XG4gICAgICAgICAgICBzZWxlY3Rpb25fZGVmaW5lcy5UQU5HUkFNX0ZFQVRVUkVfU0VMRUNUSU9OID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBhbnkgY3VzdG9tIGNvZGUgYmxvY2tzLCB1bmlmb3JtIGRlcGVuZGVuY2llcywgZXRjLlxuICAgICAgICB2YXIgYmxvY2tzID0gKHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMuYmxvY2tzKTtcbiAgICAgICAgdmFyIGJsb2NrX3Njb3BlcyA9ICh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blcyk7XG4gICAgICAgIHZhciB1bmlmb3JtcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMudW5pZm9ybXMpO1xuXG4gICAgICAgIC8vIEFjY2VwdCBhIHNpbmdsZSBleHRlbnNpb24sIG9yIGFuIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSAodGhpcy5zaGFkZXJzICYmIHRoaXMuc2hhZGVycy5leHRlbnNpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiBleHRlbnNpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IFtleHRlbnNpb25zXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBzaGFkZXJzXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBTaGFkZXJQcm9ncmFtKFxuICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3NoYWRlcl9zcmMsXG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50X3NoYWRlcl9zcmMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGRlZmluZXMsXG4gICAgICAgICAgICAgICAgdW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlcyxcbiAgICAgICAgICAgICAgICBleHRlbnNpb25zXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbmV3IFNoYWRlclByb2dyYW0oXG4gICAgICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjLFxuICAgICAgICAgICAgICAgIHNoYWRlclNyY19zZWxlY3Rpb25GcmFnbWVudCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICh0aGlzLm5hbWUgKyAnIChzZWxlY3Rpb24pJyksXG4gICAgICAgICAgICAgICAgICAgIGRlZmluZXM6IHNlbGVjdGlvbl9kZWZpbmVzLFxuICAgICAgICAgICAgICAgICAgICB1bmlmb3JtcyxcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgICAgICBibG9ja19zY29wZXMsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBpbGVfc2V0dXAgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzaGFkZXIgYmxvY2tcbiAgICBhZGRTaGFkZXJCbG9jayAoa2V5LCBibG9jaywgc2NvcGUgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3MgPSB0aGlzLnNoYWRlcnMuYmxvY2tzIHx8IHt9O1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gPSB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gfHwgW107XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3Nba2V5XS5wdXNoKGJsb2NrKTtcblxuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3BlcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldIHx8IFtdO1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tleV0ucHVzaChzY29wZSk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSBhbGwgc2hhZGVyIGJsb2NrcyBmb3Iga2V5XG4gICAgcmVtb3ZlU2hhZGVyQmxvY2sgKGtleSkge1xuICAgICAgICBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2Nrc1trZXldID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZXBsYWNlU2hhZGVyQmxvY2sgKGtleSwgYmxvY2ssIHNjb3BlID0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZVNoYWRlckJsb2NrKGtleSk7XG4gICAgICAgIHRoaXMuYWRkU2hhZGVyQmxvY2soa2V5LCBibG9jaywgc2NvcGUpO1xuICAgIH0sXG5cbiAgICAvKiogVE9ETzogY291bGQgcHJvYmFibHkgY29tYmluZSBhbmQgZ2VuZXJhbGl6ZSB0aGlzIHdpdGggc2ltaWxhciBtZXRob2QgaW4gU2hhZGVyUHJvZ3JhbVxuICAgICAqIChsaXN0IG9mIGRlZmluZSBvYmplY3RzIHRoYXQgaW5oZXJpdCBmcm9tIGVhY2ggb3RoZXIpXG4gICAgICovXG4gICAgYnVpbGREZWZpbmVMaXN0ICgpIHtcbiAgICAgICAgLy8gQWRkIGFueSBjdXN0b20gZGVmaW5lcyB0byBidWlsdC1pbiBzdHlsZSBkZWZpbmVzXG4gICAgICAgIHZhciBkZWZpbmVzID0ge307IC8vIGNyZWF0ZSBhIG5ldyBvYmplY3QgdG8gYXZvaWQgbXV0YXRpbmcgYSBwcm90b3R5cGUgdmFsdWUgdGhhdCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgc3R5bGVzXG4gICAgICAgIGlmICh0aGlzLmRlZmluZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgZCBpbiB0aGlzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5kZWZpbmVzW2RdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNoYWRlcnMgIT0gbnVsbCAmJiB0aGlzLnNoYWRlcnMuZGVmaW5lcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKGQgaW4gdGhpcy5zaGFkZXJzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5zaGFkZXJzLmRlZmluZXNbZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZXM7XG5cbiAgICB9LFxuXG4gICAgLy8gRGV0ZXJtaW5lcyBpZiAncmFzdGVyJyBwYXJhbWV0ZXIgaXMgc2V0IHRvIGEgdmFsaWQgdmFsdWVcbiAgICBoYXNSYXN0ZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIChbJ2NvbG9yJywgJ25vcm1hbCcsICdjdXN0b20nXS5pbmRleE9mKHRoaXMucmFzdGVyKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgLy8gU2V0dXAgcmFzdGVyIGFjY2VzcyBpbiBzaGFkZXJzXG4gICAgc2V0dXBSYXN0ZXJzICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Jhc3RlcnMoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5hYmxlIHJhc3RlciB0ZXh0dXJlcyBhbmQgY29uZmlndXJlIGhvdyBmaXJzdCByYXN0ZXIgaXMgYXBwbGllZFxuICAgICAgICBpZiAodGhpcy5yYXN0ZXIgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX0NPTE9SID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnJhc3RlciA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX05PUk1BTCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBjdXN0b20gcmFzdGVyIChzYW1wbGVycyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGJ1dCBub3QgYXV0b21hdGljYWxseSBhcHBsaWVkKVxuXG4gICAgICAgIC8vIEEgZ2l2ZW4gc3R5bGUgbWF5IGJlIGJ1aWx0IHdpdGggbXVsdGlwbGUgZGF0YSBzb3VyY2VzLCBlYWNoIG9mIHdoaWNoIG1heSBhdHRhY2hcbiAgICAgICAgLy8gYSB2YXJpYWJsZSBudW1iZXIgb2YgcmFzdGVyIHNvdXJjZXMgKDAgdG8gTiwgd2hlcmUgTiBpcyB0aGUgbWF4IG51bWJlciBvZiByYXN0ZXIgc291cmNlc1xuICAgICAgICAvLyBkZWZpbmVkIGZvciB0aGUgc2NlbmUpLiBUaGlzIG1lYW5zIHdlIGRvbid0IGtub3cgKndoaWNoKiBvciAqaG93IG1hbnkqIHJhc3RlcnMgd2lsbCBiZVxuICAgICAgICAvLyBib3VuZCBub3csIGF0IGluaXRpYWwgY29tcGlsZS10aW1lOyB3ZSBvbmx5IGtub3cgdGhpcyBhdCBnZW9tZXRyeSBidWlsZC10aW1lLiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB3ZSBjYW4gYmluZCBhcyBtYW55IHJhc3RlciBzb3VyY2VzIGFzIG5lZWRlZCwgd2UgZGVjbGFyZSBvdXIgdW5pZm9ybSBhcnJheXMgdG8gaG9sZFxuICAgICAgICAvLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9zc2libGUgc291cmNlcy4gQXQgcmVuZGVyIHRpbWUsIG9ubHkgdGhlIG5lY2Vzc2FyeSBudW1iZXIgb2YgcmFzdGVyc1xuICAgICAgICAvLyBhcmUgYm91bmQgKHRoZSByZW1haW5pbmcgc2xvdHMgYXJlbid0IGludGVuZGVkIHRvIGJlIGFjY2Vzc2VkKS5cbiAgICAgICAgbGV0IG51bV9yYXN0ZXJfc291cmNlcyA9XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpXG4gICAgICAgICAgICAuZmlsdGVyKHMgPT4gdGhpcy5zb3VyY2VzW3NdIGluc3RhbmNlb2YgUmFzdGVyVGlsZVNvdXJjZSlcbiAgICAgICAgICAgIC5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTlVNX1JBU1RFUl9TT1VSQ0VTID0gYGludCgke251bV9yYXN0ZXJfc291cmNlc30pYDtcbiAgICAgICAgaWYgKG51bV9yYXN0ZXJfc291cmNlcyA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBtb2RlbCBwb3NpdGlvbiBvZiB0aWxlJ3MgY29vcmRpbmF0ZSB6b29tIGZvciByYXN0ZXIgdGlsZSB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTU9ERUxfUE9TSVRJT05fQkFTRV9aT09NX1ZBUllJTkcgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBVbmlmb3JtcyBhbmQgbWFjcm9zIGZvciByYXN0ZXIgc2FtcGxlcnNcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZVNoYWRlckJsb2NrKCdyYXN0ZXInLCBzaGFkZXJTcmNfcmFzdGVycywgJ1Jhc3RlcicpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIExvYWQgcmFzdGVyIHRpbGUgdGV4dHVyZXMgYW5kIHNldCB1bmlmb3Jtc1xuICAgIGJ1aWxkUmFzdGVyVGV4dHVyZXMgKHRpbGUsIHRpbGVfZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzUmFzdGVycygpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29uZmlncyA9IHt9OyAvLyB0ZXh0dXJlIGNvbmZpZ3MgdG8gcGFzcyB0byB0ZXh0dXJlIGJ1aWxkZXIsIGtleWVkIGJ5IHRleHR1cmUgbmFtZVxuICAgICAgICBsZXQgaW5kZXggPSB7fTsgICAvLyBpbmRleCBpbnRvIHJhc3RlciBzYW1wbGVyIGFycmF5LCBrZXllZCBieSB0ZXh0dXJlIG5hbWVcblxuICAgICAgICAvLyBUT0RPOiBkYXRhIHNvdXJjZSBjb3VsZCByZXRyaWV2ZSByYXN0ZXIgdGV4dHVyZSBVUkxzXG4gICAgICAgIHRpbGUucmFzdGVycy5tYXAociA9PiB0aGlzLnNvdXJjZXNbcl0pLmZpbHRlcih4ID0+IHgpLmZvckVhY2goKHNvdXJjZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFJhc3RlclRpbGVTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gc291cmNlLnRpbGVUZXh0dXJlKHRpbGUpO1xuICAgICAgICAgICAgICAgIGNvbmZpZ3NbY29uZmlnLnVybF0gPSBjb25maWc7XG4gICAgICAgICAgICAgICAgaW5kZXhbY29uZmlnLnVybF0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlncykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIHRleHR1cmVzIG9uIG1haW4gdGhyZWFkIGFuZCByZXR1cm4gd2hlbiBkb25lXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gYmxvY2sgdGhlIGJ1aWxkaW5nIG9mIGEgcmFzdGVyIHRpbGUgbWVzaCB1bnRpbCBpdHMgdGV4dHVyZSBpcyBsb2FkZWQsXG4gICAgICAgIC8vIHRvIGF2b2lkIGZsaWNrZXJpbmcgd2hpbGUgbG9hZGluZyAodGV4dHVyZSB3aWxsIHJlbmRlciBhcyBibGFjaylcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLmxvYWRUZXh0dXJlcycsIGNvbmZpZ3MpXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0dXJlcyB8fCB0ZXh0dXJlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgdGV4dHVyZSB1bmlmb3JtcyAocmV0dXJuZWQgYWZ0ZXIgbG9hZGluZyBmcm9tIG1haW4gdGhyZWFkKVxuICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3JtcyA9IHRpbGVfZGF0YS51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMgPSB0aWxlX2RhdGEudGV4dHVyZXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBsZXQgdV9zYW1wbGVycyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJzJ10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdV9zaXplcyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJfc2l6ZXMnXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCB1X29mZnNldHMgPSB0aWxlX2RhdGEudW5pZm9ybXNbJ3VfcmFzdGVyX29mZnNldHMnXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCgoW3RuYW1lLCB0d2lkdGgsIHRoZWlnaHRdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXhbdG5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFzdGVyX2Nvb3JkcyA9IGNvbmZpZ3NbdG5hbWVdLmNvb3JkczsgLy8gdGlsZSBjb29yZHMgb2YgcmFzdGVyIHRpbGVcblxuICAgICAgICAgICAgICAgICAgICB1X3NhbXBsZXJzW2ldID0gdG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcy5wdXNoKHRuYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICB1X3NpemVzW2ldID0gW3R3aWR0aCwgdGhlaWdodF07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGlsZSBnZW9tZXRyeSBtYXkgYmUgYXQgYSBoaWdoZXIgem9vbSB0aGFuIHRoZSByYXN0ZXIgdGlsZSB0ZXh0dXJlLFxuICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBhbiBvdmVyem9vbWVkIHJhc3RlciB0aWxlKSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFkanVzdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmFzdGVyIHRleHR1cmUgVVZzIHRvIG9mZnNldCB0byB0aGUgYXBwcm9wcmlhdGUgc3RhcnRpbmcgcG9pbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZ2VvbWV0cnkgdGlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuY29vcmRzLnogPiByYXN0ZXJfY29vcmRzLnopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkeiA9IHRpbGUuY29vcmRzLnogLSByYXN0ZXJfY29vcmRzLno7IC8vICMgb2YgbGV2ZWxzIHJhc3RlciBzb3VyY2UgaXMgb3Zlcnpvb21lZFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR6MiA9IE1hdGgucG93KDIsIGR6KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVfb2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGlsZS5jb29yZHMueCAlIGR6MikgLyBkejIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR6MiAtIDEgLSAodGlsZS5jb29yZHMueSAlIGR6MikpIC8gZHoyLCAvLyBHTCB0ZXh0dXJlIGNvb3JkcyBhcmUgK1kgdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8gZHoyXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdV9vZmZzZXRzW2ldID0gWzAsIDAsIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWRcbiAgICBsb2FkVGV4dHVyZXMgKHRleHR1cmVzKSB7XG4gICAgICAgIC8vIE5COiBvbmx5IHJldHVybiBuYW1lIGFuZCBzaXplIG9mIHRleHR1cmVzIGxvYWRlZCwgYmVjYXVzZSB3ZSBjYW4ndCBzZW5kIGFjdHVhbCB0ZXh0dXJlIG9iamVjdHMgdG8gd29ya2VyXG4gICAgICAgIHJldHVybiBUZXh0dXJlLmNyZWF0ZUZyb21PYmplY3QodGhpcy5nbCwgdGV4dHVyZXMpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHRleHR1cmVzKS5tYXAodCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnRleHR1cmVzW3RdICYmIFRleHR1cmUudGV4dHVyZXNbdF0ubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHgpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHQucmV0YWluKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlcy5tYXAodCA9PiBbdC5uYW1lLCB0LndpZHRoLCB0LmhlaWdodF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFNldHVwIGFueSBHTCBzdGF0ZSBmb3IgcmVuZGVyaW5nXG4gICAgc2V0dXAgKCkge1xuICAgICAgICB0aGlzLnNldFVuaWZvcm1zKCk7XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuc2V0dXBQcm9ncmFtKFNoYWRlclByb2dyYW0uY3VycmVudCk7XG4gICAgfSxcblxuICAgIC8vIFNldCBzdHlsZSB1bmlmb3JtcyBvbiBjdXJyZW50bHkgYm91bmQgcHJvZ3JhbVxuICAgIHNldFVuaWZvcm1zICgpIHtcbiAgICAgICAgdmFyIHByb2dyYW0gPSBTaGFkZXJQcm9ncmFtLmN1cnJlbnQ7XG4gICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3Jtcyh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLCB0cnVlKTsgLy8gcmVzZXQgdGV4dHVyZSB1bml0IHRvIDBcbiAgICB9LFxuXG4gICAgLy8gUmVuZGVyIHN0YXRlIHNldHRpbmdzIGJ5IGJsZW5kIG1vZGVcbiAgICByZW5kZXJfc3RhdGVzOiB7XG4gICAgICAgIG9wYXF1ZTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogdHJ1ZSB9LFxuICAgICAgICBhZGQ6IHsgZGVwdGhfdGVzdDogdHJ1ZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH0sXG4gICAgICAgIG11bHRpcGx5OiB7IGRlcHRoX3Rlc3Q6IHRydWUsIGRlcHRoX3dyaXRlOiBmYWxzZSB9LFxuICAgICAgICBpbmxheTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogZmFsc2UgfSxcbiAgICAgICAgb3ZlcmxheTogeyBkZXB0aF90ZXN0OiBmYWxzZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH1cbiAgICB9LFxuXG4gICAgLy8gRGVmYXVsdCBzb3J0IG9yZGVyIGZvciBibGVuZCBtb2Rlc1xuICAgIGRlZmF1bHRfYmxlbmRfb3JkZXJzOiB7XG4gICAgICAgIG9wYXF1ZTogMCxcbiAgICAgICAgYWRkOiAxLFxuICAgICAgICBtdWx0aXBseTogMixcbiAgICAgICAgaW5sYXk6IDMsXG4gICAgICAgIG92ZXJsYXk6IDRcbiAgICB9LFxuXG4gICAgLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3Igc29ydGluZyBzdHlsZXMgYnkgYmxlbmRcbiAgICBibGVuZE9yZGVyU29ydCAoYSwgYikge1xuICAgICAgICAvLyBvcGFxdWUgYWx3YXlzIGNvbWVzIGZpcnN0XG4gICAgICAgIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJyB8fCBiLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgaWYgKGEuYmxlbmQgPT09ICdvcGFxdWUnICYmIGIuYmxlbmQgPT09ICdvcGFxdWUnKSB7IC8vIGlmIGJvdGggYXJlIG9wYXF1ZVxuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUgPCBiLm5hbWUgPyAtMSA6IDE7IC8vIHVzZSBuYW1lIGFzIHRpZSBicmVha2VyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gb25seSBgYWAgd2FzIG9wYXF1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIG9ubHkgYGJgIHdhcyBvcGFxdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzZSBleHBsaWNpdCBibGVuZCBvcmRlciBpZiBwb3NzaWJsZVxuICAgICAgICBpZiAoYS5ibGVuZF9vcmRlciA8IGIuYmxlbmRfb3JkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmJsZW5kX29yZGVyID4gYi5ibGVuZF9vcmRlcikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBibGVuZCBvcmRlcnMgYXJlIGVxdWFsLCB1c2UgZGVmYXVsdCBvcmRlciBieSBibGVuZCBtb2RlXG4gICAgICAgIGlmIChTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1thLmJsZW5kXSA8IFN0eWxlLmRlZmF1bHRfYmxlbmRfb3JkZXJzW2IuYmxlbmRdKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoU3R5bGUuZGVmYXVsdF9ibGVuZF9vcmRlcnNbYS5ibGVuZF0gPiBTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1tiLmJsZW5kXSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxOyAvLyB1c2UgbmFtZSBhcyB0aWUgYnJlYWtlclxuICAgIH1cblxufTtcbiIsIi8vIE1hbmFnZSByZW5kZXJpbmcgc3R5bGVzXG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4uL3V0aWxzL21lcmdlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuaW1wb3J0IHtQb2x5Z29uc30gZnJvbSAnLi9wb2x5Z29ucy9wb2x5Z29ucyc7XG5pbXBvcnQge0xpbmVzfSBmcm9tICcuL2xpbmVzL2xpbmVzJztcbmltcG9ydCB7UG9pbnRzfSBmcm9tICcuL3BvaW50cy9wb2ludHMnO1xuaW1wb3J0IHtUZXh0U3R5bGV9IGZyb20gJy4vdGV4dC90ZXh0JztcbmltcG9ydCB7UmFzdGVyU3R5bGV9IGZyb20gJy4vcmFzdGVyL3Jhc3Rlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfYWNjZXNzb3JzID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9hY2Nlc3NvcnMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfbGF5ZXJPcmRlciA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvbGF5ZXJfb3JkZXIuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvc2VsZWN0aW9uX2dsb2JhbHMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9zZWxlY3Rpb25fdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5zdHlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlX3N0eWxlcyA9IHt9O1xuXG4gICAgICAgIC8vIEFkZCBidWlsdC1pbiByZW5kZXJpbmcgc3R5bGVzXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShQb2x5Z29ucykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoTGluZXMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihPYmplY3QuY3JlYXRlKFBvaW50cykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoVGV4dFN0eWxlKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShSYXN0ZXJTdHlsZSkpO1xuICAgIH1cblxuICAgIC8vIEdsb2JhbCBjb25maWd1cmF0aW9uIGZvciBhbGwgc3R5bGVzXG4gICAgaW5pdCAoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soJ2dsb2JhbCcpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKCdzZXR1cCcpO1xuXG4gICAgICAgIC8vIE1vZGVsIGFuZCB3b3JsZCBwb3NpdGlvbiBhY2Nlc3NvcnNcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2FjY2Vzc29ycyk7XG5cbiAgICAgICAgLy8gTGF5ZXIgcmUtb3JkZXJpbmcgZnVuY3Rpb25cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2xheWVyT3JkZXIpO1xuXG4gICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uIGdsb2JhbFxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKCdnbG9iYWwnLCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyk7XG5cbiAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gdmVydGV4IHNoYWRlciBzdXBwb3J0XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdzZXR1cCcsIHNoYWRlclNyY19zZWxlY3Rpb25WZXJ0ZXgpO1xuXG4gICAgICAgIC8vIE1pbmltdW0gdmFsdWUgZm9yIGZsb2F0IGNvbXBhcmlzb25zXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0VQU0lMT04gPSAwLjAwMDAxO1xuXG4gICAgICAgIC8vIE1pbmltdW0gZGVwdGggYnVmZmVyIHZhbHVlIHNlcGFyYXRpbmcgZWFjaCBgb3JkZXJgIHVuaXRcbiAgICAgICAgLy8gQXNzdW1lIG1pbiAxNi1iaXQgZGVwdGggYnVmZmVyLCBpbiBwcmFjdGljZSB1c2VzIDE0LWJpdHMsIDEgZXh0cmEgYml0IHRvIGhhbmRsZSB2aXJ0dWFsIGhhbGYtbGF5ZXJzXG4gICAgICAgIC8vIGZvciBvdXRsaW5lcyAoaW5zZXJ0ZWQgaW4gYmV0d2VlbiBsYXllcnMpLCBhbm90aGVyIGV4dHJhIGJpdCB0byBwcmV2ZW50IHByZWNpc2lvbiBsb3NzXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0xBWUVSX0RFTFRBID0gMSAvICgxIDw8IDE0KTtcblxuICAgICAgICAvLyBJbnRlcm5hbCB0aWxlIHNjYWxlXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX1RJTEVfU0NBTEUgPVxuICAgICAgICAgICAgYHZlYzMoJHtHZW8udGlsZV9zY2FsZX0uLCAke0dlby50aWxlX3NjYWxlfS4sIHVfbWV0ZXJzX3Blcl9waXhlbCAqICR7R2VvLnRpbGVfc2l6ZX0uKWA7XG5cbiAgICAgICAgLy8gSW5jcmVhc2VzIHByZWNpc2lvbiBmb3IgaGVpZ2h0IHZhbHVlc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXMuVEFOR1JBTV9IRUlHSFRfU0NBTEUgPSBHZW8uaGVpZ2h0X3NjYWxlO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgYWxsIHN0eWxlcyBmb3IgYSBnaXZlbiBHTCBjb250ZXh0XG4gICAgZGVzdHJveSAoZ2wpIHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdHlsZXMpLmZvckVhY2goKF9uYW1lKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLnN0eWxlc1tfbmFtZV07XG4gICAgICAgICAgICBpZiAoc3R5bGUuZ2wgPT09IGdsKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZU1hbmFnZXIuZGVzdHJveTogZGVzdHJveWluZyByZW5kZXIgc3R5bGUgJHtzdHlsZS5uYW1lfWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmJhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0eWxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgYSBzdHlsZVxuICAgIHJlZ2lzdGVyIChzdHlsZSkge1xuICAgICAgICB0aGlzLnN0eWxlc1tzdHlsZS5uYW1lXSA9IHN0eWxlO1xuICAgICAgICB0aGlzLmJhc2Vfc3R5bGVzW3N0eWxlLm5hbWVdID0gc3R5bGU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgc3R5bGVcbiAgICByZW1vdmUgKG5hbWUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGVzW25hbWVdO1xuICAgIH1cblxuICAgIG1peCAoc3R5bGUsIHN0eWxlcykge1xuICAgICAgICAvLyBFeGl0IGVhcmx5IGlmIHdlIGhhdmUgYWxyZWFkeSBhcHBsaWVkIG1peGlucyB0byB0aGlzIHN0eWxlXG4gICAgICAgIGlmIChzdHlsZS5taXhlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLm1peGVkID0ge307XG5cbiAgICAgICAgLy8gTWl4aW4gc291cmNlcywgaW4gb3JkZXJcbiAgICAgICAgbGV0IHNvdXJjZXMgPSBbXTtcbiAgICAgICAgaWYgKHN0eWxlLm1peCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUubWl4KSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaCguLi5zdHlsZS5taXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKHN0eWxlLm1peCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb3VyY2VzID0gc291cmNlcy5tYXAoeCA9PiBzdHlsZXNbeF0pLmZpbHRlcih4ID0+IHggJiYgeCAhPT0gc3R5bGUpOyAvLyBUT0RPOiB3YXJuaW5nIG9uIHRyeWluZyB0byBtaXggaW50byBzZWxmXG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHdoaWNoIHN0eWxlcyB3ZXJlIG1peGVkIGludG8gdGhpcyBvbmVcbiAgICAgICAgICAgIHNvdXJjZXMuZm9yRWFjaChzID0+IHN0eWxlLm1peGVkW3MubmFtZV0gPSB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzLnB1c2goc3R5bGUpO1xuXG4gICAgICAgIC8vIEZsYWdzIC0gT1InZCwgdHJ1ZSBpZiBhbnkgc3R5bGUgaGFzIGl0IHNldFxuICAgICAgICBzdHlsZS5hbmltYXRlZCA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC5hbmltYXRlZCk7XG4gICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC50ZXhjb29yZHMpO1xuXG4gICAgICAgIC8vIE92ZXJ3cml0ZXMgLSBsYXN0IGRlZmluaXRpb24gd2luc1xuICAgICAgICBzdHlsZS5iYXNlID0gc291cmNlcy5tYXAoeCA9PiB4LmJhc2UpLmZpbHRlcih4ID0+IHgpLnBvcCgpO1xuICAgICAgICBzdHlsZS5saWdodGluZyA9IHNvdXJjZXMubWFwKHggPT4geC5saWdodGluZykuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUudGV4dHVyZSA9IHNvdXJjZXMubWFwKHggPT4geC50ZXh0dXJlKS5maWx0ZXIoeCA9PiB4KS5wb3AoKTtcbiAgICAgICAgc3R5bGUucmFzdGVyID0gc291cmNlcy5tYXAoeCA9PiB4LnJhc3RlcikuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUuZGFzaCA9IHNvdXJjZXMubWFwKHggPT4geC5kYXNoKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBzdHlsZS5kYXNoX2JhY2tncm91bmRfY29sb3IgPSBzb3VyY2VzLm1hcCh4ID0+IHguZGFzaF9iYWNrZ3JvdW5kX2NvbG9yKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBpZiAoc291cmNlcy5zb21lKHggPT4geC5oYXNPd25Qcm9wZXJ0eSgnYmxlbmQnKSAmJiB4LmJsZW5kKSkge1xuICAgICAgICAgICAgLy8gb25seSBtaXggYmxlbmQgaWYgZXhwbGljaXRseSBzZXQsIG90aGVyd2lzZSBsZXQgYmFzZSBzdHlsZSBjaG9vc2UgYmxlbmRpbmcgbW9kZVxuICAgICAgICAgICAgLy8gaGFzT3duUHJvcGVydHkgY2hlY2sgZ2l2ZXMgcHJlZmVyZW5jZSB0byBiYXNlIHN0eWxlIHByb3RvdHlwZVxuICAgICAgICAgICAgc3R5bGUuYmxlbmQgPSBzb3VyY2VzLm1hcCh4ID0+IHguaGFzT3duUHJvcGVydHkoJ2JsZW5kJykgJiYgeC5ibGVuZCkuZmlsdGVyKHggPT4geCkucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3R5bGUuYmxlbmRfb3JkZXIgPSBzb3VyY2VzLm1hcCh4ID0+IHguYmxlbmRfb3JkZXIpLmZpbHRlcih4ID0+IHggIT0gbnVsbCkucG9wKCk7XG5cbiAgICAgICAgLy8gTWVyZ2VzIC0gcHJvcGVydHktc3BlY2lmaWMgcnVsZXMgZm9yIG1lcmdpbmcgdmFsdWVzXG4gICAgICAgIHN0eWxlLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zb3VyY2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpOyAvLyBpbnRlcm5hbCBkZWZpbmVzIChub3QgdXNlci1kZWZpbmVkKVxuICAgICAgICBzdHlsZS5tYXRlcmlhbCA9IE9iamVjdC5hc3NpZ24oe30sIC4uLnNvdXJjZXMubWFwKHggPT4geC5tYXRlcmlhbCkuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIE1peCBzaGFkZXIgcHJvcGVydGllc1xuICAgICAgICB0aGlzLm1peFNoYWRlcnMoc3R5bGUsIHN0eWxlcywgc291cmNlcyk7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBNaXggdGhlIHByb3BlcnRlcyBpbiB0aGUgXCJzaGFkZXJzXCIgYmxvY2tcbiAgICBtaXhTaGFkZXJzIChzdHlsZSwgc3R5bGVzLCBzb3VyY2VzKSB7XG4gICAgICAgIGxldCBzaGFkZXJzID0ge307IC8vIG5ld2x5IG1peGVkIHNoYWRlcnMgcHJvcGVydGllc1xuICAgICAgICBsZXQgc2hhZGVyX21lcmdlcyA9IHNvdXJjZXMubWFwKHggPT4geC5zaGFkZXJzKS5maWx0ZXIoeCA9PiB4KTsgLy8ganVzdCB0aGUgc291cmNlIHN0eWxlcyB3aXRoIHNoYWRlciBwcm9wZXJ0aWVzXG5cbiAgICAgICAgLy8gRGVmaW5lc1xuICAgICAgICBzaGFkZXJzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zaGFkZXJfbWVyZ2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIFVuaWZvcm1zXG4gICAgICAgIHNoYWRlcnMudW5pZm9ybXMgPSB7fTsgIC8vIHVuaWZvcm1zIGZvciB0aGlzIHN0eWxlLCBib3RoIGV4cGxpY2l0bHkgZGVmaW5lZCwgYW5kIG1peGVkIGZyb20gb3RoZXIgc3R5bGVzXG4gICAgICAgIHNoYWRlcnMuX3VuaWZvcm1zID0gKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3JtcykgfHwge307IC8vIHVuaWZvcm1zIGV4cGxpY2l0bHkgZGVmaW5lZCBieSAqdGhpcyogc3R5bGVcbiAgICAgICAgc2hhZGVycy5fdW5pZm9ybV9zY29wZXMgPSB7fTsgLy8gdHJhY2tzIHdoaWNoIHN0eWxlIGVhY2ggdW5pZm9ybSBvcmlnaW5hdGVkIGZyb20gKHRoaXMgb25lLCBvciBhbmNlc3RvcilcblxuICAgICAgICAvLyBNaXggaW4gdW5pZm9ybXMgZnJvbSBhbmNlc3RvcnMsIHByb3ZpZGluZyBtZWFucyB0byBhY2Nlc3NcbiAgICAgICAgc291cmNlc1xuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHguc2hhZGVycyAmJiB4LnNoYWRlcnMudW5pZm9ybXMpXG4gICAgICAgICAgICAuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB1IGluIHguc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3JtX3Njb3Blc1t1XSA9IHgubmFtZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZpbmUgZ2V0dGVyIGFuZCBzZXR0ZXIgZm9yIHRoaXMgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICAvLyBHZXR0ZXIgcmV0dXJucyB2YWx1ZSBmb3IgdGhpcyBzdHlsZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgYXNrcyBhcHByb3ByaWF0ZSBhbmNlc3RvciBmb3IgaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0dGVyIHNldHMgdGhlIHZhbHVlIGZvciB0aGlzIHN0eWxlICh3aGV0aGVyIHByZXZpb3VzbHkgcHJlc2VudCBpbiB0aGlzIHN0eWxlIG9yIG5vdClcbiAgICAgICAgICAgICAgICAgICAgLy8gTWltaWNzIEpTIHByb3RvdHlwZS9oYXNPd25Qcm9wZXJ0eSBiZWhhdmlvciwgYnV0IHdpdGggbXVsdGlwbGUgYW5jZXN0b3JzICh2aWEgbWl4aW5zKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hhZGVycy51bmlmb3JtcywgdSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gaXMgZXhwbGljaXRseSBkZWZpbmVkIG9uIHRoaXMgc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hhZGVycy5fdW5pZm9ybXNbdV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hhZGVycy5fdW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gd2FzIG1peGVkIGZyb20gYW5vdGhlciBzdHlsZSwgZm9yd2FyZCByZXF1ZXN0IHRoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgY2hlY2sgaXMgbmVlZGVkIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgcHJldmlvdXNseSBkZWZpbmVkIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzZXQgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVzW3NoYWRlcnMuX3VuaWZvcm1fc2NvcGVzW3VdXS5zaGFkZXJzLnVuaWZvcm1zICE9PSBzaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXNbc2hhZGVycy5fdW5pZm9ybV9zY29wZXNbdV1dLnNoYWRlcnMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3Jtc1t1XSA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4dGVuc2lvbnM6IGJ1aWxkIGEgbGlzdCBvZiB1bmlxdWUgZXh0ZW5zaW9uc1xuICAgICAgICBzaGFkZXJzLmV4dGVuc2lvbnMgPSBPYmplY3Qua2V5cyhzaGFkZXJfbWVyZ2VzXG4gICAgICAgICAgICAubWFwKHggPT4geC5leHRlbnNpb25zKVxuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHgpXG4gICAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZbY3VyXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyLmZvckVhY2goeCA9PiBwcmV2W3hdID0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgfSwge30pIHx8IHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2hhZGVyIGJsb2Nrc1xuICAgICAgICAvLyBNYXJrIGFsbCBzaGFkZXIgYmxvY2tzIGZvciB0aGUgdGFyZ2V0IHN0eWxlIGFzIG9yaWdpbmF0aW5nIHdpdGggaXRzIG93biBuYW1lXG4gICAgICAgIGlmIChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMuYmxvY2tzKSB7XG4gICAgICAgICAgICBzdHlsZS5zaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgayBpbiBzdHlsZS5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHN0eWxlLnNoYWRlcnMuYmxvY2tzW2tdO1xuICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdID0gc3R5bGUuc2hhZGVycy5ibG9ja19zY29wZXNba10gfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmxvY2spKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goLi4uYmxvY2subWFwKCgpID0+IHN0eWxlLm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2Ugc2hhZGVyIGJsb2Nrcywga2VlcGluZyB0cmFjayBvZiB3aGljaCBzdHlsZSBlYWNoIGJsb2NrIG9yaWdpbmF0ZWQgZnJvbVxuICAgICAgICBsZXQgbWl4ZWQgPSB7fTsgLy8gYWxsIHNjb3BlcyBtaXhlZCBzbyBmYXJcbiAgICAgICAgc2hhZGVyX21lcmdlcy5mb3JFYWNoKHNvdXJjZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzID0gc2hhZGVycy5ibG9ja3MgfHwge307XG4gICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgbGV0IG1peGVkX3NvdXJjZSA9IHt9OyAvLyBzY29wZXMgbWl4ZWQgZm9yIHRoaXMgc291cmNlIHN0eWxlXG5cbiAgICAgICAgICAgIGZvciAobGV0IHQgaW4gc291cmNlLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHNvdXJjZS5ibG9ja3NbdF07XG4gICAgICAgICAgICAgICAgbGV0IGJsb2NrX3Njb3BlID0gc291cmNlLmJsb2NrX3Njb3Blc1t0XTtcblxuICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdID0gc2hhZGVycy5ibG9ja3NbdF0gfHwgW107XG4gICAgICAgICAgICAgICAgc2hhZGVycy5ibG9ja19zY29wZXNbdF0gPSBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XSB8fCBbXTtcblxuICAgICAgICAgICAgICAgIC8vIHN0YW5kYXJkaXplIG9uIGFycmF5cyAoYmxvY2sgY2FuIGJlIHNpbmdsZSBvciBtdWx0aS12YWx1ZSlcbiAgICAgICAgICAgICAgICBibG9jayA9IEFycmF5LmlzQXJyYXkoYmxvY2spID8gYmxvY2sgOiBbYmxvY2tdO1xuICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlID0gQXJyYXkuaXNBcnJheShibG9ja19zY29wZSkgPyBibG9ja19zY29wZSA6IFtibG9ja19zY29wZV07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiPTA7IGIgPCBibG9jay5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGJsb2NrcyB3ZSd2ZSBhbHJlYWR5IG1peGVkIGluIGZyb20gdGhlIHNhbWUgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwZWF0aW5nIHNjb3BlIGluZGljYXRlcyBhIGRpYW1vbmQgcGF0dGVybiB3aGVyZSBhIHN0eWxlIGlzIGJlaW5nIG1peGVkIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaXhlZFtibG9ja19zY29wZVtiXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1peGVkX3NvdXJjZVtibG9ja19zY29wZVtiXV0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdLnB1c2goYmxvY2tbYl0pO1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XS5wdXNoKGJsb2NrX3Njb3BlW2JdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBzdHlsZXMgbWl4ZWQgaW4gZnJvbSB0aGlzIHNvdXJjZSAtIHRoZXkgY291bGQgYmUgbXVsdGktbGV2ZWwgYW5jZXN0b3JzLFxuICAgICAgICAgICAgLy8gYmV5b25kIHRoZSBmaXJzdC1sZXZlbCBcInBhcmVudHNcIiBkZWZpbmVkIGluIHRoaXMgc3R5bGUncyBgbWl4YCBsaXN0XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1peGVkLCBtaXhlZF9zb3VyY2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlLm1peGVkLCBtaXhlZCk7IC8vIGFkZCBhbGwgbmV3bHkgbWl4ZWQgc3R5bGVzXG5cbiAgICAgICAgc3R5bGUuc2hhZGVycyA9IHNoYWRlcnM7IC8vIGFzc2lnbiBiYWNrIHRvIHN0eWxlXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgc3R5bGVcbiAgICAvLyBuYW1lOiBuYW1lIG9mIG5ldyBzdHlsZVxuICAgIC8vIGNvbmZpZzogcHJvcGVydGllcyBvZiBuZXcgc3R5bGVcbiAgICAvLyBzdHlsZXM6IHdvcmtpbmcgc2V0IG9mIHN0eWxlcyBiZWluZyBidWlsdCAodXNlZCBmb3IgbWl4aW5nIGluIGV4aXN0aW5nIHN0eWxlcylcbiAgICBjcmVhdGUgKG5hbWUsIGNvbmZpZywgc3R5bGVzID0ge30pIHtcbiAgICAgICAgbGV0IHN0eWxlID0gbWVyZ2VPYmplY3RzKHt9LCBjb25maWcpOyAvLyBkZWVwIGNvcHlcbiAgICAgICAgc3R5bGUubmFtZSA9IG5hbWU7XG5cbiAgICAgICAgLy8gU3R5bGUgbWl4aW5zXG4gICAgICAgIHN0eWxlID0gdGhpcy5taXgoc3R5bGUsIHN0eWxlcyk7XG5cbiAgICAgICAgLy8gSGFzIGJhc2Ugc3R5bGU/XG4gICAgICAgIC8vIE9ubHkgcmVuZGVyYWJsZSAoaW5zdGFudGlhdGVkKSBzdHlsZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBydW4tdGltZSB1c2VcbiAgICAgICAgLy8gT3RoZXJzIGFyZSBpbnRlcm1lZGlhcnkvYWJzdHJhY3QsIHVzZWQgZHVyaW5nIHN0eWxlIGNvbXBvc2l0aW9uIGJ1dCBub3QgZXhlY3V0aW9uXG4gICAgICAgIGlmIChzdHlsZS5iYXNlICYmIHRoaXMuYmFzZV9zdHlsZXNbc3R5bGUuYmFzZV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzW25hbWVdID0gc3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUodGhpcy5iYXNlX3N0eWxlc1tzdHlsZS5iYXNlXSksIHN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLmJhc2UgPSBudWxsOyAvLyBudWxsIG91dCBpbnZhbGlkIGJhc2Ugc3R5bGVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXplIHN0eWxlc1xuICAgIGJ1aWxkIChzdHlsZXMpIHtcbiAgICAgICAgLy8gU29ydCBzdHlsZXMgYnkgZGVwZW5kZW5jeSwgdGhlbiBidWlsZCB0aGVtXG4gICAgICAgIGxldCBzdHlsZV9kZXBzID0gT2JqZWN0LmtleXMoc3R5bGVzKS5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+IHRoaXMuaW5oZXJpdGFuY2VEZXB0aChhLCBzdHlsZXMpIC0gdGhpcy5pbmhlcml0YW5jZURlcHRoKGIsIHN0eWxlcylcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBPbmx5IGtlZXAgYnVpbHQtaW4gYmFzZSBzdHlsZXNcbiAgICAgICAgZm9yIChsZXQgc25hbWUgaW4gdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5iYXNlX3N0eWxlc1tzbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZXNbc25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXb3JraW5nIHNldCBvZiBzdHlsZXMgYmVpbmcgYnVpbHRcbiAgICAgICAgbGV0IHdzID0ge307XG4gICAgICAgIHN0eWxlX2RlcHMuZm9yRWFjaChzbmFtZSA9PiB7XG4gICAgICAgICAgICB3c1tzbmFtZV0gPSB0aGlzLmNyZWF0ZShzbmFtZSwgc3R5bGVzW3NuYW1lXSwgd3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZXM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgc3R5bGVzXG4gICAgaW5pdFN0eWxlcyAoc2NlbmUgPSB7fSkge1xuICAgICAgICAvLyBJbml0aWFsaXplIGFsbFxuICAgICAgICBmb3IgKGxldCBzbmFtZSBpbiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLmluaXQoc2NlbmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYSBzdHlsZSBrZXkgaW4gYSBzZXQgb2Ygc3R5bGVzIHRvIGFkZCwgY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgaW5oZXJpdGFuY2UgY2hhaW5cbiAgICBpbmhlcml0YW5jZURlcHRoIChrZXksIHN0eWxlcykge1xuICAgICAgICBsZXQgcGFyZW50cyA9IDA7XG5cbiAgICAgICAgd2hpbGUodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHNjZW5lIGRlZiBlcnJvciwgdHJ5aW5nIHRvIGV4dGVuZCBhIHN0eWxlIHRoYXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZXBlbmRlbmN5IGNoYWluIGVuZHMgd2hlbiB0aGlzIHN0eWxlIGlzbid0IG1peGluZyBpbiBhbnkgb3RoZXJzXG4gICAgICAgICAgICBpZiAoIXN0eWxlLm1peCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmF2ZXJzZSBuZXh0IHBhcmVudCBzdHlsZVxuICAgICAgICAgICAgcGFyZW50cysrO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5taXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbXVsdGlwbGUgbWl4aW5zLCBmaW5kIHRoZSBkZWVwZXN0IG9uZVxuICAgICAgICAgICAgICAgIHBhcmVudHMgKz0gTWF0aC5tYXgoLi4uc3R5bGUubWl4Lm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIG1peCBpbnRvIGl0c2VsZiFcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5oZXJpdGFuY2VEZXB0aChzLCBzdHlsZXMpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRyeWluZyB0byBtaXggaW50byBpdHNlbGYhXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gc3R5bGUubWl4KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIHNpbmdsZSBtaXhpbiwgY29udGludWUgbG9vcCB1cCB0aGUgdHJlZVxuICAgICAgICAgICAgICAgIGtleSA9IHN0eWxlLm1peDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9XG5cbn1cbiIsImltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmltcG9ydCBwYXJzZUNTU0NvbG9yIGZyb20gJ2Nzc2NvbG9ycGFyc2VyJztcblxuZXhwb3J0IHZhciBTdHlsZVBhcnNlciA9IHt9O1xuXG4vLyBXcmFwcyBzdHlsZSBmdW5jdGlvbnMgYW5kIHByb3ZpZGVzIGEgc2NvcGUgb2YgY29tbW9ubHkgYWNjZXNzaWJsZSBkYXRhOlxuLy8gLSBmZWF0dXJlOiB0aGUgJ3Byb3BlcnRpZXMnIG9mIHRoZSBmZWF0dXJlLCBlLmcuIGFjY2Vzc2VkIGFzICdmZWF0dXJlLm5hbWUnXG4vLyAtIGdsb2JhbDogdXNlci1kZWZpbmVkIHByb3BlcnRpZXMgb24gdGhlIGBnbG9iYWxgIG9iamVjdCBpbiB0aGUgc2NlbmUgZmlsZVxuLy8gLSAkem9vbTogdGhlIGN1cnJlbnQgbWFwIHpvb20gbGV2ZWxcbi8vIC0gJGdlb21ldHJ5OiB0aGUgdHlwZSBvZiBnZW9tZXRyeSwgJ3BvaW50JywgJ2xpbmUnLCBvciAncG9seWdvbidcbi8vIC0gJG1ldGVyc19wZXJfcGl4ZWw6IGNvbnZlcnNpb24gZm9yIG1ldGVycy9waXhlbHMgYXQgY3VycmVudCBtYXAgem9vbVxuU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgZiA9IGBcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllcztcbiAgICAgICAgdmFyIGdsb2JhbCA9IGNvbnRleHQuZ2xvYmFsO1xuICAgICAgICB2YXIgJHpvb20gPSBjb250ZXh0Lnpvb207XG4gICAgICAgIHZhciAkbGF5ZXIgPSBjb250ZXh0LmxheWVyO1xuICAgICAgICB2YXIgJGdlb21ldHJ5ID0gY29udGV4dC5nZW9tZXRyeTtcbiAgICAgICAgdmFyICRtZXRlcnNfcGVyX3BpeGVsID0gY29udGV4dC5tZXRlcnNfcGVyX3BpeGVsO1xuXG4gICAgICAgIHZhciB2YWwgPSAoZnVuY3Rpb24oKXsgJHtmdW5jfSB9KCkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpKSB7XG4gICAgICAgICAgICB2YWwgPSBudWxsOyAvLyBjb252ZXJ0IE5hTnMgdG8gbnVsbHNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgYDtcbiAgICByZXR1cm4gZjtcbn07XG5cblxuLy8gU3R5bGUgcGFyc2luZ1xuXG5TdHlsZVBhcnNlci56ZXJvUGFpciA9IE9iamVjdC5mcmVlemUoWzAsIDBdKTsgLy8gc2luZ2xlIGFsbG9jYXRpb24gZm9yIHplcm8gdmFsdWVzIHRoYXQgd29uJ3QgYmUgbW9kaWZpZWRcblxuLy8gU3R5bGUgZGVmYXVsdHNcblN0eWxlUGFyc2VyLmRlZmF1bHRzID0ge1xuICAgIGNvbG9yOiBbMSwgMSwgMSwgMV0sXG4gICAgd2lkdGg6IDEsXG4gICAgc2l6ZTogMSxcbiAgICBleHRydWRlOiBmYWxzZSxcbiAgICBoZWlnaHQ6IDIwLFxuICAgIG1pbl9oZWlnaHQ6IDAsXG4gICAgb3JkZXI6IDAsXG4gICAgejogMCxcbiAgICBtYXRlcmlhbDoge1xuICAgICAgICBhbWJpZW50OiAxLFxuICAgICAgICBkaWZmdXNlOiAxXG4gICAgfVxufTtcblxuLy8gU3R5bGUgbWFjcm9zXG5TdHlsZVBhcnNlci5tYWNyb3MgPSB7XG4gICAgLy8gcHNldWRvLXJhbmRvbSBjb2xvciBieSBnZW9tZXRyeSBpZFxuICAgICdTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvcic6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgMC43ICogKHBhcnNlSW50KGZlYXR1cmUuaWQsIDE2KSAvIDEwMCAlIDEpLCAgICAgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICAwLjcgKiAocGFyc2VJbnQoZmVhdHVyZS5pZCwgMTYpIC8gMTAwMDAgJSAxKSwgICAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIDAuNyAqIChwYXJzZUludChmZWF0dXJlLmlkLCAxNikgLyAxMDAwMDAwICUgMSksIC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgMVxuICAgICAgICBdO1xuICAgIH0sXG5cbiAgICAvLyByYW5kb20gY29sb3JcbiAgICAnU3R5bGUuY29sb3IucmFuZG9tQ29sb3InOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFswLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAxXTtcbiAgICB9XG59O1xuXG4vLyBBIGNvbnRleHQgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHRvIHN0eWxlIHBhcnNpbmcgZnVuY3Rpb25zIHRvIHByb3ZpZGUgYSBzY29wZSBvZiBjb21tb25seSB1c2VkIHZhbHVlc1xuU3R5bGVQYXJzZXIuZ2V0RmVhdHVyZVBhcnNlQ29udGV4dCA9IGZ1bmN0aW9uIChmZWF0dXJlLCB0aWxlLCBnbG9iYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmZWF0dXJlLFxuICAgICAgICB0aWxlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIHpvb206IHRpbGUuc3R5bGVfem9vbSxcbiAgICAgICAgZ2VvbWV0cnk6IEdlby5nZW9tZXRyeVR5cGUoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSxcbiAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGlsZS5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICBtZXRlcnNfcGVyX3BpeGVsX3NxOiB0aWxlLm1ldGVyc19wZXJfcGl4ZWxfc3EsXG4gICAgICAgIHVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTogdGlsZS51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb21cbiAgICB9O1xufTtcblxuLy8gQnVpbGQgYSBzdHlsZSBwYXJhbSBjYWNoZSBvYmplY3Rcbi8vIGB2YWx1ZWAgaXMgcmF3IHZhbHVlLCBjYWNoZSBtZXRob2RzIHdpbGwgYWRkIG90aGVyIHByb3BlcnRpZXMgYXMgbmVlZGVkXG4vLyBgdHJhbnNmb3JtYCBpcyBvcHRpb25hbCB0cmFuc2Zvcm0gZnVuY3Rpb24gdG8gcnVuIG9uIHZhbHVlcyAoZXhjZXB0IGZ1bmN0aW9uIHZhbHVlcylcblN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUgPSBmdW5jdGlvbiAob2JqLCB0cmFuc2Zvcm0gPSBudWxsKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2JqLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiBvYmoudmFsdWUsIHpvb206IChvYmouem9vbSA/IHt9IDogbnVsbCkgfTsgLy8gY2xvbmUgZXhpc3RpbmcgY2FjaGUgb2JqZWN0XG4gICAgfVxuXG4gICAgbGV0IGMgPSB7IHZhbHVlOiBvYmogfTtcblxuICAgIC8vIGRvZXMgdmFsdWUgY29udGFpbiB6b29tIHN0b3BzIHRvIGJlIGludGVycG9sYXRlZD9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KGMudmFsdWVbMF0pKSB7XG4gICAgICAgIGMuem9vbSA9IHt9OyAvLyB3aWxsIGhvbGQgdmFsdWVzIGludGVycG9sYXRlZCBieSB6b29tXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgb3B0aW9uYWwgdHJhbnNmb3JtIGZ1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGMuem9vbSkgeyAvLyBhcHBseSB0byBlYWNoIHpvb20gc3RvcCB2YWx1ZVxuICAgICAgICAgICAgYy52YWx1ZSA9IGMudmFsdWUubWFwKHYgPT4gW3ZbMF0sIHRyYW5zZm9ybSh2WzFdKV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7IC8vIGRvbid0IHRyYW5zZm9ybSBmdW5jdGlvbnNcbiAgICAgICAgICAgIGMudmFsdWUgPSB0cmFuc2Zvcm0oYy52YWx1ZSk7IC8vIHNpbmdsZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGM7XG59O1xuXG4vLyBDb252ZXJ0IG9sZC1zdHlsZSBjb2xvciBtYWNybyBpbnRvIGEgZnVuY3Rpb25cbi8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIG1hY3JvIHN5bnRheFxuU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKG9iaiwgdiA9PiB7XG4gICAgICAgIGlmICh2ID09PSAnU3R5bGUuY29sb3IucHNldWRvUmFuZG9tQ29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24oU3R5bGVQYXJzZXIubWFjcm9zWydTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvciddKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodiA9PT0gJ1N0eWxlLmNvbG9yLnJhbmRvbUNvbG9yJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLm1hY3Jvc1snU3R5bGUuY29sb3IucmFuZG9tQ29sb3InXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xufTtcblxuLy8gSW50ZXJwb2xhdGlvbiBhbmQgY2FjaGluZyBmb3IgYSBnZW5lcmljIHByb3BlcnR5IChub3QgYSBjb2xvciBvciBkaXN0YW5jZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IHZhbCwgem9vbTogeyAxOiB2YWwxLCAyOiB2YWwyLCAuLi4gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKHZhbCwgY29udGV4dCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5keW5hbWljKSB7IC8vIGZ1bmN0aW9uLCBjb21wdXRlIGVhY2ggdGltZSAobm8gY2FjaGluZylcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHsgLy8gc2luZ2xlIHN0YXRpYyB2YWx1ZVxuICAgICAgICByZXR1cm4gdmFsLnN0YXRpYztcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsLnpvb20gJiYgdmFsLnpvb21bY29udGV4dC56b29tXSkgeyAvLyBpbnRlcnBvbGF0ZWQsIGNhY2hlZFxuICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIG5vdCB5ZXQgZXZhdWxhdGVkIGZvciBjYWNoZVxuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbC52YWx1ZVswXSkpIHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB2YWx1ZSBmb3IgY3VycmVudCB6b29tXG4gICAgICAgICAgICB2YWwuem9vbSA9IHZhbC56b29tIHx8IHt9O1xuICAgICAgICAgICAgdmFsLnpvb20gPSB7fTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RhdGljIHZhbHVlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsLnN0YXRpYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuU3R5bGVQYXJzZXIuY29udmVydFVuaXRzID0gZnVuY3Rpb24odmFsLCBjb250ZXh0KSB7XG4gICAgLy8gcHJlLXBhcnNlZCB1bml0c1xuICAgIGlmICh2YWwudmFsICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbC51bml0cyA9PT0gJ3B4JykgeyAvLyBjb252ZXJ0IGZyb20gcGl4ZWxzXG4gICAgICAgICAgICByZXR1cm4gdmFsLnZhbCAqIEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWwudmFsO1xuICAgIH1cbiAgICAvLyB1bi1wYXJzZWQgdW5pdCBzdHJpbmdcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgdW5pdHMgPSB2YWwubWF0Y2goLyhbMC05Li1dKykoW2Etel0rKS8pO1xuICAgICAgICBpZiAodW5pdHMgJiYgdW5pdHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHVuaXRzWzFdKTtcbiAgICAgICAgICAgIHVuaXRzID0gdW5pdHNbMl07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5pdHMgPT09ICdweCcpIHsgLy8gY29udmVydCBmcm9tIHBpeGVsc1xuICAgICAgICAgICAgdmFsICo9IEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG11bHRpcGxlIHZhbHVlcyBvciBzdG9wc1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAvLyBBcnJheSBvZiBhcnJheXMsIGUuZy4gem9vbS1pbnRlcnBvbGF0ZWQgc3RvcHNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsWzBdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBbdlswXSwgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHZbMV0sIGNvbnRleHQpXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2YgdmFsdWVzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModiwgY29udGV4dCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBQcmUtcGFyc2UgdW5pdHMgZnJvbSBzdHJpbmcgdmFsdWVzXG5TdHlsZVBhcnNlci5wYXJzZVVuaXRzID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBvYmogPSB7IHZhbDogcGFyc2VGbG9hdCh2YWwpIH07XG4gICAgaWYgKG9iai52YWwgIT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKS5zbGljZSgtMikgPT09ICdweCcpIHtcbiAgICAgICAgb2JqLnVuaXRzID0gJ3B4JztcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIFRha2VzIGEgZGlzdGFuY2UgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgZGlzdGFuY2UgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCB6b29tOiB7IHo6IG1ldGVycyB9LCBkeW5hbWljOiBmdW5jdGlvbigpey4uLn0gfVxuU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkgPSBmdW5jdGlvbih2YWwsIGNvbnRleHQpIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKHZhbC56b29tKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdmFsdWUgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgLy8gRG8gZmluYWwgdW5pdCBjb252ZXJzaW9uIGFzIGxhdGUgYXMgcG9zc2libGUsIHdoZW4gaW50ZXJwb2xhdGlvbiB2YWx1ZXMgaGF2ZSBiZWVuIGRldGVybWluZWRcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSxcbiAgICAgICAgICAgICAgICB2ID0+IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2LCBjb250ZXh0KSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2YWwudmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gQ2FjaGUgcHJldmlvdXNseSBwYXJzZWQgY29sb3Igc3RyaW5nc1xuU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9ycyA9IHt9O1xuU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAvLyBDYWNoZWRcbiAgICBpZiAoU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9yc1tzdHJpbmddKSB7XG4gICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5zdHJpbmdfY29sb3JzW3N0cmluZ107XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZCBjYWNoZVxuICAgIGxldCBjb2xvciA9IHBhcnNlQ1NTQ29sb3IucGFyc2VDU1NDb2xvcihzdHJpbmcpO1xuICAgIGlmIChjb2xvciAmJiBjb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgY29sb3JbMF0gLz0gMjU1O1xuICAgICAgICBjb2xvclsxXSAvPSAyNTU7XG4gICAgICAgIGNvbG9yWzJdIC89IDI1NTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbG9yID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgfVxuICAgIFN0eWxlUGFyc2VyLnN0cmluZ19jb2xvcnNbc3RyaW5nXSA9IGNvbG9yO1xuICAgIHJldHVybiBjb2xvcjtcbn07XG5cbi8vIFRha2VzIGEgY29sb3IgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgY29sb3IgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IFtyLGcsYixhXSwgem9vbTogeyB6OiBbcixnLGIsYV0gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRDb2xvclByb3BlcnR5ID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodiAmJiB2WzNdID09IG51bGwpIHtcbiAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkIGNvbG9yXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2ICYmIHZbM10gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RyaW5nIGNvbG9yXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWwuc3RhdGljID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZWxzZSBpZiAodmFsLnpvb20pIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIGFueSBzdHJpbmcgY29sb3JzIGluc2lkZSBzdG9wcywgdGhlIGZpcnN0IHRpbWUgd2UgZW5jb3VudGVyIHRoaXMgcHJvcGVydHlcbiAgICAgICAgICAgIGlmICghdmFsLnpvb21fcHJlcHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2ID0gdmFsLnZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0gPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwuem9vbV9wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgY29sb3IgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgdmFsLnpvb21bY29udGV4dC56b29tXSA9IFV0aWxzLmludGVycG9sYXRlKGNvbnRleHQuem9vbSwgdmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV1bM10gPSB2YWwuem9vbVtjb250ZXh0Lnpvb21dWzNdIHx8IDE7IC8vIGRlZmF1bHQgYWxwaGFcbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmdsZSBhcnJheSBjb2xvclxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhbC5zdGF0aWMgPSB2YWwudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsLnN0YXRpYyAmJiB2YWwuc3RhdGljWzNdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YWwuc3RhdGljWzNdID0gMTsgLy8gZGVmYXVsdCBhbHBoYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5TdHlsZVBhcnNlci5wYXJzZUNvbG9yID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSB2YWwoY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgQ1NTLXN0eWxlIGNvbG9yc1xuICAgIC8vIFRPRE86IGNoYW5nZSBhbGwgY29sb3JzIHRvIHVzZSAwLTI1NSByYW5nZSBpbnRlcm5hbGx5IHRvIGF2b2lkIGRpdmlkaW5nIGFuZCB0aGVuIHJlLW11bHRpcGx5aW5nIGluIGdlb20gYnVpbGRlclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWwgPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2YWwpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkgJiYgQXJyYXkuaXNBcnJheSh2YWxbMF0pKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbFtpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2WzFdID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodlsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC56b29tKSB7XG4gICAgICAgICAgICB2YWwgPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0c1xuICAgIGlmICh2YWwpIHtcbiAgICAgICAgLy8gYWxwaGFcbiAgICAgICAgaWYgKHZhbFszXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWxbM10gPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWwgPSBbMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbn07XG5cblN0eWxlUGFyc2VyLmNhbGN1bGF0ZU9yZGVyID0gZnVuY3Rpb24ob3JkZXIsIGNvbnRleHQpIHtcbiAgICAvLyBDb21wdXRlZCBvcmRlclxuICAgIGlmICh0eXBlb2Ygb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3JkZXIgPSBvcmRlcihjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIG9yZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBPcmRlciB0aWVkIHRvIGZlYXR1cmUgcHJvcGVydHlcbiAgICAgICAgaWYgKGNvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzW29yZGVyXSkge1xuICAgICAgICAgICAgb3JkZXIgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1tvcmRlcl07XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwbGljaXQgb3JkZXIgdmFsdWVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcmRlciA9IHBhcnNlRmxvYXQob3JkZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xufTtcblxuLy8gRXZhbHVhdGUgYSBmdW5jdGlvbi1iYXNlZCBwcm9wZXJ0eSwgb3IgcGFzcy10aHJvdWdoIHN0YXRpYyB2YWx1ZVxuU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gcHJvcChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3A7XG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vZm9udF9tYW5hZ2VyJztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FudmFzVGV4dCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7IC8vIHJlbmRlciB0ZXh0IG9uIHRyYW5zcGFyZW50IGJhY2tncm91bmRcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciA9IDg7IC8vIHZlcnRpY2FsIHBpeGVsIHBhZGRpbmcgYXJvdW5kIHRleHRcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyID0gNDsgLy8gdGV4dCBzdHlsaW5nIHN1Y2ggYXMgaXRhbGljIGVtcGhhc2lzIGlzIG5vdCBtZWFzdXJlZCBieSB0aGUgQ2FudmFzIEFQSSwgc28gcGFkZGluZyBpcyBuZWNlc3NhcnlcbiAgICB9XG5cbiAgICByZXNpemUgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIFNldCBmb250IHN0eWxlIHBhcmFtcyBmb3IgY2FudmFzIGRyYXdpbmdcbiAgICBzZXRGb250ICh7IGZvbnRfY3NzLCBmaWxsLCBzdHJva2UsIHN0cm9rZV93aWR0aCwgcHhfc2l6ZSwgc3VwZXJzYW1wbGUgfSkge1xuICAgICAgICB0aGlzLnB4X3NpemUgPSBweF9zaXplO1xuICAgICAgICBsZXQgY3R4ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG5cbiAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2Vfd2lkdGggPiAwKSB7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2U7XG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gc3Ryb2tlX3dpZHRoICogZHByO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsO1xuXG4gICAgICAgIGN0eC5mb250ID0gZm9udF9jc3M7XG4gICAgICAgIGN0eC5taXRlckxpbWl0ID0gMjtcbiAgICB9XG5cbiAgICB0ZXh0U2l6ZXMgKHRleHRzKSB7XG4gICAgICAgIGxldCBkcHI7XG4gICAgICAgIHJldHVybiBGb250TWFuYWdlci5sb2FkRm9udHMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV0gfHwge307XG5cbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBzcGFjZV93aWR0aDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSB0ZXh0X2luZm8udGV4dF9zZXR0aW5ncztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRwciA9IFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAqIHRleHRfc2V0dGluZ3Muc3VwZXJzYW1wbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZV93aWR0aCA9IHRoaXMuY29udGV4dC5tZWFzdXJlVGV4dCgnICcpLndpZHRoIC8gZHByO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zcGFjZV93aWR0aCA9IHNwYWNlX3dpZHRoO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWdtZW50cyA9IHNwbGl0TGFiZWxUZXh0KHRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uc2VnbWVudHMgPSBzZWdtZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWdtZW50ID0gc2VnbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3NlZ21lbnRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bc2VnbWVudF0gPSB0aGlzLnRleHRTaXplKHNlZ21lbnQsIHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLm1pc3NlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC5jYWNoZV9zdGF0cy5oaXRzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplLnB1c2goQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVtzZWdtZW50XS5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0gPSB0aGlzLnRleHRTaXplKHRleHQsIHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMubWlzc2VzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLmhpdHMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc2VuZCB0ZXh0IHNpemVzIGJhY2sgdG8gd29ya2VyIChrZWVwIGNvbXB1dGVkIHRleHQgbGluZSBpbmZvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBtYWluIHRocmVhZCwgZm9yIGZ1dHVyZSByZW5kZXJpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uc2l6ZSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0uc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRleHRzO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlcyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRleHQgYmFzZWQgb24gY3VycmVudCBmb250IHN0eWxlXG4gICAgLy8gSW5jbHVkZXMgd29yZCB3cmFwcGluZywgcmV0dXJucyBzaXplIGluZm8gZm9yIHdob2xlIHRleHQgYmxvY2sgYW5kIGluZGl2aWR1YWwgbGluZXNcbiAgICB0ZXh0U2l6ZSAodGV4dCwge3RyYW5zZm9ybSwgdGV4dF93cmFwLCBtYXhfbGluZXMsIHN0cm9rZV93aWR0aCA9IDAsIHN1cGVyc2FtcGxlfSkge1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG4gICAgICAgIGxldCBzdHIgPSB0aGlzLmFwcGx5VGV4dFRyYW5zZm9ybSh0ZXh0LCB0cmFuc2Zvcm0pO1xuICAgICAgICBsZXQgY3R4ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgdmVydGljYWxfYnVmZmVyID0gdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciAqIGRwcjtcbiAgICAgICAgbGV0IGhvcml6b250YWxfYnVmZmVyID0gZHByICogKHN0cm9rZV93aWR0aCArIHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlcik7XG4gICAgICAgIGxldCBsZWFkaW5nID0gMiAqIGRwcjsgLy8gbWFrZSBjb25maWd1cmFibGUgYW5kL29yIHVzZSBDYW52YXMgVGV4dE1ldHJpY3Mgd2hlbiBhdmFpbGFibGVcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gdGhpcy5weF9zaXplICsgbGVhZGluZzsgLy8gcHhfc2l6ZSBhbHJlYWR5IGluIGRldmljZSBwaXhlbHNcblxuICAgICAgICAvLyBQYXJzZSBzdHJpbmcgaW50byBzZXJpZXMgb2YgbGluZXMgaWYgaXQgZXhjZWVkcyB0aGUgdGV4dCB3cmFwcGluZyB2YWx1ZSBvciBjb250YWlucyBsaW5lIGJyZWFrc1xuICAgICAgICBsZXQgbXVsdGlsaW5lID0gTXVsdGlMaW5lLnBhcnNlKHN0ciwgdGV4dF93cmFwLCBtYXhfbGluZXMsIGxpbmVfaGVpZ2h0LCBjdHgpO1xuXG4gICAgICAgIC8vIEZpbmFsIGRpbWVuc2lvbnMgb2YgdGV4dFxuICAgICAgICBsZXQgaGVpZ2h0ID0gbXVsdGlsaW5lLmhlaWdodDtcbiAgICAgICAgbGV0IHdpZHRoID0gbXVsdGlsaW5lLndpZHRoO1xuICAgICAgICBsZXQgbGluZXMgPSBtdWx0aWxpbmUubGluZXM7XG5cbiAgICAgICAgbGV0IGNvbGxpc2lvbl9zaXplID0gW1xuICAgICAgICAgICAgd2lkdGggLyBkcHIsXG4gICAgICAgICAgICBoZWlnaHQgLyBkcHJcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gW1xuICAgICAgICAgICAgd2lkdGggKyAyICogaG9yaXpvbnRhbF9idWZmZXIsXG4gICAgICAgICAgICBoZWlnaHQgKyAyICogdmVydGljYWxfYnVmZmVyXG4gICAgICAgIF07XG5cbiAgICAgICAgbGV0IGxvZ2ljYWxfc2l6ZSA9IFtcbiAgICAgICAgICAgIHRleHR1cmVfc2l6ZVswXSAvIGRwcixcbiAgICAgICAgICAgIHRleHR1cmVfc2l6ZVsxXSAvIGRwcixcbiAgICAgICAgXTtcblxuICAgICAgICAvLyBSZXR1cm5zIGxpbmVzICh3L3Blci1saW5lIGluZm8gZm9yIGRyYXdpbmcpIGFuZCB0ZXh0J3Mgb3ZlcmFsbCBib3VuZGluZyBib3ggKyBjYW52YXMgc2l6ZVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGluZXMsXG4gICAgICAgICAgICBzaXplOiB7IGNvbGxpc2lvbl9zaXplLCB0ZXh0dXJlX3NpemUsIGxvZ2ljYWxfc2l6ZSwgbGluZV9oZWlnaHQgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIERyYXcgbXVsdGlwbGUgbGluZXMgb2YgdGV4dFxuICAgIGRyYXdUZXh0TXVsdGlMaW5lIChsaW5lcywgW3gsIHldLCBzaXplLCB7IHN0cm9rZSwgc3Ryb2tlX3dpZHRoID0gMCwgdHJhbnNmb3JtLCBhbGlnbiwgc3VwZXJzYW1wbGUgfSkge1xuICAgICAgICBsZXQgbGluZV9oZWlnaHQgPSBzaXplLmxpbmVfaGVpZ2h0O1xuICAgICAgICBsZXQgaGVpZ2h0ID0geTtcbiAgICAgICAgZm9yIChsZXQgbGluZV9udW09MDsgbGluZV9udW0gPCBsaW5lcy5sZW5ndGg7IGxpbmVfbnVtKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbbGluZV9udW1dO1xuICAgICAgICAgICAgdGhpcy5kcmF3VGV4dExpbmUobGluZSwgW3gsIGhlaWdodF0sIHNpemUsIHsgc3Ryb2tlLCBzdHJva2Vfd2lkdGgsIHRyYW5zZm9ybSwgYWxpZ24sIHN1cGVyc2FtcGxlIH0pO1xuICAgICAgICAgICAgaGVpZ2h0ICs9IGxpbmVfaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHJhdyBib3VuZGluZyBib3hlcyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLmRyYXdfbGFiZWxfY29sbGlzaW9uX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG4gICAgICAgICAgICBsZXQgaG9yaXpvbnRhbF9idWZmZXIgPSBkcHIgKiAodGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyICsgc3Ryb2tlX3dpZHRoKTtcbiAgICAgICAgICAgIGxldCB2ZXJ0aWNhbF9idWZmZXIgPSBkcHIgKiB0aGlzLnZlcnRpY2FsX3RleHRfYnVmZmVyO1xuICAgICAgICAgICAgbGV0IGNvbGxpc2lvbl9zaXplID0gc2l6ZS5jb2xsaXNpb25fc2l6ZTtcbiAgICAgICAgICAgIGxldCBsaW5lV2lkdGggPSAyO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnYmx1ZSc7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVJlY3QoeCArIGhvcml6b250YWxfYnVmZmVyLCB5ICsgdmVydGljYWxfYnVmZmVyLCBkcHIgKiBjb2xsaXNpb25fc2l6ZVswXSwgZHByICogY29sbGlzaW9uX3NpemVbMV0pO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlYnVnU2V0dGluZ3MuZHJhd19sYWJlbF90ZXh0dXJlX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gc2l6ZS50ZXh0dXJlX3NpemU7XG4gICAgICAgICAgICBsZXQgbGluZVdpZHRoID0gMjtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gJ2dyZWVuJztcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgICAgICAgICAvLyBzdHJva2UgaXMgYXBwbGllZCBpbnRlcm5hbGx5LCBzbyB0aGUgb3V0ZXIgYm9yZGVyIGlzIHRoZSBlZGdlIG9mIHRoZSB0ZXh0dXJlXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlUmVjdCh4ICsgbGluZVdpZHRoLCB5ICsgbGluZVdpZHRoLCB0ZXh0dXJlX3NpemVbMF0gLSAyICogbGluZVdpZHRoLCB0ZXh0dXJlX3NpemVbMV0gLSAyICogbGluZVdpZHRoKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERyYXcgc2luZ2xlIGxpbmUgb2YgdGV4dCBhdCBzcGVjaWZpZWQgbG9jYXRpb24sIGFkanVzdGluZyBmb3IgYnVmZmVyIGFuZCBiYXNlbGluZVxuICAgIGRyYXdUZXh0TGluZSAobGluZSwgW3gsIHldLCBzaXplLCB7IHN0cm9rZSwgc3Ryb2tlX3dpZHRoID0gMCwgdHJhbnNmb3JtLCBhbGlnbiwgc3VwZXJzYW1wbGUgfSkge1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG4gICAgICAgIGFsaWduID0gYWxpZ24gfHwgJ2NlbnRlcic7XG5cbiAgICAgICAgbGV0IHZlcnRpY2FsX2J1ZmZlciA9IHRoaXMudmVydGljYWxfdGV4dF9idWZmZXIgKiBkcHI7XG4gICAgICAgIGxldCB0ZXh0dXJlX3NpemUgPSBzaXplLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gc2l6ZS5saW5lX2hlaWdodDtcbiAgICAgICAgbGV0IGhvcml6b250YWxfYnVmZmVyID0gZHByICogKHN0cm9rZV93aWR0aCArIHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlcik7XG5cbiAgICAgICAgbGV0IHN0ciA9IHRoaXMuYXBwbHlUZXh0VHJhbnNmb3JtKGxpbmUudGV4dCwgdHJhbnNmb3JtKTtcblxuICAgICAgICAvLyBUZXh0IGFsaWdubWVudFxuICAgICAgICBsZXQgdHg7XG4gICAgICAgIGlmIChhbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICB0eCA9IHggKyBob3Jpem9udGFsX2J1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIHR4ID0geCArIHRleHR1cmVfc2l6ZVswXS8yIC0gbGluZS53aWR0aC8yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB0eCA9IHggKyB0ZXh0dXJlX3NpemVbMF0gLSBsaW5lLndpZHRoIC0gaG9yaXpvbnRhbF9idWZmZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbiB0aGUgYWJzZW5jZSBvZiBiZXR0ZXIgQ2FudmFzIFRleHRNZXRyaWNzIChub3Qgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzIHlldCksXG4gICAgICAgIC8vIDAuNzUgYnVmZmVyIHByb2R1Y2VzIGEgYmV0dGVyIGFwcHJveGltYXRlIHZlcnRpY2FsIGNlbnRlcmluZyBvZiB0ZXh0XG4gICAgICAgIGxldCB0eSA9IHkgKyB2ZXJ0aWNhbF9idWZmZXIgKiAwLjc1ICsgbGluZV9oZWlnaHQ7XG5cbiAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2Vfd2lkdGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlVGV4dChzdHIsIHR4LCB0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbGxUZXh0KHN0ciwgdHgsIHR5KTtcbiAgICB9XG5cbiAgICByYXN0ZXJpemUgKHRleHRzLCB0ZXh0dXJlX3NpemUsIHRpbGVfa2V5KSB7XG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0X2luZm9zW3RleHRdO1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzID0gdGV4dF9pbmZvLnRleHRfc2V0dGluZ3M7XG5cbiAgICAgICAgICAgICAgICAvLyBzZXQgZm9udCBvbiBmaXJzdCBvY2N1cmVuY2Ugb2YgbmV3IGZvbnQgc3R5bGVcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb250KHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmRzID0gdGV4dF9pbmZvLnNlZ21lbnRzO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8udGV4Y29vcmRzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29yZCA9IHdvcmRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleGNvb3JkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdLnRleGNvb3JkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhjb29yZCA9IENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXhjb29yZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlX3Bvc2l0aW9uID0gQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdLnRleHR1cmVfcG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3dvcmRdLnNpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3dvcmRdLmxpbmVzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3VGV4dE11bHRpTGluZShsaW5lLCB0ZXh0dXJlX3Bvc2l0aW9uLCBzaXplLCB0ZXh0X3NldHRpbmdzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleGNvb3JkID0gVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVfcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUudGV4dHVyZV9zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3NpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdLnRleGNvb3JkID0gdGV4Y29vcmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby50ZXhjb29yZHMucHVzaCh0ZXhjb29yZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5lcyA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0ubGluZXM7IC8vIGdldCBwcmV2aW91c2x5IGNvbXB1dGVkIGxpbmVzIG9mIHRleHRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYWxpZ24gaW4gdGV4dF9pbmZvLmFsaWduKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdUZXh0TXVsdGlMaW5lKGxpbmVzLCB0ZXh0X2luZm8uYWxpZ25bYWxpZ25dLnRleHR1cmVfcG9zaXRpb24sIHRleHRfaW5mby5zaXplLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiB0ZXh0X3NldHRpbmdzLnN0cm9rZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Vfd2lkdGg6IHRleHRfc2V0dGluZ3Muc3Ryb2tlX3dpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogdGV4dF9zZXR0aW5ncy50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJzYW1wbGU6IHRleHRfc2V0dGluZ3Muc3VwZXJzYW1wbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246IGFsaWduXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXhjb29yZHMgPSBUZXh0dXJlLmdldFRleGNvb3Jkc0ZvclNwcml0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ25bYWxpZ25dLnRleHR1cmVfcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNpemUudGV4dHVyZV9zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVfc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBsYWNlIHRleHQgbGFiZWxzIHdpdGhpbiBhbiBhdGxhcyBvZiB0aGUgZ2l2ZW4gbWF4IHNpemVcbiAgICBzZXRUZXh0dXJlVGV4dFBvc2l0aW9ucyAodGV4dHMsIG1heF90ZXh0dXJlX3NpemUsIHRpbGVfa2V5KSB7XG4gICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV0pIHtcbiAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIGNvbHVtbiB3aWR0aFxuICAgICAgICBsZXQgY29sdW1uX3dpZHRoID0gMDtcblxuICAgICAgICAvLyBMYXlvdXQgbGFiZWxzLCBzdGFja2VkIGluIGNvbHVtbnNcbiAgICAgICAgbGV0IGN4ID0gMCwgY3kgPSAwOyAvLyBjdXJyZW50IHgveSBwb3NpdGlvbiBpbiBhdGxhc1xuICAgICAgICBsZXQgaGVpZ2h0ID0gMDsgICAgIC8vIG92ZXJhbGwgYXRsYXMgaGVpZ2h0XG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXSkge1xuICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0X2luZm9zID0gdGV4dHNbc3R5bGVdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRfaW5mb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcblxuICAgICAgICAgICAgICAgIGlmICh0ZXh0X2luZm8udGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlX3Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHRfaW5mby5zaXplLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29yZCA9IHRleHRfaW5mby5zZWdtZW50c1tpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV1bd29yZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHRleHRfaW5mby5zaXplW2ldLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZVswXSA+IGNvbHVtbl93aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5fd2lkdGggPSBzaXplWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3kgKyBzaXplWzFdIDwgbWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgKz0gc2l6ZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBjeTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gc3RhcnQgbmV3IGNvbHVtbiBpZiB0YWxsZXIgdGhhbiB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4ICs9IGNvbHVtbl93aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uOiB0ZXh0dXJlX3Bvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyZWQgc2l6ZSBpcyBzYW1lIGZvciBhbGwgYWxpZ25tZW50c1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHRleHRfaW5mby5zaXplLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVbMF0gPiBjb2x1bW5fd2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl93aWR0aCA9IHNpemVbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgZWFjaCBhbGlnbm1lbnQgbmVlZHMgdG8gYmUgcmVuZGVyZWQgc2VwYXJhdGVseVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBhbGlnbiBpbiB0ZXh0X2luZm8uYWxpZ24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSArIHNpemVbMV0gPCBtYXhfdGV4dHVyZV9zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07IC8vIGFkZCBsYWJlbCB0byBjdXJyZW50IGNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5ICs9IHNpemVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGN5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBzdGFydCBuZXcgY29sdW1uIGlmIHRhbGxlciB0aGFuIHRleHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeCArPSBjb2x1bW5fd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2N4ICsgY29sdW1uX3dpZHRoLCBoZWlnaHRdOyAvLyBvdmVyYWxsIGF0bGFzIHNpemVcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgYmVmb3JlIHJhc3Rlcml6YXRpb25cbiAgICBhcHBseVRleHRUcmFuc2Zvcm0gKHRleHQsIHRyYW5zZm9ybSkge1xuICAgICAgICBpZiAodHJhbnNmb3JtID09PSAnY2FwaXRhbGl6ZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcd1xcUyovZywgZnVuY3Rpb24gKHR4dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0eHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtID09PSAndXBwZXJjYXNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm0gPT09ICdsb3dlcmNhc2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgZm9udCBDU1Mtc3R5bGUgc2l6ZSAoJzEycHgnLCAnMTRwdCcsICcxLjVlbScsIGV0Yy4pIHRvIHBpeGVsIHNpemUgKGFkanVzdGVkIGZvciBkZXZpY2UgcGl4ZWwgcmF0aW8pXG4gICAgLy8gRGVmYXVsdHMgdW5pdHMgdG8gcGl4ZWxzIGlmIG5vdCBzcGVjaWZpZWRcbiAgICBzdGF0aWMgZm9udFBpeGVsU2l6ZSAoc2l6ZSkge1xuICAgICAgICBpZiAoc2l6ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2l6ZSA9ICh0eXBlb2Ygc2l6ZSA9PT0gJ3N0cmluZycpID8gc2l6ZSA6IFN0cmluZyhzaXplKTsgLy8gbmVlZCBhIHN0cmluZyBmb3IgcmVnZXhcblxuICAgICAgICBsZXQgWywgcHhfc2l6ZSwgdW5pdHNdID0gc2l6ZS5tYXRjaChDYW52YXNUZXh0LmZvbnRfc2l6ZV9yZSkgfHwgW107XG4gICAgICAgIHVuaXRzID0gdW5pdHMgfHwgJ3B4JztcblxuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikge1xuICAgICAgICAgICAgcHhfc2l6ZSAqPSAxNjtcbiAgICAgICAgfSBlbHNlIGlmICh1bml0cyA9PT0gXCJwdFwiKSB7XG4gICAgICAgICAgICBweF9zaXplIC89IDAuNzU7XG4gICAgICAgIH0gZWxzZSBpZiAodW5pdHMgPT09IFwiJVwiKSB7XG4gICAgICAgICAgICBweF9zaXplIC89IDYuMjU7XG4gICAgICAgIH1cblxuICAgICAgICBweF9zaXplID0gcGFyc2VGbG9hdChweF9zaXplKTtcbiAgICAgICAgcHhfc2l6ZSAqPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIHJldHVybiBweF9zaXplO1xuICAgIH1cblxuICAgIGNsZWFyVGV4Y29vcmRDYWNoZSAodGlsZV9rZXkpIHtcbiAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV0gPSB7fTtcbiAgICB9XG5cbn1cblxuLy8gRXh0cmFjdCBmb250IHNpemUgYW5kIHVuaXRzXG5DYW52YXNUZXh0LmZvbnRfc2l6ZV9yZSA9IC8oKD86WzAtOV0qXFwuKT9bMC05XSspXFxzKihweHxwdHxlbXwlKT8vO1xuXG4vLyBDYWNoZSBzaXplcyBvZiByZW5kZXJlZCB0ZXh0XG5DYW52YXNUZXh0LnRleHRfY2FjaGUgPSB7fTsgLy8gYnkgdGV4dCBzdHlsZSwgdGhlbiB0ZXh0IHN0cmluZ1xuQ2FudmFzVGV4dC5jYWNoZV9zdGF0cyA9IHsgaGl0czogMCwgbWlzc2VzOiAwIH07XG5DYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlID0ge307XG5cbi8vIFJpZ2h0LXRvLWxlZnQgLyBiaS1kaXJlY3Rpb25hbCB0ZXh0IGhhbmRsaW5nXG4vLyBUYWtlbiBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTIwMDYwOTUvamF2YXNjcmlwdC1ob3ctdG8tY2hlY2staWYtY2hhcmFjdGVyLWlzLXJ0bCNhbnN3ZXItMTkxNDMyNTRcbmxldCBydGxSZWdFeCA9IC9eW15cXHUwNTkxLVxcdTA3RkZcXHUyMDBGXFx1MjAyQlxcdTIwMkVcXHVGQjFELVxcdUZERkRcXHVGRTcwLVxcdUZFRkNdKj9bXFx1MDU5MS1cXHUwN0ZGXFx1MjAwRlxcdTIwMkJcXHUyMDJFXFx1RkIxRC1cXHVGREZEXFx1RkU3MC1cXHVGRUZDXS87XG5mdW5jdGlvbiBpc1JUTChzKXtcbiAgICByZXR1cm4gcnRsUmVnRXgudGVzdChzKTtcbn1cblxuZnVuY3Rpb24gcmVvcmRlcldvcmRzTFRSKHdvcmRzKSB7XG4gICAgbGV0IHdvcmRzX0xUUiA9IFtdO1xuICAgIGxldCB3b3Jkc19SVEwgPSBbXTtcblxuICAgIC8vIGxvb3AgdGhyb3VnaCB3b3JkcyBhbmQgcmUtb3JkZXIgUlRMIGdyb3VwcyBpbiByZXZlcnNlIG9yZGVyIChidXQgaW4gTFRSIHZpc3VhbCBvcmRlcilcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIHN0ciA9IHdvcmRzW2ldO1xuICAgICAgICB2YXIgcnRsID0gaXNSVEwoc3RyKTtcbiAgICAgICAgaWYgKHJ0bCl7XG4gICAgICAgICAgICB3b3Jkc19SVEwucHVzaChzdHIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKHdvcmRzX1JUTC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICB3b3Jkc19MVFIucHVzaCh3b3Jkc19SVEwucG9wKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd29yZHNfTFRSLnB1c2goc3RyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdoaWxlICh3b3Jkc19SVEwubGVuZ3RoID4gMCl7XG4gICAgICAgIHdvcmRzX0xUUi5wdXNoKHdvcmRzX1JUTC5wb3AoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmRzX0xUUjtcbn1cblxuLy8gU3BsaXR0aW5nIHN0cmF0ZWd5IGZvciBjaG9wcGluZyBhIGxhYmVsIGludG8gc2VnbWVudHNcbmZ1bmN0aW9uIHNwbGl0TGFiZWxUZXh0KHRleHQpe1xuICAgIGxldCB3b3JkcyA9IHRleHQuc3BsaXQoJyAnKTtcbiAgICByZXR1cm4gcmVvcmRlcldvcmRzTFRSKHdvcmRzKTtcbn1cblxuLy8gUHJpdmF0ZSBjbGFzcyB0byBhcnJhbmdlIHRleHQgbGFiZWxzIGludG8gbXVsdGlwbGUgbGluZXMgYmFzZWQgb25cbi8vIFwidGV4dCB3cmFwXCIgYW5kIFwibWF4IGxpbmVcIiB2YWx1ZXNcbmNsYXNzIE11bHRpTGluZSB7XG4gICAgY29uc3RydWN0b3IgKGNvbnRleHQsIG1heF9saW5lcyA9IEluZmluaXR5LCB0ZXh0X3dyYXAgPSBJbmZpbml0eSkge1xuICAgICAgICB0aGlzLndpZHRoID0gMDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLmxpbmVzID0gW107XG5cbiAgICAgICAgdGhpcy5lbGxpcHNpcyA9ICcuLi4nO1xuICAgICAgICB0aGlzLmVsbGlwc2lzX3dpZHRoID0gTWF0aC5jZWlsKGNvbnRleHQubWVhc3VyZVRleHQodGhpcy5lbGxpcHNpcykud2lkdGgpO1xuXG4gICAgICAgIHRoaXMubWF4X2xpbmVzID0gbWF4X2xpbmVzO1xuICAgICAgICB0aGlzLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICB9XG5cbiAgICBjcmVhdGVMaW5lIChsaW5lX2hlaWdodCl7XG4gICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA8IHRoaXMubWF4X2xpbmVzKXtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGluZShsaW5lX2hlaWdodCwgdGhpcy50ZXh0X3dyYXApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCAobGluZSl7XG4gICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA8IHRoaXMubWF4X2xpbmVzKXtcbiAgICAgICAgICAgIC8vIG1lYXN1cmUgbGluZSB3aWR0aFxuICAgICAgICAgICAgbGV0IGxpbmVfd2lkdGggPSB0aGlzLmNvbnRleHQubWVhc3VyZVRleHQobGluZS50ZXh0KS53aWR0aDtcbiAgICAgICAgICAgIGxpbmUud2lkdGggPSBsaW5lX3dpZHRoO1xuXG4gICAgICAgICAgICBpZiAobGluZV93aWR0aCA+IHRoaXMud2lkdGgpe1xuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSBNYXRoLmNlaWwobGluZV93aWR0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFkZCB0byBsaW5lcyBhbmQgaW5jcmVtZW50IGhlaWdodFxuICAgICAgICAgICAgdGhpcy5saW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgdGhpcy5oZWlnaHQgKz0gbGluZS5oZWlnaHQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRWxsaXBzaXMoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHB1c2hlcyB0byB0aGUgbGluZXMgYXJyYXkgYW5kIHJldHVybnMgYSBuZXcgbGluZSBpZiBwb3NzaWJsZSAoZmFsc2Ugb3RoZXJ3aXNlKVxuICAgIGFkdmFuY2UgKGxpbmUsIGxpbmVfaGVpZ2h0KSB7XG4gICAgICAgIGxldCBjYW5fcHVzaCA9IHRoaXMucHVzaChsaW5lKTtcbiAgICAgICAgaWYgKGNhbl9wdXNoKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUxpbmUobGluZV9oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkRWxsaXBzaXMgKCl7XG4gICAgICAgIGxldCBsYXN0X2xpbmUgPSB0aGlzLmxpbmVzW3RoaXMubGluZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgbGFzdF9saW5lLmFwcGVuZCh0aGlzLmVsbGlwc2lzKTtcbiAgICAgICAgbGFzdF9saW5lLndpZHRoICs9IHRoaXMuZWxsaXBzaXNfd2lkdGg7XG5cbiAgICAgICAgaWYgKGxhc3RfbGluZS53aWR0aCA+IHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSBsYXN0X2xpbmUud2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmaW5pc2ggKGxpbmUpe1xuICAgICAgICBpZiAobGluZSl7XG4gICAgICAgICAgICB0aGlzLnB1c2gobGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVsbGlwc2lzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UgKHN0ciwgdGV4dF93cmFwLCBtYXhfbGluZXMsIGxpbmVfaGVpZ2h0LCBjdHgpIHtcbiAgICAgICAgLy8gV29yZCB3cmFwcGluZ1xuICAgICAgICAvLyBMaW5lIGJyZWFrcyBjYW4gYmUgY2F1c2VkIGJ5OlxuICAgICAgICAvLyAgLSBpbXBsaWNpdCBsaW5lIGJyZWFrIHdoZW4gYSBtYXhpbXVtIGNoYXJhY3RlciB0aHJlc2hvbGQgaXMgZXhjZWVkZWQgcGVyIGxpbmUgKHRleHRfd3JhcClcbiAgICAgICAgLy8gIC0gZXhwbGljaXQgbGluZSBicmVhayBpbiB0aGUgbGFiZWwgdGV4dCAoXFxuKVxuICAgICAgICBsZXQgd29yZHM7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dF93cmFwID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgd29yZHMgPSBzdHIuc3BsaXQoJyAnKTsgLy8gc3BsaXQgd29yZHMgb24gc3BhY2VzXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3b3JkcyA9IFtzdHJdOyAvLyBubyBtYXggbGluZSB3b3JkIHdyYXBwaW5nIChidXQgbmV3IGxpbmVzIHdpbGwgc3RpbGwgYmUgaW4gZWZmZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG11bHRpbGluZSA9IG5ldyBNdWx0aUxpbmUoY3R4LCBtYXhfbGluZXMsIHRleHRfd3JhcCk7XG4gICAgICAgIGxldCBsaW5lID0gbXVsdGlsaW5lLmNyZWF0ZUxpbmUobGluZV9oZWlnaHQpO1xuXG4gICAgICAgIC8vIEZpcnN0IGl0ZXJhdGUgb24gc3BhY2UtYnJlYWsgZ3JvdXBzICh3aWxsIGJlIG9uZSBpZiBtYXggbGluZSBsZW5ndGggb2ZmKSwgdGhlbiBpdGVyYXRlIG9uIGxpbmUtYnJlYWsgZ3JvdXBzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBicmVha3MgPSB3b3Jkc1tpXS5zcGxpdCgnXFxuJyk7IC8vIHNwbGl0IG9uIGxpbmUgYnJlYWtzXG4gICAgICAgICAgICBsZXQgbmV3X2xpbmUgPSAoaSA9PT0gMCkgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgIGZvciAobGV0IG49MDsgbiA8IGJyZWFrcy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgICAgIGlmICghbGluZSl7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB3b3JkID0gYnJlYWtzW25dLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgIGlmICghd29yZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc3BhY2VkX3dvcmQgPSAobmV3X2xpbmUpID8gd29yZCA6ICcgJyArIHdvcmQ7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBhZGRpbmcgY3VycmVudCB3b3JkIHdvdWxkIG92ZXJmbG93LCBhZGQgYSBuZXcgbGluZSBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgLy8gZmlyc3Qgd29yZCAoaSA9PT0gMCkgYWx3YXlzIGFwcGVuZHNcbiAgICAgICAgICAgICAgICBpZiAodGV4dF93cmFwICYmIGkgPiAwICYmIGxpbmUuZXhjZWVkc1RleHR3cmFwKHNwYWNlZF93b3JkKSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lID0gbXVsdGlsaW5lLmFkdmFuY2UobGluZSwgbGluZV9oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQod29yZCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld19saW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKHNwYWNlZF93b3JkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBsaW5lIGJyZWFrcyBwcmVzZW50LCBhZGQgbmV3IGxpbmUgKHVubGVzcyBvbiBsYXN0IGxpbmUpXG4gICAgICAgICAgICAgICAgaWYgKG4gPCBicmVha3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lID0gbXVsdGlsaW5lLmFkdmFuY2UobGluZSwgbGluZV9oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdfbGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaSA9PT0gd29yZHMubGVuZ3RoIC0gMSl7XG4gICAgICAgICAgICAgICAgbXVsdGlsaW5lLmZpbmlzaChsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXVsdGlsaW5lO1xuICAgIH1cbn1cblxuLy8gQSBQcml2YXRlIGNsYXNzIHVzZWQgYnkgTXVsdGlMaW5lIHRvIGNvbnRhaW4gdGhlIGxvZ2ljIGZvciBhIHNpbmdsZSBsaW5lXG4vLyBpbmNsdWRpbmcgY2hhcmFjdGVyIGNvdW50LCB3aWR0aCwgaGVpZ2h0IGFuZCB0ZXh0XG5jbGFzcyBMaW5lIHtcbiAgICBjb25zdHJ1Y3RvciAoaGVpZ2h0ID0gMCwgdGV4dF93cmFwID0gMCl7XG4gICAgICAgIHRoaXMuY2hhcnMgPSAwO1xuICAgICAgICB0aGlzLnRleHQgPSAnJztcblxuICAgICAgICB0aGlzLmhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQpO1xuICAgICAgICB0aGlzLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcbiAgICB9XG5cbiAgICBhcHBlbmQgKHRleHQpe1xuICAgICAgICB0aGlzLmNoYXJzICs9IHRleHQubGVuZ3RoO1xuICAgICAgICB0aGlzLnRleHQgKz0gdGV4dDtcbiAgICB9XG5cbiAgICBleGNlZWRzVGV4dHdyYXAgKHRleHQpe1xuICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggKyB0aGlzLmNoYXJzID4gdGhpcy50ZXh0X3dyYXA7XG4gICAgfVxufVxuIiwiLyogZ2xvYmFsIEZvbnRGYWNlICovXG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEZvbnRGYWNlT2JzZXJ2ZXIgZnJvbSAnZm9udGZhY2VvYnNlcnZlcic7XG5cbmNvbnN0IEZvbnRNYW5hZ2VyID0ge1xuXG4gICAgLy8gRm9udCBkZXRlY3Rpb25cbiAgICBmb250c19sb2FkZWQ6IFByb21pc2UucmVzb2x2ZSgpLCAvLyByZXNvbHZlcyB3aGVuIGFsbCByZXF1ZXN0ZWQgZm9udHMgaGF2ZSBiZWVuIGRldGVjdGVkXG5cbiAgICAvLyBMb2FkIHNldCBvZiBjdXN0b20gZm9udCBmYWNlc1xuICAgIC8vIGBmb250c2AgaXMgYW4gb2JqZWN0IHdoZXJlIHRoZSBrZXkgaXMgYSBmb250IGZhbWlseSBuYW1lLCBhbmQgdGhlIHZhbHVlIGlzIG9uZSBvciBtb3JlIGZvbnQgZmFjZVxuICAgIC8vIGRlZmluaXRpb25zLiBUaGUgdmFsdWUgY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBvYmplY3QsIG9yIGFuIGFycmF5IG9mIHN1Y2ggb2JqZWN0cy5cbiAgICAvLyBJZiB0aGUgc3BlY2lhbCBzdHJpbmcgdmFsdWUgJ2V4dGVybmFsJyBpcyB1c2VkLCBpdCBpbmRpY2F0ZXMgdGhlIHRoZSBmb250IHdpbGwgYmUgbG9hZGVkIHZpYSBleHRlcm5hbCBDU1MuXG4gICAgbG9hZEZvbnRzIChmb250cykge1xuICAgICAgICBpZiAoZm9udHMpIHtcbiAgICAgICAgICAgIGxldCBxdWV1ZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgZmFtaWx5IGluIGZvbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZm9udHNbZmFtaWx5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9udHNbZmFtaWx5XS5mb3JFYWNoKGZhY2UgPT4gcXVldWUucHVzaCh0aGlzLmxvYWRGb250RmFjZShmYW1pbHksIGZhY2UpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKHRoaXMubG9hZEZvbnRGYWNlKGZhbWlseSwgZm9udHNbZmFtaWx5XSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5mb250c19sb2FkZWQgPSBQcm9taXNlLmFsbChxdWV1ZS5maWx0ZXIoeCA9PiB4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9udHNfbG9hZGVkO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkIGEgc2luZ2xlIGZvbnQgZmFjZVxuICAgIC8vIGBmYWNlYCBjb250YWlucyB0aGUgZm9udCBmYWNlIGRlZmluaXRpb24sIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgYHdlaWdodGAsIGBzdHlsZWAsIGFuZCBgdXJsYC5cbiAgICAvLyBJZiB0aGUgYHVybGAgaXMgZGVmaW5lZCwgdGhlIGZvbnQgaXMgaW5qZWN0ZWQgaW50byB0aGUgZG9jdW1lbnQgYXMgYSBDU1MgZm9udC1mYWNlLlxuICAgIC8vIElmIHRoZSBvYmplY3QncyB2YWx1ZSBpcyB0aGUgc3BlY2lhbCBzdHJpbmcgJ2V4dGVybmFsJywgb3IgaWYgbm8gYHVybGAgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZm9udCBmYWNlXG4gICAgLy8gaXMgYXNzdW1lZCBpcyBhc3N1bWVkIHRvIGJlZW4gbG9hZGVkIHZpYSBleHRlcm5hbCBDU1MuIEluIGVpdGhlciBjYXNlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2VcbiAgICAvLyB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZvbnQgZmFjZSBoYXMgbG9hZGVkLCBvciB0aW1lcyBvdXQuXG4gICAgbG9hZEZvbnRGYWNlIChmYW1pbHksIGZhY2UpIHtcbiAgICAgICAgaWYgKGZhY2UgPT0gbnVsbCB8fCAodHlwZW9mIGZhY2UgIT09ICdvYmplY3QnICYmIGZhY2UgIT09ICdleHRlcm5hbCcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3B0aW9ucyA9IHsgZmFtaWx5IH07XG4gICAgICAgIGxldCBpbmplY3QgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGZhY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMsIGZhY2UpO1xuXG4gICAgICAgICAgICAvLyBJZiBVUkwgaXMgZGVmaW5lZCwgaW5qZWN0IGZvbnQgaW50byBkb2N1bWVudFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmYWNlLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbmplY3QgPSB0aGlzLmluamVjdEZvbnRGYWNlKG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgZm9udCB0byBsb2FkXG4gICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBGb250RmFjZU9ic2VydmVyKGZhbWlseSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBpbmplY3QudGhlbigoKSA9PiBvYnNlcnZlci5sb2FkKCkpLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlcywgZm9udCBpcyBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYEZvbnQgZmFjZSAnJHtmYW1pbHl9JyBpcyBhdmFpbGFibGVgLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUHJvbWlzZSByZWplY3RzLCBmb250IGlzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYEZvbnQgZmFjZSAnJHtmYW1pbHl9JyBpcyBOT1QgYXZhaWxhYmxlYCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8vIExvYWRzIGEgZm9udCBmYWNlIHZpYSBlaXRoZXIgdGhlIG5hdGl2ZSBGb250RmFjZSBBUEksIG9yIENTUyBpbmplY3Rpb25cbiAgICAvLyBUT0RPOiBjb25zaWRlciBzdXBwb3J0IGZvciBtdWx0aXBsZSBmb3JtYXQgVVJMcyBwZXIgZmFjZSwgdW5pY29kZSByYW5nZXNcbiAgICBpbmplY3RGb250RmFjZSAoeyBmYW1pbHksIHVybCwgd2VpZ2h0LCBzdHlsZSB9KSB7XG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzX25hdGl2ZV9mb250X2xvYWRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nID0gKHdpbmRvdy5Gb250RmFjZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgYmxvYiBVUkxzLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmF0aXZlIEZvbnRGYWNlIEFQSSB3aWxsIGJlIHVzZWQgb3Igbm90LlxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVuIHRoZSBGb250RmFjZSBBUEkgKmlzKiBzdXBwb3J0ZWQsIHRoZSBibG9iIFVSTCBpcyByZWFkIGludG8gYSByYXcgZGF0YSBhcnJheS5cbiAgICAgICAgLy8gTkI6IGl0J3MgaW5lZmZpY2llbnQgdG8gYmUgY29udmVydGluZyBibG9iIFVSTHMgaW50byB0eXBlZCBhcnJheXMgaGVyZSwgc2luY2UgdGhleSBvcmlnaW5hdGVkXG4gICAgICAgIC8vIGFzIHJhdyBkYXRhICpiZWZvcmUqIHRoZXkgd2VyZSBjb252ZXJ0ZWQgaW50byBibG9iIFVSTHMuIEhvd2V2ZXIsIHRoaXMgcHJvY2VzcyBzaG91bGQgYmUgZmFzdCBzaW5jZVxuICAgICAgICAvLyB0aGVzZSBhcmUgbmF0aXZlIGJyb3dzZXIgZnVuY3Rpb25zIGFuZCBhbGwgZGF0YSBpcyBsb2NhbCAobm8gbmV0d29yayByZXF1ZXN0KSwgYW5kIGl0IGtlZXBzIHRoZVxuICAgICAgICAvLyBsb2dpYyBzdHJlYW1saW5lZCBieSBhbGxvd2luZyB1cyB0byBjb250aW51ZSB0byB1c2UgYSBVUkwtYmFzZWQgaW50ZXJmYWNlIGZvciBhbGwgc2NlbmUgcmVzb3VyY2VzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVuIHRoZSBGb250RmFjZSBBUEkgaXMgKm5vdCogc3VwcG9ydGVkLCB0aGUgYmxvYiBVUkwgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gYSBiYXNlNjQgZGF0YSBVUkwuXG4gICAgICAgIC8vIFRoaXMgYXZvaWRzIHNlY3VyaXR5IHJlc3RyaWNpb25zIGluIHNvbWUgYnJvd3NlcnMuXG4gICAgICAgIC8vIEFsc28gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9icmFtc3RlaW4vZm9udGxvYWRlci9ibG9iLzU5OGU5Mzk5MTE3YmRjOTQ2ZmY3ODZmYTJjNTAwN2E2YmQ3ZDNiOWUvc3JjL2ZvbnRmYWNlLmpzI0wxNDUtTDE1M1xuICAgICAgICBsZXQgcHJlcHJvY2VzcyA9IFByb21pc2UucmVzb2x2ZSh1cmwpO1xuICAgICAgICBpZiAodXJsLnNsaWNlKDAsIDUpID09PSAnYmxvYjonKSB7XG4gICAgICAgICAgICBwcmVwcm9jZXNzID0gVXRpbHMuaW8odXJsLCA2MDAwMCwgJ2FycmF5YnVmZmVyJykudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBieXRlczsgLy8gdXNlIHJhdyBiaW5hcnkgZGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LCcgKyBidG9hKHN0cik7IC8vIGJhc2U2NCBlbmNvZGUgYXMgZGF0YSBVUkxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmVwcm9jZXNzLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIG5hdGl2ZSBGb250RmFjZSBBUElcbiAgICAgICAgICAgICAgICBsZXQgZmFjZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7IC8vIGFkZCBhcyBVUkxcbiAgICAgICAgICAgICAgICAgICAgZmFjZSA9IG5ldyBGb250RmFjZShmYW1pbHksIGB1cmwoJHtlbmNvZGVVUkkoZGF0YSl9KWAsIHsgd2VpZ2h0LCBzdHlsZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsgLy8gYWRkIGFzIGJpbmFyeSBkYXRhXG4gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBuZXcgRm9udEZhY2UoZmFtaWx5LCBkYXRhLCB7IHdlaWdodCwgc3R5bGUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChmYWNlKTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0FkZGluZyBGb250RmFjZSB0byBkb2N1bWVudC5mb250czonLCBmYWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBDU1MgaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgbGV0IGNzcyA9IGBcbiAgICAgICAgICAgICAgICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogJyR7ZmFtaWx5fSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogJHt3ZWlnaHQgfHwgJ25vcm1hbCd9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zdHlsZTogJHtzdHlsZSB8fCAnbm9ybWFsJ307XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHVybCgke2VuY29kZVVSSShkYXRhKX0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICAgIGxldCBzdHlsZV9lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgc3R5bGVfZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIikpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVfZWwpO1xuICAgICAgICAgICAgICAgIHN0eWxlX2VsLnNoZWV0Lmluc2VydFJ1bGUoY3NzLCAwKTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0luamVjdGluZyBDU1MgZm9udCBmYWNlOicsIGNzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgRm9udE1hbmFnZXI7XG4iLCIvLyBUZXh0IHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1BvaW50c30gZnJvbSAnLi4vcG9pbnRzL3BvaW50cyc7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4uLy4uL2xhYmVscy9jb2xsaXNpb24nO1xuaW1wb3J0IExhYmVsUG9pbnQgZnJvbSAnLi4vLi4vbGFiZWxzL2xhYmVsX3BvaW50JztcbmltcG9ydCBMYWJlbExpbmUgZnJvbSAnLi4vLi4vbGFiZWxzL2xhYmVsX2xpbmUnO1xuXG5leHBvcnQgbGV0IFRleHRTdHlsZSA9IE9iamVjdC5jcmVhdGUoUG9pbnRzKTtcblxuT2JqZWN0LmFzc2lnbihUZXh0U3R5bGUsIHtcbiAgICBuYW1lOiAndGV4dCcsXG4gICAgc3VwZXI6IFBvaW50cyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcblxuICAgIGluaXQoKSB7XG4gICAgICAgIHRoaXMuc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIFBvaW50IHN0eWxlIChwYXJlbnQgY2xhc3MpIHJlcXVpcmVzIHRleHR1cmluZyB0byBiZSB0dXJuZWQgb25cbiAgICAgICAgLy8gKGxhYmVscyBhcmUgYWx3YXlzIGRyYXduIHdpdGggdGV4dHVyZXMpXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1BPSU5UX1RFWFRVUkUgPSB0cnVlO1xuXG4gICAgICAgIC8vIERpc2FibGUgZHVhbCBwb2ludC90ZXh0IG1vZGVcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTVVMVElfU0FNUExFUiA9IGZhbHNlO1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IHVuLW11bHRpcGx5IGFscGhhLCBiZWNhdXNlIENhbnZhcyB0ZXh0IHJhc3Rlcml6YXRpb24gaXMgcHJlLW11bHRpcGxpZWRcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVU5NVUxUSVBMWV9BTFBIQSA9IHRydWU7XG5cbiAgICAgICAgLy8gRmFkZSBvdXQgdGV4dCB3aGVuIHRpbGUgaXMgem9vbWluZyBvdXQsIGUuZy4gYWN0aW5nIGFzIHByb3h5IHRpbGVzXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfT05fWk9PTV9PVVQgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUX1JBVEUgPSAyOyAvLyBmYWRlIGF0IDJ4LCBlLmcuIGZ1bGx5IHRyYW5zcGFyZW50IGF0IDAuNSB6b29tIGxldmVsIGF3YXlcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSxcblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnF1ZXVlcyA9IHt9O1xuICAgICAgICB0aGlzLnJlc2V0VGV4dCgpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZSB0byBxdWV1ZSBmZWF0dXJlcyBpbnN0ZWFkIG9mIHByb2Nlc3NpbmcgaW1tZWRpYXRlbHlcbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGxlZCBoZXJlIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgZGVsYXllZCB1bnRpbCB0aGUgZmVhdHVyZSBxdWV1ZSBpcyBwYXJzZWQsXG4gICAgICAgIC8vIGFuZCB3ZSB3YW50IHRoZSBwcmVwcm9jZXNzaW5nIGRvbmUgYmVmb3JlIHdlIGV2YWx1YXRlIHRleHQgc3R5bGUgYmVsb3dcbiAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHlwZSA9IGZlYXR1cmUuZ2VvbWV0cnkudHlwZTtcbiAgICAgICAgZHJhdy5jYW5fYXJ0aWN1bGF0ZSA9ICh0eXBlID09PSBcIkxpbmVTdHJpbmdcIiB8fCB0eXBlID09PSBcIk11bHRpTGluZVN0cmluZ1wiKTtcblxuICAgICAgICAvLyBzdXBlcnNhbXBsZSB0ZXh0IHJlbmRlcmluZyBmb3IgYW5nbGVkIGxhYmVscywgdG8gaW1wcm92ZSBjbGFyaXR5XG4gICAgICAgIGRyYXcuc3VwZXJzYW1wbGVfdGV4dCA9ICh0eXBlID09PSBcIkxpbmVTdHJpbmdcIiB8fCB0eXBlID09PSBcIk11bHRpTGluZVN0cmluZ1wiKTtcblxuICAgICAgICBsZXQgcSA9IHRoaXMucGFyc2VUZXh0RmVhdHVyZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKTtcbiAgICAgICAgaWYgKCFxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBxLmZlYXR1cmUgPSBmZWF0dXJlO1xuICAgICAgICBxLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBxLmxheW91dC52ZXJ0ZXggPSBmYWxzZTsgLy8gdmVydGV4IHBsYWNlbWVudCBvcHRpb24gbm90IGFwcGxpY2FibGUgdG8gc3RhbmRhbG9uZSBsYWJlbHNcblxuICAgICAgICAvLyBRdWV1ZSB0aGUgZmVhdHVyZSBmb3IgcHJvY2Vzc2luZ1xuICAgICAgICBpZiAoIXRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGEodGlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldLnB1c2gocSk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCBjb2xsaXNpb24gbWFuYWdlclxuICAgICAgICBDb2xsaXNpb24uYWRkU3R5bGUodGhpcy5uYW1lLCB0aWxlLmtleSk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgc3RhcnREYXRhICh0aWxlKSB7XG4gICAgICAgIHRoaXMucXVldWVzW3RpbGUua2V5XSA9IFtdO1xuICAgICAgICByZXR1cm4gU3R5bGUuc3RhcnREYXRhLmNhbGwodGhpcywgdGlsZSk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgZW5kRGF0YSAodGlsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlVGV4dExhYmVscyh0aWxlLCB0aGlzLm5hbWUsIHRoaXMucXVldWVzW3RpbGUua2V5XSkuXG4gICAgICAgICAgICB0aGVuKGxhYmVscyA9PiB0aGlzLmNvbGxpZGVBbmRSZW5kZXJUZXh0TGFiZWxzKHRpbGUsIHRoaXMubmFtZSwgbGFiZWxzKSkuXG4gICAgICAgICAgICB0aGVuKCh7IGxhYmVscywgdGV4dHMsIHRleHR1cmUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XSA9IHRleHRzO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJ1aWxkIHF1ZXVlZCBmZWF0dXJlc1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzX2tleSA9IHEudGV4dF9zZXR0aW5nc19rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XVt0ZXh0X3NldHRpbmdzX2tleV0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XVt0ZXh0X3NldHRpbmdzX2tleV1bcS50ZXh0XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgc3R5bGluZyBvYmplY3QgZXhwZWN0ZWQgYnkgU3R5bGUgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmxhYmVsID0gcS5sYWJlbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfaW5mby50ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG9naWNhbCBzaXplcyBvZiBlYWNoIHNlZ21lbnQgaW50byBhbiBhcnJheSBmb3IgdGhlIHN0eWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHRleHRfaW5mby5zaXplLm1hcChmdW5jdGlvbihzaXplKXsgcmV0dXJuIHNpemUubG9naWNhbF9zaXplOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSB0ZXh0X2luZm8udGV4Y29vcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHRleHRfaW5mby5zaXplLmxvZ2ljYWxfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5hbmdsZSA9IHEubGFiZWwuYW5nbGUgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSB0ZXh0X2luZm8uYWxpZ25bcS5sYWJlbC5hbGlnbl0udGV4Y29vcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBTdHlsZS5hZGRGZWF0dXJlLmNhbGwodGhpcywgcS5mZWF0dXJlLCBxLmRyYXcsIHEuY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZyZWVUZXh0KHRpbGUpO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluaXNoIHRpbGUgbWVzaFxuICAgICAgICAgICAgICAgIHJldHVybiBTdHlsZS5lbmREYXRhLmNhbGwodGhpcywgdGlsZSkudGhlbih0aWxlX2RhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2ggdGlsZS1zcGVjaWZpYyBsYWJlbCBhdGxhcyB0byBtZXNoIGFzIGEgdGV4dHVyZSB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlICYmIHRpbGVfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnVuaWZvcm1zLnVfdGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMucHVzaCh0ZXh0dXJlKTsgLy8gYXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aWxlX2RhdGE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBTZXRzIHVwIGNhY2hpbmcgZm9yIGRyYXcgcHJvcGVydGllc1xuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXByb2Nlc3NUZXh0KGRyYXcpO1xuICAgIH0sXG5cbiAgICAvLyBJbXBsZW1lbnRzIGxhYmVsIGJ1aWxkaW5nIGZvciBUZXh0TGFiZWxzIG1peGluXG4gICAgYnVpbGRUZXh0TGFiZWxzICh0aWxlX2tleSwgZmVhdHVyZV9xdWV1ZSkge1xuICAgICAgICBsZXQgbGFiZWxzID0gW107XG4gICAgICAgIGZvciAobGV0IGY9MDsgZiA8IGZlYXR1cmVfcXVldWUubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgIGxldCBmcSA9IGZlYXR1cmVfcXVldWVbZl07XG4gICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGhpcy50ZXh0c1t0aWxlX2tleV1bZnEudGV4dF9zZXR0aW5nc19rZXldW2ZxLnRleHRdO1xuICAgICAgICAgICAgbGV0IGZlYXR1cmVfbGFiZWxzO1xuICAgICAgICAgICAgaWYgKHRleHRfaW5mby50ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZXMgPSB0ZXh0X2luZm8uc2l6ZS5tYXAoZnVuY3Rpb24oc2l6ZSl7IHJldHVybiBzaXplLmNvbGxpc2lvbl9zaXplOyB9KTtcbiAgICAgICAgICAgICAgICBmcS5sYXlvdXQuc3BhY2Vfd2lkdGggPSB0ZXh0X2luZm8uc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgZmVhdHVyZV9sYWJlbHMgPSB0aGlzLmJ1aWxkTGFiZWxzKHNpemVzLCBmcS5mZWF0dXJlLmdlb21ldHJ5LCBmcS5sYXlvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZV9sYWJlbHMgPSB0aGlzLmJ1aWxkTGFiZWxzKHRleHRfaW5mby5zaXplLmNvbGxpc2lvbl9zaXplLCBmcS5mZWF0dXJlLmdlb21ldHJ5LCBmcS5sYXlvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0dXJlX2xhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBmcWwgPSBPYmplY3QuY3JlYXRlKGZxKTtcbiAgICAgICAgICAgICAgICBmcWwubGFiZWwgPSBmZWF0dXJlX2xhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChmcWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkcyBvbmUgb3IgbW9yZSBsYWJlbHMgZm9yIGEgZ2VvbWV0cnlcbiAgICBidWlsZExhYmVscyAoc2l6ZSwgZ2VvbWV0cnksIGxheW91dCkge1xuICAgICAgICBsZXQgbGFiZWxzID0gW107XG5cbiAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTGluZVN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZUxhYmVscyhnZW9tZXRyeS5jb29yZGluYXRlcywgc2l6ZSwgbGF5b3V0LCBsYWJlbHMpO1xuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBsaW5lcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lTGFiZWxzKGxpbmVzW2ldLCBzaXplLCBsYXlvdXQsIGxhYmVscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2ludFwiKSB7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChnZW9tZXRyeS5jb29yZGluYXRlcywgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvaW50XCIpIHtcbiAgICAgICAgICAgIGxldCBwb2ludHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQocG9pbnRzW2ldLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvbHlnb25cIikge1xuICAgICAgICAgICAgbGV0IGNlbnRyb2lkID0gR2VvLmNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9seWdvblwiKSB7XG4gICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8ubXVsdGlDZW50cm9pZChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBvbmUgb3IgbW9yZSBsYWJlbHMgZm9yIGEgbGluZSBnZW9tZXRyeVxuICAgIGJ1aWxkTGluZUxhYmVscyAobGluZSwgc2l6ZSwgbGF5b3V0LCBsYWJlbHMpIHtcbiAgICAgICAgbGV0IHN1YmRpdiA9IE1hdGgubWluKGxheW91dC5zdWJkaXYsIGxpbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgIGlmIChzdWJkaXYgPiAxKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgbXVsdGlwbGUgbGFiZWxzIGZvciBsaW5lLCB3aXRoIGVhY2ggYWxsb3R0ZWQgYSByYW5nZSBvZiBzZWdtZW50c1xuICAgICAgICAgICAgLy8gaW4gd2hpY2ggaXQgd2lsbCBhdHRlbXB0IHRvIHBsYWNlXG4gICAgICAgICAgICBsZXQgc2VnX3Blcl9kaXYgPSAobGluZS5sZW5ndGggLSAxKSAvIHN1YmRpdjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViZGl2OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9zdGFydCA9IE1hdGguZmxvb3IoaSAqIHNlZ19wZXJfZGl2KTtcbiAgICAgICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9lbmQgPSBNYXRoLmZsb29yKChpICsgMSkgKiBzZWdfcGVyX2Rpdik7XG5cbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxMaW5lKHNpemUsIGxpbmUsIGxheW91dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfc3RhcnQgPSBudWxsO1xuICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfZW5kID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IG5ldyBMYWJlbExpbmUoc2l6ZSwgbGluZSwgbGF5b3V0KTtcbiAgICAgICAgICAgIGlmICghbGFiZWwudGhyb3dfYXdheSl7XG4gICAgICAgICAgICAgICAgbGV0IGNob3Nlbl9sYWJlbCA9IHBsYWNlbWVudFN0cmF0ZWd5KGxhYmVsKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hvc2VuX2xhYmVsKXtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2goY2hvc2VuX2xhYmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbn0pO1xuXG5jb25zdCBUQVJHRVRfU1RSQUlHSFQgPSAwLjQ7IC8vIE9wdGltaXN0aWMgdGFyZ2V0IHJhdGlvIGZvciBzdHJhaWdodCBsYWJlbHMgKGxhYmVsIGxlbmd0aCAvIGxpbmUgbGVuZ3RoKVxuY29uc3QgVEFSR0VUX0tJTktFRCA9IDAuNTsgLy8gT3B0aW1pc3RpYyB0YXJnZXQgcmF0aW8gZm9yIGtpbmtlZCBsYWJlbHMgKGxhYmVsIGxlbmd0aCAvIGxpbmUgbGVuZ3RoKVxuXG4vLyBQbGFjZSBsYWJlbHMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3k6XG4vLyAtIGNob29zZSB0aGUgYmVzdCBzdHJhaWdodCBsYWJlbCB0aGF0IHNhdGlzZmllcyB0aGUgb3B0aW1pc3RpYyBzdHJhaWdodCBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBjaG9vc2UgdGhlIGJlc3Qga2lua2VkIGxhYmVsIHRoYXQgc2F0aXNmaWVzIHRoZSBvcHRpbWlzdGljIGtpbmtlZCBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBjaG9vc2UgdGhlIGJlc3Qgc3RyYWlnaHQgbGFiZWwgdGhhdCBzYXRpc2ZpZXMgaXRzIGludGVybmFsIChsZXNzIG9wdGltaXN0aWMpIGN1dG9mZiAoaWYgYW55KVxuLy8gLSBlbHNlIGNob29zZSB0aGUgYmVzdCBraW5rZWQgbGFiZWxzIHRoYXQgc2F0aXNmaWVzIGl0cyBpbnRlcm5hbCAobGVzcyBvcHRpbWlzdGljKSBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBkb24ndCBwbGFjZSBhIGxhYmVsXG5mdW5jdGlvbiBwbGFjZW1lbnRTdHJhdGVneShsYWJlbCl7XG4gICAgbGV0IGxhYmVsc19zdHJhaWdodCA9IFtdO1xuICAgIGxldCBsYWJlbHNfa2lua2VkID0gW107XG4gICAgbGV0IGJlc3Rfc3RyYWlnaHRfZml0bmVzcyA9IEluZmluaXR5O1xuICAgIGxldCBiZXN0X2tpbmtlZF9maXRuZXNzID0gSW5maW5pdHk7XG5cbiAgICAvLyBsb29wIHRocm91Z2ggYWxsIGxhYmVsc1xuICAgIHdoaWxlIChsYWJlbCAmJiAhbGFiZWwudGhyb3dfYXdheSkge1xuICAgICAgICBpZiAobGFiZWwua2lua19pbmRleCA+IDApe1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgYXJ0aWN1bGF0ZWQgbGFiZWwgaXMgYWJvdmUgbG93ZXN0IGN1dG9mZlxuICAgICAgICAgICAgaWYgKGxhYmVsLmZpdG5lc3MgPCBiZXN0X2tpbmtlZF9maXRuZXNzKXtcbiAgICAgICAgICAgICAgICBiZXN0X2tpbmtlZF9maXRuZXNzID0gbGFiZWwuZml0bmVzcztcbiAgICAgICAgICAgICAgICBsYWJlbHNfa2lua2VkLnVuc2hpZnQobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgc3RyYWlnaHQgbGFiZWwgaXMgYWJvdmUgbG93ZXN0IHN0cmFpZ2h0IGN1dG9mZlxuICAgICAgICAgICAgaWYgKGxhYmVsLmZpdG5lc3MgPCBiZXN0X3N0cmFpZ2h0X2ZpdG5lc3Mpe1xuICAgICAgICAgICAgICAgIGJlc3Rfc3RyYWlnaHRfZml0bmVzcyA9IGxhYmVsLmZpdG5lc3M7XG4gICAgICAgICAgICAgICAgbGFiZWxzX3N0cmFpZ2h0LnVuc2hpZnQobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFiZWwgPSBMYWJlbExpbmUubmV4dExhYmVsKGxhYmVsKTtcbiAgICB9XG5cbiAgICBsZXQgYmVzdF9zdHJhaWdodCA9IGxhYmVsc19zdHJhaWdodFswXTtcbiAgICBsZXQgYmVzdF9raW5rZWQgPSBsYWJlbHNfa2lua2VkWzBdO1xuXG4gICAgaWYgKGxhYmVsc19zdHJhaWdodC5sZW5ndGggJiYgYmVzdF9zdHJhaWdodC5maXRuZXNzIDwgVEFSR0VUX1NUUkFJR0hUKXtcbiAgICAgICAgLy8gcmV0dXJuIHRoZSBiZXN0IHN0cmFpZ2h0IHNlZ21lbnQgaWYgaXQgaXMgYWJvdmUgdGhlIHN0cmljdGVyIHN0cmFpZ2h0IGN1dG9mZlxuICAgICAgICByZXR1cm4gYmVzdF9zdHJhaWdodDtcbiAgICB9XG4gICAgZWxzZSBpZiAobGFiZWxzX2tpbmtlZC5sZW5ndGggJiYgYmVzdF9raW5rZWQuZml0bmVzcyA8IFRBUkdFVF9LSU5LRUQpe1xuICAgICAgICAvLyByZXR1cm4gdGhlIGJlc3Qga2lua2VkIHNlZ21lbnQgaWYgaXQgaXMgYWJvdmUgdGhlIHN0cmljdGVyIGtpbmtlZCBjdXRvZmZcbiAgICAgICAgcmV0dXJuIGJlc3Rfa2lua2VkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHJldHVybiBiZXN0IG9mIHdoYXQncyBsZWZ0IChpZiBhbnkpXG4gICAgICAgIHJldHVybiBiZXN0X3N0cmFpZ2h0IHx8IGJlc3Rfa2lua2VkO1xuICAgIH1cbn1cblxuVGV4dFN0eWxlLnRleHR1cmVfaWQgPSAwOyAvLyBuYW1lc3BhY2VzIHBlci10aWxlIGxhYmVsIHRleHR1cmVzXG4iLCIvLyBUZXh0IGxhYmVsIHJlbmRlcmluZyBtZXRob2RzLCBjYW4gYmUgbWl4ZWQgaW50byBhIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vLi4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4uLy4uL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uLy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tICcuLi8uLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBUZXh0U2V0dGluZ3MgZnJvbSAnLi4vdGV4dC90ZXh0X3NldHRpbmdzJztcbmltcG9ydCBDYW52YXNUZXh0IGZyb20gJy4uL3RleHQvY2FudmFzX3RleHQnO1xuXG4vLyBuYW1lc3BhY2VzIGxhYmVsIHRleHR1cmVzIChlbnN1cmVzIG5ldyB0ZXh0dXJlIG5hbWUgd2hlbiBhIHRpbGUgaXMgYnVpbHQgbXVsdGlwbGUgdGltZXMpXG5sZXQgdGV4dF90ZXh0dXJlX2lkID0gMDtcblxuZXhwb3J0IGNvbnN0IFRleHRMYWJlbHMgPSB7XG5cbiAgICByZXNldFRleHQgKCkge1xuICAgICAgICBpZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gbmV3IENhbnZhc1RleHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChUaHJlYWQuaXNfd29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRzID0ge307IC8vIHVuaXF1ZSB0ZXh0cywgZ3JvdXBlZCBieSB0aWxlLCBieSBzdHlsZVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZyZWVUZXh0ICh0aWxlKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRleHRzW3RpbGUua2V5XTtcbiAgICB9LFxuXG4gICAgcGFyc2VUZXh0RmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSkge1xuICAgICAgICAvLyBDb21wdXRlIGxhYmVsIHRleHRcbiAgICAgICAgbGV0IHRleHQgPSB0aGlzLnBhcnNlVGV4dFNvdXJjZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0ID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBubyB0ZXh0IGZvciB0aGlzIGZlYXR1cmVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXB1dGUgdGV4dCBzdHlsZSBhbmQgbGF5b3V0IHNldHRpbmdzIGZvciB0aGlzIGZlYXR1cmUgbGFiZWxcbiAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSBUZXh0U2V0dGluZ3MuY29tcHV0ZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0KTtcbiAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gVGV4dFNldHRpbmdzLmtleSh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgbGV0IGxheW91dCA9IHRoaXMuY29tcHV0ZVRleHRMYXlvdXQoe30sIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUsIHRleHQsIHRleHRfc2V0dGluZ3MpO1xuXG4gICAgICAgIC8vIGZpcnN0IGxhYmVsIGluIHRpbGUsIG9yIHdpdGggdGhpcyBzdHlsZT9cbiAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV0gPSB0aGlzLnRleHRzW3RpbGUua2V5XSB8fCB7fTtcbiAgICAgICAgbGV0IHNpemVzID0gdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldID0gdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldIHx8IHt9O1xuXG4gICAgICAgIC8vIHVuaXF1ZSB0ZXh0IHN0cmluZ3MsIGdyb3VwZWQgYnkgdGV4dCBkcmF3aW5nIHN0eWxlXG4gICAgICAgIGlmICghc2l6ZXNbdGV4dF0pIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IGxhYmVsIHdpdGggdGhpcyB0ZXh0L3N0eWxlL3RpbGUgY29tYmluYXRpb24sIG1ha2UgYSBuZXcgbGFiZWwgZW50cnlcbiAgICAgICAgICAgIHNpemVzW3RleHRdID0ge1xuICAgICAgICAgICAgICAgIHRleHRfc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgcmVmOiAwIC8vICMgb2YgdGltZXMgdGhpcyB0ZXh0L3N0eWxlIGNvbWJvIGFwcGVhcnMgaW4gdGlsZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkcmF3LCB0ZXh0LCB0ZXh0X3NldHRpbmdzX2tleSwgbGF5b3V0XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8vIENvbXB1dGUgdGhlIGxhYmVsIHRleHQsIGRlZmF1bHQgaXMgdmFsdWUgb2YgZmVhdHVyZS5wcm9wZXJ0aWVzLm5hbWVcbiAgICAvLyAtIFN0cmluZyB2YWx1ZSBpbmRpY2F0ZXMgYSBmZWF0dXJlIHByb3BlcnR5IGxvb2stdXAsIGUuZy4gYHNob3J0X25hbWVgIG1lYW5zIHVzZSBmZWF0dXJlLnByb3BlcnRpZXMuc2hvcnRfbmFtZVxuICAgIC8vIC0gRnVuY3Rpb24gd2lsbCB1c2UgdGhlIHJldHVybiB2YWx1ZSBhcyB0aGUgbGFiZWwgdGV4dCAoZm9yIGN1c3RvbSBsYWJlbHMpXG4gICAgLy8gLSBBcnJheSAob2Ygc3RyaW5ncyBhbmQvb3IgZnVuY3Rpb25zKSBkZWZpbmVzIGEgbGlzdCBvZiBmYWxsYmFja3MsIGV2YWx1YXRlZCBhY2NvcmRpbmcgdG8gdGhlIGFib3ZlIHJ1bGVzLFxuICAgIC8vICAgd2l0aCB0aGUgZmlyc3Qgbm9uLW51bGwgdmFsdWUgdXNlZCBhcyB0aGUgbGFiZWwgdGV4dFxuICAgIC8vICAgZS5nLiBgW25hbWU6ZXMsIG5hbWU6ZW4sIG5hbWVdYCBwcmVmZXJzIFNwYW5pc2ggbmFtZXMsIGZvbGxvd2VkIGJ5IEVuZ2xpc2gsIGFuZCBsYXN0IHRoZSBkZWZhdWx0IGxvY2FsIG5hbWVcbiAgICBwYXJzZVRleHRTb3VyY2UgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRleHQ7XG4gICAgICAgIGxldCBzb3VyY2UgPSBkcmF3LnRleHRfc291cmNlIHx8ICduYW1lJztcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzb3VyY2UubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZVtzXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGZlYXR1cmUucHJvcGVydGllc1tzb3VyY2Vbc11dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZVtzXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gc291cmNlW3NdKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBzdG9wIGlmIHdlIGZvdW5kIGEgdGV4dCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGV4dCA9IGZlYXR1cmUucHJvcGVydGllc1tzb3VyY2VdO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRleHQgPSBzb3VyY2UoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfSxcblxuICAgIHByZXBhcmVUZXh0TGFiZWxzICh0aWxlLCBjb2xsaXNpb25fZ3JvdXAsIHF1ZXVlKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnRleHRzW3RpbGUua2V5XXx8e30pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXJzdCBjYWxsIHRvIG1haW4gdGhyZWFkLCBhc2sgZm9yIHRleHQgcGl4ZWwgc2l6ZXNcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLmNhbGNUZXh0U2l6ZXMnLCB0aGlzLnRleHRzW3RpbGUua2V5XSkudGhlbih0ZXh0cyA9PiB7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZSAke3RoaXMubmFtZX06IHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fSwgcG9zdC1jYWxjVGV4dFNpemVzKClgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldID0gdGV4dHM7XG4gICAgICAgICAgICBpZiAoIXRleHRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFRleHRMYWJlbHModGlsZS5rZXksIHF1ZXVlKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIGNvbGxpZGVBbmRSZW5kZXJUZXh0TGFiZWxzICh0aWxlLCBjb2xsaXNpb25fZ3JvdXAsIGxhYmVscykge1xuICAgICAgICBpZiAoIWxhYmVscykge1xuICAgICAgICAgICAgQ29sbGlzaW9uLmNvbGxpZGUoe30sIGNvbGxpc2lvbl9ncm91cCwgdGlsZS5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQ29sbGlzaW9uLmNvbGxpZGUobGFiZWxzLCBjb2xsaXNpb25fZ3JvdXAsIHRpbGUua2V5KS50aGVuKGxhYmVscyA9PiB7XG4gICAgICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgc3RvcCB0aWxlIGJ1aWxkIGJlY2F1c2UgdGlsZSB3YXMgY2FuY2VsZWQ6ICR7dGlsZS5rZXl9LCBwb3N0LWNvbGxpZGUoKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0cyA9IHRoaXMudGV4dHNbdGlsZS5rZXldO1xuICAgICAgICAgICAgdGhpcy5jdWxsVGV4dFN0eWxlcyh0ZXh0cywgbGFiZWxzKTtcblxuICAgICAgICAgICAgLy8gc2V0IGFsaWdubWVudHNcbiAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzX2tleSA9IHEudGV4dF9zZXR0aW5nc19rZXk7XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRzW3RleHRfc2V0dGluZ3Nfa2V5XSAmJiB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV1bcS50ZXh0XTtcbiAgICAgICAgICAgICAgICBpZiAoIXRleHRfaW5mby50ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduID0gdGV4dF9pbmZvLmFsaWduIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ25bcS5sYWJlbC5hbGlnbl0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gc2Vjb25kIGNhbGwgdG8gbWFpbiB0aHJlYWQsIGZvciByYXN0ZXJpemluZyB0aGUgc2V0IG9mIHRleHRzXG4gICAgICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0KycucmFzdGVyaXplVGV4dHMnLCB0aWxlLmtleSwgdGV4dHMpLnRoZW4oKHsgdGV4dHMsIHRleHR1cmUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aWxlLmNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgc3RvcCB0aWxlIGJ1aWxkIGJlY2F1c2UgdGlsZSB3YXMgY2FuY2VsZWQ6ICR7dGlsZS5rZXl9LCBwb3N0LXJhc3Rlcml6ZVRleHRzKClgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxhYmVscywgdGV4dHMsIHRleHR1cmUgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZlIHVudXNlZCB0ZXh0L3N0eWxlIGNvbWJpbmF0aW9ucyB0byBhdm9pZCB1bm5lY2Vzc2FyeSByYXN0ZXJpemF0aW9uXG4gICAgY3VsbFRleHRTdHlsZXModGV4dHMsIGxhYmVscykge1xuICAgICAgICAvLyBDb3VudCBob3cgbWFueSB0aW1lcyBlYWNoIHRleHQvc3R5bGUgY29tYmluYXRpb24gaXMgdXNlZFxuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IGxhYmVsc1tpXTtcbiAgICAgICAgICAgIHRleHRzW2xhYmVsLnRleHRfc2V0dGluZ3Nfa2V5XVtsYWJlbC50ZXh0XS5yZWYrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0ZXh0L3N0eWxlIGNvbWJpbmF0aW9ucyB0aGF0IGhhdmUgbm8gdmlzaWJsZSBsYWJlbHNcbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGV4dHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dHNbc3R5bGVdKSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gbGFiZWxzIGZvciB0aGlzIHRleHRcbiAgICAgICAgICAgICAgICBpZiAodGV4dHNbc3R5bGVdW3RleHRdLnJlZiA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRleHRzW3N0eWxlXVt0ZXh0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgLy8gbm8gbGFiZWxzIGZvciB0aGlzIHN0eWxlXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGV4dHNbc3R5bGVdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGV4dHNbc3R5bGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCBmcm9tIHdvcmtlciwgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBlYWNoIHRleHQgc3RyaW5nLFxuICAgIC8vIHdlcmUgaXQgdG8gYmUgcmVuZGVyZWQuIFRoaXMgaW5mbyBpcyB0aGVuIHVzZWQgdG8gcGVyZm9ybSBpbml0aWFsIGxhYmVsIGN1bGxpbmcsICpiZWZvcmUqXG4gICAgLy8gbGFiZWxzIGFyZSBhY3R1YWxseSByZW5kZXJlZC5cbiAgICBjYWxjVGV4dFNpemVzICh0ZXh0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXMudGV4dFNpemVzKHRleHRzKTtcbiAgICB9LFxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIGZyb20gd29ya2VyLCB0byBjcmVhdGUgYXRsYXMgb2YgbGFiZWxzIGZvciBhIHRpbGVcbiAgICByYXN0ZXJpemVUZXh0cyAodGlsZV9rZXksIHRleHRzKSB7XG4gICAgICAgIGxldCBjYW52YXMgPSBuZXcgQ2FudmFzVGV4dCgpO1xuICAgICAgICBjYW52YXMuY2xlYXJUZXhjb29yZENhY2hlKHRpbGVfa2V5KTtcblxuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gY2FudmFzLnNldFRleHR1cmVUZXh0UG9zaXRpb25zKHRleHRzLCB0aGlzLm1heF90ZXh0dXJlX3NpemUsIHRpbGVfa2V5KTtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0ZXh0IHN1bW1hcnkgZm9yIHRpbGUgJHt0aWxlX2tleX06IGZpdHMgaW4gJHt0ZXh0dXJlX3NpemVbMF19eCR7dGV4dHVyZV9zaXplWzFdfXB4YCk7XG5cbiAgICAgICAgLy8gZml0cyBpbiBtYXggdGV4dHVyZSBzaXplP1xuICAgICAgICBpZiAodGV4dHVyZV9zaXplWzBdIDwgdGhpcy5tYXhfdGV4dHVyZV9zaXplICYmIHRleHR1cmVfc2l6ZVsxXSA8IHRoaXMubWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIGNhbnZhcyBzaXplICYgcmFzdGVyaXplIGFsbCB0aGUgdGV4dCBzdHJpbmdzIHdlIG5lZWRcbiAgICAgICAgICAgIGNhbnZhcy5yZXNpemUoLi4udGV4dHVyZV9zaXplKTtcbiAgICAgICAgICAgIGNhbnZhcy5yYXN0ZXJpemUodGV4dHMsIHRleHR1cmVfc2l6ZSwgdGlsZV9rZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIFtcbiAgICAgICAgICAgICAgICBgTGFiZWwgYXRsYXMgZm9yIHRpbGUgJHt0aWxlX2tleX0gaXMgJHt0ZXh0dXJlX3NpemVbMF19eCR7dGV4dHVyZV9zaXplWzFdfXB4LCBgLFxuICAgICAgICAgICAgICAgIGBidXQgbWF4IEdMIHRleHR1cmUgc2l6ZSBpcyAke3RoaXMubWF4X3RleHR1cmVfc2l6ZX14JHt0aGlzLm1heF90ZXh0dXJlX3NpemV9cHhgXS5qb2luKCcnKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjcmVhdGUgYSB0ZXh0dXJlXG4gICAgICAgIGxldCB0ID0gJ2xhYmVscy0nICsgdGlsZV9rZXkgKyAnLScgKyAodGV4dF90ZXh0dXJlX2lkKyspO1xuICAgICAgICBUZXh0dXJlLmNyZWF0ZSh0aGlzLmdsLCB0LCB7XG4gICAgICAgICAgICBlbGVtZW50OiBjYW52YXMuY2FudmFzLFxuICAgICAgICAgICAgZmlsdGVyaW5nOiAnbGluZWFyJyxcbiAgICAgICAgICAgIFVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgVGV4dHVyZS5yZXRhaW4odCk7XG5cbiAgICAgICAgcmV0dXJuIHsgdGV4dHMsIHRleHR1cmU6IHQgfTsgLy8gdGV4dHVyZSBpcyByZXR1cm5lZCBieSBuYW1lIChub3QgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIHByZXByb2Nlc3NUZXh0IChkcmF3KSB7XG4gICAgICAgIC8vIEZvbnQgc2V0dGluZ3MgYXJlIHJlcXVpcmVkXG4gICAgICAgIGlmICghZHJhdyB8fCAhZHJhdy5mb250IHx8IHR5cGVvZiBkcmF3LmZvbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb2xvcnNcbiAgICAgICAgZHJhdy5mb250LmZpbGwgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5maWxsKTtcbiAgICAgICAgaWYgKGRyYXcuZm9udC5zdHJva2UpIHtcbiAgICAgICAgICAgIGRyYXcuZm9udC5zdHJva2UuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5zdHJva2UuY29sb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBmb250IGFuZCB0ZXh0IHN0cm9rZSBzaXplc1xuICAgICAgICBkcmF3LmZvbnQucHhfc2l6ZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LnNpemUgfHwgVGV4dFNldHRpbmdzLmRlZmF1bHRzLnNpemUsIENhbnZhc1RleHQuZm9udFBpeGVsU2l6ZSk7XG4gICAgICAgIGlmIChkcmF3LmZvbnQuc3Ryb2tlICYmIGRyYXcuZm9udC5zdHJva2Uud2lkdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgZHJhdy5mb250LnN0cm9rZS53aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LnN0cm9rZS53aWR0aCwgcGFyc2VGbG9hdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPZmZzZXQgKDJkIGFycmF5KVxuICAgICAgICBkcmF3Lm9mZnNldCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5vZmZzZXQsIHYgPT4gKEFycmF5LmlzQXJyYXkodikgJiYgdi5tYXAocGFyc2VGbG9hdCkpIHx8IDApO1xuXG4gICAgICAgIC8vIEJ1ZmZlciAoMWQgdmFsdWUgb3Igb3IgMmQgYXJyYXkpXG4gICAgICAgIGRyYXcuYnVmZmVyID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmJ1ZmZlciwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdiwgdl0pLm1hcChwYXJzZUZsb2F0KSB8fCAwKTtcblxuICAgICAgICAvLyBSZXBlYXQgcnVsZXMgLSBmb3IgdGV4dCBsYWJlbHMsIGRlZmF1bHRzIHRvIHRpbGUgc2l6ZVxuICAgICAgICBkcmF3LnJlcGVhdF9kaXN0YW5jZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5yZXBlYXRfZGlzdGFuY2UgfHwgR2VvLnRpbGVfc2l6ZSwgcGFyc2VGbG9hdCk7XG5cbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIEFkZGl0aW9uYWwgdGV4dC1zcGVjaWZpYyBsYXlvdXQgc2V0dGluZ3NcbiAgICBjb21wdXRlVGV4dExheW91dCAodGFyZ2V0LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlLCB0ZXh0LCB0ZXh0X3NldHRpbmdzKSB7XG4gICAgICAgIGxldCBsYXlvdXQgPSB0YXJnZXQgfHwge307XG5cbiAgICAgICAgLy8gY29tbW9uIHNldHRpbmdzIHcvcG9pbnRzXG4gICAgICAgIGxheW91dCA9IHRoaXMuY29tcHV0ZUxheW91dChsYXlvdXQsIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpO1xuXG4gICAgICAgIC8vIHRpbGUgYm91bmRhcnkgaGFuZGxpbmdcbiAgICAgICAgbGF5b3V0LmN1bGxfZnJvbV90aWxlID0gKGRyYXcuY3VsbF9mcm9tX3RpbGUgIT0gbnVsbCkgPyBkcmF3LmN1bGxfZnJvbV90aWxlIDogdHJ1ZTtcblxuICAgICAgICAvLyBzdGFuZGFsb25lIHRleHQgY2FuIG1vdmUgaW50byB0aWxlIGlmIHNwZWNpZmllZFxuICAgICAgICBsYXlvdXQubW92ZV9pbnRvX3RpbGUgPSAoZHJhdy5tb3ZlX2ludG9fdGlsZSAhPSBudWxsKSA/IGRyYXcubW92ZV9pbnRvX3RpbGUgOiB0cnVlO1xuXG4gICAgICAgIC8vIHJlcGVhdCBydWxlcyBpbmNsdWRlIHRoZSB0ZXh0XG4gICAgICAgIGlmIChsYXlvdXQucmVwZWF0X2Rpc3RhbmNlKSB7XG4gICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwICs9ICcvJyArIHRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXggbnVtYmVyIG9mIHN1YmRpdmlzaW9ucyB0byB0cnlcbiAgICAgICAgbGF5b3V0LnN1YmRpdiA9IHRpbGUub3Zlcnpvb20yO1xuXG4gICAgICAgIGxheW91dC5hbGlnbiA9IGRyYXcuYWxpZ247XG5cbiAgICAgICAgLy8gdXNlZCB0byBmdWRnZSB3aWR0aCB2YWx1ZSBhcyB0ZXh0IG1heSBvdmVyZmxvdyBib3VuZGluZyBib3ggaWYgaXQgaGFzIGl0YWxpYywgYm9sZCwgZXRjIHN0eWxlXG4gICAgICAgIGxheW91dC5pdGFsaWMgPSAodGV4dF9zZXR0aW5ncy5zdHlsZSAhPT0gJ25vcm1hbCcpO1xuXG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfVxuXG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5cbnZhciBUZXh0U2V0dGluZ3M7XG5cbmV4cG9ydCBkZWZhdWx0IFRleHRTZXR0aW5ncyA9IHtcblxuICAgIC8vIEEga2V5IGZvciBncm91cGluZyBhbGwgbGFiZWxzIG9mIHRoZSBzYW1lIHRleHQgc3R5bGUgKGUuZy4gc2FtZSBDYW52YXMgc3RhdGUsIHRvIG1pbmltaXplIHN0YXRlIGNoYW5nZXMpXG4gICAga2V5IChzZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgc2V0dGluZ3Muc3R5bGUsXG4gICAgICAgICAgICBzZXR0aW5ncy53ZWlnaHQsXG4gICAgICAgICAgICBzZXR0aW5ncy5mYW1pbHksXG4gICAgICAgICAgICBzZXR0aW5ncy5weF9zaXplLFxuICAgICAgICAgICAgc2V0dGluZ3MuZmlsbCxcbiAgICAgICAgICAgIHNldHRpbmdzLnN0cm9rZSxcbiAgICAgICAgICAgIHNldHRpbmdzLnN0cm9rZV93aWR0aCxcbiAgICAgICAgICAgIHNldHRpbmdzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIHNldHRpbmdzLnRleHRfd3JhcCxcbiAgICAgICAgICAgIHNldHRpbmdzLm1heF9saW5lcyxcbiAgICAgICAgICAgIHNldHRpbmdzLnN1cGVyc2FtcGxlLFxuICAgICAgICAgICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvXG4gICAgICAgIF0uam9pbignLycpO1xuICAgIH0sXG5cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBzdHlsZTogJ25vcm1hbCcsXG4gICAgICAgIHdlaWdodDogbnVsbCxcbiAgICAgICAgc2l6ZTogJzEycHgnLFxuICAgICAgICBweF9zaXplOiAxMixcbiAgICAgICAgZmFtaWx5OiAnSGVsdmV0aWNhJyxcbiAgICAgICAgZmlsbDogJ3doaXRlJyxcbiAgICAgICAgdGV4dF93cmFwOiAxNSxcbiAgICAgICAgbWF4X2xpbmVzOiA1LFxuICAgICAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIHN0cm9rZTogbnVsbCxcbiAgICAgICAgc3Ryb2tlX3dpZHRoOiAwXG4gICAgfSxcblxuICAgIGNvbXB1dGUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHN0eWxlID0ge307XG5cbiAgICAgICAgZHJhdy5mb250ID0gZHJhdy5mb250IHx8IHRoaXMuZGVmYXVsdHM7XG5cbiAgICAgICAgLy8gTGluZVN0cmluZyBsYWJlbHMgY2FuIGFydGljdWxhdGUgd2hpbGUgcG9pbnQgbGFiZWxzIGNhbm5vdC4gTmVlZGVkIGZvciBmdXR1cmUgdGV4dHVyZSBjb29yZGluYXRlIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgc3R5bGUuY2FuX2FydGljdWxhdGUgPSBkcmF3LmNhbl9hcnRpY3VsYXRlO1xuXG4gICAgICAgIC8vIFVzZSBmaWxsIGlmIHNwZWNpZmllZCwgb3IgZGVmYXVsdFxuICAgICAgICBzdHlsZS5maWxsID0gKGRyYXcuZm9udC5maWxsICYmIFV0aWxzLnRvQ1NTQ29sb3IoU3R5bGVQYXJzZXIuZXZhbENhY2hlZENvbG9yUHJvcGVydHkoZHJhdy5mb250LmZpbGwsIGNvbnRleHQpKSkgfHwgdGhpcy5kZWZhdWx0cy5maWxsO1xuXG4gICAgICAgIC8vIEZvbnQgcHJvcGVydGllcyBhcmUgbW9kZWxlZCBhZnRlciBDU1MgbmFtZXM6XG4gICAgICAgIC8vIC0gZmFtaWx5OiBIZWx2ZXRpY2EsIEZ1dHVyYSwgZXRjLlxuICAgICAgICAvLyAtIHNpemU6IGluIHB0LCBweCwgb3IgZW1cbiAgICAgICAgLy8gLSBzdHlsZTogbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcbiAgICAgICAgLy8gLSB3ZWlnaHQ6IG5vcm1hbCwgYm9sZCwgZXRjLlxuICAgICAgICAvLyAtIHRyYW5zZm9ybTogY2FwaXRhbGl6ZSwgdXBwZXJjYXNlLCBsb3dlcmNhc2VcbiAgICAgICAgc3R5bGUuc3R5bGUgPSBkcmF3LmZvbnQuc3R5bGUgfHwgdGhpcy5kZWZhdWx0cy5zdHlsZTtcbiAgICAgICAgc3R5bGUud2VpZ2h0ID0gZHJhdy5mb250LndlaWdodCB8fCB0aGlzLmRlZmF1bHRzLndlaWdodDtcbiAgICAgICAgaWYgKGRyYXcuZm9udC5mYW1pbHkpIHtcbiAgICAgICAgICAgIHN0eWxlLmZhbWlseSA9IGRyYXcuZm9udC5mYW1pbHk7XG4gICAgICAgICAgICBpZiAoc3R5bGUuZmFtaWx5ICE9PSB0aGlzLmRlZmF1bHRzLmZhbWlseSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmZhbWlseSArPSAnLCAnICsgdGhpcy5kZWZhdWx0cy5mYW1pbHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS5mYW1pbHkgPSB0aGlzLmRlZmF1bHRzLmZhbWlseTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IGRyYXcuZm9udC50cmFuc2Zvcm07XG5cbiAgICAgICAgLy8gb3JpZ2luYWwgc2l6ZSAobm90IGN1cnJlbnRseSB1c2VkLCBidXQgdXNlZnVsIGZvciBkZWJ1Z2dpbmcpXG4gICAgICAgIHN0eWxlLnNpemUgPSBkcmF3LmZvbnQuc2l6ZSB8fCB0aGlzLmRlZmF1bHRzLnNpemU7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlZCBwaXhlbCBzaXplXG4gICAgICAgIHN0eWxlLnN1cGVyc2FtcGxlID0gZHJhdy5zdXBlcnNhbXBsZV90ZXh0ID8gMS41IDogMTsgLy8gb3B0aW9uYWxseSByZW5kZXIgdGV4dCBhdCAxNTAlIHRvIGltcHJvdmUgY2xhcml0eVxuICAgICAgICBzdHlsZS5weF9zaXplID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuZm9udC5weF9zaXplLCBjb250ZXh0KSAqIHN0eWxlLnN1cGVyc2FtcGxlO1xuXG4gICAgICAgIC8vIFVzZSBzdHJva2UgaWYgc3BlY2lmaWVkXG4gICAgICAgIGlmIChkcmF3LmZvbnQuc3Ryb2tlICYmIGRyYXcuZm9udC5zdHJva2UuY29sb3IpIHtcbiAgICAgICAgICAgIHN0eWxlLnN0cm9rZSA9IFV0aWxzLnRvQ1NTQ29sb3IoU3R5bGVQYXJzZXIuZXZhbENhY2hlZENvbG9yUHJvcGVydHkoZHJhdy5mb250LnN0cm9rZS5jb2xvciwgY29udGV4dCkgfHwgdGhpcy5kZWZhdWx0cy5zdHJva2UpO1xuICAgICAgICAgICAgc3R5bGUuc3Ryb2tlX3dpZHRoID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuZm9udC5zdHJva2Uud2lkdGgsIGNvbnRleHQpIHx8IHRoaXMuZGVmYXVsdHMuc3Ryb2tlX3dpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUuZm9udF9jc3MgPSB0aGlzLmZvbnRDU1Moc3R5bGUpO1xuXG4gICAgICAgIC8vIFdvcmQgd3JhcCBhbmQgdGV4dCBhbGlnbm1lbnRcbiAgICAgICAgLy8gTm90IGEgZm9udCBwcm9wZXJ0aWVzLCBidXQgYWZmZWN0IGF0bGFzIG9mIHVuaXF1ZSB0ZXh0IHRleHR1cmVzXG4gICAgICAgIGxldCB0ZXh0X3dyYXAgPSBkcmF3LnRleHRfd3JhcDsgLy8gdXNlIGV4cGxpY2l0bHkgc2V0IHZhbHVlXG5cbiAgICAgICAgaWYgKHRleHRfd3JhcCA9PSBudWxsICYmIEdlby5nZW9tZXRyeVR5cGUoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSAhPT0gJ2xpbmUnKSB7XG4gICAgICAgICAgICAvLyBwb2ludCBsYWJlbHMgKGZvciBwb2ludCBhbmQgcG9seWdvbiBmZWF0dXJlcykgaGF2ZSB3b3JkIHdyYXAgb24gdy9kZWZhdWx0IG1heCBsZW5ndGgsXG4gICAgICAgICAgICAvLyBsaW5lIGxhYmVscyBkZWZhdWx0IG9mZlxuICAgICAgICAgICAgdGV4dF93cmFwID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldHRpbmcgdG8gJ3RydWUnIGNhdXNlcyBkZWZhdWx0IHdyYXAgdmFsdWUgdG8gYmUgdXNlZFxuICAgICAgICBpZiAodGV4dF93cmFwID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0ZXh0X3dyYXAgPSB0aGlzLmRlZmF1bHRzLnRleHRfd3JhcDtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZS50ZXh0X3dyYXAgPSB0ZXh0X3dyYXA7XG5cbiAgICAgICAgLy8gbWF4X2xpbmVzIHNldHRpbmcgdG8gdHJ1bmNhdGUgdmVyeSBsb25nIGxhYmVscyB3aXRoIGFuIGVsbGlwc2lzXG4gICAgICAgIHN0eWxlLm1heF9saW5lcyA9IGRyYXcubWF4X2xpbmVzIHx8IHRoaXMuZGVmYXVsdHMubWF4X2xpbmVzO1xuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgQ1NTLXN0eWxlIGZvbnQgc3RyaW5nICh0byBzZXQgQ2FudmFzIGRyYXcgc3RhdGUpXG4gICAgZm9udENTUyAoeyBzdHlsZSwgd2VpZ2h0LCBweF9zaXplLCBmYW1pbHkgfSkge1xuICAgICAgICByZXR1cm4gW3N0eWxlLCB3ZWlnaHQsIHB4X3NpemUgKyAncHgnLCBmYW1pbHldXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geCkgLy8gcmVtb3ZlIG51bGwgcHJvcHNcbiAgICAgICAgICAgIC5qb2luKCcgJyk7XG4gICAgfVxuXG59O1xuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuXG5pbXBvcnQge21hdDQsIHZlYzN9IGZyb20gJy4vdXRpbHMvZ2wtbWF0cml4JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZSB7XG5cbiAgICAvKipcbiAgICAgICAgVGlsZVxuICAgICAgICBAY29uc3RydWN0b3JcbiAgICAgICAgUmVxdWlyZWQgcHJvcGVydGllczpcbiAgICAgICAgY29vcmRzOiBvYmplY3Qgd2l0aCB7eCwgeSwgen0gcHJvcGVydGllcyBpZGVudGlmeWluZyB0aWxlIGNvb3JkaW5hdGUgbG9jYXRpb25cbiAgICAgICAgd29ya2VyOiB3ZWIgd29ya2VyIHRvIGhhbmRsZSB0aWxlIGNvbnN0cnVjdGlvblxuICAgICovXG4gICAgY29uc3RydWN0b3IoeyBjb29yZHMsIHN0eWxlX3pvb20sIHNvdXJjZSwgd29ya2VyLCB2aWV3IH0pIHtcbiAgICAgICAgdGhpcy53b3JrZXIgPSB3b3JrZXI7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBudWxsO1xuXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb3h5X2ZvciA9IG51bGw7XG4gICAgICAgIHRoaXMucHJveHlfZGVwdGggPSAwO1xuICAgICAgICB0aGlzLnByb3hpZWRfYXMgPSBudWxsO1xuICAgICAgICB0aGlzLmZhZGVfaW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idWlsdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IHt9O1xuXG4gICAgICAgIHRoaXMuY29vcmRzID0gVGlsZS5jb29yZGluYXRlV2l0aE1heFpvb20oY29vcmRzLCB0aGlzLnNvdXJjZS5tYXhfem9vbSk7XG4gICAgICAgIHRoaXMuc3R5bGVfem9vbSA9IHN0eWxlX3pvb207IC8vIHpvb20gbGV2ZWwgdG8gYmUgdXNlZCBmb3Igc3R5bGluZ1xuICAgICAgICB0aGlzLm92ZXJ6b29tID0gTWF0aC5tYXgodGhpcy5zdHlsZV96b29tIC0gdGhpcy5jb29yZHMueiwgMCk7IC8vIG51bWJlciBvZiBsZXZlbHMgb2Ygb3Zlcnpvb21pbmdcbiAgICAgICAgdGhpcy5vdmVyem9vbTIgPSBNYXRoLnBvdygyLCB0aGlzLm92ZXJ6b29tKTtcbiAgICAgICAgdGhpcy5rZXkgPSBUaWxlLmtleSh0aGlzLmNvb3JkcywgdGhpcy5zb3VyY2UsIHRoaXMuc3R5bGVfem9vbSk7XG4gICAgICAgIHRoaXMubWluID0gR2VvLm1ldGVyc0ZvclRpbGUodGhpcy5jb29yZHMpO1xuICAgICAgICB0aGlzLm1heCA9IEdlby5tZXRlcnNGb3JUaWxlKHt4OiB0aGlzLmNvb3Jkcy54ICsgMSwgeTogdGhpcy5jb29yZHMueSArIDEsIHo6IHRoaXMuY29vcmRzLnogfSksXG4gICAgICAgIHRoaXMuc3BhbiA9IHsgeDogKHRoaXMubWF4LnggLSB0aGlzLm1pbi54KSwgeTogKHRoaXMubWF4LnkgLSB0aGlzLm1pbi55KSB9O1xuICAgICAgICB0aGlzLmJvdW5kcyA9IHsgc3c6IHsgeDogdGhpcy5taW4ueCwgeTogdGhpcy5tYXgueSB9LCBuZTogeyB4OiB0aGlzLm1heC54LCB5OiB0aGlzLm1pbi55IH0gfTtcbiAgICAgICAgdGhpcy5jZW50ZXJfZGlzdCA9IDA7XG5cbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsID0gR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMuc3R5bGVfem9vbSk7XG4gICAgICAgIHRoaXMubWV0ZXJzX3Blcl9waXhlbF9zcSA9IHRoaXMubWV0ZXJzX3Blcl9waXhlbCAqIHRoaXMubWV0ZXJzX3Blcl9waXhlbDtcbiAgICAgICAgdGhpcy51bml0c19wZXJfcGl4ZWwgPSBHZW8udW5pdHNfcGVyX3BpeGVsIC8gdGhpcy5vdmVyem9vbTI7IC8vIGFkanVzdGVkIGZvciBvdmVyem9vbVxuICAgICAgICB0aGlzLnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbSA9IEdlby51bml0c1Blck1ldGVyKHRoaXMuY29vcmRzLnopICogdGhpcy5vdmVyem9vbTI7IC8vIGFkanVzdGVkIGZvciBvdmVyem9vbVxuXG4gICAgICAgIHRoaXMubWVzaGVzID0ge307IC8vIHJlbmRlcmFibGUgVkJPIG1lc2hlcyBrZXllZCBieSBzdHlsZVxuICAgICAgICB0aGlzLnRleHR1cmVzID0gW107IC8vIHRleHR1cmVzIHRoYXQgdGhlIHRpbGUgb3ducyAobGFiZWxzLCBldGMuKVxuICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzID0gW107IC8vIHRleHR1cmVzIHJldGFpbmVkIGJ5IHRoZSB0aWxlIGluIHRoZSBwcmV2aW91cyBidWlsZCBnZW5lcmF0aW9uXG4gICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzID0gW107IC8vIG1lc2hlcyB0aGF0IGhhdmUgYmVlbiBidWlsdCBzbyBmYXIgaW4gY3VycmVudCBidWlsZCBnZW5lcmF0aW9uXG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGlsZShzcGVjKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmQoYykge1xuICAgICAgICByZXR1cm4ge3g6IGMueCwgeTogYy55LCB6OiBjLnosIGtleTogVGlsZS5jb29yZEtleShjKX07XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkS2V5KHt4LCB5LCB6fSkge1xuICAgICAgICByZXR1cm4geCArICcvJyArIHkgKyAnLycgKyB6O1xuICAgIH1cblxuICAgIHN0YXRpYyBrZXkgKGNvb3Jkcywgc291cmNlLCBzdHlsZV96b29tKSB7XG4gICAgICAgIGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZVdpdGhNYXhab29tKGNvb3Jkcywgc291cmNlLm1heF96b29tKTtcbiAgICAgICAgaWYgKGNvb3Jkcy55IDwgMCB8fCBjb29yZHMueSA+PSAoMSA8PCBjb29yZHMueikgfHwgY29vcmRzLnogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIGN1bGwgdGlsZXMgb3V0IG9mIHJhbmdlICh4IHdpbGwgd3JhcClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3NvdXJjZS5uYW1lLCBzdHlsZV96b29tLCBjb29yZHMueCwgY29vcmRzLnksIGNvb3Jkcy56XS5qb2luKCcvJyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkaW5hdGVBdFpvb20oe3gsIHksIHosIGtleX0sIHpvb20pIHtcbiAgICAgICAgaWYgKHogIT09IHpvb20pIHtcbiAgICAgICAgICAgIGxldCB6c2NhbGUgPSBNYXRoLnBvdygyLCB6IC0gem9vbSk7XG4gICAgICAgICAgICB4ID0gTWF0aC5mbG9vcih4IC8genNjYWxlKTtcbiAgICAgICAgICAgIHkgPSBNYXRoLmZsb29yKHkgLyB6c2NhbGUpO1xuICAgICAgICAgICAgeiA9IHpvb207XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGUuY29vcmQoe3gsIHksIHp9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmRpbmF0ZVdpdGhNYXhab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pIHtcbiAgICAgICAgaWYgKG1heF96b29tICE9PSB1bmRlZmluZWQgJiYgeiA+IG1heF96b29tKSB7XG4gICAgICAgICAgICByZXR1cm4gVGlsZS5jb29yZGluYXRlQXRab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkKHt4LCB5LCB6fSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNoaWxkcmVuRm9yQ29vcmRpbmF0ZSh7eCwgeSwgeiwga2V5fSkge1xuICAgICAgICBpZiAoIVRpbGUuY29vcmRfY2hpbGRyZW5ba2V5XSkge1xuICAgICAgICAgICAgeisrO1xuICAgICAgICAgICAgeCAqPSAyO1xuICAgICAgICAgICAgeSAqPSAyO1xuICAgICAgICAgICAgVGlsZS5jb29yZF9jaGlsZHJlbltrZXldID0gW1xuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHksICAgICAgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHksICAgICAgen0pLFxuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHk6IHkrMSwgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHk6IHkrMSwgen0pXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkX2NoaWxkcmVuW2tleV07XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRGVzY2VuZGFudChwYXJlbnQsIGRlc2NlbmRhbnQpIHtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnQueiA+IHBhcmVudC56KSB7XG4gICAgICAgICAgICBsZXQge3gsIHl9ID0gVGlsZS5jb29yZGluYXRlQXRab29tKGRlc2NlbmRhbnQsIHBhcmVudC56KTtcbiAgICAgICAgICAgIHJldHVybiAocGFyZW50LnggPT09IHggJiYgcGFyZW50LnkgPT09IHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGEgc2V0IG9mIHRpbGUgaW5zdGFuY2VzICh3aGljaCBhbHJlYWR5IGhhdmUgYSBkaXN0YW5jZSBmcm9tIGNlbnRlciB0aWxlIGNvbXB1dGVkKVxuICAgIHN0YXRpYyBzb3J0KHRpbGVzKSB7XG4gICAgICAgIHJldHVybiB0aWxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWQgPSBhLmNlbnRlcl9kaXN0O1xuICAgICAgICAgICAgbGV0IGJkID0gYi5jZW50ZXJfZGlzdDtcbiAgICAgICAgICAgIHJldHVybiAoYmQgPiBhZCA/IC0xIDogKGJkID09PSBhZCA/IDAgOiAxKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZyZWUgcmVzb3VyY2VzIG93bmVkIGJ5IHRpbGVcbiAgICBmcmVlUmVzb3VyY2VzICgpIHtcbiAgICAgICAgZm9yIChsZXQgbSBpbiB0aGlzLm1lc2hlcykge1xuICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzaGVzID0ge307XG5cbiAgICAgICAgdGhpcy50ZXh0dXJlcy5mb3JFYWNoKHQgPT4gVGV4dHVyZS5yZWxlYXNlKHQpKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMuZm9yRWFjaCh0ID0+IFRleHR1cmUucmVsZWFzZSh0KSk7XG4gICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMgPSBbXTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLndvcmtlck1lc3NhZ2UoJ3NlbGYucmVtb3ZlVGlsZScsIHRoaXMua2V5KTtcbiAgICAgICAgdGhpcy5mcmVlUmVzb3VyY2VzKCk7XG4gICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcbiAgICB9XG5cbiAgICBidWlsZEFzTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogdGhpcy5rZXksXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLm5hbWUsXG4gICAgICAgICAgICBjb29yZHM6IHRoaXMuY29vcmRzLFxuICAgICAgICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgICAgICAgIG1heDogdGhpcy5tYXgsXG4gICAgICAgICAgICB1bml0c19wZXJfcGl4ZWw6IHRoaXMudW5pdHNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGhpcy5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgbWV0ZXJzX3Blcl9waXhlbF9zcTogdGhpcy5tZXRlcnNfcGVyX3BpeGVsX3NxLFxuICAgICAgICAgICAgdW5pdHNfcGVyX21ldGVyX292ZXJ6b29tOiB0aGlzLnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbSxcbiAgICAgICAgICAgIHN0eWxlX3pvb206IHRoaXMuc3R5bGVfem9vbSxcbiAgICAgICAgICAgIG92ZXJ6b29tOiB0aGlzLm92ZXJ6b29tLFxuICAgICAgICAgICAgb3Zlcnpvb20yOiB0aGlzLm92ZXJ6b29tMixcbiAgICAgICAgICAgIGdlbmVyYXRpb246IHRoaXMuZ2VuZXJhdGlvbixcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLmRlYnVnXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgd29ya2VyTWVzc2FnZSAoLi4ubWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VyLCAuLi5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICBidWlsZChnZW5lcmF0aW9uLCB7IGZhZGVfaW4gPSB0cnVlIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuICAgICAgICB0aGlzLmZhZGVfaW4gPSBmYWRlX2luO1xuICAgICAgICBpZiAoIXRoaXMubG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5idWlsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLndvcmtlck1lc3NhZ2UoJ3NlbGYuYnVpbGRUaWxlJywgeyB0aWxlOiB0aGlzLmJ1aWxkQXNNZXNzYWdlKCkgfSkuY2F0Y2goZSA9PiB7IHRocm93IGU7IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICBDYWxsZWQgb24gd29ya2VyIHRvIGNhbmNlbCBsb2FkaW5nXG4gICAgICAgIFN0YXRpYyBtZXRob2QgYmVjYXVzZSB0aGUgd29ya2VyIG9ubHkgaGFzIG9iamVjdCByZXByZXNlbnRhdGlvbnMgb2YgdGlsZSBkYXRhLCB0aGVyZSBpcyBub1xuICAgICAgICB0aWxlIGluc3RhbmNlIGNyZWF0ZWQgeWV0LlxuICAgICovXG4gICAgc3RhdGljIGNhbmNlbCh0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aWxlLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aWxlLnNvdXJjZV9kYXRhICYmIHRpbGUuc291cmNlX2RhdGEucmVxdWVzdF9pZCkge1xuICAgICAgICAgICAgICAgIFV0aWxzLmNhbmNlbFJlcXVlc3QodGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0X2lkKTsgLy8gY2FuY2VsIHBlbmRpbmcgdGlsZSBuZXR3b3JrIHJlcXVlc3RcbiAgICAgICAgICAgICAgICB0aWxlLnNvdXJjZV9kYXRhLnJlcXVlc3RfaWQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBnZW9tZXRyeSBmb3IgdGlsZSAtIGNhbGxlZCBieSB3ZWIgd29ya2VyXG4gICAgLy8gUmV0dXJucyBhIHNldCBvZiB0aWxlIGtleXMgdGhhdCBzaG91bGQgYmUgc2VudCB0byB0aGUgbWFpbiB0aHJlYWQgKHNvIHRoYXQgd2UgY2FuIG1pbmltaXplIGRhdGEgZXhjaGFuZ2UgYmV0d2VlbiB3b3JrZXIgYW5kIG1haW4gdGhyZWFkKVxuICAgIHN0YXRpYyBidWlsZEdlb21ldHJ5ICh0aWxlLCB7IHNjZW5lX2lkLCBsYXllcnMsIHN0eWxlcywgZ2xvYmFsIH0pIHtcbiAgICAgICAgdGlsZS5kZWJ1Zy5yZW5kZXJpbmcgPSArbmV3IERhdGUoKTtcbiAgICAgICAgdGlsZS5kZWJ1Zy5mZWF0dXJlcyA9IDA7XG5cbiAgICAgICAgbGV0IGRhdGEgPSB0aWxlLnNvdXJjZV9kYXRhO1xuXG4gICAgICAgIENvbGxpc2lvbi5zdGFydFRpbGUodGlsZS5rZXkpO1xuXG4gICAgICAgIC8vIFByb2Nlc3MgZWFjaCB0b3AtbGV2ZWwgbGF5ZXJcbiAgICAgICAgZm9yIChsZXQgbGF5ZXJfbmFtZSBpbiBsYXllcnMpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IGxheWVyc1tsYXllcl9uYW1lXTtcbiAgICAgICAgICAgIC8vIFNraXAgbGF5ZXJzIHdpdGggbm8gZGF0YSBzb3VyY2UgZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFsYXllciB8fCAhbGF5ZXIuY29uZmlnLmRhdGEpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgTGF5ZXIgJHtsYXllcl9uYW1lfSB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2VvbWV0cnkgZGF0YSBzb3VyY2UgYW5kIHdpbGwgbm90IGJlIHJlbmRlcmVkLmApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTb3VyY2UgbmFtZXMgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgIGlmIChsYXllci5jb25maWcuZGF0YS5zb3VyY2UgIT09IHRpbGUuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCBkYXRhIGZvciBvbmUgb3IgbW9yZSBsYXllcnMgZnJvbSBzb3VyY2VcbiAgICAgICAgICAgIGxldCBzb3VyY2VfbGF5ZXJzID0gVGlsZS5nZXREYXRhRm9yU291cmNlKGRhdGEsIGxheWVyLmNvbmZpZy5kYXRhLCBsYXllcl9uYW1lKTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIGZlYXR1cmVzIGluIGxheWVyXG4gICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzb3VyY2VfbGF5ZXJzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZV9sYXllciA9IHNvdXJjZV9sYXllcnNbc107XG4gICAgICAgICAgICAgICAgbGV0IGdlb20gPSBzb3VyY2VfbGF5ZXIuZ2VvbTtcbiAgICAgICAgICAgICAgICBpZiAoIWdlb20pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZiA9IDA7IGYgPCBnZW9tLmZlYXR1cmVzLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmZWF0dXJlID0gZ2VvbS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgZmVhdHVyZXMgdy9vIGdlb21ldHJ5ICh2YWxpZCBHZW9KU09OKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRleHQgPSBTdHlsZVBhcnNlci5nZXRGZWF0dXJlUGFyc2VDb250ZXh0KGZlYXR1cmUsIHRpbGUsIGdsb2JhbCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud2luZGluZyA9IHRpbGUuZGVmYXVsdF93aW5kaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNvdXJjZSA9IHRpbGUuc291cmNlOyAgICAgICAgLy8gYWRkIGRhdGEgc291cmNlIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5sYXllciA9IHNvdXJjZV9sYXllci5sYXllcjsgIC8vIGFkZCBkYXRhIHNvdXJjZSBsYXllciBuYW1lXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGRyYXcgZ3JvdXBzIGZvciB0aGlzIGZlYXR1cmVcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRyYXdfZ3JvdXBzID0gbGF5ZXIuYnVpbGREcmF3R3JvdXBzKGNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRyYXdfZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbmRlciBkcmF3IGdyb3Vwc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBncm91cF9uYW1lIGluIGRyYXdfZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXAgPSBkcmF3X2dyb3Vwc1tncm91cF9uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JvdXAudmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdG8gc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZV9uYW1lID0gZ3JvdXAuc3R5bGUgfHwgZ3JvdXBfbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHN0eWxlc1tzdHlsZV9uYW1lXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTdHlsZSAnJHtzdHlsZV9uYW1lfScgbm90IGZvdW5kLCBza2lwcGluZyBsYXllciAnJHtsYXllcl9uYW1lfSc6YCwgZ3JvdXAsIGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxheWVycyA9IGdyb3VwLmxheWVyczsgIC8vIGFkZCBtYXRjaGluZyBkcmF3IGxheWVyc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5hZGRGZWF0dXJlKGZlYXR1cmUsIGdyb3VwLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRpbGUuZGVidWcuZmVhdHVyZXMrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGlsZS5kZWJ1Zy5yZW5kZXJpbmcgPSArbmV3IERhdGUoKSAtIHRpbGUuZGVidWcucmVuZGVyaW5nO1xuXG4gICAgICAgIC8vIFNlbmQgc3R5bGVzIGJhY2sgdG8gbWFpbiB0aHJlYWQgYXMgdGhleSBmaW5pc2ggYnVpbGRpbmcsIGluIHR3byBncm91cHM6IGNvbGxpc2lvbiB2cy4gbm9uLWNvbGxpc2lvblxuICAgICAgICBsZXQgdGlsZV9zdHlsZXMgPSB0aGlzLnN0eWxlc0ZvclRpbGUodGlsZS5rZXksIHN0eWxlcykubWFwKHMgPT4gc3R5bGVzW3NdKTtcbiAgICAgICAgVGlsZS5zZW5kU3R5bGVHcm91cHModGlsZSwgdGlsZV9zdHlsZXMsIHsgc2NlbmVfaWQgfSwgc3R5bGUgPT4gc3R5bGUuY29sbGlzaW9uID8gJ2NvbGxpc2lvbicgOiAnbm9uLWNvbGxpc2lvbicpO1xuICAgICAgICAvLyBUaWxlLnNlbmRTdHlsZUdyb3Vwcyh0aWxlLCB0aWxlX3N0eWxlcywgeyBzY2VuZV9pZCB9LCBzdHlsZSA9PiBzdHlsZS5uYW1lKTsgLy8gY2FsbCBmb3IgZWFjaCBzdHlsZVxuICAgICAgICAvLyBUaWxlLnNlbmRTdHlsZUdyb3Vwcyh0aWxlLCB0aWxlX3N0eWxlcywgeyBzY2VuZV9pZCB9LCBzdHlsZSA9PiAnc3R5bGVzJyk7IC8vIGFsbCBzdHlsZXMgaW4gc2luZ2xlIGNhbGwgKHByZXZpb3VzIGJlaGF2aW9yKVxuICAgIH1cblxuICAgIHN0YXRpYyBzdHlsZXNGb3JUaWxlICh0aWxlX2tleSwgc3R5bGVzKSB7XG4gICAgICAgIGxldCB0aWxlX3N0eWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzIGluIHN0eWxlcykge1xuICAgICAgICAgICAgaWYgKHN0eWxlc1tzXS5oYXNEYXRhRm9yVGlsZSh0aWxlX2tleSkpIHtcbiAgICAgICAgICAgICAgICB0aWxlX3N0eWxlcy5wdXNoKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWxlX3N0eWxlcztcbiAgICB9XG5cbiAgICAvLyBTZW5kIGdyb3VwcyBvZiBzdHlsZXMgYmFjayB0byBtYWluIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgKGFzIHRoZXkgZmluaXNoIGJ1aWxkaW5nKSxcbiAgICAvLyBncm91cGVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgIHN0YXRpYyBzZW5kU3R5bGVHcm91cHModGlsZSwgc3R5bGVzLCB7IHNjZW5lX2lkIH0sIGdyb3VwX2J5KSB7XG4gICAgICAgIC8vIEdyb3VwIHN0eWxlc1xuICAgICAgICBsZXQgZ3JvdXBzID0ge307XG4gICAgICAgIHN0eWxlcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgbGV0IGdyb3VwX25hbWUgPSBncm91cF9ieShzKTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IGdyb3Vwc1tncm91cF9uYW1lXSB8fCBbXTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXS5wdXNoKHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJvZ3Jlc3MgPSB7IHN0YXJ0OiB0cnVlIH07XG4gICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBncm91cF9uYW1lIGluIGdyb3Vwcykge1xuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGdyb3Vwc1tncm91cF9uYW1lXTtcblxuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGdyb3VwLm1hcChzdHlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZS5lbmREYXRhKHRpbGUpLnRoZW4oc3R5bGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUubWVzaF9kYXRhW3N0eWxlLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogc3R5bGVfZGF0YS52ZXJ0ZXhfZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzOiBzdHlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHN0eWxlX2RhdGEudW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVzOiBzdHlsZV9kYXRhLnRleHR1cmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYEZpbmlzaGVkIHN0eWxlIGdyb3VwICcke2dyb3VwX25hbWV9JyBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIGdyb3VwIGFuZCBjaGVjayBpZiBhbGwgZ3JvdXBzIGZpbmlzaGVkXG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5ldmVyeShnID0+IGdyb3Vwc1tnXS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgbWVzaGVzIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaWxlTWFuYWdlcl8ke3NjZW5lX2lkfS5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKHsgdGlsZTogVGlsZS5zbGljZSh0aWxlLCBbJ21lc2hfZGF0YSddKSwgcHJvZ3Jlc3MgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc3RhcnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9OyAvLyByZXNldCBzbyBlYWNoIGdyb3VwIHNlbmRzIHNlcGFyYXRlIHNldCBvZiBzdHlsZSBtZXNoZXNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90aGluZyB0byBidWlsZCwgcmV0dXJuIGVtcHR5IHRpbGUgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICBgVGlsZU1hbmFnZXJfJHtzY2VuZV9pZH0uYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkYCxcbiAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMoeyB0aWxlOiBUaWxlLnNsaWNlKHRpbGUpLCBwcm9ncmVzczogeyBzdGFydDogdHJ1ZSwgZG9uZTogdHJ1ZSB9IH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAgICBSZXRyaWV2ZXMgZ2VvbWV0cnkgZnJvbSBhIHRpbGUgYWNjb3JkaW5nIHRvIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvblxuICAgICAgICBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aDpcbiAgICAgICAgICAgIGxheWVyOiBzb3VyY2UgbGF5ZXIgbmFtZVxuICAgICAgICAgICAgZ2VvbTogR2VvSlNPTiBGZWF0dXJlQ29sbGVjdGlvblxuICAgICovXG4gICAgc3RhdGljIGdldERhdGFGb3JTb3VyY2UgKHNvdXJjZV9kYXRhLCBzb3VyY2VfY29uZmlnLCBkZWZhdWx0X2xheWVyID0gbnVsbCkge1xuICAgICAgICB2YXIgbGF5ZXJzID0gW107XG5cbiAgICAgICAgaWYgKHNvdXJjZV9jb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHNvdXJjZSBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGlmICghc291cmNlX2NvbmZpZy5sYXllciAmJiBzb3VyY2VfZGF0YS5sYXllcnMuX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGdlb206IHNvdXJjZV9kYXRhLmxheWVycy5fZGVmYXVsdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHJlcXVlc3RlZCBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGVsc2UgaWYgKCFzb3VyY2VfY29uZmlnLmxheWVyICYmIGRlZmF1bHRfbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyOiBkZWZhdWx0X2xheWVyLFxuICAgICAgICAgICAgICAgICAgICBnZW9tOiBzb3VyY2VfZGF0YS5sYXllcnNbZGVmYXVsdF9sYXllcl1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGEgbGF5ZXIgaXMgc3BlY2lmaWVkIGJ5IG5hbWUsIHVzZSBpdFxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZV9jb25maWcubGF5ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsYXllcjogc291cmNlX2NvbmZpZy5sYXllcixcbiAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW3NvdXJjZV9jb25maWcubGF5ZXJdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBtdWx0aXBsZSBsYXllcnMgYXJlIHNwZWNpZmllZCBieSBuYW1lLCBjb21iaW5lIHRoZW1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlX2NvbmZpZy5sYXllcikpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfY29uZmlnLmxheWVyLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXSAmJiBzb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdLmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGNvbXBsZXRlcyBwcm9jZXNzaW5nXG4gICAgICAgZm9yIGEgc2luZ2xlIHRpbGUuXG4gICAgKi9cbiAgICBidWlsZE1lc2hlcyhzdHlsZXMsIHByb2dyZXNzKSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWJ1Z1xuICAgICAgICB0aGlzLmRlYnVnLmdlb21ldHJpZXMgPSAwO1xuICAgICAgICB0aGlzLmRlYnVnLmJ1ZmZlcl9zaXplID0gMDtcblxuICAgICAgICAvLyBDcmVhdGUgVkJPc1xuICAgICAgICBsZXQgbWVzaGVzID0ge30sIHRleHR1cmVzID0gW107IC8vIG5ldyBkYXRhIHRvIGJlIGFkZGVkIHRvIHRpbGVcbiAgICAgICAgbGV0IG1lc2hfZGF0YSA9IHRoaXMubWVzaF9kYXRhO1xuICAgICAgICBpZiAobWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzIGluIG1lc2hfZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5idWZmZXJfc2l6ZSArPSBtZXNoX2RhdGFbc10udmVydGV4X2RhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuYnVmZmVyX3NpemUgKz0gbWVzaF9kYXRhW3NdLnZlcnRleF9lbGVtZW50cy5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3R5bGVzW3NdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgQ291bGQgbm90IGNyZWF0ZSBtZXNoIGJlY2F1c2Ugc3R5bGUgJyR7c30nIG5vdCBmb3VuZCwgZm9yIHRpbGUgJHt0aGlzLmtleX0sIGFib3J0aW5nIHRpbGVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc2hlc1tzXSA9IHN0eWxlc1tzXS5tYWtlTWVzaChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEsIG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMsIG1lc2hfZGF0YVtzXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuZ2VvbWV0cmllcyArPSBtZXNoZXNbc10uZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVzXG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgdmFsaWQgZm9yIGEgc2luZ2xlIHRleHR1cmUgdG8gYmUgcmVmZXJlbmNlZCBmcm9tIG11bHRpcGxlIHN0eWxlc1xuICAgICAgICAgICAgICAgIC8vIChlLmcuIHNhbWUgcmFzdGVyIHRleHR1cmUgYXR0YWNoZWQgdG8gbXVsdGlwbGUgc291cmNlcykuIFRoaXMgbWVhbnMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIG1heSBiZSBhZGRlZCB0byB0aGUgdGlsZSdzIHRleHR1cmUgbGlzdCBtb3JlIHRoYW4gb25jZSwgd2hpY2ggZW5zdXJlc1xuICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgaXMgcHJvcGVybHkgcmVsZWFzZWQgKHRvIG1hdGNoIGl0cyByZXRhaW4gY291bnQpLlxuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXMucHVzaCguLi5tZXNoX2RhdGFbc10udGV4dHVyZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5tZXNoX2RhdGE7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0cmFja2luZyBmb3IgdGhpcyB0aWxlIGdlbmVyYXRpb25cbiAgICAgICAgaWYgKHByb2dyZXNzLnN0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLm5ld19tZXNoX3N0eWxlcyA9IFtdOyAvLyBrZWVwIHRyYWNrIG9mIHdoaWNoIG1lc2hlcyB3ZXJlIGJ1aWx0IGFzIHBhcnQgb2YgY3VycmVudCBnZW5lcmF0aW9uXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzID0gWy4uLnRoaXMudGV4dHVyZXNdOyAvLyBjb3B5IG9sZCBsaXN0IG9mIHRleHR1cmVzXG4gICAgICAgICAgICB0aGlzLnRleHR1cmVzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXcgbWVzaGVzXG4gICAgICAgIGZvciAobGV0IG0gaW4gbWVzaGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNoZXNbbV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc2hlc1ttXS5kZXN0cm95KCk7IC8vIGZyZWUgb2xkIG1lc2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWVzaGVzW21dID0gbWVzaGVzW21dOyAvLyBzZXQgbmV3IG1lc2hcbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzLnB1c2gobSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXcgdGV4dHVyZXNcbiAgICAgICAgdGhpcy50ZXh0dXJlcy5wdXNoKC4uLnRleHR1cmVzKTtcblxuICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgLy8gUmVsZWFzZSB1bi1yZXBsYWNlZCBtZXNoZXMgKGV4aXN0aW5nIGluIHByZXZpb3VzIGdlbmVyYXRpb24sIGJ1dCB3ZXJlbid0IGJ1aWx0IGZvciB0aGlzIG9uZSlcbiAgICAgICAgICAgIGZvciAobGV0IG0gaW4gdGhpcy5tZXNoZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXdfbWVzaF9zdHlsZXMuaW5kZXhPZihtKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzID0gW107XG5cbiAgICAgICAgICAgIC8vIFJlbGVhc2Ugb2xkIHRleHR1cmVzXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzLmZvckVhY2godCA9PiBUZXh0dXJlLnJlbGVhc2UodCkpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c190ZXh0dXJlcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmRlYnVnLmdlb21fcmF0aW8gPSAodGhpcy5kZWJ1Zy5nZW9tZXRyaWVzIC8gdGhpcy5kZWJ1Zy5mZWF0dXJlcykudG9GaXhlZCgxKTtcbiAgICAgICAgICAgIHRoaXMucHJpbnREZWJ1ZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgY29tcGxldGVzIHByb2Nlc3NpbmcsIGJ1dCB0aWxlIGhhcyBzaW5jZSBiZWVuIGRpc2NhcmRlZFxuICAgICAgICBGcmVlcyByZXNvdXJjZXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIHRpbGUgb2JqZWN0LlxuICAgICAgICBTdGF0aWMgbWV0aG9kIGJlY2F1c2UgdGhlIHRpbGUgb2JqZWN0IG5vIGxvbmdlciBleGlzdHMgKHRoZSB0aWxlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdvcmtlciBpcyBwYXNzZWQgaW5zdGVhZCkuXG4gICAgKi9cbiAgICBzdGF0aWMgYWJvcnRCdWlsZCAodGlsZSkge1xuICAgICAgICAvLyBSZWxlYXNlcyBtZXNoZXNcbiAgICAgICAgaWYgKHRpbGUubWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzIGluIHRpbGUubWVzaF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHR1cmVzID0gdGlsZS5tZXNoX2RhdGFbc10udGV4dHVyZXM7XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmVzLmZvckVhY2godCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgcmVsZWFzaW5nIHRleHR1cmUgJHt0fSBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUucmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcmVsYXRpdmUgdG8gdmlld1xuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSB0aGlzLmNvb3JkcztcbiAgICAgICAgaWYgKGNvb3Jkcy56ICE9PSB0aGlzLnZpZXcuY2VudGVyLnRpbGUueikge1xuICAgICAgICAgICAgY29vcmRzID0gVGlsZS5jb29yZGluYXRlQXRab29tKGNvb3JkcywgdGhpcy52aWV3LmNlbnRlci50aWxlLnopO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2VudGVyX2Rpc3QgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGNvb3Jkcy54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gY29vcmRzLnkpO1xuICAgIH1cblxuICAgIC8vIFNldCBhcyBhIHByb3h5IHRpbGUgZm9yIGFub3RoZXIgdGlsZVxuICAgIHNldFByb3h5Rm9yICh0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IgPSB0aGlzLnByb3h5X2ZvciB8fCBbXTtcbiAgICAgICAgICAgIHRoaXMucHJveHlfZm9yLnB1c2godGlsZSk7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2RlcHRoID0gMTsgLy8gZHJhdyBwcm94aWVzIGEgaGFsZi1sYXllciBiYWNrIChvcmRlciBpcyBzY2FsZWQgMnggdG8gYXZvaWQgaW50ZWdlciB0cnVuY2F0aW9uKVxuICAgICAgICAgICAgdGlsZS5wcm94aWVkX2FzID0gKHRpbGUuc3R5bGVfem9vbSA+IHRoaXMuc3R5bGVfem9vbSA/ICdjaGlsZCcgOiAncGFyZW50Jyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9kZXB0aCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm94eSB0aWxlcyBvbmx5IG5lZWQgdG8gcmVuZGVyIGEgc3BlY2lmaWMgc3R5bGUgaWYgYW55IG9mIHRoZSB0aWxlcyB0aGV5IGFyZSBwcm94eWluZyAqZm9yKlxuICAgIC8vIGhhdmVuJ3QgZmluaXNoZWQgbG9hZGluZyB0aGF0IHN0eWxlIHlldC4gSWYgYWxsIHByb3hpZWQgdGlsZXMgKmhhdmUqIGRhdGEgZm9yIHRoYXQgc3R5bGUsIHRoZW4gaXQnc1xuICAgIC8vIHNhZmUgdG8gaGlkZSB0aGUgcHJveHkgdGlsZSdzIHZlcnNpb24uXG4gICAgc2hvdWxkUHJveHlGb3JTdHlsZSAoc3R5bGUpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnByb3h5X2ZvciB8fCB0aGlzLnByb3h5X2Zvci5zb21lKHQgPT4gdC5tZXNoZXNbc3R5bGVdID09IG51bGwpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtb2RlbCBtYXRyaXggYW5kIHRpbGUgdW5pZm9ybXNcbiAgICBzZXR1cFByb2dyYW0gKHsgbW9kZWwsIG1vZGVsMzIgfSwgcHJvZ3JhbSkge1xuICAgICAgICAvLyBUaWxlIG9yaWdpblxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzRmdicsICd1X3RpbGVfb3JpZ2luJywgW3RoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMuc3R5bGVfem9vbSwgdGhpcy5jb29yZHMuel0pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfdGlsZV9wcm94eV9kZXB0aCcsIHRoaXMucHJveHlfZGVwdGgpO1xuXG4gICAgICAgIC8vIE1vZGVsIC0gdHJhbnNmb3JtIHRpbGUgc3BhY2UgaW50byB3b3JsZCBzcGFjZSAobWV0ZXJzLCBhYnNvbHV0ZSBtZXJjYXRvciBwb3NpdGlvbilcbiAgICAgICAgbWF0NC5pZGVudGl0eShtb2RlbCk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG1vZGVsLCBtb2RlbCwgdmVjMy5mcm9tVmFsdWVzKHRoaXMubWluLngsIHRoaXMubWluLnksIDApKTtcbiAgICAgICAgbWF0NC5zY2FsZShtb2RlbCwgbW9kZWwsIHZlYzMuZnJvbVZhbHVlcyh0aGlzLnNwYW4ueCAvIEdlby50aWxlX3NjYWxlLCAtMSAqIHRoaXMuc3Bhbi55IC8gR2VvLnRpbGVfc2NhbGUsIDEpKTsgLy8gc2NhbGUgdGlsZSBsb2NhbCBjb29yZHMgdG8gbWV0ZXJzXG4gICAgICAgIG1hdDQuY29weShtb2RlbDMyLCBtb2RlbCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfbW9kZWwnLCBtb2RlbDMyKTtcblxuICAgICAgICAvLyBGYWRlIGluIGxhYmVscyBhY2NvcmRpbmcgdG8gcHJveHkgc3RhdHVzLCBhdm9pZGluZyBcImZsaWNrZXJpbmdcIiB3aGVyZVxuICAgICAgICAvLyBsYWJlbHMgcXVpY2tseSBnbyBmcm9tIGludmlzaWJsZSBiYWNrIHRvIHZpc2libGVcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxaScsICd1X3RpbGVfZmFkZV9pbicsIHRoaXMuZmFkZV9pbiAmJiB0aGlzLnByb3hpZWRfYXMgIT09ICdjaGlsZCcpO1xuICAgIH1cblxuICAgIC8vIFNsaWNlIGEgc3Vic2V0IG9mIGtleXMgb3V0IG9mIGEgdGlsZVxuICAgIC8vIEluY2x1ZGVzIGEgbWluaW11bSBzZXQgb2YgcHJlLWRlZmluZWQga2V5cyBmb3IgbG9hZCBzdGF0ZSwgZGVidWcuIGV0Yy5cbiAgICAvLyBXZSB1c2UgdGhpcyB0byBzZW5kIGEgc3Vic2V0IG9mIHRoZSB0aWxlIGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkLCB0byBtaW5pbWl6ZSB1bm5lY2Vzc2FyeSBkYXRhIHRyYW5zZmVyXG4gICAgLy8gKGUuZy4gdmVyeSBsYXJnZSBpdGVtcyBsaWtlIGZlYXR1cmUgZ2VvbWV0cnkgYXJlIG5vdCBuZWVkZWQgb24gdGhlIG1haW4gdGhyZWFkKVxuICAgIHN0YXRpYyBzbGljZSAodGlsZSwga2V5cykge1xuICAgICAgICBsZXQga2VlcCA9IFtcbiAgICAgICAgICAgICdrZXknLFxuICAgICAgICAgICAgJ2xvYWRpbmcnLFxuICAgICAgICAgICAgJ2xvYWRlZCcsXG4gICAgICAgICAgICAnZ2VuZXJhdGlvbicsXG4gICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgJ2RlYnVnJ1xuICAgICAgICBdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgICAgICAgICAga2VlcC5wdXNoKC4uLmtleXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIHRpbGUgc3Vic2V0XG4gICAgICAgIHZhciB0aWxlX3N1YnNldCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBrPTA7IGsgPCBrZWVwLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBrZWVwW2tdO1xuICAgICAgICAgICAgdGlsZV9zdWJzZXRba2V5XSA9IHRpbGVba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aWxlX3N1YnNldDtcbiAgICB9XG5cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb3RoZXIpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdrZXknKSB7XG4gICAgICAgICAgICAgICAgdGhpc1trZXldID0gb3RoZXJba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcmludERlYnVnICgpIHtcbiAgICAgICAgbG9nKCdkZWJ1ZycsIGBUaWxlOiBkZWJ1ZyBmb3IgJHt0aGlzLmtleX06IFsgICR7SlNPTi5zdHJpbmdpZnkodGhpcy5kZWJ1Zyl9IF1gKTtcbiAgICB9XG5cbn1cblxuVGlsZS5jb29yZF9jaGlsZHJlbiA9IHt9OyAvLyBvbmx5IGFsbG9jYXRlIGNoaWxkcmVuIGNvb3JkaW5hdGVzIG9uY2UgcGVyIGNvb3JkaW5hdGVcbiIsImltcG9ydCBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgVGlsZVB5cmFtaWQgZnJvbSAnLi90aWxlX3B5cmFtaWQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yKHsgc2NlbmUsIHZpZXcgfSkge1xuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMudGlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5weXJhbWlkID0gbmV3IFRpbGVQeXJhbWlkKCk7XG4gICAgICAgIHRoaXMudmlzaWJsZV9jb29yZHMgPSB7fTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzID0gW107XG4gICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0gW107XG5cbiAgICAgICAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHRoaXMgb2JqZWN0IHRvIGJlIGNhbGxlZCBmcm9tIHdvcmtlciB0aHJlYWRzXG4gICAgICAgIHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0ID0gWydUaWxlTWFuYWdlcicsIHRoaXMuc2NlbmUuaWRdLmpvaW4oJ18nKTtcbiAgICAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCwgdGhpcyk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHRpbGUuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLnB5cmFtaWQgPSBudWxsO1xuICAgICAgICB0aGlzLnZpc2libGVfY29vcmRzID0ge307XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3JkcyA9IFtdO1xuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3ID0gbnVsbDtcbiAgICB9XG5cbiAgICBrZWVwVGlsZSh0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZXNbdGlsZS5rZXldID0gdGlsZTtcbiAgICAgICAgdGhpcy5weXJhbWlkLmFkZFRpbGUodGlsZSk7XG4gICAgfVxuXG4gICAgaGFzVGlsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZXNba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZvcmdldFRpbGUoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1RpbGUoa2V5KSkge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgICAgICB0aGlzLnB5cmFtaWQucmVtb3ZlVGlsZSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgIHRoaXMudGlsZUJ1aWxkU3RvcChrZXkpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhIHNpbmdsZSB0aWxlXG4gICAgcmVtb3ZlVGlsZShrZXkpIHtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0aWxlIHVubG9hZCBmb3IgJHtrZXl9YCk7XG5cbiAgICAgICAgdmFyIHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG5cbiAgICAgICAgaWYgKHRpbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGlsZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcmdldFRpbGUodGlsZS5rZXkpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG5cbiAgICAvLyBSdW4gYSBmdW5jdGlvbiBvbiBlYWNoIHRpbGVcbiAgICBmb3JFYWNoVGlsZShmdW5jKSB7XG4gICAgICAgIGZvciAobGV0IHQgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgZnVuYyh0aGlzLnRpbGVzW3RdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IHBhc3MgYSBmaWx0ZXIgY29uZGl0aW9uXG4gICAgcmVtb3ZlVGlsZXMoZmlsdGVyKSB7XG4gICAgICAgIGxldCByZW1vdmVfdGlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNbdF07XG4gICAgICAgICAgICBpZiAoZmlsdGVyKHRpbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlX3RpbGVzLnB1c2godCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgcmVtb3ZlX3RpbGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gcmVtb3ZlX3RpbGVzW3JdO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaWxlKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVUaWxlc0ZvclZpZXcoKSB7XG4gICAgICAgIC8vIEZpbmQgdmlzaWJsZSB0aWxlcyBhbmQgbG9hZCBuZXcgb25lc1xuICAgICAgICBsZXQgcHJldl9jb29yZHMgPSBPYmplY3Qua2V5cyh0aGlzLnZpc2libGVfY29vcmRzKTtcbiAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3JkcyA9IHt9O1xuICAgICAgICBsZXQgdGlsZV9jb29yZHMgPSB0aGlzLnZpZXcuZmluZFZpc2libGVUaWxlQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgdGlsZV9jb29yZHMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IHRpbGVfY29vcmRzW2NdO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZUNvb3JkaW5hdGUoY29vcmRzKTtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZV9jb29yZHNbY29vcmRzLmtleV0gPSBjb29yZHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB2aXNpYmxlIGNvb3JkcyBjaGFuZ2VkXG4gICAgICAgIC8vIFRPRE86IG1vdmUgdG8gYSBuZXcgdmlldyBtYW5hZ2VyIG9iamVjdFxuICAgICAgICBsZXQgbmV3X2Nvb3JkcyA9IE9iamVjdC5rZXlzKHRoaXMudmlzaWJsZV9jb29yZHMpO1xuICAgICAgICBsZXQgY29vcmRzX2NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHByZXZfY29vcmRzLmxlbmd0aCAhPT0gbmV3X2Nvb3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvb3Jkc19jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByZXZfY29vcmRzLnNvcnQoKTtcbiAgICAgICAgICAgIG5ld19jb29yZHMuc29ydCgpO1xuICAgICAgICAgICAgaWYgKCFwcmV2X2Nvb3Jkcy5ldmVyeSgoYywgaSkgPT4gbmV3X2Nvb3Jkc1tpXSA9PT0gYykpIHtcbiAgICAgICAgICAgICAgICBjb29yZHNfY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVRpbGVTdGF0ZXMoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVUaWxlU3RhdGVzICgpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSh0aWxlKTtcbiAgICAgICAgICAgIHRpbGUudXBkYXRlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubG9hZFF1ZXVlZENvb3JkaW5hdGVzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUHJveHlUaWxlcygpO1xuICAgICAgICB0aGlzLnZpZXcucHJ1bmVUaWxlc0ZvclZpZXcoKTtcbiAgICAgICAgdGhpcy51cGRhdGVSZW5kZXJhYmxlVGlsZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVTdHlsZXMoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQcm94eVRpbGVzICgpIHtcbiAgICAgICAgaWYgKHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgcHJveGllc1xuICAgICAgICB0aGlzLmZvckVhY2hUaWxlKHRpbGUgPT4gdGlsZS5zZXRQcm94eUZvcihudWxsKSk7XG5cbiAgICAgICAgbGV0IHByb3h5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9yRWFjaFRpbGUodGlsZSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGUudmlzaWJsZSAmJiAhdGlsZS5idWlsdCAmJiB0aWxlLmNvb3Jkcy56ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnB5cmFtaWQuZ2V0QW5jZXN0b3IodGlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5zZXRQcm94eUZvcih0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmICF0aWxlLmJ1aWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy5weXJhbWlkLmdldERlc2NlbmRhbnRzKHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBkZXNjZW5kYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHNbaV0uc2V0UHJveHlGb3IodGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm94eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcHJveHkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVWaXNpYmlsaXR5KHRpbGUpIHtcbiAgICAgICAgdGlsZS52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aWxlLnN0eWxlX3pvb20gPT09IHRoaXMudmlldy50aWxlX3pvb20pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpc2libGVfY29vcmRzW3RpbGUuY29vcmRzLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aWxlLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYnJ1dGUgZm9yY2VcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy52aXNpYmxlX2Nvb3Jkcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGlsZS5pc0Rlc2NlbmRhbnQodGlsZS5jb29yZHMsIHRoaXMudmlzaWJsZV9jb29yZHNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IGFyZW4ndCB2aXNpYmxlLCBhbmQgZmxhZyByZW1haW5pbmcgdmlzaWJsZSBvbmVzIHRvIGJlIHVwZGF0ZWQgKGZvciBsb2FkaW5nLCBwcm94eSwgZXRjLilcbiAgICBwcnVuZVRvVmlzaWJsZVRpbGVzICgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVUaWxlcyh0aWxlID0+ICF0aWxlLnZpc2libGUpO1xuICAgIH1cblxuICAgIGdldFJlbmRlcmFibGVUaWxlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmFibGVfdGlsZXM7XG4gICAgfVxuXG4gICAgdXBkYXRlUmVuZGVyYWJsZVRpbGVzKCkge1xuICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNbdF07XG4gICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmIHRpbGUubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJhYmxlX3RpbGVzLnB1c2godGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyYWJsZV90aWxlcztcbiAgICB9XG5cbiAgICBnZXRBY3RpdmVTdHlsZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVfc3R5bGVzO1xuICAgIH1cblxuICAgIHVwZGF0ZUFjdGl2ZVN0eWxlcyAoKSB7XG4gICAgICAgIGxldCB0aWxlcyA9IHRoaXMucmVuZGVyYWJsZV90aWxlcztcbiAgICAgICAgbGV0IGFjdGl2ZSA9IHt9O1xuICAgICAgICBmb3IgKGxldCB0PTA7IHQgPCB0aWxlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aWxlc1t0XTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRpbGUubWVzaGVzKS5mb3JFYWNoKHMgPT4gYWN0aXZlW3NdID0gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0gT2JqZWN0LmtleXMoYWN0aXZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlX3N0eWxlcztcbiAgICB9XG5cbiAgICBpc0xvYWRpbmdWaXNpYmxlVGlsZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnRpbGVzKS5zb21lKGsgPT4gdGhpcy50aWxlc1trXS52aXNpYmxlICYmICF0aGlzLnRpbGVzW2tdLmJ1aWx0KTtcbiAgICB9XG5cbiAgICAvLyBRdWV1ZSBhIHRpbGUgZm9yIGxvYWRcbiAgICBxdWV1ZUNvb3JkaW5hdGUoY29vcmRzKSB7XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3Jkc1t0aGlzLnF1ZXVlZF9jb29yZHMubGVuZ3RoXSA9IGNvb3JkcztcbiAgICB9XG5cbiAgICAvLyBMb2FkIGFsbCBxdWV1ZWQgdGlsZXNcbiAgICBsb2FkUXVldWVkQ29vcmRpbmF0ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlZF9jb29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IHF1ZXVlZCB0aWxlcyBmcm9tIGNlbnRlciB0aWxlXG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3Jkcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWQgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGEueCkgKyBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueSAtIGEueSk7XG4gICAgICAgICAgICBsZXQgYmQgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGIueCkgKyBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueSAtIGIueSk7XG4gICAgICAgICAgICByZXR1cm4gKGJkID4gYWQgPyAtMSA6IChiZCA9PT0gYWQgPyAwIDogMSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzLmZvckVhY2goY29vcmRzID0+IHRoaXMubG9hZENvb3JkaW5hdGUoY29vcmRzKSk7XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3JkcyA9IFtdO1xuICAgIH1cblxuICAgIC8vIExvYWQgYWxsIHRpbGVzIHRvIGNvdmVyIGEgZ2l2ZW4gbG9naWNhbCB0aWxlIGNvb3JkaW5hdGVcbiAgICBsb2FkQ29vcmRpbmF0ZShjb29yZHMpIHtcbiAgICAgICAgLy8gU2tpcCBpZiBub3QgYXQgY3VycmVudCBzY2VuZSB6b29tXG4gICAgICAgIGlmIChjb29yZHMueiAhPT0gdGhpcy52aWV3LmNlbnRlci50aWxlLnopIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSBuZWNlc3NhcnkgdGlsZXMgZm9yIGVhY2ggc291cmNlXG4gICAgICAgIGZvciAobGV0IHMgaW4gdGhpcy5zY2VuZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zY2VuZS5zb3VyY2VzW3NdO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBzb3VyY2Ugc2hvdWxkIGJ1aWxkIHRoaXMgdGlsZVxuICAgICAgICAgICAgaWYgKCFzb3VyY2UuYnVpbGRzX2dlb21ldHJ5X3RpbGVzIHx8ICFzb3VyY2UuaW5jbHVkZXNUaWxlKGNvb3JkcywgdGhpcy52aWV3LnRpbGVfem9vbSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGtleSA9IFRpbGUua2V5KGNvb3Jkcywgc291cmNlLCB0aGlzLnZpZXcudGlsZV96b29tKTtcbiAgICAgICAgICAgIGlmIChrZXkgJiYgIXRoaXMuaGFzVGlsZShrZXkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRpbGUgPSBUaWxlLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgY29vcmRzLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZXI6IHRoaXMuc2NlbmUuZ2V0V29ya2VyRm9yRGF0YVNvdXJjZShzb3VyY2UpLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZV96b29tOiB0aGlzLnZpZXcuc3R5bGVab29tKGNvb3Jkcy56KSxcbiAgICAgICAgICAgICAgICAgICAgdmlldzogdGhpcy52aWV3XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmtlZXBUaWxlKHRpbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRUaWxlKHRpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU29ydCBhbmQgYnVpbGQgYSBsaXN0IG9mIHRpbGVzXG4gICAgYnVpbGRUaWxlcyh0aWxlcykge1xuICAgICAgICBUaWxlLnNvcnQodGlsZXMpLmZvckVhY2godGlsZSA9PiB0aGlzLmJ1aWxkVGlsZSh0aWxlKSk7XG4gICAgICAgIHRoaXMuY2hlY2tCdWlsZFF1ZXVlKCk7XG4gICAgfVxuXG4gICAgYnVpbGRUaWxlKHRpbGUsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50aWxlQnVpbGRTdGFydCh0aWxlLmtleSk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSh0aWxlKTtcbiAgICAgICAgdGlsZS51cGRhdGUoKTtcbiAgICAgICAgdGlsZS5idWlsZCh0aGlzLnNjZW5lLmdlbmVyYXRpb24sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIGEgd2ViIHdvcmtlciBjb21wbGV0ZXMgcHJvY2Vzc2luZyBmb3IgYSBzaW5nbGUgdGlsZSAoaW5pdGlhbCBsb2FkLCBvciByZWJ1aWxkKVxuICAgIGJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZCh7IHRpbGUsIHByb2dyZXNzIH0pIHtcbiAgICAgICAgLy8gUmVtb3ZlZCB0aGlzIHRpbGUgZHVyaW5nIGxvYWQ/XG4gICAgICAgIGlmICh0aGlzLnRpbGVzW3RpbGUua2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYGRpc2NhcmRlZCB0aWxlICR7dGlsZS5rZXl9IGluIFRpbGVNYW5hZ2VyLmJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZCBiZWNhdXNlIHByZXZpb3VzbHkgcmVtb3ZlZGApO1xuICAgICAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaWxlU3RhdGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnVpbHQgd2l0aCBhbiBvdXRkYXRlZCBzY2VuZSBjb25maWd1cmF0aW9uP1xuICAgICAgICBlbHNlIGlmICh0aWxlLmdlbmVyYXRpb24gIT09IHRoaXMuc2NlbmUuZ2VuZXJhdGlvbikge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBkaXNjYXJkZWQgdGlsZSAke3RpbGUua2V5fSBpbiBUaWxlTWFuYWdlci5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWQgYmVjYXVzZSBidWlsdCB3aXRoIGAgK1xuICAgICAgICAgICAgICAgIGBzY2VuZSBjb25maWcgZ2VuICR7dGlsZS5nZW5lcmF0aW9ufSwgY3VycmVudCAke3RoaXMuc2NlbmUuZ2VuZXJhdGlvbn1gKTtcbiAgICAgICAgICAgIFRpbGUuYWJvcnRCdWlsZCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRpbGUgd2l0aCBwcm9wZXJ0aWVzIGZyb20gd29ya2VyXG4gICAgICAgICAgICBpZiAodGhpcy50aWxlc1t0aWxlLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1t0aWxlLmtleV0ubWVyZ2UodGlsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5idWlsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRpbGUuYnVpbGRNZXNoZXModGhpcy5zY2VuZS5zdHlsZXMsIHByb2dyZXNzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgdGhpcy50aWxlQnVpbGRTdG9wKHRpbGUua2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgZW5jb3VudGVycyBhbiBlcnJvciBidWlsZGluZyBhIHRpbGVcbiAgICBidWlsZFRpbGVFcnJvcih0aWxlKSB7XG4gICAgICAgIGxvZygnZXJyb3InLCBgRXJyb3IgYnVpbGRpbmcgdGlsZSAke3RpbGUua2V5fTpgLCB0aWxlLmVycm9yKTtcbiAgICAgICAgdGhpcy5mb3JnZXRUaWxlKHRpbGUua2V5KTtcbiAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgIH1cblxuICAgIC8vIFRyYWNrIHRpbGUgYnVpbGQgc3RhdGVcbiAgICB0aWxlQnVpbGRTdGFydChrZXkpIHtcbiAgICAgICAgdGhpcy5idWlsZGluZ190aWxlcyA9IHRoaXMuYnVpbGRpbmdfdGlsZXMgfHwge307XG4gICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXNba2V5XSA9IHRydWU7XG4gICAgICAgIGxvZygndHJhY2UnLCBgdGlsZUJ1aWxkU3RhcnQgZm9yICR7a2V5fTogJHtPYmplY3Qua2V5cyh0aGlzLmJ1aWxkaW5nX3RpbGVzKS5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgdGlsZUJ1aWxkU3RvcChrZXkpIHtcbiAgICAgICAgLy8gRG9uZSBidWlsZGluZz9cbiAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmdfdGlsZXMpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgdGlsZUJ1aWxkU3RvcCBmb3IgJHtrZXl9OiAke09iamVjdC5rZXlzKHRoaXMuYnVpbGRpbmdfdGlsZXMpLmxlbmd0aH1gKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1aWxkaW5nX3RpbGVzW2tleV07XG4gICAgICAgICAgICB0aGlzLmNoZWNrQnVpbGRRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgc3RhdHVzIG9mIHRpbGUgYnVpbGRpbmcgcXVldWUgYW5kIG5vdGlmeSBzY2VuZSB3aGVuIHdlJ3JlIGRvbmVcbiAgICBjaGVja0J1aWxkUXVldWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5idWlsZGluZ190aWxlcyB8fCBPYmplY3Qua2V5cyh0aGlzLmJ1aWxkaW5nX3RpbGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zY2VuZS50aWxlTWFuYWdlckJ1aWxkRG9uZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VtIG9mIGEgZGVidWcgcHJvcGVydHkgYWNyb3NzIHRpbGVzXG4gICAgZ2V0RGVidWdTdW0ocHJvcCwgZmlsdGVyKSB7XG4gICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICBmb3IgKHZhciB0IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbGVzW3RdLmRlYnVnW3Byb3BdICE9IG51bGwgJiYgKHR5cGVvZiBmaWx0ZXIgIT09ICdmdW5jdGlvbicgfHwgZmlsdGVyKHRoaXMudGlsZXNbdF0pID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgIHN1bSArPSB0aGlzLnRpbGVzW3RdLmRlYnVnW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgLy8gQXZlcmFnZSBvZiBhIGRlYnVnIHByb3BlcnR5IGFjcm9zcyB0aWxlc1xuICAgIGdldERlYnVnQXZlcmFnZShwcm9wLCBmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVidWdTdW0ocHJvcCwgZmlsdGVyKSAvIE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aDtcbiAgICB9XG5cbn1cbiIsImltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZVB5cmFtaWQge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29vcmRzID0ge307XG4gICAgICAgIHRoaXMubWF4X3Byb3h5X2Rlc2NlbmRhbnRfZGVwdGggPSAzOyAvLyAjIG9mIGxldmVscyBkZWVwIHRvIHNlYXJjaCBmb3IgZGVzY2VuZGFudCBwcm94eSB0aWxlc1xuICAgIH1cblxuICAgIHNvdXJjZVRpbGVzKGNvb3JkLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuY29vcmRzW2Nvb3JkLmtleV0gJiZcbiAgICAgICAgICAgIHRoaXMuY29vcmRzW2Nvb3JkLmtleV0uc291cmNlcyAmJlxuICAgICAgICAgICAgdGhpcy5jb29yZHNbY29vcmQua2V5XS5zb3VyY2VzW3NvdXJjZS5uYW1lXSk7XG4gICAgfVxuXG4gICAgYWRkVGlsZSh0aWxlKSB7XG4gICAgICAgIC8vIEFkZCB0YXJnZXQgdGlsZVxuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuICAgICAgICBsZXQgY29vcmQgPSB0aGlzLmNvb3Jkc1trZXldO1xuICAgICAgICBpZiAoIWNvb3JkKSB7XG4gICAgICAgICAgICBjb29yZCA9IHRoaXMuY29vcmRzW2tleV0gPSB7IGRlc2NlbmRhbnRzOiAwIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvb3JkLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvb3JkLnNvdXJjZXMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29vcmQuc291cmNlc1t0aWxlLnNvdXJjZS5uYW1lXSkge1xuICAgICAgICAgICAgY29vcmQuc291cmNlc1t0aWxlLnNvdXJjZS5uYW1lXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvb3JkLnNvdXJjZXNbdGlsZS5zb3VyY2UubmFtZV1bdGlsZS5zdHlsZV96b29tXSA9IHRpbGU7XG5cbiAgICAgICAgLy8gSW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudCB1cCB0aGUgdGlsZSBweXJhbWlkXG4gICAgICAgIGZvciAobGV0IHogPSB0aWxlLmNvb3Jkcy56IC0gMTsgeiA+PSAwOyB6LS0pIHtcbiAgICAgICAgICAgIGxldCB1cCA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbSh0aWxlLmNvb3Jkcywgeik7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29vcmRzW3VwLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvb3Jkc1t1cC5rZXldID0geyBkZXNjZW5kYW50czogMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb29yZHNbdXAua2V5XS5kZXNjZW5kYW50cysrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlVGlsZSh0aWxlKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0YXJnZXQgdGlsZVxuICAgICAgICBsZXQgc291cmNlX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyh0aWxlLmNvb3JkcywgdGlsZS5zb3VyY2UpO1xuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuXG4gICAgICAgIGlmIChzb3VyY2VfdGlsZXMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzb3VyY2VfdGlsZXNbdGlsZS5zdHlsZV96b29tXTtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzb3VyY2VfdGlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzb3VyY2VcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNba2V5XS5zb3VyY2VzW3RpbGUuc291cmNlLm5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmNvb3Jkc1trZXldLnNvdXJjZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNba2V5XS5zb3VyY2VzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1trZXldLmRlc2NlbmRhbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgd2hvbGUgY29vcmRcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1trZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCB1cCB0aGUgdGlsZSBweXJhbWlkXG4gICAgICAgIGZvciAobGV0IHogPSB0aWxlLmNvb3Jkcy56IC0gMTsgeiA+PSAwOyB6LS0pIHtcbiAgICAgICAgICAgIGxldCBkb3duID0gVGlsZS5jb29yZGluYXRlQXRab29tKHRpbGUuY29vcmRzLCB6KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1tkb3duLmtleV0gJiYgdGhpcy5jb29yZHNbZG93bi5rZXldLmRlc2NlbmRhbnRzID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzW2Rvd24ua2V5XS5kZXNjZW5kYW50cy0tO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1tkb3duLmtleV0uZGVzY2VuZGFudHMgPT09IDAgJiYgIXRoaXMuY29vcmRzW2Rvd24ua2V5XS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1tkb3duLmtleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0QW5jZXN0b3IgKHsgY29vcmRzLCBzdHlsZV96b29tLCBzb3VyY2UgfSkge1xuICAgICAgICAvLyBGaXJzdCBjaGVjayBvdmVyem9vbWVkIHRpbGVzIGF0IHNhbWUgY29vcmRpbmF0ZSB6b29tXG4gICAgICAgIGlmIChzdHlsZV96b29tID4gc291cmNlLm1heF96b29tKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhjb29yZHMsIHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IHN0eWxlX3pvb20gLSAxOyB6ID49IHNvdXJjZS5tYXhfem9vbTsgei0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXNbel0gJiYgc291cmNlX3RpbGVzW3pdLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZV90aWxlc1t6XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0eWxlX3pvb20gPSBzb3VyY2UubWF4X3pvb207XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aWxlcyBhdCBuZXh0IHpvb20gdXBcbiAgICAgICAgc3R5bGVfem9vbS0tO1xuICAgICAgICBsZXQgcGFyZW50ID0gVGlsZS5jb29yZGluYXRlQXRab29tKGNvb3JkcywgY29vcmRzLnogLSAxKTtcbiAgICAgICAgbGV0IHBhcmVudF90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMocGFyZW50LCBzb3VyY2UpO1xuICAgICAgICBpZiAocGFyZW50X3RpbGVzICYmIHBhcmVudF90aWxlc1tzdHlsZV96b29tXSAmJiBwYXJlbnRfdGlsZXNbc3R5bGVfem9vbV0ubG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50X3RpbGVzW3N0eWxlX3pvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRpZG4ndCBmaW5kIGFuY2VzdG9yLCB0cnkgbmV4dCBsZXZlbFxuICAgICAgICAvLyBUT0RPOiBtYXggZGVwdGggbGV2ZWxzIHRvIGNoZWNrXG4gICAgICAgIGlmIChwYXJlbnQueiA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEFuY2VzdG9yKHsgY29vcmRzOiBwYXJlbnQsIHN0eWxlX3pvb20sIHNvdXJjZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldERlc2NlbmRhbnRzICh7IGNvb3Jkcywgc3R5bGVfem9vbSwgc291cmNlIH0sIGxldmVsID0gMSkge1xuICAgICAgICBsZXQgZGVzY2VuZGFudHMgPSBbXTtcblxuICAgICAgICAvLyBGaXJzdCBjaGVjayBvdmVyem9vbWVkIHRpbGVzIGF0IHNhbWUgY29vcmRpbmF0ZSB6b29tXG4gICAgICAgIGlmIChzdHlsZV96b29tID49IHNvdXJjZS5tYXhfem9vbSkge1xuICAgICAgICAgICAgbGV0IHNvdXJjZV90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMoY29vcmRzLCBzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlcykge1xuICAgICAgICAgICAgICAgIGxldCBzZWFyY2hfbWF4X3pvb20gPSBNYXRoLm1heChHZW8uZGVmYXVsdF92aWV3X21heF96b29tLCBzdHlsZV96b29tICsgdGhpcy5tYXhfcHJveHlfZGVzY2VuZGFudF9kZXB0aCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IHN0eWxlX3pvb20gKyAxOyB6IDw9IHNlYXJjaF9tYXhfem9vbTsgeisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXNbel0gJiYgc291cmNlX3RpbGVzW3pdLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChzb3VyY2VfdGlsZXNbel0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGlsZXMgYXQgbmV4dCB6b29tIGRvd25cbiAgICAgICAgaWYgKHRoaXMuY29vcmRzW2Nvb3Jkcy5rZXldICYmIHRoaXMuY29vcmRzW2Nvb3Jkcy5rZXldLmRlc2NlbmRhbnRzID4gMCkge1xuICAgICAgICAgICAgc3R5bGVfem9vbSsrO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBUaWxlLmNoaWxkcmVuRm9yQ29vcmRpbmF0ZShjb29yZHMpO1xuICAgICAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgY2hpbGRyZW4ubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2NdO1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZF90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMoY2hpbGQsIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkX3RpbGVzICYmIGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dICYmIGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgY2hpbGQsIHRyeSBuZXh0IGxldmVsXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPD0gdGhpcy5tYXhfcHJveHlfZGVzY2VuZGFudF9kZXB0aCAmJiBjaGlsZC56IDw9IHNvdXJjZS5tYXhfem9vbSkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKC4uLnRoaXMuZ2V0RGVzY2VuZGFudHMoeyBjb29yZHM6IGNoaWxkLCBzb3VyY2UsIHN0eWxlX3pvb20gfSwgbGV2ZWwgKyAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgIH1cblxufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIGRyYXdzIGEgYmx1ZSByZWN0YW5nbGUgYm9yZGVyIGFyb3VuZCB0aGUgY29sbGlzaW9uIGJveCBvZiBhIGxhYmVsXG4gICAgZHJhd19sYWJlbF9jb2xsaXNpb25fYm94ZXM6IGZhbHNlLFxuICAgIC8vIGRyYXdzIGEgZ3JlZW4gcmVjdGFuZ2xlIGJvcmRlciB3aXRoaW4gdGhlIHRleHR1cmUgYm94IG9mIGEgbGFiZWxcbiAgICBkcmF3X2xhYmVsX3RleHR1cmVfYm94ZXM6IGZhbHNlLFxuICAgIC8vIHN1cHByZXNlcyBmYWRlLWluIG9mIGxhYmVsc1xuICAgIHN1cHByZXNzX2xhYmVsX2ZhZGVfaW46IGZhbHNlLFxuICAgIC8vIHN1cHByZXNzIGFuaW1hdG9uIG9mIGxhYmVsIHNuYXAgdG8gcGl4ZWwgZ3JpZFxuICAgIHN1cHByZXNzX2xhYmVsX3NuYXBfYW5pbWF0aW9uOiBmYWxzZVxufTtcbiIsIlxuXG5leHBvcnQgY2xhc3MgTWV0aG9kTm90SW1wbGVtZW50ZWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kTmFtZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm5hbWUgICAgPSAnTWV0aG9kTm90SW1wbGVtZW50ZWQnO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnTWV0aG9kICcgKyBtZXRob2ROYW1lICsgJyBtdXN0IGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzJztcbiAgICB9XG59XG4iLCIvLyBQYXJ0aWFsIGltcG9ydCBvZiBnbC1tYXRyaXggdmlhIG1vZHVsYXJpemVkIHN0YWNrLWdsIGZvcmtzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdG9qaS9nbC1tYXRyaXhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFja2dsXG5cbi8vIHZlYzNcblxuLy8gU3Vic3RpdHV0ZSA2NC1iaXQgdmVyc2lvblxuLy8gV2UgbmVlZCB0aGUgZXh0cmEgcHJlY2lzaW9uIHdoZW4gbXVsdGlwbHlpbmcgbWF0cmljZXMgdy9tZXJjYXRvciBwcm9qZWN0ZWQgdmFsdWVzXG5jb25zdCB2ZWMzID0ge1xuICAgIGZyb21WYWx1ZXMgKHgsIHksIHopIHtcbiAgICAgICAgdmFyIG91dCA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XG4gICAgICAgIG91dFswXSA9IHg7XG4gICAgICAgIG91dFsxXSA9IHk7XG4gICAgICAgIG91dFsyXSA9IHo7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxufTtcblxuXG4vLyBtYXQzXG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQzX25vcm1hbEZyb21NYXQ0fSBmcm9tICdnbC1tYXQzL25vcm1hbC1mcm9tLW1hdDQnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDNfaW52ZXJ0fSBmcm9tICdnbC1tYXQzL2ludmVydCc7XG5cbmNvbnN0IG1hdDMgPSB7XG4gICAgbm9ybWFsRnJvbU1hdDQ6IG1hdDNfbm9ybWFsRnJvbU1hdDQsXG4gICAgaW52ZXJ0OiBtYXQzX2ludmVydFxufTtcblxuXG4vLyBtYXQ0XG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X211bHRpcGx5fSBmcm9tICdnbC1tYXQ0L211bHRpcGx5JztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X3RyYW5zbGF0ZX0gZnJvbSAnZ2wtbWF0NC90cmFuc2xhdGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfc2NhbGV9IGZyb20gJ2dsLW1hdDQvc2NhbGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfcGVyc3BlY3RpdmV9IGZyb20gJ2dsLW1hdDQvcGVyc3BlY3RpdmUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfbG9va0F0fSBmcm9tICdnbC1tYXQ0L2xvb2tBdCc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9pZGVudGl0eX0gZnJvbSAnZ2wtbWF0NC9pZGVudGl0eSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9jb3B5fSBmcm9tICdnbC1tYXQ0L2NvcHknO1xuXG5jb25zdCBtYXQ0ID0ge1xuICAgIG11bHRpcGx5OiBtYXQ0X211bHRpcGx5LFxuICAgIHRyYW5zbGF0ZTogbWF0NF90cmFuc2xhdGUsXG4gICAgc2NhbGU6IG1hdDRfc2NhbGUsXG4gICAgcGVyc3BlY3RpdmU6IG1hdDRfcGVyc3BlY3RpdmUsXG4gICAgbG9va0F0OiBtYXQ0X2xvb2tBdCxcbiAgICBpZGVudGl0eTogbWF0NF9pZGVudGl0eSxcbiAgICBjb3B5OiBtYXQ0X2NvcHlcbn07XG5cblxuZXhwb3J0IHt2ZWMzLCBtYXQzLCBtYXQ0fTtcbiIsImltcG9ydCB2ZXJzaW9uIGZyb20gJy4vdmVyc2lvbic7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi93b3JrZXJfYnJva2VyJztcblxuY29uc3QgTEVWRUxTID0ge1xuICAgIHNpbGVudDogLTEsXG4gICAgZXJyb3I6IDAsXG4gICAgd2FybjogMSxcbiAgICBpbmZvOiAyLFxuICAgIGRlYnVnOiAzLFxuICAgIHRyYWNlOiA0XG59O1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbmZ1bmN0aW9uIG1ldGhvZEZvckxldmVsIChsZXZlbCkge1xuICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgICAgICBtZXRob2RzW2xldmVsXSA9IG1ldGhvZHNbbGV2ZWxdIHx8IChjb25zb2xlW2xldmVsXSA/IGNvbnNvbGVbbGV2ZWxdIDogY29uc29sZS5sb2cpLmJpbmQoY29uc29sZSk7XG4gICAgICAgIHJldHVybiBtZXRob2RzW2xldmVsXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvZyAobXNnX2xldmVsLCAuLi5tc2cpIHtcbiAgICBpZiAoTEVWRUxTW21zZ19sZXZlbF0gPD0gTEVWRUxTW2xvZy5sZXZlbF0pIHtcbiAgICAgICAgaWYgKFRocmVhZC5pc193b3JrZXIpIHtcbiAgICAgICAgICAgIC8vIFByb3h5IHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ19sb2dQcm94eScsIG1zZ19sZXZlbCwgLi4ubXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsb2dnZXIgPSBtZXRob2RGb3JMZXZlbChtc2dfbGV2ZWwpO1xuXG4gICAgICAgICAgICAvLyBXcml0ZSB0byBjb25zb2xlIChvbiBtYWluIHRocmVhZClcbiAgICAgICAgICAgIGlmIChtc2cubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlcihgVGFuZ3JhbSAke3ZlcnNpb259IFske21zZ19sZXZlbH1dOiAke21zZ1swXX1gLCAuLi5tc2cuc2xpY2UoMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyKGBUYW5ncmFtICR7dmVyc2lvbn0gWyR7bXNnX2xldmVsfV06ICR7bXNnWzBdfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5sb2cubGV2ZWwgPSAnaW5mbyc7XG5sb2cud29ya2VycyA9IG51bGw7XG5cbmxvZy5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkge1xuICAgIGxvZy5sZXZlbCA9IGxldmVsO1xuXG4gICAgaWYgKFRocmVhZC5pc19tYWluICYmIEFycmF5LmlzQXJyYXkobG9nLndvcmtlcnMpKSB7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShsb2cud29ya2VycywgJ19sb2dTZXRMZXZlbFByb3h5JywgbGV2ZWwpO1xuICAgIH1cbn07XG5cbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIGxvZy5zZXRXb3JrZXJzID0gZnVuY3Rpb24gKHdvcmtlcnMpIHtcbiAgICAgICAgbG9nLndvcmtlcnMgPSB3b3JrZXJzO1xuICAgIH07XG5cblxufVxuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdfbG9nUHJveHknLCBsb2cpOyAgICAgICAgICAgICAgICAgICAvLyBwcm94eSBsb2cgbWVzc2FnZXMgZnJvbSB3b3JrZXIgdG8gbWFpbiB0aHJlYWRcbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ19sb2dTZXRMZXZlbFByb3h5JywgbG9nLnNldExldmVsKTsgIC8vIHByb3h5IGxvZyBsZXZlbCBzZXR0aW5nIGZyb20gbWFpbiB0byB3b3JrZXIgdGhyZWFkXG4iLCIvKiBnbG9iYWwgTWVkaWFSZWNvcmRlciAqL1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQge2NyZWF0ZU9iamVjdFVSTH0gZnJvbSAnLi91cmxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVkaWFDYXB0dXJlIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUgPSBudWxsO1xuICAgIH1cblxuICAgIHNldENhbnZhcyAoY2FudmFzKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuICAgIH1cblxuICAgIC8vIFRha2UgYSBzY3JlZW5zaG90LCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNjcmVlbnNob3QgZGF0YSB3aGVuIGF2YWlsYWJsZVxuICAgIHNjcmVlbnNob3QgKCkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZV9zY3JlZW5zaG90ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZTsgLy8gb25seSBjYXB0dXJlIG9uZSBzY3JlZW5zaG90IGF0IGEgdGltZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2lsbCByZXNvbHZlIG9uY2UgcmVuZGVyaW5nIGlzIGNvbXBsZXRlIGFuZCByZW5kZXIgYnVmZmVyIGlzIGNhcHR1cmVkXG4gICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdCA9IHt9O1xuICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnByb21pc2U7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIGFmdGVyIHJlbmRlcmluZywgY2FwdHVyZXMgcmVuZGVyIGJ1ZmZlciBhbmQgcmVzb2x2ZXMgcHJvbWlzZSB3aXRoIHRoZSBpbWFnZSBkYXRhXG4gICAgY29tcGxldGVTY3JlZW5zaG90ICgpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWVfc2NyZWVuc2hvdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBHZXQgZGF0YSBVUkwsIGNvbnZlcnQgdG8gYmxvYlxuICAgICAgICAgICAgLy8gU3RyaXAgaG9zdC9taW1ldHlwZS9ldGMuLCBjb252ZXJ0IGJhc2U2NCB0byBiaW5hcnkgd2l0aG91dCBVVEYtOCBtYW5nbGluZ1xuICAgICAgICAgICAgLy8gQWRhcHRlZCBmcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS91bmNvbmVkLzQzNzA4MjJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXRvYih1cmwuc2xpY2UoMjIpKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiAnaW1hZ2UvcG5nJyB9KTtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSB3aXRoIHNjcmVlbnNob3QgZGF0YVxuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlc29sdmUoeyB1cmwsIGJsb2IsIHR5cGU6ICdwbmcnIH0pO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0YXJ0cyBjYXB0dXJpbmcgYSB2aWRlbyBzdHJlYW0gZnJvbSB0aGUgY2FudmFzXG4gICAgc3RhcnRWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5NZWRpYVJlY29yZGVyICE9PSAnZnVuY3Rpb24nIHx8ICF0aGlzLmNhbnZhcyB8fCB0eXBlb2YgdGhpcy5jYW52YXMuY2FwdHVyZVN0cmVhbSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZpZGVvIGNhcHR1cmUgKENhbnZhcy5jYXB0dXJlU3RyZWFtIGFuZC9vciBNZWRpYVJlY29yZGVyIEFQSXMpIG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3NlcicpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmlkZW9fY2FwdHVyZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZpZGVvIGNhcHR1cmUgYWxyZWFkeSBpbiBwcm9ncmVzcywgY2FsbCBTY2VuZS5zdG9wVmlkZW9DYXB0dXJlKCkgZmlyc3QnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IGEgbmV3IGNhcHR1cmVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjYXAgPSB0aGlzLnZpZGVvX2NhcHR1cmUgPSB7fTtcbiAgICAgICAgICAgIGNhcC5jaHVua3MgPSBbXTtcbiAgICAgICAgICAgIGNhcC5zdHJlYW0gPSB0aGlzLmNhbnZhcy5jYXB0dXJlU3RyZWFtKCk7XG4gICAgICAgICAgICBjYXAub3B0aW9ucyA9IHsgbWltZVR5cGU6ICd2aWRlby93ZWJtJyB9OyAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIGZvcm1hdCBvcHRpb25zXG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlcihjYXAuc3RyZWFtLCBjYXAub3B0aW9ucyk7XG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICBjYXAuY2h1bmtzLnB1c2goZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RvcHBlZCByZWNvcmRpbmc/IENyZWF0ZSB0aGUgZmluYWwgY2FwdHVyZSBmaWxlIGJsb2JcbiAgICAgICAgICAgICAgICBpZiAoY2FwLnJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJsb2IgPSBuZXcgQmxvYihjYXAuY2h1bmtzLCB7IHR5cGU6IGNhcC5vcHRpb25zLm1pbWVUeXBlIH0pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgcmVtb3ZlIGFsbCBzdHJlYW0gdHJhY2tzLCBhbmQgc2V0IG9iamVjdHMgdG8gbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FwLnN0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYWNrcyA9IGNhcC5zdHJlYW0uZ2V0VHJhY2tzKCkgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja3MuZm9yRWFjaCh0cmFjayA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2suc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcC5zdHJlYW0ucmVtb3ZlVHJhY2sodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FwLnN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGNhcC5tZWRpYV9yZWNvcmRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FwLnJlc29sdmUoeyB1cmwsIGJsb2IsIHR5cGU6ICd3ZWJtJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FwLm1lZGlhX3JlY29yZGVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgJ1NjZW5lIHZpZGVvIGNhcHR1cmUgZmFpbGVkJywgZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU3RvcHMgY2FwdHVyaW5nIGEgdmlkZW8gc3RyZWFtIGZyb20gdGhlIGNhbnZhcywgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2aWRlbyB3aGVuIGF2YWlsYWJsZVxuICAgIHN0b3BWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9fY2FwdHVyZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ05vIHNjZW5lIHZpZGVvIGNhcHR1cmUgaW4gcHJvZ3Jlc3MsIGNhbGwgU2NlbmUuc3RhcnRWaWRlb0NhcHR1cmUoKSBmaXJzdCcpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIHdoZW4gZmluYWwgc3RyZWFtIGlzIGF2YWlsYWJsZVxuICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0b3AgcmVjb3JkaW5nXG4gICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5tZWRpYV9yZWNvcmRlci5zdG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW9fY2FwdHVyZS5wcm9taXNlO1xuICAgIH1cblxufVxuIiwiLy8gRGVlcC9yZWN1cnNpdmUgbWVyZ2Ugb2Ygb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgaW50byBhIGRlc3RpbmF0aW9uIG9iamVjdFxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VPYmplY3RzIChkZXN0LCAuLi5zb3VyY2VzKSB7XG4gICAgZm9yIChsZXQgcz0wOyBzIDwgc291cmNlcy5sZW5ndGg7IHMrKykge1xuICAgICAgICBsZXQgc291cmNlID0gc291cmNlc1tzXTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2UgdGhlIHNvdXJjZSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBpZiBpdCBpcyBhIGEgbm9uLW51bGwga2V5L3ZhbHVlIG9iamVjdFxuICAgICAgICAgICAgLy8gKGUuZy4gZG9uJ3QgbWVyZ2UgYXJyYXlzLCB0aG9zZSBhcmUgdHJlYXRlZCBhcyBzY2FsYXIgdmFsdWVzOyBudWxsIHZhbHVlcyB3aWxsIG92ZXJ3cml0ZS9lcmFzZVxuICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzIGRlc3RpbmF0aW9uIHZhbHVlKVxuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3Rba2V5XSAhPT0gbnVsbCAmJiB0eXBlb2YgZGVzdFtrZXldID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkZXN0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IG1lcmdlT2JqZWN0cyhkZXN0W2tleV0sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IG1lcmdlT2JqZWN0cyh7fSwgdmFsdWUpOyAvLyBkZXN0aW5hdGlvbiBub3QgYW4gb2JqZWN0LCBvdmVyd3JpdGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIHByZXZpb3VzIGRlc3RpbmF0aW9uIHZhbHVlIGlmIHRoZSBzb3VyY2UgcHJvcGVydHkgaXM6IGEgc2NhbGFyIChudW1iZXIvc3RyaW5nKSxcbiAgICAgICAgICAgIC8vIGFuIGFycmF5LCBvciBhIG51bGwgdmFsdWVcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZXN0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVuZGVmaW5lZCBzb3VyY2UgcHJvcGVydGllcyBhcmUgaWdub3JlZFxuICAgICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59XG4iLCJpbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9CQiB7XG5cbiAgICBjb25zdHJ1Y3RvciAoeCwgeSwgYSwgdywgaCkge1xuICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IFt3LCBoXTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGE7XG4gICAgICAgIHRoaXMuY2VudHJvaWQgPSBbeCwgeV07XG4gICAgICAgIHRoaXMucXVhZCA9IFtdO1xuICAgICAgICB0aGlzLmF4ZXMgPSBbXTtcblxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIG1vdmUgKHB4LCBweSkge1xuICAgIFx0dGhpcy5jZW50cm9pZCA9IFtweCwgcHldO1xuXG4gICAgXHR0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGdldEV4dGVudCAoKSB7XG4gICAgXHRsZXQgaW5mID0gMWU2O1xuICAgIFx0bGV0IGFhYmIgPSBbaW5mLCBpbmYsIC1pbmYsIC1pbmZdO1xuXG4gICAgXHRmb3IgKGxldCBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgYWFiYlswXSA9IE1hdGgubWluKHRoaXMucXVhZFtpXVswXSwgYWFiYlswXSk7XG4gICAgICAgICAgICBhYWJiWzFdID0gTWF0aC5taW4odGhpcy5xdWFkW2ldWzFdLCBhYWJiWzFdKTtcbiAgICAgICAgICAgIGFhYmJbMl0gPSBNYXRoLm1heCh0aGlzLnF1YWRbaV1bMF0sIGFhYmJbMl0pO1xuICAgICAgICAgICAgYWFiYlszXSA9IE1hdGgubWF4KHRoaXMucXVhZFtpXVsxXSwgYWFiYlszXSk7XG4gICAgXHR9XG5cbiAgICBcdHJldHVybiBhYWJiO1xuICAgIH1cblxuICAgIHBlcnBBeGVzICgpIHtcbiAgICBcdHRoaXMuYXhlc1swXSA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnN1Yih0aGlzLnF1YWRbMl0sIHRoaXMucXVhZFszXSkpO1xuICAgIFx0dGhpcy5heGVzWzFdID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3Iuc3ViKHRoaXMucXVhZFsyXSwgdGhpcy5xdWFkWzFdKSk7XG4gICAgfVxuXG4gICAgdXBkYXRlICgpIHtcbiAgICBcdGxldCB4ID0gWyBNYXRoLmNvcyh0aGlzLmFuZ2xlKSwgTWF0aC5zaW4odGhpcy5hbmdsZSldO1xuICAgIFx0bGV0IHkgPSBbLU1hdGguc2luKHRoaXMuYW5nbGUpLCBNYXRoLmNvcyh0aGlzLmFuZ2xlKV07XG5cbiAgICBcdHggPSBWZWN0b3IubXVsdCh4LCB0aGlzLmRpbWVuc2lvblswXSAvIDIuMCk7XG4gICAgXHR5ID0gVmVjdG9yLm11bHQoeSwgdGhpcy5kaW1lbnNpb25bMV0gLyAyLjApO1xuXG4gICAgXHR0aGlzLnF1YWRbMF0gPSBWZWN0b3Iuc3ViKFZlY3Rvci5zdWIodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyBsb3dlci1sZWZ0XG4gICAgXHR0aGlzLnF1YWRbMV0gPSBWZWN0b3Iuc3ViKFZlY3Rvci5hZGQodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyBsb3dlci1yaWdodFxuICAgIFx0dGhpcy5xdWFkWzJdID0gVmVjdG9yLmFkZChWZWN0b3IuYWRkKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gdXBlci1yaWdodFxuICAgIFx0dGhpcy5xdWFkWzNdID0gVmVjdG9yLmFkZChWZWN0b3Iuc3ViKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gdXBlci1sZWZ0XG5cbiAgICBcdHRoaXMucGVycEF4ZXMoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcHJvamVjdFRvQXhpcyAob2JiLCBheGlzKSB7XG4gICAgXHRsZXQgaW5mID0gMWU2O1xuICAgIFx0bGV0IG1pbiA9IGluZjtcbiAgICBcdGxldCBtYXggPSAtaW5mO1xuXG4gICAgXHRsZXQgcXVhZCA9IG9iYi5xdWFkO1xuXG4gICAgXHQvLyBmb3IgZWFjaCBheGlzLCBwcm9qZWN0IG9iYiBxdWFkIHRvIGl0IGFuZCBmaW5kIG1pbiBhbmQgbWF4IHZhbHVlc1xuICAgIFx0Zm9yIChsZXQgaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgICAgIGxldCBkID0gIFZlY3Rvci5kb3QocXVhZFtpXSwgYXhpcyk7XG4gICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIGQpO1xuICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBkKTtcbiAgICBcdH1cblxuICAgIFx0cmV0dXJuIFttaW4sIG1heF07XG4gICAgfVxuXG4gICAgc3RhdGljIGF4aXNDb2xsaWRlIChvYmJfYSwgb2JiX2IsIGF4ZXMpIHtcbiAgICBcdGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgXHRcdGxldCBhX3Byb2ogPSBPQkIucHJvamVjdFRvQXhpcyhvYmJfYSwgYXhlc1tpXSk7XG4gICAgXHRcdGxldCBiX3Byb2ogPSBPQkIucHJvamVjdFRvQXhpcyhvYmJfYiwgYXhlc1tpXSk7XG5cbiAgICBcdFx0aWYgKGJfcHJvalswXSA+IGFfcHJvalsxXSB8fCBiX3Byb2pbMV0gPCBhX3Byb2pbMF0pIHtcbiAgICBcdFx0XHRyZXR1cm4gZmFsc2U7XG4gICAgXHRcdH1cbiAgICBcdH1cbiAgICBcdHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcnNlY3Qob2JiX2EsIG9iYl9iKSB7XG4gICAgXHRyZXR1cm4gT0JCLmF4aXNDb2xsaWRlKG9iYl9hLCBvYmJfYiwgb2JiX2EuYXhlcykgJiYgT0JCLmF4aXNDb2xsaWRlKG9iYl9hLCBvYmJfYiwgb2JiX2IuYXhlcyk7XG4gICAgfVxuXG59XG5cbiIsIi8vIFByb21pc2VzIHBvbHlmaWxsXG5pbXBvcnQgJ2NvcmUtanMvZXM2L3Byb21pc2UnO1xuXG4vLyBPYmplY3QuYXNzaWduIHBvbHlmaWxsXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICBPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICAgICAgLy8gV2UgbXVzdCBjaGVjayBhZ2FpbnN0IHRoZXNlIHNwZWNpZmljIGNhc2VzLlxuICAgICAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkobmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH0pKCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdWJzY3JpYmVNaXhpbiAodGFyZ2V0KSB7XG5cbiAgICBsZXQgbGlzdGVuZXJzID0gW107XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcblxuICAgICAgICBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHVuc3Vic2NyaWJlQWxsKCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzID0gW107XG4gICAgICAgIH0sXG5cbiAgICAgICAgdHJpZ2dlcihldmVudCwgLi4uZGF0YSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJbZXZlbnRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyW2V2ZW50XSguLi5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBoYXNTdWJzY3JpYmVyc0ZvcihldmVudCkge1xuICAgICAgICAgICAgbGV0IGhhcyA9IGZhbHNlO1xuICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJbZXZlbnRdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gaGFzO1xuICAgICAgICB9XG5cbiAgICB9KTtcblxufVxuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuLy8gTWFyayB0aHJlYWQgYXMgbWFpbiBvciB3b3JrZXJcbmNvbnN0IFRocmVhZCA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBUaHJlYWQ7XG5cbnRyeSB7XG4gICAgaWYgKHdpbmRvdy5kb2N1bWVudCAhPT0gSFRNTERvY3VtZW50KSB7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICBUaHJlYWQuaXNfd29ya2VyID0gZmFsc2U7XG4gICAgICAgIFRocmVhZC5pc19tYWluICAgPSB0cnVlO1xuICAgIH1cbn1cbmNhdGNoIChlKSB7XG4gICAgaWYgKHNlbGYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBUaHJlYWQuaXNfd29ya2VyID0gdHJ1ZTtcbiAgICAgICAgVGhyZWFkLmlzX21haW4gICA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFBhdGNoIGZvciAzcmQgcGFydHkgbGlicyB0aGF0IHJlcXVpcmUgdGhlc2UgZ2xvYmFscyB0byBiZSBwcmVzZW50LiBTcGVjaWZpY2FsbHksIEZvbnRGYWNlT2JzZXJ2ZXIuXG4gICAgICAgIC8vIEJyaXR0bGUgc29sdXRpb24gYnV0IGFsbG93cyB0aGF0IGxpYnJhcnkgdG8gbG9hZCBvbiB3b3JrZXIgdGhyZWFkcy5cbiAgICAgICAgc2VsZi53aW5kb3cgPSB7IGRvY3VtZW50OiB7fSB9O1xuICAgICAgICBzZWxmLmRvY3VtZW50ID0gc2VsZi53aW5kb3cuZG9jdW1lbnQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5cbi8vIEFkZCBhIGJhc2UgVVJMIGZvciBzY2hlbWVsZXNzIG9yIHByb3RvY29sLWxlc3MgVVJMc1xuLy8gRGVmYXVsdHMgdG8gYWRkaW5nIGN1cnJlbnQgd2luZG93IHByb3RvY29sIGFuZCBiYXNlLCBvciBhZGRzIGEgY3VzdG9tIGJhc2UgaWYgc3BlY2lmaWVkXG4vLyBNYXliZSB1c2UgaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9VUkkuanMgaWYgbW9yZSByb2J1c3QgZnVuY3Rpb25hbGl0eSBpcyBuZWVkZWRcbmV4cG9ydCBmdW5jdGlvbiBhZGRCYXNlVVJMICh1cmwsIGJhc2UpIHtcbiAgICBpZiAoIXVybCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2NoZW1lbGVzcywgYWRkIHByb3RvY29sXG4gICAgaWYgKHVybC5zdWJzdHIoMCwgMikgPT09ICcvLycpIHtcbiAgICAgICAgdXJsID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgdXJsO1xuICAgIH1cbiAgICAvLyBObyBodHRwKHMpIG9yIGRhdGEsIGFkZCBiYXNlXG4gICAgZWxzZSBpZiAodXJsLnNlYXJjaCgvXihodHRwfGh0dHBzfGRhdGF8YmxvYik6LykgPCAwKSB7XG4gICAgICAgIHZhciByZWxhdGl2ZSA9ICh1cmxbMF0gIT09ICcvJyk7XG4gICAgICAgIHZhciBiYXNlX2luZm87XG4gICAgICAgIGlmIChiYXNlKSB7XG4gICAgICAgICAgICBiYXNlX2luZm8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7IC8vIHVzZSBhIHRlbXBvcmFyeSBlbGVtZW50IHRvIHBhcnNlIFVSTFxuICAgICAgICAgICAgYmFzZV9pbmZvLmhyZWYgPSBiYXNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYmFzZV9pbmZvID0gd2luZG93LmxvY2F0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbGF0aXZlKSB7XG4gICAgICAgICAgICBsZXQgcGF0aCA9IHBhdGhGb3JVUkwoYmFzZV9pbmZvLmhyZWYpO1xuICAgICAgICAgICAgdXJsID0gcGF0aCArIHVybDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEVhc3kgd2F5XG4gICAgICAgICAgICBpZiAoYmFzZV9pbmZvLm9yaWdpbikge1xuICAgICAgICAgICAgICAgIHVybCA9IGJhc2VfaW5mby5vcmlnaW4gKyAnLycgKyB1cmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIYXJkIHdheSAoSUUxMSlcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBvcmlnaW4gPSB1cmwubWF0Y2goL14oKGh0dHB8aHR0cHN8ZGF0YXxibG9iKTpcXC9cXC9bXlxcL10qXFwvKS8pO1xuICAgICAgICAgICAgICAgIG9yaWdpbiA9IChvcmlnaW4gJiYgb3JpZ2luLmxlbmd0aCA+IDEpID8gb3JpZ2luWzBdIDogJyc7XG4gICAgICAgICAgICAgICAgdXJsID0gb3JpZ2luICsgdXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRoRm9yVVJMICh1cmwpIHtcbiAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3N0cmluZycgJiYgdXJsLnNlYXJjaCgvXihkYXRhfGJsb2IpOi8pID09PSAtMSkge1xuICAgICAgICBsZXQgcXMgPSB1cmwuaW5kZXhPZignPycpO1xuICAgICAgICBpZiAocXMgPiAtMSkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cigwLCBxcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGFzaCA9IHVybC5pbmRleE9mKCcjJyk7XG4gICAgICAgIGlmIChoYXNoID4gLTEpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgaGFzaCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXJsLnN1YnN0cigwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpIHx8ICcnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbnNpb25Gb3JVUkwgKHVybCkge1xuICAgIHVybCA9IHVybC5zcGxpdCgnLycpLnBvcCgpO1xuICAgIGxldCBsYXN0X2RvdCA9IHVybC5sYXN0SW5kZXhPZignLicpO1xuICAgIGlmIChsYXN0X2RvdCA+IC0xKSB7XG4gICAgICAgIHJldHVybiB1cmwuc3Vic3RyaW5nKGxhc3RfZG90ICsgMSk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWxhdGl2ZVVSTCAodXJsKSB7XG4gICAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuICEodXJsLnNlYXJjaCgvXihodHRwfGh0dHBzfGRhdGF8YmxvYik6LykgPiAtMSB8fCB1cmwuc3Vic3RyKDAsIDIpID09PSAnLy8nKTtcbn1cblxuLy8gUmVzb2x2ZXMgJy4vJyBhbmQgJy4uLycgY29tcG9uZW50cyBmcm9tIHJlbGF0aXZlIHBhdGgsIHRvIGdldCBhIFwiZmxhdHRlbmVkXCIgcGF0aFxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5SZWxhdGl2ZVVSTCAodXJsKSB7XG4gICAgbGV0IGRpcnMgPSAodXJsIHx8ICcnKS5zcGxpdCgnLycpO1xuICAgIGZvciAobGV0IGQgPSAxOyBkIDwgZGlycy5sZW5ndGg7IGQrKykge1xuICAgICAgICBpZiAoZGlyc1tkXSA9PT0gJy4nKSB7XG4gICAgICAgICAgICBkaXJzLnNwbGljZShkLCAxKTtcbiAgICAgICAgICAgIGQtLTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkaXJzW2RdID09PSAnLi4nKSB7XG4gICAgICAgICAgICBkID0gZCArIDA7XG4gICAgICAgICAgICBkaXJzLnNwbGljZShkLTEsIDIpO1xuICAgICAgICAgICAgZC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaXJzLmpvaW4oJy8nKTtcbn1cblxuLy8gQWRkIGEgc2V0IG9mIHF1ZXJ5IHN0cmluZyBwYXJhbXMgdG8gYSBVUkxcbi8vIHBhcmFtczogaGFzaCBvZiBrZXkvdmFsdWUgcGFpcnMgb2YgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnNcbmV4cG9ydCBmdW5jdGlvbiBhZGRQYXJhbXNUb1VSTCAodXJsLCBwYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcyB8fCBPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cblxuICAgIHZhciBxc19pbmRleCA9IHVybC5pbmRleE9mKCc/Jyk7XG4gICAgdmFyIGhhc2hfaW5kZXggPSB1cmwuaW5kZXhPZignIycpO1xuXG4gICAgLy8gU2F2ZSBhbmQgdHJpbSBoYXNoXG4gICAgdmFyIGhhc2ggPSAnJztcbiAgICBpZiAoaGFzaF9pbmRleCA+IC0xKSB7XG4gICAgICAgIGhhc2ggPSB1cmwuc2xpY2UoaGFzaF9pbmRleCk7XG4gICAgICAgIHVybCA9IHVybC5zbGljZSgwLCBoYXNoX2luZGV4KTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBxdWVyeSBzdHJpbmdcbiAgICBpZiAocXNfaW5kZXggPT09IC0xKSB7XG4gICAgICAgIHFzX2luZGV4ID0gdXJsLmxlbmd0aDtcbiAgICAgICAgdXJsICs9ICc/JztcbiAgICB9XG4gICAgcXNfaW5kZXgrKzsgLy8gYWR2YW5jZWQgcGFzdCAnPydcblxuICAgIC8vIEJ1aWxkIHF1ZXJ5IHN0cmluZyBwYXJhbXNcbiAgICB2YXIgdXJsX3BhcmFtcyA9ICcnO1xuICAgIGZvciAodmFyIHAgaW4gcGFyYW1zKSB7XG4gICAgICAgIHVybF9wYXJhbXMgKz0gYCR7cH09JHtwYXJhbXNbcF19JmA7XG4gICAgfVxuXG4gICAgLy8gSW5zZXJ0IG5ldyBxdWVyeSBzdHJpbmcgcGFyYW1zIGFuZCByZXN0b3JlIGhhc2hcbiAgICAvLyBOT1RFOiBkb2Vzbid0IHJlcGxhY2UgYW55IHZhbHVlcyBhbHJlYWR5IHByZXNlbnQgb24gcXVlcnkgc3RyaW5nLCBqdXN0IGluc2VydHMgZHVwZSB2YWx1ZXNcbiAgICB1cmwgPSB1cmwuc2xpY2UoMCwgcXNfaW5kZXgpICsgdXJsX3BhcmFtcyArIHVybC5zbGljZShxc19pbmRleCkgKyBoYXNoO1xuXG4gICAgcmV0dXJuIHVybDtcbn1cblxuLy8gUG9seWZpbGwgKGZvciBTYWZhcmkgY29tcGF0aWJpbGl0eSlcbmxldCBfY3JlYXRlT2JqZWN0VVJMO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU9iamVjdFVSTCAodXJsKSB7XG4gICAgaWYgKF9jcmVhdGVPYmplY3RVUkwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBfY3JlYXRlT2JqZWN0VVJMID0gKHdpbmRvdy5VUkwgJiYgd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwpIHx8ICh3aW5kb3cud2Via2l0VVJMICYmIHdpbmRvdy53ZWJraXRVUkwuY3JlYXRlT2JqZWN0VVJMKTtcblxuICAgICAgICBpZiAodHlwZW9mIF9jcmVhdGVPYmplY3RVUkwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIF9jcmVhdGVPYmplY3RVUkwgPSBudWxsO1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMIChvciB2ZW5kb3IgcHJlZml4KSBub3QgZm91bmQsIHVuYWJsZSB0byBjcmVhdGUgbG9jYWwgYmxvYiBVUkxzYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoX2NyZWF0ZU9iamVjdFVSTCkge1xuICAgICAgICByZXR1cm4gX2NyZWF0ZU9iamVjdFVSTCh1cmwpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG59XG5cbi8vIEdldCBVUkwgdGhhdCB0aGUgY3VycmVudCBzY3JpcHQgd2FzIGxvYWRlZCBmcm9tXG4vLyBJZiBjdXJyZW50U2NyaXB0IGlzIG5vdCBhdmFpbGFibGUsIGxvb3BzIHRocm91Z2ggPHNjcmlwdD4gZWxlbWVudHMgc2VhcmNoaW5nIGZvciBhIGxpc3Qgb2YgcHJvdmlkZWQgcGF0aHNcbi8vIGUuZy4gZmluZEN1cnJlbnRVUkwoJ3RhbmdyYW0uZGVidWcuanMnLCAndGFuZ3JhbS5taW4uanMnKTtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ3VycmVudFVSTCAoLi4ucGF0aHMpIHtcbiAgICAvLyBGaW5kIGN1cnJlbnRseSBleGVjdXRpbmcgc2NyaXB0XG4gICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQ7XG4gICAgaWYgKHNjcmlwdCkge1xuICAgICAgICByZXR1cm4gc2NyaXB0LnNyYztcbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXRocykpIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgb24gbG9vcGluZyB0aHJvdWdoIDxzY3JpcHQ+IGVsZW1lbnRzIGlmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgaXMgbm90IHN1cHBvcnRlZFxuICAgICAgICB2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcbiAgICAgICAgZm9yICh2YXIgcz0wOyBzIDwgc2NyaXB0cy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgcGF0aHMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0c1tzXS5zcmMuaW5kZXhPZihwYXRoc1twXSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHRzW3NdLnNyYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvLyBNaXNjZWxsYW5lb3VzIHV0aWxpdGllc1xuLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi93b3JrZXJfYnJva2VyJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxudmFyIFV0aWxzO1xuZXhwb3J0IGRlZmF1bHQgVXRpbHMgPSB7fTtcblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnVXRpbHMnLCBVdGlscyk7XG5cbi8vIEJhc2ljIFNhZmFyaSBkZXRlY3Rpb25cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzk0NDQ2MC9kZXRlY3Qtc2FmYXJpLWJyb3dzZXJcblV0aWxzLmlzU2FmYXJpID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xufTtcblxuLy8gQmFzaWMgSUUxMSBvciBFZGdlIGRldGVjdGlvblxuVXRpbHMuaXNNaWNyb3NvZnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIC8oVHJpZGVudFxcLzcuMHxFZGdlWyAvXShcXGQrW1xcLlxcZF0rKSkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xufTtcblxuVXRpbHMuX3JlcXVlc3RzID0ge307ICAgICAgIC8vIFhIUiByZXF1ZXN0cyBvbiBjdXJyZW50IHRocmVhZFxuVXRpbHMuX3Byb3h5X3JlcXVlc3RzID0ge307IC8vIFhIUiByZXF1ZXN0cyBwcm94aWVkIHRvIG1haW4gdGhyZWFkXG5cbi8vIGByZXF1ZXN0X2tleWAgaXMgYSB1c2VyLXByb3ZpZGVkIGtleSB0aGF0IGNhbiBiZSBsYXRlciB1c2VkIHRvIGNhbmNlbCB0aGUgcmVxdWVzdFxuVXRpbHMuaW8gPSBmdW5jdGlvbiAodXJsLCB0aW1lb3V0ID0gNjAwMDAsIHJlc3BvbnNlVHlwZSA9ICd0ZXh0JywgbWV0aG9kID0gJ0dFVCcsIGhlYWRlcnMgPSB7fSwgcmVxdWVzdF9rZXkgPSBudWxsLCBwcm94eSA9IGZhbHNlKSB7XG4gICAgaWYgKFRocmVhZC5pc193b3JrZXIgJiYgVXRpbHMuaXNNaWNyb3NvZnQoKSkge1xuICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIElFMTEgYW5kIEVkZ2Ugd2lsbCBoYW5nIHdlYiB3b3JrZXJzIHdoZW4gcGVyZm9ybWluZyBYSFIgcmVxdWVzdHNcbiAgICAgICAgLy8gVGhlc2UgcmVxdWVzdHMgY2FuIGJlIHByb3hpZWQgdGhyb3VnaCB0aGUgbWFpbiB0aHJlYWRcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvOTU0NTg2Ni9cbiAgICAgICAgbG9nKCdkZWJ1ZycsICdQcm94eWluZyByZXF1ZXN0IGZvciBVUkwgdG8gd29ya2VyJywgdXJsKTtcblxuICAgICAgICBpZiAocmVxdWVzdF9rZXkpIHtcbiAgICAgICAgICAgIFV0aWxzLl9wcm94eV9yZXF1ZXN0c1tyZXF1ZXN0X2tleV0gPSB0cnVlOyAvLyBtYXJrIGFzIHByb3hpZWRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKCdVdGlscy5pbycsIHVybCwgdGltZW91dCwgcmVzcG9uc2VUeXBlLCBtZXRob2QsIGhlYWRlcnMsIHJlcXVlc3Rfa2V5LCB0cnVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdC5vcGVuKG1ldGhvZCwgdXJsLCB0cnVlKTtcbiAgICAgICAgICAgIHJlcXVlc3QudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3Qub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChbJ3RleHQnLCAnanNvbiddLmluZGV4T2YocmVxdWVzdC5yZXNwb25zZVR5cGUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVxdWVzdC5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcignUmVxdWVzdCBlcnJvciB3aXRoIGEgc3RhdHVzIG9mICcgKyByZXF1ZXN0LnN0YXR1c1RleHQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGV2dCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcignVGhlcmUgd2FzIGEgbmV0d29yayBlcnJvcicgKyBldnQudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcXVlc3Qub250aW1lb3V0ID0gKGV2dCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcigndGltZW91dCAnKyBldnQudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcXVlc3Quc2VuZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0X2tleSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBVdGlscy5fcmVxdWVzdHNbcmVxdWVzdF9rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJveHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3Rfa2V5KSB7XG4gICAgICAgICAgICBVdGlscy5fcmVxdWVzdHNbcmVxdWVzdF9rZXldID0gcmVxdWVzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbn07XG5cbi8vIMOHYW5jZWwgYSBwZW5kaW5nIG5ldHdvcmsgcmVxdWVzdCBieSB1c2VyLXByb3ZpZGVkIHJlcXVlc3Qga2V5XG5VdGlscy5jYW5jZWxSZXF1ZXN0ID0gZnVuY3Rpb24gKGtleSkge1xuICAgIC8vIENoZWNrIGZvciBhIHJlcXVlc3QgdGhhdCB3YXMgcHJveGllZCB0byB0aGUgbWFpbiB0aHJlYWRcbiAgICBpZiAoVGhyZWFkLmlzX3dvcmtlciAmJiBVdGlscy5fcHJveHlfcmVxdWVzdHNba2V5XSkge1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKCdVdGlscy5jYW5jZWxSZXF1ZXN0Jywga2V5KTsgLy8gZm9yd2FyZCB0byBtYWluIHRocmVhZFxuICAgIH1cblxuICAgIGxldCByZXEgPSBVdGlscy5fcmVxdWVzdHNba2V5XTtcbiAgICBpZiAocmVxKSB7XG4gICAgICAgIGxvZygndHJhY2UnLCBgQ2FuY2VsbGluZyBuZXR3b3JrIHJlcXVlc3Qga2V5ICcke2tleX0nYCk7XG4gICAgICAgIFV0aWxzLl9yZXF1ZXN0c1trZXldLmFib3J0KCk7XG4gICAgICAgIGRlbGV0ZSBVdGlscy5fcmVxdWVzdHNba2V5XTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxvZygndHJhY2UnLCBgQ291bGQgbm90IGZpbmQgbmV0d29yayByZXF1ZXN0IGtleSAnJHtrZXl9J2ApO1xuICAgIH1cbn07XG5cbi8vIE5lZWRlZCBmb3Igb2xkZXIgYnJvd3NlcnMgdGhhdCBzdGlsbCBzdXBwb3J0IFdlYkdMIChTYWZhcmkgNiBldGMuKVxuVXRpbHMucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPVxuICAgICAgICAgICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICAgICAgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSAgICB8fFxuICAgICAgICAgICAgd2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgICAgICB8fFxuICAgICAgICAgICAgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgICB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChjYiwgMTAwMCAvNjApO1xuICAgICAgICAgICAgfTtcbiAgICB9XG59O1xuXG4vLyBTdHJpbmdpZnkgYW4gb2JqZWN0IGludG8gSlNPTiwgYnV0IGNvbnZlcnQgZnVuY3Rpb25zIHRvIHN0cmluZ3NcblV0aWxzLnNlcmlhbGl6ZVdpdGhGdW5jdGlvbnMgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgdmFyIHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShvYmosIGZ1bmN0aW9uKGssIHYpIHtcbiAgICAgICAgLy8gQ29udmVydCBmdW5jdGlvbnMgdG8gc3RyaW5nc1xuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB2LnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VyaWFsaXplZDtcbn07XG5cbi8vIFJlY3Vyc2l2ZWx5IHBhcnNlIGFuIG9iamVjdCwgYXR0ZW1wdGluZyB0byBjb252ZXJ0IHN0cmluZyBwcm9wZXJ0aWVzIHRoYXQgbG9vayBsaWtlIGZ1bmN0aW9ucyBiYWNrIGludG8gZnVuY3Rpb25zXG5VdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMgPSBmdW5jdGlvbihvYmosIHdyYXApIHtcbiAgICAvLyBDb252ZXJ0IHN0cmluZ1xuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICBvYmogPSBVdGlscy5zdHJpbmdUb0Z1bmN0aW9uKG9iaiwgd3JhcCk7XG4gICAgfVxuICAgIC8vIExvb3AgdGhyb3VnaCBvYmplY3QgcHJvcGVydGllc1xuICAgIGVsc2UgaWYgKG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAobGV0IHAgaW4gb2JqKSB7XG4gICAgICAgICAgICBvYmpbcF0gPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMob2JqW3BdLCB3cmFwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufTtcblxuLy8gQ29udmVydCBzdHJpbmcgYmFjayBpbnRvIGEgZnVuY3Rpb25cblV0aWxzLnN0cmluZ1RvRnVuY3Rpb24gPSBmdW5jdGlvbih2YWwsIHdyYXApIHtcbiAgICAvLyBQYXJzZSBmdW5jdGlvbiBzaWduYXR1cmUgYW5kIGJvZHlcbiAgICBsZXQgZm1hdGNoID1cbiAgICAgICAgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSAmJlxuICAgICAgICB2YWwubWF0Y2goL15cXHMqZnVuY3Rpb25bXihdKlxcKChbXildKilcXClcXHMqP1xceyhbXFxzXFxTXSopXFx9JC9tKTtcblxuICAgIGlmIChmbWF0Y2ggJiYgZm1hdGNoLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBzcmMgPSBmbWF0Y2hbMl07XG4gICAgICAgICAgICBsZXQgYXJncyA9IGZtYXRjaFsxXS5sZW5ndGggPiAwICYmIGZtYXRjaFsxXS5zcGxpdCgnLCcpLm1hcCh4ID0+IHgudHJpbSgpKS5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgICAgIGFyZ3MgPSBhcmdzLmxlbmd0aCA+IDAgPyBhcmdzIDogWydjb250ZXh0J107IC8vIGRlZmF1bHQgdG8gc2luZ2xlICdjb250ZXh0JyBhcmd1bWVudFxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHdyYXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKC4uLmFyZ3MsIHdyYXAoc3JjKSk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbiguLi5hcmdzLCBzcmMpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gZmFsbC1iYWNrIHRvIG9yaWdpbmFsIHZhbHVlIGlmIHBhcnNpbmcgZmFpbGVkXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBEZWZhdWx0IHRvIGFsbG93aW5nIGhpZ2ggcGl4ZWwgZGVuc2l0eVxuLy8gUmV0dXJucyB0cnVlIGlmIGRpc3BsYXkgZGVuc2l0eSBjaGFuZ2VkXG5VdGlscy51c2VfaGlnaF9kZW5zaXR5X2Rpc3BsYXkgPSB0cnVlO1xuVXRpbHMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcHJldiA9IFV0aWxzLmRldmljZV9waXhlbF9yYXRpbztcbiAgICBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gPSAoVXRpbHMudXNlX2hpZ2hfZGVuc2l0eV9kaXNwbGF5ICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSB8fCAxO1xuICAgIHJldHVybiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gIT09IHByZXY7XG59O1xuXG5pZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICBVdGlscy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvKCk7XG59XG5cbi8vIFVzZWQgZm9yIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHBvd2VyLW9mLTIgYW5kIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzXG4vLyBWaWE6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk3MjIyNDcvd2ViZ2wtd2FpdC1mb3ItdGV4dHVyZS10by1sb2FkXG5VdGlscy5pc1Bvd2VyT2YyID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICYgKHZhbHVlIC0gMSkpID09PSAwO1xufTtcblxuLy8gSW50ZXJwb2xhdGUgJ3gnIGFsb25nIGEgc2VyaWVzIG9mIGNvbnRyb2wgcG9pbnRzXG4vLyAncG9pbnRzJyBpcyBhbiBhcnJheSBvZiBjb250cm9sIHBvaW50cyBpbiB0aGUgZm9ybSBbeCwgeV1cbi8vXG4vLyBFeGFtcGxlOlxuLy8gICAgIENvbnRyb2wgcG9pbnRzOlxuLy8gICAgICAgICBbMCwgNV06ICB3aGVuIHg9MCwgeT01XG4vLyAgICAgICAgIFs0LCAxMF06IHdoZW4geD00LCB5PTEwXG4vL1xuLy8gICAgIFV0aWxzLmludGVycG9sYXRlKDIsIFtbMCwgNV0sIFs0LCAxMF1dKTtcbi8vICAgICAtPiBjb21wdXRlcyB4PTIsIGhhbGZ3YXkgYmV0d2VlbiB4PTAgYW5kIHg9NDogKDEwIC0gNSkgLyAyICs1XG4vLyAgICAgLT4gcmV0dXJucyA3LjVcbi8vXG4vLyBUT0RPOiBhZGQgb3RoZXIgaW50ZXJwb2xhdGlvbiBtZXRob2RzIGJlc2lkZXMgbGluZWFyXG4vL1xuVXRpbHMuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbih4LCBwb2ludHMsIHRyYW5zZm9ybSkge1xuICAgIC8vIElmIHRoaXMgZG9lc24ndCByZXNlbWJsZSBhIGxpc3Qgb2YgY29udHJvbCBwb2ludHMsIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICAgIGlmICghQXJyYXkuaXNBcnJheShwb2ludHMpIHx8ICFBcnJheS5pc0FycmF5KHBvaW50c1swXSkpIHtcbiAgICAgICAgcmV0dXJuIHBvaW50cztcbiAgICB9XG4gICAgZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIHBvaW50cztcbiAgICB9XG5cbiAgICB2YXIgeDEsIHgyLCBkLCB5LCB5MSwgeTI7XG5cbiAgICAvLyBNaW4gYm91bmRzXG4gICAgaWYgKHggPD0gcG9pbnRzWzBdWzBdKSB7XG4gICAgICAgIHkgPSBwb2ludHNbMF1bMV07XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB5ID0gdHJhbnNmb3JtKHkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE1heCBib3VuZHNcbiAgICBlbHNlIGlmICh4ID49IHBvaW50c1twb2ludHMubGVuZ3RoLTFdWzBdKSB7XG4gICAgICAgIHkgPSBwb2ludHNbcG9pbnRzLmxlbmd0aC0xXVsxXTtcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHkgPSB0cmFuc2Zvcm0oeSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRmluZCB3aGljaCBjb250cm9sIHBvaW50cyB4IGlzIGJldHdlZW5cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgaWYgKHggPj0gcG9pbnRzW2ldWzBdICYmIHggPCBwb2ludHNbaSsxXVswXSkge1xuICAgICAgICAgICAgICAgIC8vIExpbmVhciBpbnRlcnBvbGF0aW9uXG4gICAgICAgICAgICAgICAgeDEgPSBwb2ludHNbaV1bMF07XG4gICAgICAgICAgICAgICAgeDIgPSBwb2ludHNbaSsxXVswXTtcblxuICAgICAgICAgICAgICAgIC8vIE11bHRpcGxlIHZhbHVlc1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBvaW50c1tpXVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgeSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTA7IGMgPCBwb2ludHNbaV1bMV0ubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB0cmFuc2Zvcm0ocG9pbnRzW2ldWzFdW2NdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MiA9IHRyYW5zZm9ybShwb2ludHNbaSsxXVsxXVtjXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHkyIC0geTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeVtjXSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHkxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHBvaW50c1tpKzFdWzFdW2NdIC0gcG9pbnRzW2ldWzFdW2NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlbY10gPSBkICogKHggLSB4MSkgLyAoeDIgLSB4MSkgKyBwb2ludHNbaV1bMV1bY107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2luZ2xlIHZhbHVlXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB5MSA9IHRyYW5zZm9ybShwb2ludHNbaV1bMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSB0cmFuc2Zvcm0ocG9pbnRzW2krMV1bMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHkyIC0geTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gZCAqICh4IC0geDEpIC8gKHgyIC0geDEpICsgeTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkID0gcG9pbnRzW2krMV1bMV0gLSBwb2ludHNbaV1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gZCAqICh4IC0geDEpIC8gKHgyIC0geDEpICsgcG9pbnRzW2ldWzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB5O1xufTtcblxuVXRpbHMudG9DU1NDb2xvciA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgIGlmIChjb2xvclszXSA9PT0gMSkgeyAvLyBmdWxsIG9wYWNpdHlcbiAgICAgICAgcmV0dXJuIGByZ2IoJHtjb2xvci5zbGljZSgwLCAzKS5tYXAoYyA9PiBNYXRoLnJvdW5kKGMgKiAyNTUpKS5qb2luKCcsICcpfSlgO1xuICAgIH1cbiAgICAvLyBSR0IgaXMgYmV0d2VlbiBbMCwgMjU1XSBvcGFjaXR5IGlzIGJldHdlZW4gWzAsIDFdXG4gICAgcmV0dXJuIGByZ2JhKCR7Y29sb3IubWFwKChjLCBpKSA9PiAoaSA8IDMgJiYgTWF0aC5yb3VuZChjICogMjU1KSkgfHwgYykuam9pbignLCAnKX0pYDtcbn07XG5cblV0aWxzLnBvaW50SW5UaWxlID0gZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgcmV0dXJuIHBvaW50WzBdID49IDAgJibCoHBvaW50WzFdID4gLUdlby50aWxlX3NjYWxlICYmIHBvaW50WzBdIDwgR2VvLnRpbGVfc2NhbGUgJiYgcG9pbnRbMV0gPD0gMDtcbn07XG4iLCJsZXQgZnMgPSByZXF1aXJlKCdmcycpO1xubGV0IHBrZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vLi4vcGFja2FnZS5qc29uJywgJ3V0ZjgnKSk7XG5sZXQgdmVyc2lvbjtcbmV4cG9ydCBkZWZhdWx0IHZlcnNpb24gPSAndicgKyBwa2cudmVyc2lvbjtcbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5cbi8vIFdvcmtlckJyb2tlciByb3V0ZXMgbWVzc2FnZXMgYmV0d2VlbiB3ZWIgd29ya2VycyBhbmQgdGhlIG1haW4gdGhyZWFkLCBhbGxvd2luZyBmb3Igc2ltcGxlclxuLy8gYXN5bmMgY29kZSB2aWEgcHJvbWlzZXMuIEV4YW1wbGUgdXNhZ2U6XG4vL1xuLy8gSW4gd2ViIHdvcmtlciwgcmVnaXN0ZXIgc2VsZiBhcyBhIGNhbGxhYmxlIFwidGFyZ2V0XCIsIGFuZCBkZWZpbmUgYSBtZXRob2Q6XG4vL1xuLy8gICAgIFdvcmtlckJyb2tlci5hZGRUYXJnZXQoJ3NlbGYnLCBzZWxmKTtcbi8vXG4vLyAgICAgc2VsZi5zcXVhcmUgPSBmdW5jdGlvbiAoeCkge1xuLy8gICAgICAgICByZXR1cm4geCAqIHg7XG4vLyAgICAgfTtcbi8vXG4vLyBJbiBtYWluIHRocmVhZCwgaW52b2tlIHRoYXQgbWV0aG9kIGFuZCByZWNlaXZlIHRoZSByZXN1bHQgKGlmIGFueSkgYXMgYSBwcm9taXNlLlxuLy9cbi8vICAgICB3b3JrZXIgPSBuZXcgV29ya2VyKC4uLik7XG4vLyAgICAgV29ya2VyQnJva2VyLmFkZFdvcmtlcih3b3JrZXIpO1xuLy9cbi8vICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2Uod29ya2VyLCAnc2VsZi5zcXVhcmUnLCA1KS50aGVuKGZ1bmN0aW9uKHkpIHtcbi8vICAgICAgICAgY29uc29sZS5sb2coeSk7XG4vLyAgICAgfSk7XG4vL1xuLy8gICAgIC0+IHByaW50cyAyNVxuLy9cbi8vIEFzeW5jIGNvZGU6XG4vL1xuLy8gRm9yIHN5bmNocm9ub3VzIGNvZGUgdGhhdCBtdXN0IHBhc3MgYSByZXR1cm4gdmFsdWUgdG8gdGhlIG1haW4gdGhyZWFkLCB0aGUgZnVuY3Rpb24gY2FuIHNpbXBseVxuLy8gcmV0dXJuIGFuIGltbWVkaWF0ZSB2YWx1ZSAoc2VlIGV4YW1wbGUgYWJvdmUpLiBGb3IgY2FzZXMgd2hlcmUgdGhlIHdvcmtlciBtZXRob2QgbmVlZHMgdG8gcnVuXG4vLyBhc3luY2hyb25vdXMgY29kZSwgdGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gYSBwcm9taXNlLCBhbmQgdGhlIHJlc29sdmVkIG9yIHJlamVjdGVkIHZhbHVlIHdpbGxcbi8vIGJlIHNlbnQgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQgd2hlbiB0aGUgcHJvbWlzZSBpcyBmdWxmaWxsZWQuXG4vL1xuLy8gRXJyb3IgaGFuZGxpbmc6XG4vL1xuLy8gSWYgdGhlIHdvcmtlciBtZXRob2QgZWl0aGVyIHRocm93cyBhbiBlcnJvciwgb3IgcmV0dXJucyBhIHByb21pc2UgdGhhdCBpcyByZWplY3RlZCwgaXQgd2lsbCBiZVxuLy8gc2VudCBiYWNrIHRvIHRoZSBtYWluIHRocmVhZCBhcyBhIHByb21pc2UgcmVqZWN0aW9uLiBUaGVzZSB0d28gZXhhbXBsZXMgYXJlIGVxdWl2YWxlbnQ6XG4vL1xuLy8gICAgIEluIHdvcmtlciwgdGhyb3dpbmcgYW4gZXJyb3I6XG4vL1xuLy8gICAgICAgICBzZWxmLmJyb2tlbiA9IGZ1bmN0aW9uICgpIHtcbi8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXJyb3IgaW4gd29ya2VyIScpO1xuLy8gICAgICAgICB9O1xuLy9cbi8vICAgICBJbiB3b3JrZXIsIHJldHVybmluZyBhIHJlamVjdGVkIHByb21pc2U6XG4vL1xuLy8gICAgICAgICBzZWxmLmJyb2tlbiA9IGZ1bmN0aW9uICgpIHtcbi8vICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ2Vycm9yIGluIHdvcmtlciEnKSk7XG4vLyAgICAgICAgIH07XG4vL1xuLy8gICAgIEluIG1haW4gdGhyZWFkLCBib3RoIGVycm9ycyBhcmUgcmVjZWl2ZWQgYXMgYSBwcm9taXNlIHJlamVjdGlvbjpcbi8vXG4vLyAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh3b3JrZXIsICdzZWxmLmJyb2tlbicpLnRoZW4oXG4vLyAgICAgICAgICAgICAvLyBQcm9taXNlIHJlc29sdmVkXG4vLyAgICAgICAgICAgICBmdW5jdGlvbigpIHtcbi8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc3VjY2VzcyEnKTtcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICAvLyBQcm9taXNlIHJlamVjdGVkXG4vLyAgICAgICAgICAgICBmdW5jdGlvbihlcnJvcikge1xuLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciEnLCBlcnJvcik7XG4vLyAgICAgICAgICAgICB9KTtcbi8vXG4vLyAgICAgICAgIC0+IHByaW50cyAnZXJyb3IhIGVycm9yIGluIHdvcmtlcidcbi8vXG4vLyBDYWxsaW5nIGZyb20gd29ya2VyIHRvIG1haW4gdGhyZWFkOlxuLy9cbi8vIFRoZSBzYW1lIHN0eWxlIG9mIGNhbGxzIGNhbiBiZSBtYWRlICpmcm9tKiBhIHdlYiB3b3JrZXIsIHRvIHRoZSBtYWluIHRocmVhZC4gVGhlIEFQSSBpcyB0aGUgc2FtZVxuLy8gd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50LCAnd29ya2VyJywgaXMgbm90IG5lZWRlZCBmb3IgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKCksXG4vLyBzaW5jZSB0aGUgbWFpbiB0aHJlYWQgaXMgdGhlIGltcGxpY2l0IHRhcmdldC5cbi8vXG4vLyBJbiBtYWluIHRocmVhZCwgZGVmaW5lIGEgbWV0aG9kIGFuZCByZWdpc3RlciBpdDpcbi8vXG4vLyAgICAgdmFyIGdlb21ldHJ5ID0ge1xuLy8gICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uKHgsIHkpIHtcbi8vICAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4vLyAgICAgICAgIH1cbi8vICAgICB9O1xuLy9cbi8vICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdnZW9tZXRyeScsIGdlb21ldHJ5KTtcbi8vXG4vLyBJbiB3b3JrZXIgdGhyZWFkKTpcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKCdnZW9tZXRyeS5sZW5ndGgnLCAzLCA0KS50aGVuKGZ1bmN0aW9uKGQpIHtcbi8vICAgICAgICAgY29uc29sZS5sb2coZCk7XG4vLyAgICAgfSk7XG4vL1xuLy8gICAgIC0+IHByaW50cyA1XG4vL1xuXG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdGhyZWFkJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2cnO1xuXG52YXIgV29ya2VyQnJva2VyO1xuZXhwb3J0IGRlZmF1bHQgV29ya2VyQnJva2VyID0ge307XG5cbi8vIEdsb2JhbCBsaXN0IG9mIGFsbCB3b3JrZXIgbWVzc2FnZXNcbi8vIFVuaXF1ZWx5IHRyYWNrcyBldmVyeSBjYWxsIG1hZGUgYmV0d2VlbiBtYWluIHRocmVhZCBhbmQgYSB3b3JrZXJcbnZhciBtZXNzYWdlX2lkID0gMDtcbnZhciBtZXNzYWdlcyA9IHt9O1xuXG4vLyBSZWdpc3RlciBhbiBvYmplY3QgdG8gcmVjZWl2ZSBjYWxscyBmcm9tIG90aGVyIHRocmVhZFxudmFyIHRhcmdldHMgPSB7fTtcbldvcmtlckJyb2tlci5hZGRUYXJnZXQgPSBmdW5jdGlvbiAobmFtZSwgdGFyZ2V0KSB7XG4gICAgdGFyZ2V0c1tuYW1lXSA9IHRhcmdldDtcbn07XG5cbi8vIEdpdmVuIGEgZG90LW5vdGF0aW9uLXN0eWxlIG1ldGhvZCBuYW1lLCBlLmcuICdPYmplY3Qub2JqZWN0Lm1ldGhvZCcsXG4vLyBmaW5kIHRoZSBvYmplY3QgdG8gY2FsbCB0aGUgbWV0aG9kIG9uIGZyb20gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCB0YXJnZXRzXG5mdW5jdGlvbiBmaW5kVGFyZ2V0IChtZXRob2QpIHtcbiAgICB2YXIgY2hhaW4gPSBbXTtcbiAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY2hhaW4gPSBtZXRob2Quc3BsaXQoJy4nKTtcbiAgICAgICAgbWV0aG9kID0gY2hhaW4ucG9wKCk7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldCA9IHRhcmdldHM7XG5cbiAgICBmb3IgKGxldCBtPTA7IG0gPCBjaGFpbi5sZW5ndGg7IG0rKykge1xuICAgICAgICBpZiAodGFyZ2V0W2NoYWluW21dXSkge1xuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W2NoYWluW21dXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbbWV0aG9kLCB0YXJnZXRdO1xufVxuXG4vLyBNYWluIHRocmVhZDpcbi8vIC0gU2VuZCBtZXNzYWdlcyB0byB3b3JrZXJzLCBhbmQgb3B0aW9uYWxseSByZWNlaXZlIGFuIGFzeW5jIHJlc3BvbnNlIGFzIGEgcHJvbWlzZVxuLy8gLSBSZWNlaXZlIG1lc3NhZ2VzIGZyb20gd29ya2VycywgYW5kIG9wdGlvbmFsbHkgc2VuZCBhbiBhc3luYyByZXNwb25zZSBiYWNrIGFzIGEgcHJvbWlzZVxuZnVuY3Rpb24gc2V0dXBNYWluVGhyZWFkICgpIHtcblxuICAgIC8vIFNlbmQgYSBtZXNzYWdlIHRvIGEgd29ya2VyLCBhbmQgb3B0aW9uYWxseSBnZXQgYW4gYXN5bmMgcmVzcG9uc2VcbiAgICAvLyBBcmd1bWVudHM6XG4gICAgLy8gICAtIHdvcmtlcjogb25lIG9yIG1vcmUgd2ViIHdvcmtlciBpbnN0YW5jZXMgdG8gc2VuZCB0aGUgbWVzc2FnZSB0byAoc2luZ2xlIHZhbHVlIG9yIGFycmF5KVxuICAgIC8vICAgLSBtZXRob2Q6IHRoZSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUsIHNwZWNpZmllZCB3aXRoIGRvdC1ub3RhdGlvbiwgd2lsbCBiZSBpbnZva2VkIGluIHRoZSB3b3JrZXJcbiAgICAvLyAgIC0gbWVzc2FnZTogc3ByZWFkIG9mIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBtZXRob2Qgd2l0aFxuICAgIC8vIFJldHVybnM6XG4gICAgLy8gICAtIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIGlmIHRoZSB3b3JrZXIgbWV0aG9kIHJldHVybnMgYSB2YWx1ZSAoY291bGQgYmUgaW1tZWRpYXRlbHksIG9yIGFzeW5jKVxuICAgIC8vXG4gICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlID0gZnVuY3Rpb24gKHdvcmtlciwgbWV0aG9kLCAuLi5tZXNzYWdlKSB7XG4gICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgd29ya2VyIHNwZWNpZmllZCwgcG9zdCB0byBtdWx0aXBsZVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh3b3JrZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgd29ya2VyLm1hcCh3ID0+IFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh3LCBtZXRob2QsIC4uLm1lc3NhZ2UpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIHN0YXRlIG9mIHRoaXMgbWVzc2FnZVxuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VzW21lc3NhZ2VfaWRdID0geyBtZXRob2QsIG1lc3NhZ2UsIHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5sZW5ndGggPT09IDEgJiYgbWVzc2FnZVswXSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IG1lc3NhZ2VbMF0udHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlWzBdLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdtYWluX3NlbmQnLCAgICAgIC8vIG1hcmsgbWVzc2FnZSBhcyBtZXRob2QgaW52b2NhdGlvbiBmcm9tIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBtZXNzYWdlX2lkLCAgICAgICAgICAgICAvLyB1bmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZSwgZm9yIGxpZmUgb2YgcHJvZ3JhbVxuICAgICAgICAgICAgbWV0aG9kLCAgICAgICAgICAgICAgICAgLy8gd2lsbCBkaXNwYXRjaCB0byBhIGZ1bmN0aW9uIG9mIHRoaXMgbmFtZSB3aXRoaW4gdGhlIHdvcmtlclxuICAgICAgICAgICAgbWVzc2FnZSAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBwYXlsb2FkXG4gICAgICAgIH07XG5cbiAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2R9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIHdvcmtlciB0aHJlYWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lc3NhZ2VfaWQrKztcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIC8vIEFkZCBhIHdvcmtlciB0byBjb21tdW5pY2F0ZSB3aXRoIC0gZWFjaCB3b3JrZXIgbXVzdCBiZSByZWdpc3RlcmVkIGZyb20gdGhlIG1haW4gdGhyZWFkXG4gICAgV29ya2VyQnJva2VyLmFkZFdvcmtlciA9IGZ1bmN0aW9uICh3b3JrZXIpIHtcbiAgICAgICAgaWYgKCEod29ya2VyIGluc3RhbmNlb2YgV29ya2VyKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdvcmtlciBicm9rZXIgY291bGQgbm90IGFkZCBub24tV29ya2VyIG9iamVjdGAsIHdvcmtlcik7XG4gICAgICAgIH1cblxuICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIFdvcmtlckJyb2tlck1haW5UaHJlYWRIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IG1heWJlRGVjb2RlKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgbGV0IGlkID0gZGF0YS5tZXNzYWdlX2lkO1xuXG4gICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGNvbWluZyBiYWNrIGZyb20gdGhlIHdvcmtlciwgYW5kIGZ1bGZpbGwgdGhhdCBtZXNzYWdlJ3MgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ3dvcmtlcl9yZXBseScpIHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzIHRoZSByZXN1bHQgdG8gdGhlIHByb21pc2VcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpZF0ucmVqZWN0KGRhdGEuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaWRdLnJlc29sdmUoZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZXNbaWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgaW5pdGlhdGluZyBhIGNhbGwgZnJvbSB0aGUgd29ya2VyLCBkaXNwYXRjaCB0aGVtLFxuICAgICAgICAgICAgLy8gYW5kIHNlbmQgYW55IHJldHVybiB2YWx1ZSBiYWNrIHRvIHRoZSB3b3JrZXJcbiAgICAgICAgICAgIC8vIFVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlICYgcmV0dXJuIGNhbGwgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ3dvcmtlcl9zZW5kJyAmJiBpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FsbCB0aGUgcmVxdWVzdGVkIG1ldGhvZCBhbmQgc2F2ZSB0aGUgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICAgICAgdmFyIFttZXRob2RfbmFtZSwgdGFyZ2V0XSA9IGZpbmRUYXJnZXQoZGF0YS5tZXRob2QpO1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBkaXNwYXRjaCBtZXNzYWdlIHR5cGUgJHtkYXRhLm1ldGhvZH0gb24gdGFyZ2V0ICR7ZGF0YS50YXJnZXR9IGJlY2F1c2Ugbm8gb2JqZWN0IHdpdGggdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQgb24gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgbWV0aG9kID0gKHR5cGVvZiB0YXJnZXRbbWV0aG9kX25hbWVdID09PSAnZnVuY3Rpb24nKSAmJiB0YXJnZXRbbWV0aG9kX25hbWVdO1xuICAgICAgICAgICAgICAgIGlmICghbWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBkaXNwYXRjaCBtZXNzYWdlIHR5cGUgJHtkYXRhLm1ldGhvZH0gb24gdGFyZ2V0ICR7ZGF0YS50YXJnZXR9IGJlY2F1c2Ugb2JqZWN0IGhhcyBubyBtZXRob2Qgd2l0aCB0aGF0IG5hbWVgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0LCBlcnJvcjtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtZXRob2QuYXBwbHkodGFyZ2V0LCBkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRocm93biBlcnJvcnMgd2lsbCBiZSBwYXNzZWQgYmFjayAoaW4gc3RyaW5nIGZvcm0pIHRvIHdvcmtlclxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2VuZCByZXR1cm4gdmFsdWUgdG8gd29ya2VyXG4gICAgICAgICAgICAgICAgbGV0IHBheWxvYWQsIHRyYW5zZmVyYWJsZXMgPSBbXTtcblxuICAgICAgICAgICAgICAgIC8vIEFzeW5jIHJlc3VsdFxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IHZhbHVlLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS52YWx1ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWFpbl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gd29ya2VyIHRocmVhZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWFpbl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubWVzc2FnZX06ICR7ZXJyb3Iuc3RhY2t9YCA6IGVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbW1lZGlhdGUgcmVzdWx0XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSByZXN1bHQudHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWFpbl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm1lc3NhZ2V9OiAke2Vycm9yLnN0YWNrfWAgOiBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gd29ya2VyIHRocmVhZGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG5cbiAgICAvLyBFeHBvc2UgZm9yIGRlYnVnZ2luZ1xuICAgIFdvcmtlckJyb2tlci5nZXRNZXNzYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzO1xuICAgIH07XG5cbiAgICBXb3JrZXJCcm9rZXIuZ2V0TWVzc2FnZUlkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZV9pZDtcbiAgICB9O1xuXG59XG5cbi8vIFdvcmtlciB0aHJlYWRzOlxuLy8gLSBSZWNlaXZlIG1lc3NhZ2VzIGZyb20gbWFpbiB0aHJlYWQsIGFuZCBvcHRpb25hbGx5IHNlbmQgYW4gYXN5bmMgcmVzcG9uc2UgYmFjayBhcyBhIHByb21pc2Vcbi8vIC0gU2VuZCBtZXNzYWdlcyB0byBtYWluIHRocmVhZCwgYW5kIG9wdGlvbmFsbHkgcmVjZWl2ZSBhbiBhc3luYyByZXNwb25zZSBhcyBhIHByb21pc2VcbmZ1bmN0aW9uIHNldHVwV29ya2VyVGhyZWFkICgpIHtcblxuICAgIC8vIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBtYWluIHRocmVhZCwgYW5kIG9wdGlvbmFsbHkgZ2V0IGFuIGFzeW5jIHJlc3BvbnNlIGFzIGEgcHJvbWlzZVxuICAgIC8vIEFyZ3VtZW50czpcbiAgICAvLyAgIC0gbWV0aG9kOiB0aGUgbWV0aG9kIHdpdGggdGhpcyBuYW1lLCBzcGVjaWZpZWQgd2l0aCBkb3Qtbm90YXRpb24sIHdpbGwgYmUgaW52b2tlZCBvbiB0aGUgbWFpbiB0aHJlYWRcbiAgICAvLyAgIC0gbWVzc2FnZTogYXJyYXkgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIG1ldGhvZCB3aXRoXG4gICAgLy8gUmV0dXJuczpcbiAgICAvLyAgIC0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgaWYgdGhlIG1haW4gdGhyZWFkIG1ldGhvZCByZXR1cm5zIGEgdmFsdWUgKGNvdWxkIGJlIGltbWVkaWF0ZWx5LCBvciBhc3luYylcbiAgICAvL1xuICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSA9IGZ1bmN0aW9uIChtZXRob2QsIC4uLm1lc3NhZ2UpIHtcbiAgICAgICAgLy8gVHJhY2sgc3RhdGUgb2YgdGhpcyBtZXNzYWdlXG4gICAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZXNbbWVzc2FnZV9pZF0gPSB7IG1ldGhvZCwgbWVzc2FnZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgbGV0IHBheWxvYWQsIHRyYW5zZmVyYWJsZXMgPSBbXTtcblxuICAgICAgICBpZiAobWVzc2FnZSAmJiBtZXNzYWdlLmxlbmd0aCA9PT0gMSAmJiBtZXNzYWdlWzBdIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gbWVzc2FnZVswXS50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VbMF0udmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgdHlwZTogJ3dvcmtlcl9zZW5kJywgICAgLy8gbWFyayBtZXNzYWdlIGFzIG1ldGhvZCBpbnZvY2F0aW9uIGZyb20gd29ya2VyXG4gICAgICAgICAgICBtZXNzYWdlX2lkLCAgICAgICAgICAgICAvLyB1bmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZSwgZm9yIGxpZmUgb2YgcHJvZ3JhbVxuICAgICAgICAgICAgbWV0aG9kLCAgICAgICAgICAgICAgICAgLy8gd2lsbCBkaXNwYXRjaCB0byBhIG1ldGhvZCBvZiB0aGlzIG5hbWUgb24gdGhlIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBtZXNzYWdlICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHBheWxvYWRcbiAgICAgICAgfTtcblxuICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2R9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIG1haW4gdGhyZWFkYCk7XG4gICAgICAgIH1cblxuICAgICAgICBtZXNzYWdlX2lkKys7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiBXb3JrZXJCcm9rZXJXb3JrZXJUaHJlYWRIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIGxldCBkYXRhID0gbWF5YmVEZWNvZGUoZXZlbnQuZGF0YSk7XG4gICAgICAgIGxldCBpZCA9IGRhdGEubWVzc2FnZV9pZDtcblxuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGNvbWluZyBiYWNrIGZyb20gdGhlIG1haW4gdGhyZWFkLCBhbmQgZnVsZmlsbCB0aGF0IG1lc3NhZ2UncyBwcm9taXNlXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdtYWluX3JlcGx5Jykge1xuICAgICAgICAgICAgLy8gUGFzcyB0aGUgcmVzdWx0IHRvIHRoZSBwcm9taXNlXG4gICAgICAgICAgICBpZiAobWVzc2FnZXNbaWRdKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaWRdLnJlamVjdChkYXRhLmVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZXNvbHZlKGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlc1tpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjZWl2ZSBtZXNzYWdlcyBmcm9tIG1haW4gdGhyZWFkLCBkaXNwYXRjaCB0aGVtLCBhbmQgc2VuZCBiYWNrIGEgcmVwbHlcbiAgICAgICAgLy8gVW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2UgJiByZXR1cm4gY2FsbCB0byBtYWluIHRocmVhZFxuICAgICAgICBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdtYWluX3NlbmQnICYmIGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIENhbGwgdGhlIHJlcXVlc3RlZCB3b3JrZXIgbWV0aG9kIGFuZCBzYXZlIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgIHZhciBbbWV0aG9kX25hbWUsIHRhcmdldF0gPSBmaW5kVGFyZ2V0KGRhdGEubWV0aG9kKTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdvcmtlciBicm9rZXIgY291bGQgbm90IGRpc3BhdGNoIG1lc3NhZ2UgdHlwZSAke2RhdGEubWV0aG9kfSBvbiB0YXJnZXQgJHtkYXRhLnRhcmdldH0gYmVjYXVzZSBubyBvYmplY3Qgd2l0aCB0aGF0IG5hbWUgaXMgcmVnaXN0ZXJlZCBvbiBtYWluIHRocmVhZGApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbWV0aG9kID0gKHR5cGVvZiB0YXJnZXRbbWV0aG9kX25hbWVdID09PSAnZnVuY3Rpb24nKSAmJiB0YXJnZXRbbWV0aG9kX25hbWVdO1xuXG4gICAgICAgICAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBkaXNwYXRjaCBtZXNzYWdlIHR5cGUgJHtkYXRhLm1ldGhvZH0gYmVjYXVzZSB3b3JrZXIgaGFzIG5vIG1ldGhvZCB3aXRoIHRoYXQgbmFtZWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBlcnJvcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kLmFwcGx5KHRhcmdldCwgZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBUaHJvd24gZXJyb3JzIHdpbGwgYmUgcGFzc2VkIGJhY2sgKGluIHN0cmluZyBmb3JtKSB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgICAgIGVycm9yID0gZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2VuZCByZXR1cm4gdmFsdWUgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgICAgIC8vIEFzeW5jIHJlc3VsdFxuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gdmFsdWUudHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dvcmtlcl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZF9uYW1lfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byBtYWluIHRocmVhZGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dvcmtlcl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm1lc3NhZ2V9OiAke2Vycm9yLnN0YWNrfWAgOiBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbW1lZGlhdGUgcmVzdWx0XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSByZXN1bHQudHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgICAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZF9uYW1lfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byBtYWluIHRocmVhZGApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG59XG5cbi8vIFNwZWNpYWwgdmFsdWUgd3JhcHBlciwgdG8gaW5kaWNhdGUgdGhhdCB3ZSB3YW50IHRvIGZpbmQgYW5kIGluY2x1ZGUgdHJhbnNmZXJhYmxlIG9iamVjdHMgaW4gdGhlIG1lc3NhZ2VcbldvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcyA9IGZ1bmN0aW9uICguLi52YWx1ZSkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpKSB7XG4gICAgICAgIHJldHVybiBuZXcgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKC4uLnZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy50cmFuc2ZlcmFibGVzID0gZmluZFRyYW5zZmVyYWJsZXModGhpcy52YWx1ZSk7XG59O1xuXG4vLyBCdWlsZCBhIGxpc3Qgb2YgdHJhbnNmZXJhYmxlIG9iamVjdHMgZnJvbSBhIHNvdXJjZSBvYmplY3Rcbi8vIFJldHVybnMgYSBsaXN0IG9mIGluZm8gYWJvdXQgZWFjaCB0cmFuc2ZlcmFibGU6XG4vLyAgIC0gb2JqZWN0OiB0aGUgYWN0dWFsIHRyYW5zZmVyYWJsZSBvYmplY3Rcbi8vICAgLSBwYXJlbnQ6IHRoZSBwYXJlbnQgb2JqZWN0IHRoYXQgdGhlIHRyYW5zZmVyYWJsZSBpcyBhIHByb3BlcnR5IG9mIChpZiBhbnkpXG4vLyAgIC0gcHJvcGVydHk6IHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSB0cmFuc2ZlcmFibGUgb24gdGhlIHBhcmVudCBvYmplY3QgKGlmIGFueSlcbi8vIFRPRE86IGFkZCBvcHRpb24gaW4gY2FzZSB5b3UgRE9OJ1Qgd2FudCB0byB0cmFuc2ZlciBvYmplY3RzXG5mdW5jdGlvbiBmaW5kVHJhbnNmZXJhYmxlcyhzb3VyY2UsIHBhcmVudCA9IG51bGwsIHByb3BlcnR5ID0gbnVsbCwgbGlzdCA9IFtdKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgLy8gQ2hlY2sgZWFjaCBhcnJheSBlbGVtZW50XG4gICAgICAgIHNvdXJjZS5mb3JFYWNoKCh4LCBpKSA9PiBmaW5kVHJhbnNmZXJhYmxlcyh4LCBzb3VyY2UsIGksIGxpc3QpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gSXMgdGhlIG9iamVjdCBhIHRyYW5zZmVyYWJsZSBhcnJheSBidWZmZXI/XG4gICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgbGlzdC5wdXNoKHsgb2JqZWN0OiBzb3VyY2UsIHBhcmVudCwgcHJvcGVydHkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3IgbG9va3MgbGlrZSBhIHR5cGVkIGFycmF5IChoYXMgYW4gYXJyYXkgYnVmZmVyIHByb3BlcnR5KT9cbiAgICAgICAgZWxzZSBpZiAoc291cmNlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICBsaXN0LnB1c2goeyBvYmplY3Q6IHNvdXJjZS5idWZmZXIsIHBhcmVudCwgcHJvcGVydHkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGNoZWNrIGVhY2ggcHJvcGVydHlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGZpbmRUcmFuc2ZlcmFibGVzKHNvdXJjZVtwcm9wXSwgc291cmNlLCBwcm9wLCBsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbn1cblxuLy8gUmVtb3ZlIG5ldXRlcmVkIHRyYW5zZmVyYWJsZXMgZnJvbSBwYXJlbnQgb2JqZWN0cywgYXMgdGhleSBzaG91bGQgbm8gbG9uZ2VyIGJlIGFjY2Vzc2VkIGFmdGVyIHRyYW5zZmVyXG5mdW5jdGlvbiBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRyYW5zZmVyYWJsZXMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJhbnNmZXJhYmxlcy5maWx0ZXIodCA9PiB0LnBhcmVudCAmJiB0LnByb3BlcnR5KS5mb3JFYWNoKHQgPT4gZGVsZXRlIHQucGFyZW50W3QucHJvcGVydHldKTtcbn1cblxuLy8gTWVzc2FnZSBwYXlsb2FkIGNhbiBiZSBzdHJpbmdpZmllZCBmb3IgZmFzdGVyIHRyYW5zZmVyLCBpZiBpdCBkb2VzIG5vdCBpbmNsdWRlIHRyYW5zZmVyYWJsZSBvYmplY3RzXG5mdW5jdGlvbiBtYXliZUVuY29kZSAocGF5bG9hZCwgdHJhbnNmZXJhYmxlcykge1xuICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG4gICAgfVxuICAgIHJldHVybiBwYXlsb2FkO1xufVxuXG4vLyBQYXJzZSBzdHJpbmdpZmllZCBtZXNzYWdlIHBheWxvYWRcbmZ1bmN0aW9uIG1heWJlRGVjb2RlIChkYXRhKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGRhdGEpIDogZGF0YSk7XG59XG5cbi8vIFNldHVwIHRoaXMgdGhyZWFkIGFzIGFwcHJvcHJpYXRlXG5pZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICBzZXR1cE1haW5UaHJlYWQoKTtcbn1cblxuaWYgKFRocmVhZC5pc193b3JrZXIpIHtcbiAgICBzZXR1cFdvcmtlclRocmVhZCgpO1xufVxuIiwiLyoqKiBWZWN0b3IgZnVuY3Rpb25zIC0gdmVjdG9ycyBwcm92aWRlZCBhcyBbeCwgeSwgel0gYXJyYXlzICoqKi9cblxudmFyIFZlY3RvcjtcbmV4cG9ydCBkZWZhdWx0IFZlY3RvciA9IHt9O1xuXG5WZWN0b3Iuc2V0ID0gZnVuY3Rpb24gKHYpIHtcbiAgICB2YXIgViA9IFtdO1xuICAgIHZhciBsaW0gPSB2Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIFZbaV0gPSB2W2ldO1xuICAgIH1cbiAgICByZXR1cm4gVjtcbn07XG5cblZlY3Rvci5uZWcgPSBmdW5jdGlvbiAodikge1xuICAgIHZhciBWID0gW107XG4gICAgdmFyIGxpbSA9IHYubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltOyBpKyspIHtcbiAgICAgICAgVltpXSA9IHZbaV0gKiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIFY7XG59O1xuXG4vLyBBZGRpdGlvbiBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmFkZCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdO1xuICAgIHZhciBsaW0gPSBNYXRoLm1pbih2MS5sZW5ndGgsdjIubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIHZbaV0gPSB2MVtpXSArIHYyW2ldO1xuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cbi8vIFN1YnN0cmFjdGlvbiBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLnN1YiA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdO1xuICAgIHZhciBsaW0gPSBNYXRoLm1pbih2MS5sZW5ndGgsdjIubGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltOyBpKyspIHtcbiAgICAgICAgdltpXSA9IHYxW2ldIC0gdjJbaV07XG4gICAgfVxuICAgIHJldHVybiB2O1xufTtcblxuVmVjdG9yLnNpZ25lZF9hcmVhID0gZnVuY3Rpb24gKHYxLCB2MiwgdjMpIHtcbiAgICByZXR1cm4gKHYyWzBdLXYxWzBdKSoodjNbMV0tdjFbMV0pIC0gKHYzWzBdLXYxWzBdKSoodjJbMV0tdjFbMV0pO1xufTtcblxuLy8gTXVsdGlwbGljYXRpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5tdWx0ID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciB2ID0gW10sXG4gICAgICAgIGxlbiA9IHYxLmxlbmd0aCxcbiAgICAgICAgaTtcblxuICAgIGlmICh0eXBlb2YgdjIgPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIE11bGl0cGx5IGJ5IHNjYWxhclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZbaV0gPSB2MVtpXSAqIHYyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBNdWx0aXBseSB0d28gdmVjdG9yc1xuICAgICAgICBsZW4gPSBNYXRoLm1pbih2MS5sZW5ndGgsdjIubGVuZ3RoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gKiB2MltpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cbi8vIERpdmlzaW9uIG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IuZGl2ID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciB2ID0gW10sXG4gICAgICAgIGk7XG4gICAgaWYodHlwZW9mIHYyID09PSAnbnVtYmVyJyl7XG4gICAgICAgIC8vIERpdmlkZSBieSBzY2FsYXJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHYxLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHZbaV0gPSB2MVtpXSAvIHYyO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGl2aWRlIHRvIHZlY3RvcnNcbiAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKHYxLmxlbmd0aCx2Mi5sZW5ndGgpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZbaV0gPSB2MVtpXSAvIHYyW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2O1xufTtcblxuLy8gR2V0IDJEIHBlcnBlbmRpY3VsYXJcblZlY3Rvci5wZXJwID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHJldHVybiBbIHYyWzFdIC0gdjFbMV0sXG4gICAgICAgICAgICAgdjFbMF0gLSB2MlswXSBdO1xufTtcblxuLy8gR2V0IDJEIHZlY3RvciByb3RhdGVkXG5WZWN0b3Iucm90ID0gZnVuY3Rpb24gKHYsIGEpIHtcbiAgICB2YXIgYyA9IE1hdGguY29zKGEpO1xuICAgIHZhciBzID0gTWF0aC5zaW4oYSk7XG4gICAgcmV0dXJuIFt2WzBdICogYyAtIHZbMV0gKiBzLFxuICAgICAgICAgICAgdlswXSAqIHMgKyB2WzFdICogY107XG59O1xuXG4vLyBHZXQgMkQgaGVhZGluZyBhbmdsZVxuVmVjdG9yLmFuZ2xlID0gZnVuY3Rpb24gKFt4LCB5XSkge1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHkseCk7XG59O1xuXG4vLyBHZXQgYW5nbGUgYmV0d2VlbiB0d28gdmVjdG9yc1xuVmVjdG9yLmFuZ2xlQmV0d2VlbiA9IGZ1bmN0aW9uKEEsIEIpe1xuICAgIHZhciBkZWx0YSA9IFZlY3Rvci5kb3QoQSwgQik7XG4gICAgaWYgKGRlbHRhIDwgLTEpIHtcbiAgICAgICAgZGVsdGEgPSAtMTtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguYWNvcyhkZWx0YSk7XG59O1xuXG4vLyBDb21wYXJlIHR3byBwb2ludHNcblZlY3Rvci5pc0VxdWFsID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciBsZW4gPSB2MS5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAodjFbaV0gIT09IHYyW2ldKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIFZlY3RvciBsZW5ndGggc3F1YXJlZFxuVmVjdG9yLmxlbmd0aFNxID0gZnVuY3Rpb24gKHYpIHtcbiAgICBpZiAodi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuICh2WzBdKnZbMF0gKyB2WzFdKnZbMV0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh2Lmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIHJldHVybiAodlswXSp2WzBdICsgdlsxXSp2WzFdICsgdlsyXSp2WzJdKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59O1xuXG4vLyBWZWN0b3IgbGVuZ3RoXG5WZWN0b3IubGVuZ3RoID0gZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KFZlY3Rvci5sZW5ndGhTcSh2KSk7XG59O1xuXG4vLyBOb3JtYWxpemUgYSB2ZWN0b3JcblZlY3Rvci5ub3JtYWxpemUgPSBmdW5jdGlvbiAodikge1xuICAgIHZhciBkO1xuICAgIGlmICh2Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICBkID0gdlswXSp2WzBdICsgdlsxXSp2WzFdO1xuICAgICAgICBkID0gTWF0aC5zcXJ0KGQpO1xuXG4gICAgICAgIGlmIChkICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW3ZbMF0gLyBkLCB2WzFdIC8gZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFswLCAwXTtcbiAgICB9IGVsc2UgaWYgKHYubGVuZ3RoID49IDMpIHtcbiAgICAgICAgZCA9IHZbMF0qdlswXSArIHZbMV0qdlsxXSArIHZbMl0qdlsyXTtcbiAgICAgICAgZCA9IE1hdGguc3FydChkKTtcblxuICAgICAgICBpZiAoZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFt2WzBdIC8gZCwgdlsxXSAvIGQsIHZbMl0gLyBkXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gWzAsIDAsIDBdO1xufTtcblxuLy8gQ3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmNyb3NzICA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAodjFbMV0gKiB2MlsyXSkgLSAodjFbMl0gKiB2MlsxXSksXG4gICAgICAgICh2MVsyXSAqIHYyWzBdKSAtICh2MVswXSAqIHYyWzJdKSxcbiAgICAgICAgKHYxWzBdICogdjJbMV0pIC0gKHYxWzFdICogdjJbMF0pXG4gICAgXTtcbn07XG5cbi8vIERvdCBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IuZG90ID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciBuID0gMDtcbiAgICB2YXIgbGltID0gTWF0aC5taW4odjEubGVuZ3RoLCB2Mi5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltOyBpKyspIHtcbiAgICAgICAgbiArPSB2MVtpXSAqIHYyW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbn07XG4iLCJpbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcbmltcG9ydCBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgQ2FtZXJhIGZyb20gJy4vY2FtZXJhJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBzdWJzY3JpYmVNaXhpbiBmcm9tICcuL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcblxuZXhwb3J0IGNvbnN0IFZJRVdfUEFOX1NOQVBfVElNRSA9IDAuNTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlldyB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc2NlbmUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3Vic2NyaWJlTWl4aW4odGhpcyk7XG5cbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xuICAgICAgICB0aGlzLmNyZWF0ZU1hdHJpY2VzKCk7XG5cbiAgICAgICAgdGhpcy56b29tID0gbnVsbDtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kcyA9IG51bGw7XG4gICAgICAgIHRoaXMubWV0ZXJzX3Blcl9waXhlbCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5wYW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGFubmluZ19zdG9wX2F0ID0gMDtcbiAgICAgICAgdGhpcy5wYW5fc25hcF90aW1lciA9IDA7XG4gICAgICAgIHRoaXMuem9vbWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnpvb21fZGlyZWN0aW9uID0gMDtcblxuICAgICAgICAvLyBTaXplIG9mIHZpZXdwb3J0IGluIENTUyBwaXhlbHMsIGRldmljZSBwaXhlbHMsIGFuZCBtZXJjYXRvciBtZXRlcnNcbiAgICAgICAgdGhpcy5zaXplID0ge1xuICAgICAgICAgICAgY3NzOiB7fSxcbiAgICAgICAgICAgIGRldmljZToge30sXG4gICAgICAgICAgICBtZXRlcnM6IHt9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYXNwZWN0ID0gbnVsbDtcblxuICAgICAgICB0aGlzLmJ1ZmZlciA9IDA7XG4gICAgICAgIHRoaXMuY29udGludW91c196b29tID0gKHR5cGVvZiBvcHRpb25zLmNvbnRpbnVvdXNab29tID09PSAnYm9vbGVhbicpID8gb3B0aW9ucy5jb250aW51b3VzWm9vbSA6IHRydWU7XG4gICAgICAgIHRoaXMudGlsZV9zaW1wbGlmaWNhdGlvbl9sZXZlbCA9IDA7IC8vIGxldmVsLW9mLWRldGFpbCBkb3duc2FtcGxpbmcgdG8gYXBwbHkgdG8gdGlsZSBsb2FkaW5nXG4gICAgICAgIHRoaXMucHJlc2VydmVfdGlsZXNfd2l0aGluX3pvb20gPSAxO1xuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBzdGF0ZSBiZWZvcmUgc2NlbmUgY29uZmlnIGlzIHVwZGF0ZWRcbiAgICByZXNldCAoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2FtZXJhKCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNhbWVyYVxuICAgIGNyZWF0ZUNhbWVyYSAoKSB7XG4gICAgICAgIGxldCBhY3RpdmVfY2FtZXJhID0gdGhpcy5nZXRBY3RpdmVDYW1lcmEoKTtcbiAgICAgICAgaWYgKGFjdGl2ZV9jYW1lcmEpIHtcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhID0gQ2FtZXJhLmNyZWF0ZShhY3RpdmVfY2FtZXJhLCB0aGlzLCB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW2FjdGl2ZV9jYW1lcmFdKTtcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCBhY3RpdmUgY2FtZXJhIC0gZm9yIHB1YmxpYyBBUElcbiAgICBnZXRBY3RpdmVDYW1lcmEgKCkge1xuICAgICAgICBpZiAodGhpcy5zY2VuZS5jb25maWcgJiYgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhcykge1xuICAgICAgICAgICAgZm9yIChsZXQgbmFtZSBpbiB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXNbbmFtZV0uYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgbm8gY2FtZXJhIHNldCBhcyBhY3RpdmUsIHVzZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5zY2VuZS5jb25maWcuY2FtZXJhcyk7XG4gICAgICAgICAgICByZXR1cm4ga2V5cy5sZW5ndGggJiYga2V5c1swXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBhY3RpdmUgY2FtZXJhIGFuZCByZWNvbXBpbGUgLSBmb3IgcHVibGljIEFQSVxuICAgIHNldEFjdGl2ZUNhbWVyYSAobmFtZSkge1xuICAgICAgICBsZXQgcHJldiA9IHRoaXMuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgICAgIGlmICh0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW25hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW25hbWVdLmFjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIENsZWFyIHByZXZpb3VzbHkgYWN0aXZlIGNhbWVyYVxuICAgICAgICAgICAgaWYgKHByZXYgJiYgcHJldiAhPT0gbmFtZSAmJiB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW3ByZXZdKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXNbcHJldl0uYWN0aXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY2VuZS51cGRhdGVDb25maWcoeyByZWJ1aWxkOiBmYWxzZSB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1ldGhvZCBjYWxsZWQgb25jZSBwZXIgZnJhbWVcbiAgICB1cGRhdGUgKCkge1xuICAgICAgICB0aGlzLmNhbWVyYS51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5wYW5fc25hcF90aW1lciA9ICgoK25ldyBEYXRlKCkpIC0gdGhpcy5wYW5uaW5nX3N0b3BfYXQpIC8gMTAwMDtcbiAgICB9XG5cbiAgICAvLyBTZXQgbG9naWNhbCBwaXhlbCBzaXplIG9mIHZpZXdwb3J0XG4gICAgc2V0Vmlld3BvcnRTaXplICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuc2l6ZS5jc3MgPSB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgICAgICAgdGhpcy5zaXplLmRldmljZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBNYXRoLnJvdW5kKHRoaXMuc2l6ZS5jc3Mud2lkdGggKiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHRoaXMuc2l6ZS5jc3MuaGVpZ2h0ICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFzcGVjdCA9IHRoaXMuc2l6ZS5jc3Mud2lkdGggLyB0aGlzLnNpemUuY3NzLmhlaWdodDtcbiAgICAgICAgdGhpcy51cGRhdGVCb3VuZHMoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIG1hcCB2aWV3LCBjYW4gYmUgcGFzc2VkIGFuIG9iamVjdCB3aXRoIGxhdC9sbmcgYW5kL29yIHpvb21cbiAgICBzZXRWaWV3ICh7IGxuZywgbGF0LCB6b29tIH0gPSB7fSkge1xuICAgICAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFNldCBjZW50ZXJcbiAgICAgICAgaWYgKHR5cGVvZiBsbmcgPT09ICdudW1iZXInICYmIHR5cGVvZiBsYXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2VudGVyIHx8IGxuZyAhPT0gdGhpcy5jZW50ZXIubG5nIHx8IGxhdCAhPT0gdGhpcy5jZW50ZXIubGF0KSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB7IGxuZzogR2VvLndyYXBMbmcobG5nKSwgbGF0IH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgem9vbVxuICAgICAgICBpZiAodHlwZW9mIHpvb20gPT09ICdudW1iZXInICYmIHpvb20gIT09IHRoaXMuem9vbSkge1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNldFpvb20oem9vbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG5cbiAgICBzZXRab29tICh6b29tKSB7XG4gICAgICAgIGlmICh0aGlzLnpvb21pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuem9vbWluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYXN0X3pvb20gPSB0aGlzLnpvb207XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGFzdF90aWxlX3pvb20gPSB0aGlzLnRpbGVfem9vbTtcbiAgICAgICAgbGV0IHRpbGVfem9vbSA9IHRoaXMudGlsZVpvb20oem9vbSk7XG4gICAgICAgIGlmICghdGhpcy5jb250aW51b3VzX3pvb20pIHtcbiAgICAgICAgICAgIHpvb20gPSB0aWxlX3pvb207XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGlsZV96b29tICE9PSBsYXN0X3RpbGVfem9vbSkge1xuICAgICAgICAgICAgdGhpcy56b29tX2RpcmVjdGlvbiA9IHRpbGVfem9vbSA+IGxhc3RfdGlsZV96b29tID8gMSA6IC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sYXN0X3pvb20gPSB0aGlzLnpvb207XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgICAgIHRoaXMudGlsZV96b29tID0gdGlsZV96b29tO1xuXG4gICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIHRoaXMuc2NlbmUucmVxdWVzdFJlZHJhdygpO1xuICAgIH1cblxuICAgIHN0YXJ0Wm9vbSAoKSB7XG4gICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB0aGlzLnpvb21pbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIENob29zZSB0aGUgYmFzZSB6b29tIGxldmVsIHRvIHVzZSBmb3IgYSBnaXZlbiBmcmFjdGlvbmFsIHpvb21cbiAgICBiYXNlWm9vbSAoem9vbSkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih6b29tKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgYSBnaXZlbiB2aWV3IHpvb20sIHdoYXQgdGlsZSB6b29tIHNob3VsZCBiZSBsb2FkZWQ/XG4gICAgdGlsZVpvb20gKHZpZXdfem9vbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlWm9vbSh2aWV3X3pvb20pIC0gdGhpcy50aWxlX3NpbXBsaWZpY2F0aW9uX2xldmVsO1xuICAgIH1cblxuICAgIC8vIEZvciBhIGdpdmVuIHRpbGUgem9vbSwgd2hhdCBzdHlsZSB6b29tIHNob3VsZCBiZSB1c2VkP1xuICAgIHN0eWxlWm9vbSAodGlsZV96b29tKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2Vab29tKHRpbGVfem9vbSkgKyB0aGlzLnRpbGVfc2ltcGxpZmljYXRpb25fbGV2ZWw7XG4gICAgfVxuXG4gICAgc2V0UGFubmluZyAocGFubmluZykge1xuICAgICAgICB0aGlzLnBhbm5pbmcgPSBwYW5uaW5nO1xuICAgICAgICBpZiAoIXRoaXMucGFubmluZykge1xuICAgICAgICAgICAgdGhpcy5wYW5uaW5nX3N0b3BfYXQgPSAoK25ldyBEYXRlKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVhZHkgKCkge1xuICAgICAgICAvLyBUT0RPOiBiZXR0ZXIgY29uY2VwdCBvZiBcInJlYWRpbmVzc1wiIHN0YXRlP1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2l6ZS5jc3Mud2lkdGggIT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zaXplLmNzcy5oZWlnaHQgIT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9PSBudWxsIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy56b29tICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgdmlld3BvcnQgYm91bmRzIGJhc2VkIG9uIGN1cnJlbnQgY2VudGVyIGFuZCB6b29tXG4gICAgdXBkYXRlQm91bmRzICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWV0ZXJzX3Blcl9waXhlbCA9IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnpvb20pO1xuXG4gICAgICAgIC8vIFNpemUgb2YgdGhlIGhhbGYtdmlld3BvcnQgaW4gbWV0ZXJzIGF0IGN1cnJlbnQgem9vbVxuICAgICAgICB0aGlzLnNpemUubWV0ZXJzID0ge1xuICAgICAgICAgICAgeDogdGhpcy5zaXplLmNzcy53aWR0aCAqIHRoaXMubWV0ZXJzX3Blcl9waXhlbCxcbiAgICAgICAgICAgIHk6IHRoaXMuc2l6ZS5jc3MuaGVpZ2h0ICogdGhpcy5tZXRlcnNfcGVyX3BpeGVsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQ2VudGVyIG9mIHZpZXdwb3J0IGluIG1ldGVycywgYW5kIHRpbGVcbiAgICAgICAgbGV0IFt4LCB5XSA9IEdlby5sYXRMbmdUb01ldGVycyhbdGhpcy5jZW50ZXIubG5nLCB0aGlzLmNlbnRlci5sYXRdKTtcbiAgICAgICAgdGhpcy5jZW50ZXIubWV0ZXJzID0geyB4LCB5IH07XG5cbiAgICAgICAgdGhpcy5jZW50ZXIudGlsZSA9IEdlby50aWxlRm9yTWV0ZXJzKFt0aGlzLmNlbnRlci5tZXRlcnMueCwgdGhpcy5jZW50ZXIubWV0ZXJzLnldLCB0aGlzLnRpbGVfem9vbSk7XG5cbiAgICAgICAgLy8gQm91bmRzIGluIG1ldGVyc1xuICAgICAgICB0aGlzLmJvdW5kcyA9IHtcbiAgICAgICAgICAgIHN3OiB7XG4gICAgICAgICAgICAgICAgeDogdGhpcy5jZW50ZXIubWV0ZXJzLnggLSB0aGlzLnNpemUubWV0ZXJzLnggLyAyLFxuICAgICAgICAgICAgICAgIHk6IHRoaXMuY2VudGVyLm1ldGVycy55IC0gdGhpcy5zaXplLm1ldGVycy55IC8gMlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5lOiB7XG4gICAgICAgICAgICAgICAgeDogdGhpcy5jZW50ZXIubWV0ZXJzLnggKyB0aGlzLnNpemUubWV0ZXJzLnggLyAyLFxuICAgICAgICAgICAgICAgIHk6IHRoaXMuY2VudGVyLm1ldGVycy55ICsgdGhpcy5zaXplLm1ldGVycy55IC8gMlxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2NlbmUudGlsZV9tYW5hZ2VyLnVwZGF0ZVRpbGVzRm9yVmlldygpO1xuXG4gICAgICAgIHRoaXMudHJpZ2dlcignbW92ZScpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTsgLy8gVE9ETyBhdXRvbWF0ZSB2aWEgbW92ZSBldmVudD9cbiAgICB9XG5cbiAgICBmaW5kVmlzaWJsZVRpbGVDb29yZGluYXRlcyAoKSB7XG4gICAgICAgIGlmICghdGhpcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB6ID0gdGhpcy50aWxlX3pvb207XG4gICAgICAgIGxldCBzdyA9IEdlby50aWxlRm9yTWV0ZXJzKFt0aGlzLmJvdW5kcy5zdy54LCB0aGlzLmJvdW5kcy5zdy55XSwgeik7XG4gICAgICAgIGxldCBuZSA9IEdlby50aWxlRm9yTWV0ZXJzKFt0aGlzLmJvdW5kcy5uZS54LCB0aGlzLmJvdW5kcy5uZS55XSwgeik7XG5cbiAgICAgICAgbGV0IGNvb3JkcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB4ID0gc3cueCAtIHRoaXMuYnVmZmVyOyB4IDw9IG5lLnggKyB0aGlzLmJ1ZmZlcjsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gbmUueSAtIHRoaXMuYnVmZmVyOyB5IDw9IHN3LnkgKyB0aGlzLmJ1ZmZlcjsgeSsrKSB7XG4gICAgICAgICAgICAgICAgY29vcmRzLnB1c2goVGlsZS5jb29yZCh7IHgsIHksIHogfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb29yZHM7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRpbGVzIHRvbyBmYXIgb3V0c2lkZSBvZiB2aWV3XG4gICAgcHJ1bmVUaWxlc0ZvclZpZXcgKCkge1xuICAgICAgICAvLyBUT0RPOiB3aWxsIHRoaXMgZnVuY3Rpb24gZXZlciBiZSBjYWxsZWQgd2hlbiB2aWV3IGlzbid0IHJlYWR5P1xuICAgICAgICBpZiAoIXRoaXMucmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRpbGVzIHRoYXQgYXJlIGEgc3BlY2lmaWVkICMgb2YgdGlsZXMgb3V0c2lkZSBvZiB0aGUgdmlld3BvcnQgYm9yZGVyXG4gICAgICAgIGxldCBib3JkZXJfdGlsZXMgPSBbXG4gICAgICAgICAgICBNYXRoLmNlaWwoKE1hdGguZmxvb3IodGhpcy5zaXplLmNzcy53aWR0aCAvIEdlby50aWxlX3NpemUpICsgMikgLyAyKSxcbiAgICAgICAgICAgIE1hdGguY2VpbCgoTWF0aC5mbG9vcih0aGlzLnNpemUuY3NzLmhlaWdodCAvIEdlby50aWxlX3NpemUpICsgMikgLyAyKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuc2NlbmUudGlsZV9tYW5hZ2VyLnJlbW92ZVRpbGVzKHRpbGUgPT4ge1xuICAgICAgICAgICAgLy8gSWdub3JlIHZpc2libGUgdGlsZXNcbiAgICAgICAgICAgIGlmICh0aWxlLnZpc2libGUgfHwgdGlsZS5wcm94eV9mb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aWxlcyBvdXRzaWRlIGdpdmVuIHpvb20gdGhhdCBhcmUgc3RpbGwgbG9hZGluZ1xuICAgICAgICAgICAgaWYgKHRpbGUubG9hZGluZyAmJiB0aWxlLnN0eWxlX3pvb20gIT09IHRoaXMudGlsZV96b29tKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERpc2NhcmQgaWYgdG9vIGZhciBmcm9tIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgbGV0IHpkaWZmID0gTWF0aC5hYnModGlsZS5zdHlsZV96b29tIC0gdGhpcy50aWxlX3pvb20pO1xuICAgICAgICAgICAgaWYgKHpkaWZmID4gdGhpcy5wcmVzZXJ2ZV90aWxlc193aXRoaW5fem9vbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIYW5kbGUgdGlsZXMgYXQgZGlmZmVyZW50IHpvb21zXG4gICAgICAgICAgICBsZXQgY29vcmRzID0gVGlsZS5jb29yZGluYXRlQXRab29tKHRpbGUuY29vcmRzLCB0aGlzLnRpbGVfem9vbSk7XG5cbiAgICAgICAgICAgIC8vIERpc2NhcmQgdGlsZXMgb3V0c2lkZSBhbiBhcmVhIHN1cnJvdW5kaW5nIHRoZSB2aWV3cG9ydFxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGNvb3Jkcy54IC0gdGhpcy5jZW50ZXIudGlsZS54KSAtIGJvcmRlcl90aWxlc1swXSA+IHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBWaWV3OiByZW1vdmUgdGlsZSAke3RpbGUua2V5fSAoYXMgJHtjb29yZHMueH0vJHtjb29yZHMueX0vJHt0aGlzLnRpbGVfem9vbX0pIGZvciBiZWluZyB0b28gZmFyIG91dCBvZiB2aXNpYmxlIGFyZWEgKioqYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChNYXRoLmFicyhjb29yZHMueSAtIHRoaXMuY2VudGVyLnRpbGUueSkgLSBib3JkZXJfdGlsZXNbMV0gPiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgVmlldzogcmVtb3ZlIHRpbGUgJHt0aWxlLmtleX0gKGFzICR7Y29vcmRzLnh9LyR7Y29vcmRzLnl9LyR7dGhpcy50aWxlX3pvb219KSBmb3IgYmVpbmcgdG9vIGZhciBvdXQgb2YgdmlzaWJsZSBhcmVhICoqKmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBbGxvY2F0ZSBtb2RlbC12aWV3IG1hdHJpY2VzXG4gICAgLy8gNjQtYml0IHZlcnNpb25zIGFyZSBmb3IgQ1BVIGNhbGN1YXRpb25zXG4gICAgLy8gMzItYml0IHZlcnNpb25zIGFyZSBkb3duc2FtcGxlZCBhbmQgc2VudCB0byBHUFVcbiAgICBjcmVhdGVNYXRyaWNlcyAoKSB7XG4gICAgICAgIHRoaXMubWF0cmljZXMgPSB7fTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5tb2RlbCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm1vZGVsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5tb2RlbF92aWV3ID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWxfdmlldzMyID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgICAgIHRoaXMubWF0cmljZXMubm9ybWFsID0gbmV3IEZsb2F0NjRBcnJheSg5KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5ub3JtYWwzMiA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7XG4gICAgICAgIHRoaXMubWF0cmljZXMuaW52ZXJzZV9ub3JtYWwzMiA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZCBzZXQgbW9kZWwvdmlldyBhbmQgbm9ybWFsIG1hdHJpY2VzIGZvciBhIHRpbGVcbiAgICBzZXR1cFRpbGUgKHRpbGUsIHByb2dyYW0pIHtcbiAgICAgICAgLy8gVGlsZS1zcGVjaWZpYyBzdGF0ZVxuICAgICAgICAvLyBUT0RPOiBjYWxjIHRoZXNlIG9uY2UgcGVyIHRpbGUgKGN1cnJlbnRseSBiZWluZyBuZWVkbGVzc2x5IHJlLWNhbGN1bGF0ZWQgcGVyLXRpbGUtcGVyLXN0eWxlKVxuICAgICAgICB0aWxlLnNldHVwUHJvZ3JhbSh0aGlzLm1hdHJpY2VzLCBwcm9ncmFtKTtcblxuICAgICAgICAvLyBNb2RlbC12aWV3IGFuZCBub3JtYWwgbWF0cmljZXNcbiAgICAgICAgdGhpcy5jYW1lcmEuc2V0dXBNYXRyaWNlcyh0aGlzLm1hdHJpY2VzLCBwcm9ncmFtKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZ2VuZXJhbCB1bmlmb3JtcyB0aGF0IG11c3QgYmUgdXBkYXRlZCBvbmNlIHBlciBwcm9ncmFtXG4gICAgc2V0dXBQcm9ncmFtIChwcm9ncmFtKSB7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMmZ2JywgJ3VfcmVzb2x1dGlvbicsIFt0aGlzLnNpemUuZGV2aWNlLndpZHRoLCB0aGlzLnNpemUuZGV2aWNlLmhlaWdodF0pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzNmdicsICd1X21hcF9wb3NpdGlvbicsIFt0aGlzLmNlbnRlci5tZXRlcnMueCwgdGhpcy5jZW50ZXIubWV0ZXJzLnksIHRoaXMuem9vbV0pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfbWV0ZXJzX3Blcl9waXhlbCcsIHRoaXMubWV0ZXJzX3Blcl9waXhlbCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nLCBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3Vfdmlld19wYW5fc25hcF90aW1lcicsIHRoaXMucGFuX3NuYXBfdGltZXIpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFpJywgJ3Vfdmlld19wYW5uaW5nJywgdGhpcy5wYW5uaW5nKTtcblxuICAgICAgICB0aGlzLmNhbWVyYS5zZXR1cFByb2dyYW0ocHJvZ3JhbSk7XG4gICAgfVxuXG4gICAgLy8gVmlldyByZXF1aXJlcyBzb21lIGFuaW1hdGlvbiwgc3VjaCBhcyBhZnRlciBwYW5uaW5nIHN0b3BzXG4gICAgaXNBbmltYXRpbmcgKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMucGFuX3NuYXBfdGltZXIgPD0gVklFV19QQU5fU05BUF9USU1FKTtcbiAgICB9XG5cbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLWFzYXAuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLXJhdy5qcyIsIm5vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3Nlci1yZXNvbHZlL2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2VzNi9wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2N0eC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oYXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyYXRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1hdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9jc3Njb2xvcnBhcnNlci9jc3Njb2xvcnBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIm5vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2ZvbnRmYWNlb2JzZXJ2ZXIvZm9udGZhY2VvYnNlcnZlci5zdGFuZGFsb25lLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NsaXAuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY29udmVydC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9zaW1wbGlmeS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy90aWxlLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3dyYXAuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0My9pbnZlcnQuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0My9ub3JtYWwtZnJvbS1tYXQ0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvY29weS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2lkZW50aXR5LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvbG9va0F0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvbXVsdGlwbHkuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9wZXJzcGVjdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L3NjYWxlLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvdHJhbnNsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2dsLXNoYWRlci1lcnJvcnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2lzLWJ1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2NvbW1vbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2V4Y2VwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2xvYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL21hcmsuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2pzb24uanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9iaW5hcnkuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Jvb2wuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Zsb2F0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9pbnQuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL2Z1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9yZWdleHAuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL3VuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWFwLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbnVsbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvb21hcC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NlcS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2V0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zdHIuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3RpbWVzdGFtcC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvYmFzZTY0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2VkT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2lvbnMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2NyYzMyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9kZWZhdWx0cy5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvZXh0ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2ZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbG9hZC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL25vZGVqc1V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9vYmplY3QuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9BcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL0RhdGFSZWFkZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9Ob2RlQnVmZmVyUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvU3RyaW5nUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvVWludDhBcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL3JlYWRlckZvci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc2lnbmF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vQ29udmVydFdvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL0NyYzMyUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhV29ya2VyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vR2VuZXJpY1dvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL1N0cmVhbUhlbHBlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3VwcG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRmOC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJpZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJ5LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi96aXBPYmplY3QuanMiLCJub2RlX21vZHVsZXMvcGFrby9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi9kZWZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL2luZmxhdGUuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvY29tbW9uLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL3N0cmluZ3MuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9hZGxlcjMyLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY29uc3RhbnRzLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9kZWZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZ3poZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZnRyZWVzLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi90cmVlcy5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3pzdHJlYW0uanMiLCJub2RlX21vZHVsZXMvcGJmL2J1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9wYmYvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcG9pbnQtZ2VvbWV0cnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyaXAtY29tbWVudHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdG9wb2pzb24tY2xpZW50L2Rpc3QvdG9wb2pzb24tY2xpZW50LmpzIiwibm9kZV9tb2R1bGVzL3V0aWwtZGVwcmVjYXRlL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGUuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMiLCJzcmMvYnVpbGRlcnMvY29tbW9uLmpzIiwic3JjL2J1aWxkZXJzL3BvaW50cy5qcyIsInNyYy9idWlsZGVycy9wb2x5Z29ucy5qcyIsInNyYy9idWlsZGVycy9wb2x5bGluZXMuanMiLCJzcmMvY2FtZXJhLmpzIiwic3JjL2dlby5qcyIsInNyYy9nbC9jb25zdGFudHMuanMiLCJzcmMvZ2wvY29udGV4dC5qcyIsInNyYy9nbC9leHRlbnNpb25zLmpzIiwic3JjL2dsL2dsc2wuanMiLCJzcmMvZ2wvcmVuZGVyX3N0YXRlLmpzIiwic3JjL2dsL3NoYWRlcl9wcm9ncmFtLmpzIiwic3JjL2dsL3RleHR1cmUuanMiLCJzcmMvZ2wvdmFvLmpzIiwic3JjL2dsL3Zib19tZXNoLmpzIiwic3JjL2dsL3ZlcnRleF9kYXRhLmpzIiwic3JjL2dsL3ZlcnRleF9lbGVtZW50cy5qcyIsInNyYy9nbC92ZXJ0ZXhfbGF5b3V0LmpzIiwic3JjL2xhYmVscy9jb2xsaXNpb24uanMiLCJzcmMvbGFiZWxzL2ludGVyc2VjdC5qcyIsInNyYy9sYWJlbHMvbGFiZWwuanMiLCJzcmMvbGFiZWxzL2xhYmVsX2xpbmUuanMiLCJzcmMvbGFiZWxzL2xhYmVsX3BvaW50LmpzIiwic3JjL2xhYmVscy9wb2ludF9hbmNob3IuanMiLCJzcmMvbGFiZWxzL3BvaW50X3BsYWNlbWVudC5qcyIsInNyYy9sYWJlbHMvcmVwZWF0X2dyb3VwLmpzIiwic3JjL2xlYWZsZXRfbGF5ZXIuanMiLCJzcmMvbGlnaHQuanMiLCJzcmMvbWF0ZXJpYWwuanMiLCJzcmMvbW9kdWxlLmpzIiwic3JjL3NjZW5lLmpzIiwic3JjL3NjZW5lX2J1bmRsZS5qcyIsInNyYy9zY2VuZV9sb2FkZXIuanMiLCJzcmMvc2NlbmVfd29ya2VyLmpzIiwic3JjL3NlbGVjdGlvbi5qcyIsInNyYy9zb3VyY2VzL2RhdGFfc291cmNlLmpzIiwic3JjL3NvdXJjZXMvZ2VvanNvbi5qcyIsInNyYy9zb3VyY2VzL212dC5qcyIsInNyYy9zb3VyY2VzL3Jhc3Rlci5qcyIsInNyYy9zb3VyY2VzL3RvcG9qc29uLmpzIiwic3JjL3N0eWxlcy9maWx0ZXIuanMiLCJzcmMvc3R5bGVzL2xheWVyLmpzIiwic3JjL3N0eWxlcy9saW5lcy9kYXNoYXJyYXkuanMiLCJzcmMvc3R5bGVzL2xpbmVzL2xpbmVzLmpzIiwic3JjL3N0eWxlcy9wb2ludHMvcG9pbnRzLmpzIiwic3JjL3N0eWxlcy9wb2x5Z29ucy9wb2x5Z29ucy5qcyIsInNyYy9zdHlsZXMvcmFzdGVyL3Jhc3Rlci5qcyIsInNyYy9zdHlsZXMvc3R5bGUuanMiLCJzcmMvc3R5bGVzL3N0eWxlX21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3N0eWxlX3BhcnNlci5qcyIsInNyYy9zdHlsZXMvdGV4dC9jYW52YXNfdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC9mb250X21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3RleHQvdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X2xhYmVscy5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X3NldHRpbmdzLmpzIiwic3JjL3RpbGUuanMiLCJzcmMvdGlsZV9tYW5hZ2VyLmpzIiwic3JjL3RpbGVfcHlyYW1pZC5qcyIsInNyYy91dGlscy9kZWJ1Z19zZXR0aW5ncy5qcyIsInNyYy91dGlscy9lcnJvcnMuanMiLCJzcmMvdXRpbHMvZ2wtbWF0cml4LmpzIiwic3JjL3V0aWxzL2xvZy5qcyIsInNyYy91dGlscy9tZWRpYV9jYXB0dXJlLmpzIiwic3JjL3V0aWxzL21lcmdlLmpzIiwic3JjL3V0aWxzL29iYi5qcyIsInNyYy91dGlscy9wb2x5ZmlsbHMuanMiLCJzcmMvdXRpbHMvc3Vic2NyaWJlLmpzIiwic3JjL3V0aWxzL3RocmVhZC5qcyIsInNyYy91dGlscy91cmxzLmpzIiwic3JjL3V0aWxzL3V0aWxzLmpzIiwic3JjL3V0aWxzL3ZlcnNpb24uanMiLCJzcmMvdXRpbHMvd29ya2VyX2Jyb2tlci5qcyIsInNyYy92ZWN0b3IuanMiLCJzcmMvdmlldy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM3dkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBOztBQ0FBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7O0FDRkE7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGpEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDN01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25SQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsZ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy8yQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNuTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbmdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFrQkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7UUNqRGdCLFcsR0FBQSxXO1FBZUEsa0IsR0FBQSxrQjs7QUExQmhCOzs7Ozs7QUFFTyxJQUFNLG9DQUFjLENBQ3ZCLEVBQUUsR0FBRyxDQUFMLEVBQVEsR0FBRyxDQUFYLEVBRHVCLEVBRXZCLEVBQUUsR0FBRyxjQUFJLFVBQVQsRUFBcUIsR0FBRyxDQUFDLGNBQUksVUFBN0IsRUFGdUIsQ0FFbUI7QUFGbkIsQ0FBcEIsQyxDQUhQO0FBUU8sSUFBTSxvQ0FBYyxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FBcEI7O0FBRVA7QUFDQTtBQUNPLFNBQVMsV0FBVCxDQUFzQixFQUF0QixFQUEwQixFQUExQixFQUE4QixTQUE5QixFQUF5QztBQUM1QyxRQUFJLFdBQVcsWUFBWSxDQUFaLENBQWY7QUFDQSxRQUFJLFdBQVcsWUFBWSxDQUFaLENBQWY7O0FBRUE7QUFDQSxRQUFLLEdBQUcsQ0FBSCxLQUFTLFNBQVMsQ0FBVCxHQUFhLFNBQXRCLElBQW1DLEdBQUcsQ0FBSCxLQUFTLFNBQVMsQ0FBVCxHQUFhLFNBQTFELElBQ0MsR0FBRyxDQUFILEtBQVMsU0FBUyxDQUFULEdBQWEsU0FBdEIsSUFBbUMsR0FBRyxDQUFILEtBQVMsU0FBUyxDQUFULEdBQWEsU0FEMUQsSUFFQyxHQUFHLENBQUgsS0FBUyxTQUFTLENBQVQsR0FBYSxTQUF0QixJQUFtQyxHQUFHLENBQUgsS0FBUyxTQUFTLENBQVQsR0FBYSxTQUYxRCxJQUdDLEdBQUcsQ0FBSCxLQUFTLFNBQVMsQ0FBVCxHQUFhLFNBQXRCLElBQW1DLEdBQUcsQ0FBSCxLQUFTLFNBQVMsQ0FBVCxHQUFhLFNBSDlELEVBRzBFO0FBQ3RFLGVBQU8sSUFBUDtBQUNIOztBQUVELFdBQU8sS0FBUDtBQUNIOztBQUVNLFNBQVMsa0JBQVQsQ0FBNkIsS0FBN0IsRUFBb0MsU0FBcEMsRUFBK0M7QUFDbEQsZ0JBQVksYUFBYSxDQUF6QjtBQUNBLFFBQUksV0FBVyxZQUFZLENBQVosQ0FBZjtBQUNBLFFBQUksV0FBVyxZQUFZLENBQVosQ0FBZjs7QUFFQSxXQUFPLE1BQU0sQ0FBTixLQUFZLFNBQVMsQ0FBVCxHQUFhLFNBQXpCLElBQ0EsTUFBTSxDQUFOLEtBQVksU0FBUyxDQUFULEdBQWEsU0FEekIsSUFFQSxNQUFNLENBQU4sS0FBWSxTQUFTLENBQVQsR0FBYSxTQUZ6QixJQUdBLE1BQU0sQ0FBTixLQUFZLFNBQVMsQ0FBVCxHQUFhLFNBSGhDO0FBSUg7Ozs7Ozs7Ozt5cEJDcENEOzs7UUFNZ0IsbUIsR0FBQSxtQjs7QUFMaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ08sU0FBUyxtQkFBVCxDQUE4QixNQUE5QixFQUFzQyxXQUF0QyxFQUFtRCxlQUFuRCxlQUVtRjtBQUFBLFFBRHBGLGNBQ29GLFFBRHBGLGNBQ29GO0FBQUEsUUFEcEUsY0FDb0UsUUFEcEUsY0FDb0U7QUFBQSxRQURwRCxXQUNvRCxRQURwRCxXQUNvRDtBQUFBLFFBRHZDLFlBQ3VDLFFBRHZDLFlBQ3VDO0FBQUEsUUFBcEYsSUFBb0YsU0FBcEYsSUFBb0Y7QUFBQSxRQUE5RSxjQUE4RSxTQUE5RSxjQUE4RTtBQUFBLFFBQTlELE1BQThELFNBQTlELE1BQThEO0FBQUEsUUFBdEQsS0FBc0QsU0FBdEQsS0FBc0Q7QUFBQSxRQUEvQyxPQUErQyxTQUEvQyxPQUErQztBQUFBLFFBQXRDLGNBQXNDLFNBQXRDLGNBQXNDO0FBQUEsUUFBdEIsa0JBQXNCLFNBQXRCLGtCQUFzQjs7QUFDdEYscUJBQWlCLGtCQUFrQixDQUFuQztBQUNBLFFBQUksS0FBSyxLQUFLLENBQUwsSUFBVSxDQUFWLEdBQWMsY0FBdkI7QUFDQSxRQUFJLEtBQUssS0FBSyxDQUFMLElBQVUsQ0FBVixHQUFjLGNBQXZCO0FBQ0EsUUFBSSxVQUFVLENBQ1YsQ0FBQyxDQUFDLEVBQUYsRUFBTSxDQUFDLEVBQVAsQ0FEVSxFQUVWLENBQUMsRUFBRCxFQUFLLENBQUMsRUFBTixDQUZVLEVBR1YsQ0FBQyxFQUFELEVBQUssRUFBTCxDQUhVLEVBSVYsQ0FBQyxDQUFDLEVBQUYsRUFBTSxFQUFOLENBSlUsQ0FBZDs7QUFPQSxRQUFJLGtCQUFrQixZQUFZLGVBQWxDO0FBQ0EsUUFBSSxpQkFBaUIsWUFBWSxZQUFqQzs7QUFFQSxRQUFJLGtCQUFKO0FBQ0EsUUFBSSxjQUFKLEVBQW9CO0FBQ2hCLDZCQUFxQixzQkFBc0IsQ0FBM0M7O0FBRGdCLG9CQUdtQixxQ0FIbkI7QUFBQTtBQUFBLFlBR1gsS0FIVztBQUFBLFlBR0osS0FISTtBQUFBLFlBR0csS0FISDtBQUFBLFlBR1UsS0FIVjs7QUFJaEIsb0JBQVksQ0FDUixDQUFDLEtBQUQsRUFBUSxLQUFSLENBRFEsRUFFUixDQUFDLEtBQUQsRUFBUSxLQUFSLENBRlEsRUFHUixDQUFDLEtBQUQsRUFBUSxLQUFSLENBSFEsRUFJUixDQUFDLEtBQUQsRUFBUSxLQUFSLENBSlEsQ0FBWjtBQU1IOztBQUVELFFBQUksYUFBYSxPQUFPLE1BQXhCO0FBQ0EsU0FBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksVUFBbEIsRUFBOEIsR0FBOUIsRUFBbUM7QUFDL0IsWUFBSSxRQUFRLE9BQU8sQ0FBUCxDQUFaOztBQUVBLGFBQUssSUFBSSxNQUFJLENBQWIsRUFBZ0IsTUFBTSxDQUF0QixFQUF5QixLQUF6QixFQUFnQztBQUM1QjtBQUNBLGdCQUFJLGNBQUosRUFBb0I7QUFDaEIsZ0NBQWdCLGlCQUFpQixDQUFqQyxJQUFzQyxVQUFVLEdBQVYsRUFBZSxDQUFmLElBQW9CLGtCQUExRDtBQUNBLGdDQUFnQixpQkFBaUIsQ0FBakMsSUFBc0MsVUFBVSxHQUFWLEVBQWUsQ0FBZixJQUFvQixrQkFBMUQ7QUFDSDs7QUFFRCw0QkFBZ0IsaUJBQWlCLENBQWpDLElBQXNDLE1BQU0sQ0FBTixDQUF0QztBQUNBLDRCQUFnQixpQkFBaUIsQ0FBakMsSUFBc0MsTUFBTSxDQUFOLENBQXRDOztBQUVBLDRCQUFnQixjQUFjLENBQTlCLElBQW1DLFFBQVEsR0FBUixFQUFhLENBQWIsQ0FBbkM7QUFDQSw0QkFBZ0IsY0FBYyxDQUE5QixJQUFtQyxRQUFRLEdBQVIsRUFBYSxDQUFiLENBQW5DO0FBQ0EsNEJBQWdCLGNBQWMsQ0FBOUIsSUFBbUMsS0FBbkM7QUFDQSw0QkFBZ0IsY0FBYyxDQUE5QixJQUFtQyxPQUFuQzs7QUFFQSw0QkFBZ0IsZUFBZSxDQUEvQixJQUFvQyxPQUFPLENBQVAsQ0FBcEM7QUFDQSw0QkFBZ0IsZUFBZSxDQUEvQixJQUFvQyxPQUFPLENBQVAsQ0FBcEM7O0FBRUEsd0JBQVksU0FBWixDQUFzQixlQUF0QjtBQUNIOztBQUVELHdCQUFnQixJQUFoQixDQUFxQixpQkFBaUIsQ0FBdEM7QUFDQSx3QkFBZ0IsSUFBaEIsQ0FBcUIsaUJBQWlCLENBQXRDO0FBQ0Esd0JBQWdCLElBQWhCLENBQXFCLGlCQUFpQixDQUF0QztBQUNBLHdCQUFnQixJQUFoQixDQUFxQixpQkFBaUIsQ0FBdEM7QUFDQSx3QkFBZ0IsSUFBaEIsQ0FBcUIsaUJBQWlCLENBQXRDO0FBQ0Esd0JBQWdCLElBQWhCLENBQXFCLGlCQUFpQixDQUF0Qzs7QUFFQSwwQkFBa0IsQ0FBbEI7QUFDSDtBQUNKOzs7Ozs7Ozs7eXBCQ3JFRDs7O1FBV2dCLGEsR0FBQSxhO1FBc0RBLHFCLEdBQUEscUI7UUF5R0Esa0IsR0FBQSxrQjs7QUF6S2hCOzs7O0FBQ0E7Ozs7QUFDQTs7QUFFQTs7Ozs7O0FBRUEsSUFBTSxVQUFVLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLENBQWhCOztBQUVBO0FBQ0E7QUFDTyxTQUFTLGFBQVQsQ0FDSCxRQURHLEVBRUgsV0FGRyxFQUVVLGVBRlYsUUFHcUQ7QUFBQSxRQUF0RCxjQUFzRCxRQUF0RCxjQUFzRDtBQUFBLFFBQXRDLGNBQXNDLFFBQXRDLGNBQXNDO0FBQUEsUUFBdEIsa0JBQXNCLFFBQXRCLGtCQUFzQjs7O0FBRXhELFFBQUksa0JBQWtCLFlBQVksZUFBbEM7O0FBRUEsUUFBSSxjQUFKLEVBQW9CO0FBQ2hCLDZCQUFxQixzQkFBc0IsQ0FBM0M7O0FBRGdCLG9CQUVtQixxQ0FGbkI7QUFBQTtBQUFBLFlBRVgsS0FGVztBQUFBLFlBRUosS0FGSTtBQUFBLFlBRUcsS0FGSDtBQUFBLFlBRVUsS0FGVjtBQUduQjs7QUFFRCxRQUFJLGVBQWUsU0FBUyxNQUE1QjtBQUNBLFNBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLFlBQWxCLEVBQWdDLEdBQWhDLEVBQXFDO0FBQ2pDLFlBQUksaUJBQWlCLFlBQVksWUFBakM7O0FBRUEsWUFBSSxVQUFVLFNBQVMsQ0FBVCxDQUFkOztBQUVBO0FBQ0EsWUFBSSxjQUFKLEVBQW9CO0FBQUEsdUNBQ21CLGNBQUksZUFBSixDQUFvQixPQUFwQixDQURuQjtBQUFBO0FBQUEsZ0JBQ1gsS0FEVztBQUFBLGdCQUNKLEtBREk7QUFBQSxnQkFDRyxLQURIO0FBQUEsZ0JBQ1UsS0FEVjs7QUFFaEIsZ0JBQUksU0FBUyxRQUFRLEtBQXJCO0FBQ0EsZ0JBQUksU0FBUyxRQUFRLEtBQXJCO0FBQ0EsZ0JBQUksVUFBVSxDQUFDLFFBQVEsS0FBVCxJQUFrQixNQUFoQztBQUNBLGdCQUFJLFVBQVUsQ0FBQyxRQUFRLEtBQVQsSUFBa0IsTUFBaEM7QUFDSDs7QUFFRCxhQUFLLElBQUksYUFBYSxDQUF0QixFQUF5QixhQUFhLFFBQVEsTUFBOUMsRUFBc0QsWUFBdEQsRUFBbUU7QUFDL0Q7QUFDQSxnQkFBSSxlQUFlLFFBQVEsVUFBUixDQUFuQjtBQUNBLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksYUFBYSxNQUFqQyxFQUF5QyxHQUF6QyxFQUE4QztBQUMxQyxvQkFBSSxTQUFTLGFBQWEsQ0FBYixDQUFiO0FBQ0EsZ0NBQWdCLENBQWhCLElBQXFCLE9BQU8sQ0FBUCxDQUFyQjtBQUNBLGdDQUFnQixDQUFoQixJQUFxQixPQUFPLENBQVAsQ0FBckI7O0FBRUE7QUFDQSxvQkFBSSxjQUFKLEVBQW9CO0FBQ2hCLG9DQUFnQixpQkFBaUIsQ0FBakMsSUFBc0MsQ0FBQyxDQUFDLE9BQU8sQ0FBUCxJQUFZLEtBQWIsSUFBc0IsT0FBdEIsR0FBZ0MsS0FBakMsSUFBMEMsa0JBQWhGO0FBQ0Esb0NBQWdCLGlCQUFpQixDQUFqQyxJQUFzQyxDQUFDLENBQUMsT0FBTyxDQUFQLElBQVksS0FBYixJQUFzQixPQUF0QixHQUFnQyxLQUFqQyxJQUEwQyxrQkFBaEY7QUFDSDs7QUFFRCw0QkFBWSxTQUFaLENBQXNCLGVBQXRCO0FBQ0g7QUFDSjs7QUFFRDtBQUNBLFlBQUksVUFBVSxtQkFBbUIsaUJBQU8sT0FBUCxDQUFlLE9BQWYsQ0FBbkIsQ0FBZDtBQUNBLGFBQUssSUFBSSxLQUFJLENBQWIsRUFBZ0IsS0FBSSxRQUFRLE1BQTVCLEVBQW9DLElBQXBDLEVBQXdDO0FBQ3BDLDRCQUFnQixJQUFoQixDQUFxQixpQkFBaUIsUUFBUSxFQUFSLENBQXRDO0FBQ0g7QUFDSjtBQUNKOztBQUVEO0FBQ08sU0FBUyxxQkFBVCxDQUNILFFBREcsRUFFSCxDQUZHLEVBRUEsTUFGQSxFQUVRLFVBRlIsRUFHSCxXQUhHLEVBR1UsZUFIVixFQUlILFlBSkcsRUFLSCxnQkFMRyxTQWFBO0FBQUEsUUFOQyxpQkFNRCxTQU5DLGlCQU1EO0FBQUEsUUFMQyxtQkFLRCxTQUxDLG1CQUtEO0FBQUEsUUFKQyxjQUlELFNBSkMsY0FJRDtBQUFBLFFBSEMsY0FHRCxTQUhDLGNBR0Q7QUFBQSxRQUZDLGtCQUVELFNBRkMsa0JBRUQ7QUFBQSxRQURDLE9BQ0QsU0FEQyxPQUNEOzs7QUFFSDtBQUNBLFFBQUksUUFBUSxLQUFLLGNBQWMsQ0FBbkIsQ0FBWjtBQUNBLFFBQUksUUFBUSxJQUFJLE1BQWhCO0FBQ0Esb0JBQWdCLENBQWhCLElBQXFCLEtBQXJCO0FBQ0Esa0JBQWMsUUFBZCxFQUF3QixXQUF4QixFQUFxQyxlQUFyQyxFQUFzRCxFQUFFLDhCQUFGLEVBQWtCLDhCQUFsQixFQUFrQyxzQ0FBbEMsRUFBdEQ7O0FBRUEsUUFBSSxrQkFBa0IsWUFBWSxlQUFsQztBQUNBLFFBQUksaUJBQWlCLFlBQVksWUFBakM7O0FBRUE7QUFDQTtBQUNBLFFBQUksY0FBSixFQUFvQjtBQUNoQiw2QkFBcUIsc0JBQXNCLENBQTNDOztBQURnQixvQkFFbUIscUNBRm5CO0FBQUE7QUFBQSxZQUVYLEtBRlc7QUFBQSxZQUVKLEtBRkk7QUFBQSxZQUVHLEtBRkg7QUFBQSxZQUVVLEtBRlY7O0FBR2hCLFlBQUksWUFBWSxDQUNaLENBQUMsS0FBRCxFQUFRLEtBQVIsQ0FEWSxFQUVaLENBQUMsS0FBRCxFQUFRLEtBQVIsQ0FGWSxFQUdaLENBQUMsS0FBRCxFQUFRLEtBQVIsQ0FIWSxFQUlaLENBQUMsS0FBRCxFQUFRLEtBQVIsQ0FKWSxDQUFoQjtBQU1IOztBQUVELFFBQUksZUFBZSxTQUFTLE1BQTVCO0FBQ0EsU0FBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksWUFBbEIsRUFBZ0MsR0FBaEMsRUFBcUM7QUFDakMsWUFBSSxVQUFVLFNBQVMsQ0FBVCxDQUFkOztBQUVBLGFBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLFFBQVEsTUFBMUIsRUFBa0MsR0FBbEMsRUFBdUM7QUFDbkMsZ0JBQUksVUFBVSxRQUFRLENBQVIsQ0FBZDs7QUFFQSxpQkFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksUUFBUSxNQUFSLEdBQWlCLENBQW5DLEVBQXNDLEdBQXRDLEVBQTJDO0FBQ3ZDLG9CQUFJLHFCQUFxQix5QkFBWSxRQUFRLENBQVIsQ0FBWixFQUF3QixRQUFRLElBQUUsQ0FBVixDQUF4QixFQUFzQyxtQkFBdEMsQ0FBekIsRUFBcUY7QUFDakYsNkJBRGlGLENBQ3ZFO0FBQ2I7O0FBRUQ7QUFDQSxvQkFBSSxXQUFKO0FBQUEsb0JBQVEsV0FBUjtBQUNBLG9CQUFJLFlBQVksS0FBaEIsRUFBdUI7QUFDbkIseUJBQUssQ0FBTDtBQUNBLHlCQUFLLElBQUUsQ0FBUDtBQUNILGlCQUhELE1BSUs7QUFDRCx5QkFBSyxJQUFFLENBQVA7QUFDQSx5QkFBSyxDQUFMO0FBQ0g7O0FBRUQ7QUFDQSxvQkFBSSxnQkFBZ0IsQ0FDaEIsQ0FBQyxRQUFRLEVBQVIsRUFBWSxDQUFaLENBQUQsRUFBaUIsUUFBUSxFQUFSLEVBQVksQ0FBWixDQUFqQixFQUFpQyxLQUFqQyxDQURnQixFQUVoQixDQUFDLFFBQVEsRUFBUixFQUFZLENBQVosQ0FBRCxFQUFpQixRQUFRLEVBQVIsRUFBWSxDQUFaLENBQWpCLEVBQWlDLEtBQWpDLENBRmdCLEVBR2hCLENBQUMsUUFBUSxFQUFSLEVBQVksQ0FBWixDQUFELEVBQWlCLFFBQVEsRUFBUixFQUFZLENBQVosQ0FBakIsRUFBaUMsS0FBakMsQ0FIZ0IsRUFJaEIsQ0FBQyxRQUFRLEVBQVIsRUFBWSxDQUFaLENBQUQsRUFBaUIsUUFBUSxFQUFSLEVBQVksQ0FBWixDQUFqQixFQUFpQyxLQUFqQyxDQUpnQixDQUFwQjs7QUFPQTtBQUNBLG9CQUFJLFdBQVcsaUJBQU8sU0FBUCxDQUFpQixDQUFDLFFBQVEsRUFBUixFQUFZLENBQVosSUFBaUIsUUFBUSxFQUFSLEVBQVksQ0FBWixDQUFsQixFQUFrQyxRQUFRLEVBQVIsRUFBWSxDQUFaLElBQWlCLFFBQVEsRUFBUixFQUFZLENBQVosQ0FBbkQsRUFBbUUsQ0FBbkUsQ0FBakIsQ0FBZjtBQUNBLG9CQUFJLFNBQVMsaUJBQU8sS0FBUCxDQUFhLE9BQWIsRUFBc0IsUUFBdEIsQ0FBYjs7QUFFQTtBQUNBLGdDQUFnQixlQUFlLENBQS9CLElBQW9DLE9BQU8sQ0FBUCxJQUFZLGdCQUFoRDtBQUNBLGdDQUFnQixlQUFlLENBQS9CLElBQW9DLE9BQU8sQ0FBUCxJQUFZLGdCQUFoRDtBQUNBLGdDQUFnQixlQUFlLENBQS9CLElBQW9DLE9BQU8sQ0FBUCxJQUFZLGdCQUFoRDs7QUFFQSxxQkFBSyxJQUFJLEtBQUcsQ0FBWixFQUFlLEtBQUssY0FBYyxNQUFsQyxFQUEwQyxJQUExQyxFQUFnRDtBQUM1QyxvQ0FBZ0IsQ0FBaEIsSUFBcUIsY0FBYyxFQUFkLEVBQWtCLENBQWxCLENBQXJCO0FBQ0Esb0NBQWdCLENBQWhCLElBQXFCLGNBQWMsRUFBZCxFQUFrQixDQUFsQixDQUFyQjtBQUNBLG9DQUFnQixDQUFoQixJQUFxQixjQUFjLEVBQWQsRUFBa0IsQ0FBbEIsQ0FBckI7O0FBRUEsd0JBQUksY0FBSixFQUFvQjtBQUNoQix3Q0FBZ0IsaUJBQWlCLENBQWpDLElBQXNDLFVBQVUsRUFBVixFQUFjLENBQWQsSUFBbUIsa0JBQXpEO0FBQ0Esd0NBQWdCLGlCQUFpQixDQUFqQyxJQUFzQyxVQUFVLEVBQVYsRUFBYyxDQUFkLElBQW1CLGtCQUF6RDtBQUNIOztBQUVELGdDQUFZLFNBQVosQ0FBc0IsZUFBdEI7QUFDSDs7QUFFRCxnQ0FBZ0IsSUFBaEIsQ0FBcUIsaUJBQWlCLENBQXRDO0FBQ0EsZ0NBQWdCLElBQWhCLENBQXFCLGlCQUFpQixDQUF0QztBQUNBLGdDQUFnQixJQUFoQixDQUFxQixpQkFBaUIsQ0FBdEM7QUFDQSxnQ0FBZ0IsSUFBaEIsQ0FBcUIsaUJBQWlCLENBQXRDO0FBQ0EsZ0NBQWdCLElBQWhCLENBQXFCLGlCQUFpQixDQUF0QztBQUNBLGdDQUFnQixJQUFoQixDQUFxQixpQkFBaUIsQ0FBdEM7O0FBRUEsa0NBQWtCLENBQWxCO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7O0FBRUQ7QUFDQTtBQUNPLFNBQVMsa0JBQVQsQ0FBNkIsSUFBN0IsRUFBbUM7QUFDdEMsV0FBTyxzQkFBTyxLQUFLLFFBQVosRUFBc0IsS0FBSyxLQUEzQixFQUFrQyxLQUFLLFVBQXZDLENBQVA7QUFDSDs7Ozs7Ozs7UUM3SWUsYyxHQUFBLGM7O0FBN0JoQjs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQSxJQUFNLFlBQVksQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFsQjs7QUFFQTtBQVJBOztBQVNBLElBQU0sV0FBVztBQUNiLFVBQU0sQ0FETztBQUViLFlBQVEsQ0FGSztBQUdiLFdBQU87QUFITSxDQUFqQjs7QUFNQSxJQUFNLFlBQVk7QUFDZCxXQUFPLENBRE87QUFFZCxXQUFPLENBRk87QUFHZCxXQUFPO0FBSE8sQ0FBbEI7O0FBTUEsSUFBTSxVQUFVO0FBQ1osaUJBQWEsQ0FERDtBQUVaLHdCQUFvQixDQUZSO0FBR1osb0JBQWdCLENBSEo7QUFJWixtQkFBZSxDQUpILENBSVk7QUFKWixDQUFoQjs7QUFPQTtBQUNBLElBQU0saUJBQWlCLGNBQUksVUFBM0I7O0FBRU8sU0FBUyxjQUFULENBQXlCLEtBQXpCLEVBQWdDLEtBQWhDLEVBQXVDLFdBQXZDLEVBQW9ELGVBQXBELFFBY0E7QUFBQSxRQVpDLGNBWUQsUUFaQyxjQVlEO0FBQUEsUUFYQyxpQkFXRCxRQVhDLGlCQVdEO0FBQUEsUUFWQyxtQkFVRCxRQVZDLG1CQVVEO0FBQUEsUUFUQyxjQVNELFFBVEMsY0FTRDtBQUFBLFFBUkMsY0FRRCxRQVJDLGNBUUQ7QUFBQSxRQVBDLGNBT0QsUUFQQyxjQU9EO0FBQUEsUUFOQyxjQU1ELFFBTkMsY0FNRDtBQUFBLFFBTEMsa0JBS0QsUUFMQyxrQkFLRDtBQUFBLFFBSkMsYUFJRCxRQUpDLGFBSUQ7QUFBQSxRQUhDLGlCQUdELFFBSEMsaUJBR0Q7QUFBQSxRQUZDLElBRUQsUUFGQyxJQUVEO0FBQUEsUUFGTyxHQUVQLFFBRk8sR0FFUDtBQUFBLFFBREMsV0FDRCxRQURDLFdBQ0Q7OztBQUVILFFBQUksV0FBVyxNQUFNLFNBQVMsR0FBVCxDQUFOLEdBQXNCLFNBQVMsSUFBOUM7QUFDQSxRQUFJLFlBQVksT0FBTyxVQUFVLElBQVYsQ0FBUCxHQUF5QixVQUFVLEtBQW5EOztBQUVBO0FBQ0EsUUFBSSxjQUFjLFVBQVUsS0FBNUIsRUFBbUM7QUFDL0Isc0JBQWMsZUFBZSxRQUFRLFdBQXJDLENBRCtCLENBQ21CO0FBQ2xELFlBQUksZUFBZSxjQUFjLFdBQWpDO0FBQ0g7O0FBRUQ7QUFDQSxRQUFJLE9BQUo7QUFDQSxRQUFJLGNBQUosRUFBb0I7QUFDaEIsNkJBQXFCLHNCQUFzQixRQUFRLGtCQUFuRDtBQUNBLHlCQUFpQixrQkFBa0IsUUFBUSxjQUEzQztBQUNBLGtCQUFVLEtBQUssaUJBQWlCLGNBQWpCLEdBQWtDLGNBQXZDLENBQVYsQ0FIZ0IsQ0FHa0Q7QUFDckU7O0FBRUQ7QUFDQSxRQUFJLFVBQVU7QUFDVixzQ0FEVTtBQUVWLDRDQUZVO0FBR1YsZ0RBSFU7QUFJVixrQ0FKVTtBQUtWLDRCQUxVO0FBTVYsMEJBTlU7QUFPVixnQ0FQVTtBQVFWLHdDQVJVO0FBU1Ysb0JBQVksUUFBUSxDQVRWO0FBVVYsb0NBVlU7QUFXViw0Q0FYVTtBQVlWLHdCQVpVO0FBYVYsc0NBYlU7QUFjVixzQ0FkVTtBQWVWO0FBZlUsS0FBZDs7QUFrQkE7QUFDQSxRQUFJLGNBQWMsRUFBbEI7O0FBRUE7QUFDQSxTQUFLLElBQUksUUFBUSxDQUFqQixFQUFvQixRQUFRLE1BQU0sTUFBbEMsRUFBMEMsT0FBMUMsRUFBbUQ7QUFDL0Msc0JBQWMsTUFBTSxLQUFOLENBQWQsRUFBNEIsT0FBNUIsRUFBcUMsV0FBckM7QUFDSDs7QUFFRDtBQUNBLFNBQUssSUFBSSxTQUFRLENBQWpCLEVBQW9CLFNBQVEsWUFBWSxNQUF4QyxFQUFnRCxRQUFoRCxFQUF5RDtBQUNyRCxzQkFBYyxZQUFZLE1BQVosQ0FBZCxFQUFrQyxPQUFsQyxFQUEyQyxXQUEzQztBQUNIO0FBQ0o7O0FBRUQsU0FBUyxhQUFULENBQXVCLElBQXZCLEVBQTZCLE9BQTdCLEVBQXNDLFdBQXRDLEVBQWtEO0FBQzlDO0FBQ0EsUUFBSSxLQUFLLE1BQUwsR0FBYyxDQUFsQixFQUFxQjtBQUNqQjtBQUNIOztBQUo2QyxRQU16QyxTQU55QyxHQU02RCxPQU43RCxDQU16QyxTQU55QztBQUFBLFFBTTlCLFFBTjhCLEdBTTZELE9BTjdELENBTTlCLFFBTjhCO0FBQUEsUUFNcEIsY0FOb0IsR0FNNkQsT0FON0QsQ0FNcEIsY0FOb0I7QUFBQSxRQU1KLGlCQU5JLEdBTTZELE9BTjdELENBTUosaUJBTkk7QUFBQSxRQU1lLG1CQU5mLEdBTTZELE9BTjdELENBTWUsbUJBTmY7QUFBQSxRQU1vQyxPQU5wQyxHQU02RCxPQU43RCxDQU1vQyxPQU5wQztBQUFBLFFBTTZDLFlBTjdDLEdBTTZELE9BTjdELENBTTZDLFlBTjdDOztBQVE5Qzs7QUFDQSxRQUFJLGtCQUFrQixjQUFjLFVBQVUsS0FBOUMsRUFBcUQ7QUFDakQsWUFBSSxnQkFBZ0IscUJBQXFCLElBQXJCLENBQXBCO0FBQ0EsWUFBSSxrQkFBa0IsQ0FBdEIsRUFBeUI7QUFDckI7QUFDQSxnQkFBSSxlQUFlLFlBQVksSUFBWixFQUFrQixhQUFsQixDQUFuQjtBQUNBLHdCQUFZLElBQVosQ0FBaUIsWUFBakI7QUFDQTtBQUNIO0FBQ0o7O0FBRUQsUUFBSSxTQUFKLEVBQWUsU0FBZixFQUEwQixRQUExQixFQUFvQyxRQUFwQztBQUNBLFFBQUksSUFBSSxDQUFSLENBcEI4QyxDQW9CbkM7O0FBRVgsUUFBSSxjQUFjLENBQWxCO0FBQ0EsUUFBSSxZQUFZLEtBQUssTUFBTCxHQUFjLENBQTlCO0FBQ0EsUUFBSSx3QkFBd0IsQ0FBNUI7O0FBRUE7QUFDQTtBQUNBLGdCQUFZLEtBQUssV0FBTCxDQUFaO0FBQ0EsZ0JBQVksS0FBSyxjQUFjLENBQW5CLENBQVo7QUFDQSxXQUFPLGlCQUFPLE9BQVAsQ0FBZSxTQUFmLEVBQTBCLFNBQTFCLENBQVAsRUFBNkM7QUFDekM7QUFDQSxvQkFBWSxTQUFaO0FBQ0Esb0JBQVksS0FBSyxjQUFjLENBQW5CLENBQVo7QUFDQTtBQUNBLFlBQUksZ0JBQWdCLEtBQUssTUFBTCxHQUFjLENBQWxDLEVBQXFDO0FBQ2pDO0FBQ0g7QUFDSjs7QUFFRDtBQUNBLFdBQU8saUJBQU8sT0FBUCxDQUFlLEtBQUssU0FBTCxDQUFmLEVBQWdDLEtBQUssWUFBWSxDQUFqQixDQUFoQyxDQUFQLEVBQTZEO0FBQ3pEO0FBQ0E7QUFDQSxZQUFJLGNBQWMsQ0FBbEIsRUFBcUI7QUFDakI7QUFDSDtBQUNKOztBQUVELFFBQUksS0FBSyxNQUFMLEdBQWMsSUFBSSxxQkFBdEIsRUFBNkM7QUFDekM7QUFDSDs7QUFFRCxlQUFXLGlCQUFPLFNBQVAsQ0FBaUIsaUJBQU8sSUFBUCxDQUFZLFNBQVosRUFBdUIsU0FBdkIsQ0FBakIsQ0FBWDs7QUFFQTtBQUNBLFFBQUkscUJBQXFCLHlCQUFZLFNBQVosRUFBdUIsU0FBdkIsRUFBa0MsbUJBQWxDLENBQXpCLEVBQWlGO0FBQzdFLFlBQUkscUJBQXFCLDBCQUEwQixJQUExQixFQUFnQyxXQUFoQyxFQUE2QyxtQkFBN0MsQ0FBekI7QUFDQSxZQUFJLGtCQUFKLEVBQXdCO0FBQ3BCLHdCQUFZLElBQVosQ0FBaUIsa0JBQWpCO0FBQ0g7QUFDRDtBQUNIOztBQUVELFFBQUksY0FBSixFQUFtQjtBQUNmO0FBQ0EsbUJBQVcsaUJBQU8sU0FBUCxDQUFpQixpQkFBTyxJQUFQLENBQVksS0FBSyxZQUFZLENBQWpCLENBQVosRUFBaUMsU0FBakMsQ0FBakIsQ0FBWDtBQUNBLHFCQUFhLFNBQWIsRUFBd0IsUUFBeEIsRUFBa0MsUUFBbEMsRUFBNEMsU0FBNUMsRUFBdUQsT0FBdkQ7QUFDSCxLQUpELE1BS0s7QUFDRDtBQUNBLFlBQUksQ0FBQyxnQ0FBbUIsU0FBbkIsQ0FBTCxFQUFvQztBQUNoQyxtQkFBTyxTQUFQLEVBQWtCLENBQWxCLEVBQXFCLFFBQXJCLEVBQStCLFFBQS9CLEVBQXlDLElBQXpDLEVBQStDLE9BQS9DO0FBQ0EsZ0JBQUksYUFBYSxTQUFTLElBQTFCLEVBQWdDO0FBQzVCLHFCQUFLLE1BQU0sT0FBTixHQUFnQixRQUFRLGNBQTdCO0FBQ0g7QUFDSjs7QUFFRDtBQUNBLGtCQUFVLFNBQVYsRUFBcUIsUUFBckIsRUFBK0IsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUEvQixFQUF1QyxPQUF2QztBQUNBLGtCQUFVLFNBQVYsRUFBcUIsaUJBQU8sR0FBUCxDQUFXLFFBQVgsQ0FBckIsRUFBMkMsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUEzQyxFQUFtRCxPQUFuRDtBQUNIOztBQUVEO0FBQ0EsU0FBSyxVQUFVLGlCQUFPLE1BQVAsQ0FBYyxpQkFBTyxHQUFQLENBQVcsU0FBWCxFQUFzQixTQUF0QixDQUFkLENBQWY7QUFDQSxTQUFLLElBQUksSUFBSSxjQUFjLENBQTNCLEVBQThCLElBQUksU0FBbEMsRUFBNkMsR0FBN0MsRUFBa0Q7QUFDOUMsWUFBSSxZQUFZLENBQWhCO0FBQ0EsWUFBSSxZQUFZLElBQUksQ0FBcEI7QUFDQSxvQkFBWSxLQUFLLFNBQUwsQ0FBWjtBQUNBLG9CQUFZLEtBQUssU0FBTCxDQUFaOztBQUVBO0FBQ0EsWUFBSSxpQkFBTyxPQUFQLENBQWUsU0FBZixFQUEwQixTQUExQixDQUFKLEVBQTBDO0FBQ3RDO0FBQ0g7O0FBRUQ7QUFDQSxZQUFJLHFCQUFxQix5QkFBWSxTQUFaLEVBQXVCLFNBQXZCLEVBQWtDLG1CQUFsQyxDQUF6QixFQUFpRjtBQUM3RSxzQkFBVSxTQUFWLEVBQXFCLFFBQXJCLEVBQStCLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBL0IsRUFBdUMsT0FBdkM7QUFDQSxzQkFBVSxTQUFWLEVBQXFCLGlCQUFPLEdBQVAsQ0FBVyxRQUFYLENBQXJCLEVBQTJDLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBM0MsRUFBbUQsT0FBbkQ7QUFDQSx1QkFBVyxDQUFYLEVBQWMsT0FBZDs7QUFFQSxnQkFBSSxtQkFBbUIsMEJBQTBCLElBQTFCLEVBQWdDLFlBQVksQ0FBNUMsRUFBK0MsbUJBQS9DLENBQXZCO0FBQ0EsZ0JBQUksZ0JBQUosRUFBc0I7QUFDbEIsNEJBQVksSUFBWixDQUFpQixnQkFBakI7QUFDSDtBQUNEO0FBQ0g7O0FBRUQsbUJBQVcsUUFBWDtBQUNBLG1CQUFXLGlCQUFPLFNBQVAsQ0FBaUIsaUJBQU8sSUFBUCxDQUFZLFNBQVosRUFBdUIsU0FBdkIsQ0FBakIsQ0FBWDs7QUFFQTtBQUNBLFlBQUksY0FBYyxVQUFVLEtBQTVCLEVBQW1DO0FBQy9CLHFCQUFTLENBQVQsRUFBWSxTQUFaLEVBQXVCLFFBQXZCLEVBQWlDLFFBQWpDLEVBQTJDLFlBQTNDLEVBQXlELEtBQXpELEVBQWdFLE9BQWhFO0FBQ0gsU0FGRCxNQUdLO0FBQ0Qsb0JBQVEsU0FBUixFQUFtQixDQUFuQixFQUFzQixTQUF0QixFQUFpQyxRQUFqQyxFQUEyQyxRQUEzQyxFQUFxRCxLQUFyRCxFQUE0RCxPQUE1RDtBQUNIOztBQUVELGFBQUssVUFBVSxpQkFBTyxNQUFQLENBQWMsaUJBQU8sR0FBUCxDQUFXLFNBQVgsRUFBc0IsU0FBdEIsQ0FBZCxDQUFmO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBWSxTQUFaO0FBQ0EsZUFBVyxRQUFYOztBQUVBLFFBQUksY0FBSixFQUFvQjtBQUNoQjtBQUNBLG1CQUFXLGlCQUFPLFNBQVAsQ0FBaUIsaUJBQU8sSUFBUCxDQUFZLFNBQVosRUFBdUIsS0FBSyxDQUFMLENBQXZCLENBQWpCLENBQVg7QUFDQSxtQkFBVyxTQUFYLEVBQXNCLFFBQXRCLEVBQWdDLFFBQWhDLEVBQTBDLFNBQTFDLEVBQXFELENBQXJELEVBQXdELE9BQXhEO0FBQ0gsS0FKRCxNQUtLO0FBQ0Q7QUFDQSxrQkFBVSxTQUFWLEVBQXFCLFFBQXJCLEVBQStCLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBL0IsRUFBdUMsT0FBdkM7QUFDQSxrQkFBVSxTQUFWLEVBQXFCLGlCQUFPLEdBQVAsQ0FBVyxRQUFYLENBQXJCLEVBQTJDLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBM0MsRUFBbUQsT0FBbkQ7QUFDQSxtQkFBVyxDQUFYLEVBQWMsT0FBZDs7QUFFQTtBQUNBLFlBQUksQ0FBQyxnQ0FBbUIsU0FBbkIsQ0FBTCxFQUFvQztBQUNoQyxtQkFBTyxTQUFQLEVBQWtCLENBQWxCLEVBQXFCLFFBQXJCLEVBQStCLFFBQS9CLEVBQXlDLEtBQXpDLEVBQWdELE9BQWhEO0FBQ0g7QUFDSjtBQUNKOztBQUVELFNBQVMsb0JBQVQsQ0FBOEIsSUFBOUIsRUFBbUM7QUFDL0IsUUFBSSxnQ0FBbUIsS0FBSyxDQUFMLENBQW5CLENBQUosRUFBaUM7QUFDN0IsZUFBTyxDQUFQO0FBQ0g7O0FBRUQsU0FBSyxJQUFJLFlBQVksQ0FBckIsRUFBd0IsWUFBWSxLQUFLLE1BQXpDLEVBQWlELFdBQWpELEVBQThEO0FBQzFELFlBQUksWUFBWSxLQUFLLEtBQUssTUFBTCxHQUFjLENBQWQsR0FBa0IsU0FBdkIsQ0FBaEI7QUFDQSxZQUFJLGdDQUFtQixTQUFuQixDQUFKLEVBQW1DO0FBQy9CLG1CQUFPLEtBQUssTUFBTCxHQUFjLENBQWQsR0FBa0IsU0FBekI7QUFDSDtBQUNKOztBQUVELFdBQU8sQ0FBUDtBQUNIOztBQUVEO0FBQ0EsU0FBUyx5QkFBVCxDQUFvQyxJQUFwQyxFQUEwQyxVQUExQyxFQUFzRCxTQUF0RCxFQUFpRTtBQUM3RCxRQUFJLFdBQVcsVUFBZjtBQUNBLFdBQU8sS0FBSyxXQUFXLENBQWhCLEtBQXNCLHlCQUFZLEtBQUssUUFBTCxDQUFaLEVBQTRCLEtBQUssV0FBVyxDQUFoQixDQUE1QixFQUFnRCxTQUFoRCxDQUE3QixFQUF5RjtBQUNyRjtBQUNIOztBQUVEO0FBQ0EsV0FBUSxLQUFLLE1BQUwsR0FBYyxRQUFkLElBQTBCLENBQTNCLEdBQWdDLEtBQUssS0FBTCxDQUFXLFFBQVgsQ0FBaEMsR0FBdUQsS0FBOUQ7QUFDSDs7QUFFRDtBQUNBLFNBQVMsWUFBVCxDQUFzQixTQUF0QixFQUFpQyxRQUFqQyxFQUEyQyxRQUEzQyxFQUFxRCxTQUFyRCxFQUFnRSxPQUFoRSxFQUF3RTtBQUNwRTtBQUNBLFFBQUksY0FBYyxTQUFkLElBQTJCLGdDQUFtQixTQUFuQixDQUEvQixFQUE4RDtBQUMxRCxrQkFBVSxTQUFWLEVBQXFCLFFBQXJCLEVBQStCLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBL0IsRUFBdUMsT0FBdkM7QUFDQSxrQkFBVSxTQUFWLEVBQXFCLGlCQUFPLEdBQVAsQ0FBVyxRQUFYLENBQXJCLEVBQTJDLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBM0MsRUFBbUQsT0FBbkQ7QUFDSCxLQUhELE1BSUs7QUFDRDtBQUNBLFlBQUksSUFBSSxDQUFSO0FBQ0EsWUFBSSxjQUFjLFVBQVUsS0FBNUIsRUFBbUM7QUFDL0IscUJBQVMsQ0FBVCxFQUFZLFNBQVosRUFBdUIsUUFBdkIsRUFBaUMsUUFBakMsRUFBMkMsUUFBUSxZQUFuRCxFQUFpRSxJQUFqRSxFQUF1RSxPQUF2RTtBQUNILFNBRkQsTUFHSztBQUNELG9CQUFRLFNBQVIsRUFBbUIsQ0FBbkIsRUFBc0IsU0FBdEIsRUFBaUMsUUFBakMsRUFBMkMsUUFBM0MsRUFBcUQsSUFBckQsRUFBMkQsT0FBM0Q7QUFDSDtBQUNKO0FBQ0o7O0FBRUQ7QUFDQSxTQUFTLFVBQVQsQ0FBb0IsU0FBcEIsRUFBK0IsUUFBL0IsRUFBeUMsUUFBekMsRUFBbUQsU0FBbkQsRUFBOEQsQ0FBOUQsRUFBaUUsT0FBakUsRUFBMEU7QUFDdEU7QUFDQSxRQUFJLGdDQUFtQixTQUFuQixDQUFKLEVBQW1DO0FBQy9CLGtCQUFVLFNBQVYsRUFBcUIsUUFBckIsRUFBK0IsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUEvQixFQUF1QyxPQUF2QztBQUNBLGtCQUFVLFNBQVYsRUFBcUIsaUJBQU8sR0FBUCxDQUFXLFFBQVgsQ0FBckIsRUFBMkMsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUEzQyxFQUFtRCxPQUFuRDtBQUNBLG1CQUFXLENBQVgsRUFBYyxPQUFkO0FBQ0gsS0FKRCxNQUtLO0FBQ0Q7QUFDQSxZQUFJLFdBQVcsZUFBZSxRQUFmLEVBQXlCLFFBQXpCLENBQWY7O0FBRUEsWUFBSSxjQUFjLFVBQVUsS0FBeEIsSUFBaUMsaUJBQU8sUUFBUCxDQUFnQixRQUFoQixJQUE0QixRQUFRLFlBQXpFLEVBQXVGO0FBQ25GLHdCQUFZLFVBQVUsS0FBdEIsQ0FEbUYsQ0FDdEQ7QUFDaEM7O0FBRUQsWUFBSSxjQUFjLFVBQVUsS0FBNUIsRUFBbUM7QUFDL0Isc0JBQVUsU0FBVixFQUFxQixRQUFyQixFQUErQixDQUFDLENBQUQsRUFBSSxDQUFKLENBQS9CLEVBQXVDLE9BQXZDO0FBQ0Esc0JBQVUsU0FBVixFQUFxQixpQkFBTyxHQUFQLENBQVcsUUFBWCxDQUFyQixFQUEyQyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQTNDLEVBQW1ELE9BQW5EO0FBQ0EsdUJBQVcsQ0FBWCxFQUFjLE9BQWQ7QUFDSCxTQUpELE1BS0s7QUFDRCxzQkFBVSxTQUFWLEVBQXFCLFFBQXJCLEVBQStCLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBL0IsRUFBdUMsT0FBdkM7QUFDQSxzQkFBVSxTQUFWLEVBQXFCLGlCQUFPLEdBQVAsQ0FBVyxRQUFYLENBQXJCLEVBQTJDLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBM0MsRUFBbUQsT0FBbkQ7QUFDQSx1QkFBVyxDQUFYLEVBQWMsT0FBZDtBQUNIO0FBQ0o7QUFDSjs7QUFFRCxTQUFTLGNBQVQsQ0FBd0IsUUFBeEIsRUFBa0MsUUFBbEMsRUFBNEM7QUFDeEMsUUFBSSxXQUFXLGlCQUFPLFNBQVAsQ0FBaUIsaUJBQU8sR0FBUCxDQUFXLFFBQVgsRUFBcUIsUUFBckIsQ0FBakIsQ0FBZjtBQUNBLFFBQUksUUFBUSxLQUFLLElBQUksS0FBSyxHQUFMLENBQVMsaUJBQU8sR0FBUCxDQUFXLFFBQVgsRUFBcUIsUUFBckIsQ0FBVCxDQUFULENBQVo7QUFDQSxXQUFPLGlCQUFPLElBQVAsQ0FBWSxRQUFaLEVBQXNCLFFBQVEsS0FBOUIsQ0FBUDtBQUNIOztBQUVEO0FBQ0EsU0FBUyxRQUFULENBQW1CLENBQW5CLEVBQXNCLFNBQXRCLEVBQWlDLFFBQWpDLEVBQTJDLFFBQTNDLEVBQXFELFlBQXJELEVBQW1FLFdBQW5FLEVBQWdGLE9BQWhGLEVBQXlGO0FBQ3JGLFFBQUksV0FBVyxlQUFlLFFBQWYsRUFBeUIsUUFBekIsQ0FBZjs7QUFFQTtBQUNBLFFBQUksaUJBQU8sUUFBUCxDQUFnQixRQUFoQixJQUE0QixZQUFoQyxFQUE4QztBQUMxQyxnQkFBUSxVQUFVLEtBQWxCLEVBQXlCLENBQXpCLEVBQTRCLFNBQTVCLEVBQXVDLFFBQXZDLEVBQWlELFFBQWpELEVBQTJELFdBQTNELEVBQXdFLE9BQXhFO0FBQ0gsS0FGRCxNQUdLO0FBQ0Qsa0JBQVUsU0FBVixFQUFxQixRQUFyQixFQUErQixDQUFDLENBQUQsRUFBSSxDQUFKLENBQS9CLEVBQXVDLE9BQXZDO0FBQ0Esa0JBQVUsU0FBVixFQUFxQixpQkFBTyxHQUFQLENBQVcsUUFBWCxDQUFyQixFQUEyQyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQTNDLEVBQW1ELE9BQW5EO0FBQ0EsWUFBSSxDQUFDLFdBQUwsRUFBa0I7QUFDZCx1QkFBVyxDQUFYLEVBQWMsT0FBZDtBQUNIO0FBQ0o7QUFDSjs7QUFFRDtBQUNBLFNBQVMsT0FBVCxDQUFpQixTQUFqQixFQUE0QixDQUE1QixFQUErQixTQUEvQixFQUEwQyxRQUExQyxFQUFvRCxRQUFwRCxFQUE4RCxXQUE5RCxFQUEyRSxPQUEzRSxFQUFvRjtBQUNoRixRQUFJLFdBQVcsZUFBZSxRQUFmLEVBQXlCLFFBQXpCLENBQWY7QUFDQSxRQUFJLGNBQWUsU0FBUyxDQUFULElBQWMsU0FBUyxDQUFULENBQWQsR0FBNEIsU0FBUyxDQUFULElBQWMsU0FBUyxDQUFULENBQTFDLEdBQXdELENBQTNFOztBQUVBLFFBQUksV0FBSixFQUFnQjtBQUNaLGtCQUFVLFNBQVYsRUFBcUIsUUFBckIsRUFBK0IsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUEvQixFQUF1QyxPQUF2QztBQUNBLGtCQUFVLFNBQVYsRUFBcUIsaUJBQU8sR0FBUCxDQUFXLFFBQVgsQ0FBckIsRUFBMkMsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUEzQyxFQUFtRCxPQUFuRDs7QUFFQSxZQUFJLENBQUMsV0FBTCxFQUFrQjtBQUNkLHVCQUFXLENBQVgsRUFBYyxPQUFkO0FBQ0g7O0FBRUQsWUFBSSxjQUFjLFVBQVUsS0FBNUIsRUFBbUM7QUFDL0IscUJBQVMsU0FBVCxFQUNJLGlCQUFPLEdBQVAsQ0FBVyxRQUFYLENBREosRUFDMEIsUUFEMUIsRUFDb0MsaUJBQU8sR0FBUCxDQUFXLFFBQVgsQ0FEcEMsRUFFSSxDQUFDLENBQUQsRUFBSSxDQUFKLENBRkosRUFFWSxDQUFDLENBQUQsRUFBSSxDQUFKLENBRlosRUFFb0IsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUZwQixFQUdJLE9BSEo7QUFLSCxTQU5ELE1BT0ssSUFBSSxjQUFjLFVBQVUsS0FBNUIsRUFBbUM7QUFDcEMsbUJBQU8sU0FBUCxFQUNJLGlCQUFPLEdBQVAsQ0FBVyxRQUFYLENBREosRUFDMEIsUUFEMUIsRUFDb0MsaUJBQU8sR0FBUCxDQUFXLFFBQVgsQ0FEcEMsRUFFSSxDQUFDLENBQUQsRUFBSSxDQUFKLENBRkosRUFFWSxDQUFDLENBQUQsRUFBSSxDQUFKLENBRlosRUFFb0IsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUZwQixFQUdJLEtBSEosRUFHVyxPQUhYO0FBS0g7O0FBRUQsa0JBQVUsU0FBVixFQUFxQixRQUFyQixFQUErQixDQUFDLENBQUQsRUFBSSxDQUFKLENBQS9CLEVBQXVDLE9BQXZDO0FBQ0Esa0JBQVUsU0FBVixFQUFxQixpQkFBTyxHQUFQLENBQVcsUUFBWCxDQUFyQixFQUEyQyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQTNDLEVBQW1ELE9BQW5EO0FBQ0gsS0F6QkQsTUEwQks7QUFDRCxrQkFBVSxTQUFWLEVBQXFCLFFBQXJCLEVBQStCLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBL0IsRUFBdUMsT0FBdkM7QUFDQSxrQkFBVSxTQUFWLEVBQXFCLGlCQUFPLEdBQVAsQ0FBVyxRQUFYLENBQXJCLEVBQTJDLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBM0MsRUFBbUQsT0FBbkQ7O0FBRUEsWUFBSSxDQUFDLFdBQUwsRUFBa0I7QUFDZCx1QkFBVyxDQUFYLEVBQWMsT0FBZDtBQUNIOztBQUVELFlBQUksY0FBYyxVQUFVLEtBQTVCLEVBQW1DO0FBQy9CLHFCQUFTLFNBQVQsRUFDSSxRQURKLEVBQ2MsaUJBQU8sR0FBUCxDQUFXLFFBQVgsQ0FEZCxFQUNvQyxRQURwQyxFQUVJLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FGSixFQUVZLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FGWixFQUVvQixDQUFDLENBQUQsRUFBSSxDQUFKLENBRnBCLEVBR0ksT0FISjtBQUtILFNBTkQsTUFPSyxJQUFJLGNBQWMsVUFBVSxLQUE1QixFQUFtQztBQUNwQyxtQkFBTyxTQUFQLEVBQ0ksUUFESixFQUNjLGlCQUFPLEdBQVAsQ0FBVyxRQUFYLENBRGQsRUFDb0MsUUFEcEMsRUFFSSxDQUFDLENBQUQsRUFBSSxDQUFKLENBRkosRUFFWSxDQUFDLENBQUQsRUFBSSxDQUFKLENBRlosRUFFb0IsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUZwQixFQUdJLEtBSEosRUFHVyxPQUhYO0FBS0g7O0FBRUQsa0JBQVUsU0FBVixFQUFxQixRQUFyQixFQUErQixDQUFDLENBQUQsRUFBSSxDQUFKLENBQS9CLEVBQXVDLE9BQXZDO0FBQ0Esa0JBQVUsU0FBVixFQUFxQixpQkFBTyxHQUFQLENBQVcsUUFBWCxDQUFyQixFQUEyQyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQTNDLEVBQW1ELE9BQW5EO0FBQ0g7QUFDSjs7QUFFRDtBQUNBLFNBQVMsVUFBVCxDQUFvQixTQUFwQixFQUErQixPQUEvQixFQUF1QztBQUNuQyxRQUFJLGtCQUFrQixRQUFRLFdBQVIsQ0FBb0IsZUFBMUM7QUFDQSxRQUFJLGVBQWUsUUFBUSxXQUFSLENBQW9CLFlBQXZDO0FBQ0EsUUFBSSxTQUFTLGVBQWUsSUFBSSxTQUFuQixHQUErQixDQUE1Qzs7QUFFQSxTQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksU0FBcEIsRUFBK0IsR0FBL0IsRUFBbUM7QUFDL0Isd0JBQWdCLElBQWhCLENBQXFCLFNBQVMsSUFBSSxDQUFiLEdBQWlCLENBQXRDO0FBQ0Esd0JBQWdCLElBQWhCLENBQXFCLFNBQVMsSUFBSSxDQUFiLEdBQWlCLENBQXRDO0FBQ0Esd0JBQWdCLElBQWhCLENBQXFCLFNBQVMsSUFBSSxDQUFiLEdBQWlCLENBQXRDO0FBQ0Esd0JBQWdCLElBQWhCLENBQXFCLFNBQVMsSUFBSSxDQUFiLEdBQWlCLENBQXRDO0FBQ0Esd0JBQWdCLElBQWhCLENBQXFCLFNBQVMsSUFBSSxDQUFiLEdBQWlCLENBQXRDO0FBQ0Esd0JBQWdCLElBQWhCLENBQXFCLFNBQVMsSUFBSSxDQUFiLEdBQWlCLENBQXRDO0FBQ0g7QUFDSjs7QUFFRCxTQUFTLFNBQVQsQ0FBbUIsVUFBbkIsRUFBK0IsTUFBL0IsRUFBdUMsRUFBdkMsRUFBMkMsT0FBM0MsRUFBb0Q7QUFDaEQsUUFBSSxrQkFBa0IsUUFBUSxlQUE5QjtBQUNBLFFBQUksY0FBYyxRQUFRLFdBQTFCOztBQUVBLHdCQUFvQixlQUFwQixFQUFxQyxVQUFyQyxFQUFpRCxFQUFqRCxFQUFxRCxNQUFyRCxFQUE2RCxPQUE3RDtBQUNBLGdCQUFZLFNBQVosQ0FBc0IsZUFBdEI7QUFDSDs7QUFFRCxTQUFTLG1CQUFULENBQThCLGVBQTlCLEVBQStDLE1BQS9DLEVBQXVELGFBQXZELEVBQXNFLEtBQXRFLEVBQTZFLE9BQTdFLEVBQXNGO0FBQ2xGO0FBQ0Esb0JBQWdCLENBQWhCLElBQXFCLE9BQU8sQ0FBUCxDQUFyQjtBQUNBLG9CQUFnQixDQUFoQixJQUFxQixPQUFPLENBQVAsQ0FBckI7O0FBRUE7QUFDQSxRQUFJLFFBQVEsY0FBUixJQUEwQixhQUE5QixFQUE2QztBQUN6Qyx3QkFBZ0IsUUFBUSxjQUFSLEdBQXlCLENBQXpDLElBQThDLGNBQWMsQ0FBZCxJQUFtQixRQUFRLGtCQUF6RTtBQUNBLHdCQUFnQixRQUFRLGNBQVIsR0FBeUIsQ0FBekMsSUFBOEMsY0FBYyxDQUFkLElBQW1CLFFBQVEsa0JBQXpFO0FBQ0g7O0FBRUQ7QUFDQSxRQUFJLFFBQVEsYUFBWixFQUEyQjtBQUN2Qix3QkFBZ0IsUUFBUSxhQUFSLEdBQXdCLENBQXhDLElBQTZDLE1BQU0sQ0FBTixJQUFXLFFBQVEsaUJBQWhFO0FBQ0Esd0JBQWdCLFFBQVEsYUFBUixHQUF3QixDQUF4QyxJQUE2QyxNQUFNLENBQU4sSUFBVyxRQUFRLGlCQUFoRTtBQUNBLHdCQUFnQixRQUFRLGFBQVIsR0FBd0IsQ0FBeEMsSUFBNkMsUUFBUSxVQUFyRDtBQUNIO0FBQ0o7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLE1BQVQsQ0FBaUIsS0FBakIsRUFBd0IsRUFBeEIsRUFBNEIsRUFBNUIsRUFBZ0MsRUFBaEMsRUFBb0MsR0FBcEMsRUFBeUMsR0FBekMsRUFBOEMsR0FBOUMsRUFBbUQsS0FBbkQsRUFBMEQsT0FBMUQsRUFBbUU7QUFDL0QsUUFBSSxRQUFRLEdBQUcsQ0FBSCxJQUFRLEdBQUcsQ0FBSCxDQUFSLEdBQWdCLEdBQUcsQ0FBSCxJQUFRLEdBQUcsQ0FBSCxDQUFwQztBQUNBLFFBQUksTUFBTSxpQkFBTyxHQUFQLENBQVcsRUFBWCxFQUFlLEVBQWYsQ0FBVjs7QUFFQSxRQUFJLFFBQVEsS0FBSyxLQUFMLENBQVcsS0FBWCxFQUFrQixHQUFsQixDQUFaO0FBQ0EsV0FBTyxTQUFTLEtBQUssRUFBckIsRUFBeUI7QUFDckIsaUJBQVMsSUFBRSxLQUFLLEVBQWhCO0FBQ0g7O0FBRUQsUUFBSSxlQUFlLGdCQUFnQixLQUFoQixFQUF1QixRQUFRLFVBQS9CLENBQW5CO0FBQ0EsUUFBSSxlQUFlLENBQW5CLEVBQXNCO0FBQ2xCO0FBQ0g7O0FBRUQsUUFBSSxhQUFhLFFBQVEsV0FBUixDQUFvQixZQUFyQztBQUNBLFFBQUksa0JBQWtCLFFBQVEsV0FBUixDQUFvQixlQUExQzs7QUFFQSxjQUFVLEtBQVYsRUFBaUIsRUFBakIsRUFBcUIsR0FBckIsRUFBMEIsT0FBMUI7QUFDQSxjQUFVLEtBQVYsRUFBaUIsRUFBakIsRUFBcUIsR0FBckIsRUFBMEIsT0FBMUI7O0FBRUEsUUFBSSxRQUFRLEVBQVo7O0FBRUEsUUFBSSxRQUFRLGNBQVIsS0FBMkIsU0FBL0IsRUFBMEM7QUFDdEMsWUFBSSxNQUFKO0FBQ0EsWUFBSSxLQUFKLEVBQVU7QUFDTixxQkFBUyxFQUFUO0FBQ0EsZ0JBQUksZ0JBQWdCLGlCQUFPLEdBQVAsQ0FBVyxHQUFYLEVBQWdCLEdBQWhCLENBQXBCO0FBQ0gsU0FIRCxNQUlLO0FBQ0QscUJBQVMsaUJBQU8sR0FBUCxDQUFXLEdBQVgsQ0FBVDtBQUNBLGdCQUFJLFdBQVcsaUJBQU8sR0FBUCxDQUFXLGlCQUFPLEdBQVAsQ0FBVyxHQUFYLEVBQWdCLEdBQWhCLENBQVgsRUFBaUMsWUFBakMsQ0FBZjtBQUNIO0FBQ0o7O0FBRUQsUUFBSSxhQUFhLFFBQVEsWUFBekI7QUFDQSxTQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksWUFBcEIsRUFBa0MsR0FBbEMsRUFBdUM7QUFDbkMsZ0JBQVEsaUJBQU8sR0FBUCxDQUFXLEtBQVgsRUFBa0IsVUFBbEIsQ0FBUjs7QUFFQSxZQUFJLFFBQVEsY0FBUixLQUEyQixTQUEvQixFQUEwQztBQUN0QyxnQkFBSSxLQUFKLEVBQVU7QUFDTjtBQUNBLGdDQUFnQixpQkFBTyxHQUFQLENBQVcsYUFBWCxFQUEwQixVQUExQixDQUFoQjtBQUNBLHVCQUFPLENBQVAsSUFBWSxjQUFjLENBQWQsSUFBbUIsSUFBSSxDQUFKLENBQS9CO0FBQ0EsdUJBQU8sQ0FBUCxJQUFZLGNBQWMsQ0FBZCxJQUFtQixRQUFRLGNBQTNCLEdBQTRDLFFBQVEsT0FBcEQsR0FBOEQsSUFBSSxDQUFKLENBQTFFLENBSk0sQ0FJNEU7QUFDckYsYUFMRCxNQU1LO0FBQ0Q7QUFDQSx5QkFBUyxpQkFBTyxHQUFQLENBQVcsTUFBWCxFQUFtQixRQUFuQixDQUFUO0FBQ0g7QUFDSjs7QUFFRCxrQkFBVSxLQUFWLEVBQWlCLEtBQWpCLEVBQXdCLE1BQXhCLEVBQWdDLE9BQWhDOztBQUVBLHdCQUFnQixJQUFoQixDQUFxQixhQUFhLENBQWIsSUFBbUIsUUFBUSxDQUFULEdBQWMsQ0FBZCxHQUFrQixDQUFwQyxDQUFyQjtBQUNBLHdCQUFnQixJQUFoQixDQUFxQixVQUFyQjtBQUNBLHdCQUFnQixJQUFoQixDQUFxQixhQUFhLENBQWIsSUFBbUIsUUFBUSxDQUFULEdBQWMsQ0FBZCxHQUFrQixDQUFwQyxDQUFyQjtBQUNIO0FBQ0o7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsUUFBVCxDQUFtQixLQUFuQixFQUEwQixFQUExQixFQUE4QixFQUE5QixFQUFrQyxFQUFsQyxFQUFzQyxFQUF0QyxFQUEwQyxFQUExQyxFQUE4QyxFQUE5QyxFQUFrRCxPQUFsRCxFQUEyRDtBQUN2RCxRQUFJLGFBQWEsUUFBUSxXQUFSLENBQW9CLFlBQXJDOztBQUVBLGNBQVUsS0FBVixFQUFpQixFQUFqQixFQUFxQixFQUFyQixFQUF5QixPQUF6QjtBQUNBLGNBQVUsS0FBVixFQUFpQixFQUFqQixFQUFxQixFQUFyQixFQUF5QixPQUF6QjtBQUNBLGNBQVUsS0FBVixFQUFpQixFQUFqQixFQUFxQixFQUFyQixFQUF5QixPQUF6Qjs7QUFFQSxRQUFJLGNBQWMsR0FBRyxDQUFILElBQVEsR0FBRyxDQUFILENBQVIsR0FBZ0IsR0FBRyxDQUFILElBQVEsR0FBRyxDQUFILENBQXhCLEdBQWdDLENBQWxEOztBQUVBLFFBQUksa0JBQWtCLFFBQVEsV0FBUixDQUFvQixlQUExQzs7QUFFQSxRQUFJLFdBQUosRUFBaUI7QUFDYix3QkFBZ0IsSUFBaEIsQ0FBcUIsYUFBYSxDQUFsQztBQUNBLHdCQUFnQixJQUFoQixDQUFxQixhQUFhLENBQWxDO0FBQ0Esd0JBQWdCLElBQWhCLENBQXFCLGFBQWEsQ0FBbEM7QUFDSCxLQUpELE1BSU87QUFDSCx3QkFBZ0IsSUFBaEIsQ0FBcUIsYUFBYSxDQUFsQztBQUNBLHdCQUFnQixJQUFoQixDQUFxQixhQUFhLENBQWxDO0FBQ0Esd0JBQWdCLElBQWhCLENBQXFCLGFBQWEsQ0FBbEM7QUFDSDtBQUNKOztBQUVEO0FBQ0E7QUFDQSxTQUFTLE1BQVQsQ0FBaUIsS0FBakIsRUFBd0IsQ0FBeEIsRUFBMkIsTUFBM0IsRUFBbUMsSUFBbkMsRUFBeUMsV0FBekMsRUFBc0QsT0FBdEQsRUFBK0Q7QUFDM0QsUUFBSSxhQUFhLGlCQUFPLEdBQVAsQ0FBVyxNQUFYLENBQWpCOztBQUVBLFlBQVEsSUFBUjtBQUNJLGFBQUssU0FBUyxNQUFkO0FBQ0ksZ0JBQUksT0FBSjtBQUNBLGdCQUFJLFdBQUosRUFBZ0I7QUFDWiwwQkFBVSxDQUFDLE9BQU8sQ0FBUCxDQUFELEVBQVksQ0FBQyxPQUFPLENBQVAsQ0FBYixDQUFWOztBQUVBLDBCQUFVLEtBQVYsRUFBaUIsaUJBQU8sR0FBUCxDQUFXLE1BQVgsRUFBbUIsT0FBbkIsQ0FBakIsRUFBOEMsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUE5QyxFQUFzRCxPQUF0RDtBQUNBLDBCQUFVLEtBQVYsRUFBaUIsaUJBQU8sR0FBUCxDQUFXLFVBQVgsRUFBdUIsT0FBdkIsQ0FBakIsRUFBa0QsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFsRCxFQUEwRCxPQUExRDs7QUFFQTtBQUNBLHFCQUFLLE1BQU0sUUFBUSxjQUFkLEdBQStCLFFBQVEsT0FBNUM7O0FBRUEsMEJBQVUsS0FBVixFQUFpQixNQUFqQixFQUF5QixDQUFDLENBQUQsRUFBSSxDQUFKLENBQXpCLEVBQWlDLE9BQWpDO0FBQ0EsMEJBQVUsS0FBVixFQUFpQixVQUFqQixFQUE2QixDQUFDLENBQUQsRUFBSSxDQUFKLENBQTdCLEVBQXFDLE9BQXJDO0FBQ0gsYUFYRCxNQVlLO0FBQ0QsMEJBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBUCxDQUFGLEVBQWEsT0FBTyxDQUFQLENBQWIsQ0FBVjs7QUFFQSwwQkFBVSxLQUFWLEVBQWlCLE1BQWpCLEVBQXlCLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBekIsRUFBaUMsT0FBakM7QUFDQSwwQkFBVSxLQUFWLEVBQWlCLFVBQWpCLEVBQTZCLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBN0IsRUFBcUMsT0FBckM7O0FBRUE7QUFDQSxxQkFBSyxNQUFNLFFBQVEsY0FBZCxHQUErQixRQUFRLE9BQTVDOztBQUVBLDBCQUFVLEtBQVYsRUFBaUIsaUJBQU8sR0FBUCxDQUFXLE1BQVgsRUFBbUIsT0FBbkIsQ0FBakIsRUFBOEMsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUE5QyxFQUFzRCxPQUF0RDtBQUNBLDBCQUFVLEtBQVYsRUFBaUIsaUJBQU8sR0FBUCxDQUFXLFVBQVgsRUFBdUIsT0FBdkIsQ0FBakIsRUFBa0QsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFsRCxFQUEwRCxPQUExRDtBQUNIOztBQUVELHVCQUFXLENBQVgsRUFBYyxPQUFkO0FBQ0E7QUFDSixhQUFLLFNBQVMsS0FBZDtBQUNJLGdCQUFJLEVBQUosRUFBUSxFQUFSLEVBQVksR0FBWixFQUFpQixHQUFqQixFQUFzQixHQUF0QjtBQUNBLGdCQUFJLFdBQUosRUFBaUI7QUFDYixxQkFBSyxNQUFMO0FBQ0EscUJBQUssVUFBTDs7QUFFQSxvQkFBSSxRQUFRLGNBQVIsS0FBMkIsU0FBL0IsRUFBeUM7QUFDckMseUJBQUssTUFBTSxRQUFRLGNBQWQsR0FBK0IsUUFBUSxPQUE1QztBQUNBLDBCQUFNLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBTjtBQUNBLDBCQUFNLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBTjtBQUNBLDBCQUFNLENBQUMsR0FBRCxFQUFNLENBQU4sQ0FBTjtBQUNIO0FBQ0osYUFWRCxNQVdLO0FBQ0QscUJBQUssVUFBTDtBQUNBLHFCQUFLLE1BQUw7O0FBRUEsb0JBQUksUUFBUSxjQUFSLEtBQTJCLFNBQS9CLEVBQXlDO0FBQ3JDLDBCQUFNLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBTjtBQUNBLDBCQUFNLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBTjtBQUNBLDBCQUFNLENBQUMsR0FBRCxFQUFNLENBQU4sQ0FBTjtBQUNIO0FBQ0o7O0FBRUQsbUJBQU8sS0FBUCxFQUNJLEVBREosRUFDUSxTQURSLEVBQ21CLEVBRG5CLEVBRUksR0FGSixFQUVTLEdBRlQsRUFFYyxHQUZkLEVBR0ksSUFISixFQUdVLE9BSFY7O0FBTUE7QUFDSixhQUFLLFNBQVMsSUFBZDtBQUNJO0FBOURSO0FBZ0VIOztBQUVEO0FBQ0EsSUFBSSxPQUFPLEtBQUssSUFBTCxJQUFhLFVBQVMsQ0FBVCxFQUFXO0FBQUUsV0FBTyxLQUFLLEdBQUwsQ0FBUyxDQUFULElBQWMsS0FBSyxLQUExQjtBQUFrQyxDQUF2RTs7QUFFQTtBQUNBLFNBQVMsZUFBVCxDQUEwQixLQUExQixFQUFpQyxLQUFqQyxFQUF3QztBQUNwQyxRQUFJLFFBQVEsQ0FBWixFQUFlO0FBQ1gsZ0JBQVEsQ0FBQyxLQUFUO0FBQ0g7O0FBRUQsUUFBSSxlQUFnQixRQUFRLElBQUksUUFBUSxhQUFyQixHQUFzQyxLQUFLLFFBQVEsUUFBUSxhQUFyQixDQUF0QyxHQUE0RSxDQUEvRjtBQUNBLFdBQU8sS0FBSyxJQUFMLENBQVUsUUFBUSxLQUFLLEVBQWIsR0FBa0IsWUFBNUIsQ0FBUDtBQUNIOztBQUVEO0FBQ0EsU0FBUyxXQUFULENBQXFCLElBQXJCLEVBQTJCLFVBQTNCLEVBQXNDO0FBQ2xDLFFBQUksVUFBVSxFQUFkO0FBQ0EsU0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssTUFBekIsRUFBaUMsR0FBakMsRUFBcUM7QUFDakMsWUFBSSxRQUFRLENBQUMsSUFBSSxVQUFMLElBQW1CLEtBQUssTUFBcEM7QUFDQTtBQUNBLFlBQUksVUFBVSxDQUFkLEVBQWlCO0FBQ2Isb0JBQVEsSUFBUixDQUFhLEtBQUssS0FBTCxDQUFiO0FBQ0g7QUFDSjtBQUNELFlBQVEsSUFBUixDQUFhLFFBQVEsQ0FBUixDQUFiO0FBQ0EsV0FBTyxPQUFQO0FBQ0g7Ozs7Ozs7Ozs7Ozs7QUNubkJEOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7OztBQUVBO0lBQ3FCLE07QUFFakIsb0JBQVksSUFBWixFQUFrQixJQUFsQixFQUFzQztBQUFBLFlBQWQsT0FBYyx1RUFBSixFQUFJOztBQUFBOztBQUNsQyxhQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsYUFBSyxRQUFMLEdBQWdCLFFBQVEsUUFBeEI7QUFDQSxhQUFLLElBQUwsR0FBWSxRQUFRLElBQXBCO0FBQ0g7O0FBRUQ7Ozs7Ozs7QUFjQTtpQ0FDUyxDQUNSOztBQUVEOzs7O3FDQUNhLE8sRUFBUyxDQUNyQjs7QUFFRDs7OztxQ0FDYztBQUNWLGdCQUFJLEtBQUssUUFBTCxJQUFpQixLQUFLLElBQTFCLEVBQWdDO0FBQzVCLG9CQUFJLE9BQU8sRUFBWDtBQUNBLG9CQUFJLEtBQUssUUFBVCxFQUFtQjtBQUNmLDJCQUFPLEVBQUUsS0FBSyxLQUFLLFFBQUwsQ0FBYyxDQUFkLENBQVAsRUFBeUIsS0FBSyxLQUFLLFFBQUwsQ0FBYyxDQUFkLENBQTlCLEVBQWdELE1BQU0sS0FBSyxRQUFMLENBQWMsQ0FBZCxDQUF0RCxFQUFQO0FBQ0g7QUFDRCxvQkFBSSxLQUFLLElBQVQsRUFBZTtBQUNYLHlCQUFLLElBQUwsR0FBWSxLQUFLLElBQWpCO0FBQ0g7QUFDRCxxQkFBSyxJQUFMLENBQVUsT0FBVixDQUFrQixJQUFsQjtBQUNIO0FBQ0o7O0FBRUQ7Ozs7c0NBQ2UsUSxFQUFVLE8sRUFBUztBQUM5QjtBQUNBLDJCQUFLLFFBQUwsQ0FBYyxTQUFTLFlBQXZCLEVBQXFDLEtBQUssV0FBMUMsRUFBdUQsU0FBUyxLQUFoRTtBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsV0FBaEIsRUFBNkIsYUFBN0IsRUFBNEMsU0FBUyxZQUFyRDs7QUFFQTtBQUNBLDJCQUFLLGNBQUwsQ0FBb0IsU0FBUyxRQUE3QixFQUF1QyxTQUFTLFlBQWhEO0FBQ0EsMkJBQUssTUFBTCxDQUFZLFNBQVMsZ0JBQXJCLEVBQXVDLFNBQVMsUUFBaEQ7QUFDQSxvQkFBUSxPQUFSLENBQWdCLFdBQWhCLEVBQTZCLGdCQUE3QixFQUErQyxTQUFTLFFBQXhEO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixXQUFoQixFQUE2Qix1QkFBN0IsRUFBc0QsU0FBUyxnQkFBL0Q7QUFDSDs7OytCQTlDYSxJLEVBQU0sSSxFQUFNLE0sRUFBUTtBQUM5QixvQkFBUSxPQUFPLElBQWY7QUFDSSxxQkFBSyxXQUFMO0FBQ0ksMkJBQU8sSUFBSSxlQUFKLENBQW9CLElBQXBCLEVBQTBCLElBQTFCLEVBQWdDLE1BQWhDLENBQVA7QUFDSixxQkFBSyxNQUFMO0FBQ0ksMkJBQU8sSUFBSSxVQUFKLENBQWUsSUFBZixFQUFxQixJQUFyQixFQUEyQixNQUEzQixDQUFQO0FBQ0oscUJBQUssYUFBTDtBQUNBO0FBQ0E7QUFDSSwyQkFBTyxJQUFJLGlCQUFKLENBQXNCLElBQXRCLEVBQTRCLElBQTVCLEVBQWtDLE1BQWxDLENBQVA7QUFSUjtBQVVIOzs7Ozs7QUF1Q0w7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQTNEcUIsTTs7SUEwRWYsaUI7OztBQUVGLCtCQUFZLElBQVosRUFBa0IsSUFBbEIsRUFBc0M7QUFBQSxZQUFkLE9BQWMsdUVBQUosRUFBSTs7QUFBQTs7QUFBQSwwSUFDNUIsSUFENEIsRUFDdEIsSUFEc0IsRUFDaEIsT0FEZ0I7O0FBRWxDLGNBQUssSUFBTCxHQUFZLGFBQVo7O0FBRUE7QUFDQSxjQUFLLFlBQUwsR0FBb0IsUUFBUSxZQUE1QjtBQUNBLGNBQUssR0FBTCxHQUFXLFFBQVEsR0FBbkI7QUFDQSxZQUFJLENBQUMsTUFBSyxZQUFOLElBQXNCLENBQUMsTUFBSyxHQUFoQyxFQUFxQztBQUNqQztBQUNBLGtCQUFLLFlBQUwsR0FBb0IsQ0FBQyxDQUFDLEVBQUQsRUFBSyxDQUFMLENBQUQsRUFBVSxDQUFDLEVBQUQsRUFBSyxHQUFMLENBQVYsRUFBcUIsQ0FBQyxFQUFELEVBQUssQ0FBTCxDQUFyQixFQUE4QixDQUFDLEVBQUQsRUFBSyxDQUFMLENBQTlCLEVBQXVDLENBQUMsRUFBRCxFQUFLLENBQUwsQ0FBdkMsQ0FBcEI7QUFDSDs7QUFFRCxjQUFLLGVBQUwsR0FBdUIsUUFBUSxlQUFSLElBQTJCLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBbEQsQ0Faa0MsQ0FZd0I7QUFDMUQsY0FBSyxlQUFMLEdBQXVCLE1BQUssZUFBTCxDQUFxQixHQUFyQixDQUF5QixVQUF6QixDQUF2QixDQWJrQyxDQWEyQjtBQUM3RCxjQUFLLG9CQUFMLEdBQTRCLEVBQTVCOztBQUVBLGNBQUssZUFBTCxHQUF1QixJQUF2QjtBQUNBLGNBQUssV0FBTCxHQUFtQixJQUFJLFlBQUosQ0FBaUIsRUFBakIsQ0FBbkI7QUFDQSxjQUFLLGlCQUFMLEdBQXlCLElBQUksWUFBSixDQUFpQixFQUFqQixDQUF6Qjs7QUFFQTtBQUNBLGlDQUFjLFlBQWQsQ0FBMkIsUUFBM0I7QUFyQmtDO0FBOEJyQzs7QUFFRDtBQUNBO0FBQ0E7Ozs7OzhDQUM0RDtBQUFBLGdCQUExQyxXQUEwQyxRQUExQyxXQUEwQztBQUFBLGdCQUE3QixNQUE2QixRQUE3QixNQUE2QjtBQUFBLGdCQUFyQixZQUFxQixRQUFyQixZQUFxQjtBQUFBLGdCQUFQLEdBQU8sUUFBUCxHQUFPOztBQUN4RDtBQUNBLGdCQUFJLENBQUMsTUFBTCxFQUFhO0FBQ1Q7QUFDQSxvQkFBSSxZQUFKLEVBQWtCO0FBQ2QsMEJBQU0sS0FBSyxJQUFMLENBQVUsSUFBSSxZQUFkLElBQThCLENBQXBDO0FBQ0g7QUFDRDtBQUhBLHFCQUlLLElBQUksR0FBSixFQUFTO0FBQ1YsOEJBQU0sTUFBTSxLQUFLLEVBQVgsR0FBZ0IsR0FBdEIsQ0FEVSxDQUNpQjtBQUMzQix1Q0FBZSxJQUFJLEtBQUssR0FBTCxDQUFTLE1BQU0sQ0FBZixDQUFuQjtBQUNIOztBQUVEO0FBQ0E7QUFDQSx5QkFBUyxjQUFjLENBQWQsR0FBa0IsWUFBM0I7QUFDSDtBQUNEO0FBZkEsaUJBZ0JLO0FBQ0QsbUNBQWUsSUFBSSxNQUFKLEdBQWEsV0FBNUI7QUFDQSwwQkFBTSxLQUFLLElBQUwsQ0FBVSxJQUFJLFlBQWQsSUFBOEIsQ0FBcEM7QUFDSDs7QUFFRCxtQkFBTyxFQUFFLHdCQUFGLEVBQWUsY0FBZixFQUF1QiwwQkFBdkIsRUFBcUMsUUFBckMsRUFBUDtBQUNIOzs7eUNBRWdCO0FBQ2I7O0FBRUE7QUFDQSxnQkFBSSxrQkFBa0IsS0FBSyxJQUFMLENBQVUsSUFBVixDQUFlLEdBQWYsQ0FBbUIsTUFBbkIsR0FBNEIsS0FBSyxJQUFMLENBQVUsZ0JBQTVEOztBQUVBOztBQU5hLG1DQU9TLEtBQUssZUFBTCxDQUFxQjtBQUN2Qyw2QkFBYSxlQUQwQjtBQUV2Qyw4QkFBYyxnQkFBTSxXQUFOLENBQWtCLEtBQUssSUFBTCxDQUFVLElBQTVCLEVBQWtDLEtBQUssWUFBdkMsQ0FGeUI7QUFHdkMscUJBQUssZ0JBQU0sV0FBTixDQUFrQixLQUFLLElBQUwsQ0FBVSxJQUE1QixFQUFrQyxLQUFLLEdBQXZDO0FBSGtDLGFBQXJCLENBUFQ7QUFBQSxnQkFPUCxNQVBPLG9CQU9QLE1BUE87QUFBQSxnQkFPQyxHQVBELG9CQU9DLEdBUEQ7O0FBYWI7OztBQUNBLGdCQUFJLFdBQVcsQ0FBQyxLQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLE1BQWpCLENBQXdCLENBQXpCLEVBQTRCLEtBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsTUFBakIsQ0FBd0IsQ0FBcEQsRUFBdUQsTUFBdkQsQ0FBZjtBQUNBLGlCQUFLLGVBQUwsR0FBdUIsUUFBdkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUFLLE1BQUwsQ0FBWSxLQUFLLFdBQWpCLEVBQ0ksZUFBSyxVQUFMLENBQWdCLFNBQVMsQ0FBVCxDQUFoQixFQUE2QixTQUFTLENBQVQsQ0FBN0IsRUFBMEMsQ0FBMUMsQ0FESixFQUVJLGVBQUssVUFBTCxDQUFnQixTQUFTLENBQVQsQ0FBaEIsRUFBNkIsU0FBUyxDQUFULENBQTdCLEVBQTBDLENBQUMsQ0FBM0MsQ0FGSixFQUdJLGVBQUssVUFBTCxDQUFnQixDQUFoQixFQUFtQixDQUFuQixFQUFzQixDQUF0QixDQUhKOztBQUtBO0FBQ0EsMkJBQUssV0FBTCxDQUFpQixLQUFLLGlCQUF0QixFQUF5QyxHQUF6QyxFQUE4QyxLQUFLLElBQUwsQ0FBVSxNQUF4RCxFQUFnRSxDQUFoRSxFQUFtRSxTQUFTLENBQTVFOztBQUVBO0FBQ0EsaUJBQUssb0JBQUwsQ0FBMEIsQ0FBMUIsSUFBK0IsS0FBSyxlQUFMLENBQXFCLENBQXJCLElBQTBCLEtBQUssSUFBTCxDQUFVLElBQVYsQ0FBZSxHQUFmLENBQW1CLEtBQTVFO0FBQ0EsaUJBQUssb0JBQUwsQ0FBMEIsQ0FBMUIsSUFBK0IsS0FBSyxlQUFMLENBQXFCLENBQXJCLElBQTBCLEtBQUssSUFBTCxDQUFVLElBQVYsQ0FBZSxHQUFmLENBQW1CLE1BQTVFOztBQUVBO0FBQ0EsaUJBQUssaUJBQUwsQ0FBdUIsQ0FBdkIsSUFBNEIsQ0FBQyxLQUFLLG9CQUFMLENBQTBCLENBQTFCLENBQUQsR0FBZ0MsQ0FBNUQsQ0FuQ2EsQ0FtQ2tEO0FBQy9ELGlCQUFLLGlCQUFMLENBQXVCLENBQXZCLElBQTRCLENBQUMsS0FBSyxvQkFBTCxDQUEwQixDQUExQixDQUFELEdBQWdDLENBQTVELENBcENhLENBb0NrRDs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0EsMkJBQUssU0FBTCxDQUFlLEtBQUssaUJBQXBCLEVBQXVDLEtBQUssaUJBQTVDLEVBQ0ksZUFBSyxVQUFMLENBQ0ksa0JBQWdCLENBQWhCLEdBQW9CLEtBQUssSUFBTCxDQUFVLE1BQTlCLElBQXdDLENBQUMsS0FBSyxvQkFBTCxDQUEwQixDQUExQixDQUFELEdBQWdDLENBQXhFLENBREosRUFFSSxrQkFBZ0IsQ0FBaEIsSUFBcUIsQ0FBQyxLQUFLLG9CQUFMLENBQTBCLENBQTFCLENBQUQsR0FBZ0MsQ0FBckQsQ0FGSixFQUdJLENBSEosQ0FESjs7QUFRQTtBQUNBLDJCQUFLLFNBQUwsQ0FBZSxLQUFLLGlCQUFwQixFQUF1QyxLQUFLLGlCQUE1QyxFQUErRCxlQUFLLFVBQUwsQ0FBZ0IsQ0FBaEIsRUFBbUIsQ0FBbkIsRUFBc0IsQ0FBQyxNQUF2QixDQUEvRDtBQUNIOzs7aUNBRVE7QUFDTDtBQUNBLGlCQUFLLGNBQUw7QUFDSDs7O3FDQUVZLE8sRUFBUztBQUNsQixvQkFBUSxPQUFSLENBQWdCLFdBQWhCLEVBQTZCLGNBQTdCLEVBQTZDLEtBQUssaUJBQWxEO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQixPQUF0QixFQUErQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sS0FBSyxlQUFMLENBQXFCLENBQXJCLENBQVAsQ0FBL0I7QUFDQSxvQkFBUSxPQUFSLENBQWdCLEtBQWhCLEVBQXVCLG1CQUF2QixFQUE0QyxLQUFLLG9CQUFqRDtBQUNIOzs7O0VBN0gyQixNOztBQWlJaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0lBQ00sZTs7O0FBRUYsNkJBQVksSUFBWixFQUFrQixJQUFsQixFQUFzQztBQUFBLFlBQWQsT0FBYyx1RUFBSixFQUFJOztBQUFBOztBQUFBLHVJQUM1QixJQUQ0QixFQUN0QixJQURzQixFQUNoQixPQURnQjs7QUFFbEMsZUFBSyxJQUFMLEdBQVksV0FBWjtBQUNBLGVBQUssSUFBTCxHQUFZLFFBQVEsSUFBUixJQUFnQixFQUFFLEdBQUcsQ0FBTCxFQUFRLEdBQUcsQ0FBWCxFQUE1QjtBQUNBLFlBQUksT0FBSyxJQUFMLENBQVUsTUFBVixLQUFxQixDQUF6QixFQUE0QjtBQUN4QixtQkFBSyxJQUFMLEdBQVksRUFBRSxHQUFHLE9BQUssSUFBTCxDQUFVLENBQVYsQ0FBTCxFQUFtQixHQUFHLE9BQUssSUFBTCxDQUFVLENBQVYsQ0FBdEIsRUFBWixDQUR3QixDQUMwQjtBQUNyRDs7QUFFRCxlQUFLLGVBQUwsR0FBdUIsSUFBdkI7QUFDQSxlQUFLLGVBQUwsR0FBdUIsSUFBdkI7O0FBRUEsZUFBSyxXQUFMLEdBQW1CLElBQUksWUFBSixDQUFpQixFQUFqQixDQUFuQjtBQUNBLGVBQUssaUJBQUwsR0FBeUIsSUFBSSxZQUFKLENBQWlCLEVBQWpCLENBQXpCOztBQUVBO0FBQ0EsaUNBQWMsWUFBZCxDQUEyQixRQUEzQjtBQWZrQztBQThCckM7Ozs7aUNBRVE7QUFDTDs7QUFFQSxpQkFBSyxlQUFMLEdBQXVCLEtBQUssSUFBTCxDQUFVLElBQVYsQ0FBZSxHQUFmLENBQW1CLE1BQW5CLEdBQTRCLEtBQUssSUFBTCxDQUFVLGdCQUE3RDtBQUNBLGdCQUFJLFdBQVcsQ0FBQyxLQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLE1BQWpCLENBQXdCLENBQXpCLEVBQTRCLEtBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsTUFBakIsQ0FBd0IsQ0FBcEQsRUFBdUQsS0FBSyxlQUE1RCxDQUFmO0FBQ0EsaUJBQUssZUFBTCxHQUF1QixRQUF2Qjs7QUFFQTtBQUNBLDJCQUFLLFFBQUwsQ0FBYyxLQUFLLFdBQW5CO0FBQ0EsMkJBQUssU0FBTCxDQUFlLEtBQUssV0FBcEIsRUFBaUMsS0FBSyxXQUF0QyxFQUFtRCxlQUFLLFVBQUwsQ0FBZ0IsQ0FBQyxTQUFTLENBQVQsQ0FBakIsRUFBOEIsQ0FBQyxTQUFTLENBQVQsQ0FBL0IsRUFBNEMsQ0FBNUMsQ0FBbkQ7O0FBRUE7QUFDQSwyQkFBSyxRQUFMLENBQWMsS0FBSyxpQkFBbkI7O0FBRUE7QUFDQSxpQkFBSyxpQkFBTCxDQUF1QixDQUF2QixJQUE0QixLQUFLLElBQUwsQ0FBVSxDQUFWLEdBQWMsS0FBSyxJQUFMLENBQVUsTUFBcEQsQ0FmSyxDQWV1RDtBQUM1RCxpQkFBSyxpQkFBTCxDQUF1QixDQUF2QixJQUE0QixLQUFLLElBQUwsQ0FBVSxDQUF0QyxDQWhCSyxDQWdCdUQ7O0FBRTVEO0FBQ0EsMkJBQUssS0FBTCxDQUFXLEtBQUssaUJBQWhCLEVBQW1DLEtBQUssaUJBQXhDLEVBQ0ksZUFBSyxVQUFMLENBQ0ksSUFBSSxLQUFLLElBQUwsQ0FBVSxJQUFWLENBQWUsTUFBZixDQUFzQixDQUQ5QixFQUVJLElBQUksS0FBSyxJQUFMLENBQVUsSUFBVixDQUFlLE1BQWYsQ0FBc0IsQ0FGOUIsRUFHSSxJQUFJLEtBQUssSUFBTCxDQUFVLElBQVYsQ0FBZSxNQUFmLENBQXNCLENBSDlCLENBREo7QUFPSDs7O3FDQUVZLE8sRUFBUztBQUNsQixvQkFBUSxPQUFSLENBQWdCLFdBQWhCLEVBQTZCLGNBQTdCLEVBQTZDLEtBQUssaUJBQWxEOztBQUVBLG9CQUFRLE9BQVIsQ0FBZ0IsS0FBaEIsRUFBdUIsT0FBdkIsRUFBZ0MsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLEtBQUssZUFBWixDQUFoQztBQUNBO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixLQUFoQixFQUF1QixtQkFBdkIsRUFBNEMsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUE1QztBQUNIOzs7O0VBcEV5QixNOztBQXdFOUI7OztJQUNNLFU7OztBQUVGLHdCQUFZLElBQVosRUFBa0IsSUFBbEIsRUFBc0M7QUFBQSxZQUFkLE9BQWMsdUVBQUosRUFBSTs7QUFBQTs7QUFBQSw2SEFDNUIsSUFENEIsRUFDdEIsSUFEc0IsRUFDaEIsT0FEZ0I7O0FBRWxDLGVBQUssSUFBTCxHQUFZLE1BQVo7QUFGa0M7QUFHckM7Ozs7aUNBRVE7QUFDTDtBQUNBLGlCQUFLLElBQUwsQ0FBVSxDQUFWLEdBQWMsQ0FBZDtBQUNBLGlCQUFLLElBQUwsQ0FBVSxDQUFWLEdBQWMsQ0FBZDs7QUFFQTtBQUNIOzs7O0VBYm9CLGU7Ozs7Ozs7Ozs7O0FDOVJ6Qjs7QUFFQSxJQUFJLEdBQUo7a0JBQ2UsTUFBTSxFOztBQUVyQjs7QUFDQSxJQUFJLHVCQUFKLEdBQThCLEVBQTlCO0FBQ0EsSUFBSSxxQkFBSixHQUE0QixFQUE1QjtBQUNBLElBQUksU0FBSixHQUFnQixHQUFoQjtBQUNBLElBQUkseUJBQUosR0FBZ0Msa0JBQWhDO0FBQ0EsSUFBSSxvQkFBSixHQUEyQixJQUFJLHlCQUFKLEdBQWdDLENBQTNEO0FBQ0EsSUFBSSx5QkFBSixHQUFnQyxJQUFJLG9CQUFKLEdBQTJCLElBQUksU0FBL0QsQyxDQUEwRTs7QUFFMUUsSUFBSSxtQkFBbUIsRUFBdkI7QUFDQSxJQUFJLGNBQUosR0FBcUIsVUFBVSxDQUFWLEVBQWE7QUFDOUIscUJBQWlCLENBQWpCLElBQXNCLGlCQUFpQixDQUFqQixLQUF1QixJQUFJLHlCQUFKLEdBQWdDLEtBQUssR0FBTCxDQUFTLENBQVQsRUFBWSxDQUFaLENBQTdFO0FBQ0EsV0FBTyxpQkFBaUIsQ0FBakIsQ0FBUDtBQUNILENBSEQ7O0FBS0EsSUFBSSxrQkFBa0IsRUFBdEI7QUFDQSxJQUFJLGFBQUosR0FBb0IsVUFBVSxDQUFWLEVBQWE7QUFDN0Isb0JBQWdCLENBQWhCLElBQXFCLGdCQUFnQixDQUFoQixLQUFzQixJQUFJLG9CQUFKLEdBQTJCLEtBQUssR0FBTCxDQUFTLENBQVQsRUFBWSxDQUFaLENBQXRFO0FBQ0EsV0FBTyxnQkFBZ0IsQ0FBaEIsQ0FBUDtBQUNILENBSEQ7O0FBS0E7QUFDQSxJQUFJLFVBQUosR0FBaUIsSUFBakIsQyxDQUF1QjtBQUN2QixJQUFJLGVBQUosR0FBc0IsSUFBSSxVQUFKLEdBQWlCLElBQUksU0FBM0M7QUFDQSxJQUFJLFlBQUosR0FBbUIsRUFBbkIsQyxDQUF3Qjs7QUFFeEIsSUFBSSxrQkFBa0IsRUFBdEI7QUFDQSxJQUFJLGFBQUosR0FBb0IsVUFBVSxDQUFWLEVBQWE7QUFDN0Isb0JBQWdCLENBQWhCLElBQXFCLGdCQUFnQixDQUFoQixLQUFzQixJQUFJLFVBQUosSUFBa0IsSUFBSSxTQUFKLEdBQWdCLElBQUksY0FBSixDQUFtQixDQUFuQixDQUFsQyxDQUEzQztBQUNBLFdBQU8sZ0JBQWdCLENBQWhCLENBQVA7QUFDSCxDQUhEOztBQUtBO0FBQ0EsSUFBSSxhQUFKLEdBQW9CLFVBQVUsSUFBVixFQUFnQjtBQUNoQyxXQUFPO0FBQ0gsV0FBRyxLQUFLLENBQUwsR0FBUyxJQUFJLG9CQUFiLEdBQW9DLEtBQUssR0FBTCxDQUFTLENBQVQsRUFBWSxLQUFLLENBQWpCLENBQXBDLEdBQTBELElBQUkseUJBRDlEO0FBRUgsV0FBRyxFQUFFLEtBQUssQ0FBTCxHQUFTLElBQUksb0JBQWIsR0FBb0MsS0FBSyxHQUFMLENBQVMsQ0FBVCxFQUFZLEtBQUssQ0FBakIsQ0FBcEMsR0FBMEQsSUFBSSx5QkFBaEU7QUFGQSxLQUFQO0FBSUgsQ0FMRDs7QUFPQTs7O0FBR0EsSUFBSSxhQUFKLEdBQW9CLGdCQUFrQixJQUFsQixFQUF3QjtBQUFBO0FBQUEsUUFBYixDQUFhO0FBQUEsUUFBVixDQUFVOztBQUN4QyxXQUFPO0FBQ0gsV0FBRyxLQUFLLEtBQUwsQ0FBVyxDQUFDLElBQUksSUFBSSx5QkFBVCxLQUF1QyxJQUFJLG9CQUFKLEdBQTJCLEtBQUssR0FBTCxDQUFTLENBQVQsRUFBWSxJQUFaLENBQWxFLENBQVgsQ0FEQTtBQUVILFdBQUcsS0FBSyxLQUFMLENBQVcsQ0FBQyxDQUFDLENBQUQsR0FBSyxJQUFJLHlCQUFWLEtBQXdDLElBQUksb0JBQUosR0FBMkIsS0FBSyxHQUFMLENBQVMsQ0FBVCxFQUFZLElBQVosQ0FBbkUsQ0FBWCxDQUZBO0FBR0gsV0FBRztBQUhBLEtBQVA7QUFLSCxDQU5EOztBQVFBO0FBQ0E7QUFDQSxJQUFJLFFBQUosR0FBZSxpQkFBb0Q7QUFBQSxRQUF6QyxDQUF5QyxTQUF6QyxDQUF5QztBQUFBLFFBQXRDLENBQXNDLFNBQXRDLENBQXNDO0FBQUEsUUFBbkMsQ0FBbUMsU0FBbkMsQ0FBbUM7QUFBQSxRQUE5QixJQUE4Qix1RUFBdkIsRUFBRSxHQUFHLElBQUwsRUFBVyxHQUFHLEtBQWQsRUFBdUI7O0FBQy9ELFFBQUksSUFBSSxDQUFDLEtBQUssQ0FBTixJQUFXLENBQW5CO0FBQ0EsUUFBSSxLQUFLLENBQVQsRUFBWTtBQUNSLFlBQUksSUFBSSxDQUFSO0FBQ0g7QUFDRCxRQUFJLEtBQUssQ0FBVCxFQUFZO0FBQ1IsWUFBSSxJQUFJLENBQVI7QUFDSDtBQUNELFdBQU8sRUFBRSxJQUFGLEVBQUssSUFBTCxFQUFRLElBQVIsRUFBUDtBQUNILENBVEQ7O0FBV0E7OztBQUdBLElBQUksY0FBSixHQUFxQixpQkFBa0I7QUFBQTtBQUFBLFFBQVAsQ0FBTztBQUFBLFFBQUosQ0FBSTs7QUFFbkMsU0FBSyxJQUFJLHlCQUFUO0FBQ0EsU0FBSyxJQUFJLHlCQUFUOztBQUVBLFFBQUksQ0FBQyxJQUFJLEtBQUssSUFBTCxDQUFVLEtBQUssR0FBTCxDQUFTLElBQUksS0FBSyxFQUFsQixDQUFWLENBQUosR0FBd0MsS0FBSyxFQUFMLEdBQVUsQ0FBbkQsSUFBeUQsS0FBSyxFQUFsRTs7QUFFQSxTQUFLLEdBQUw7QUFDQSxTQUFLLEdBQUw7O0FBRUEsV0FBTyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQVA7QUFDSCxDQVhEOztBQWFBOzs7QUFHQSxJQUFJLGNBQUosR0FBcUIsaUJBQWlCO0FBQUE7QUFBQSxRQUFQLENBQU87QUFBQSxRQUFKLENBQUk7O0FBRWxDO0FBQ0EsUUFBSSxLQUFLLEdBQUwsQ0FBUyxLQUFLLEdBQUwsQ0FBUyxJQUFFLEtBQUssRUFBUCxHQUFVLEdBQVYsR0FBZ0IsS0FBSyxFQUFMLEdBQVEsQ0FBakMsQ0FBVCxJQUFnRCxLQUFLLEVBQXpEO0FBQ0EsU0FBSyxJQUFJLHlCQUFUOztBQUVBO0FBQ0EsU0FBSyxJQUFJLHlCQUFKLEdBQWdDLEdBQXJDOztBQUVBLFdBQU8sQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFQO0FBQ0gsQ0FWRDs7QUFZQSxJQUFJLE9BQUosR0FBYyxVQUFTLENBQVQsRUFBWTtBQUN0QixRQUFJLElBQUksR0FBSixJQUFXLElBQUksQ0FBQyxHQUFwQixFQUF5QjtBQUNyQixZQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUwsSUFBWSxHQUFaLEdBQWtCLEdBQW5CLElBQTBCLEdBQTFCLEdBQWdDLEdBQXBDO0FBQ0g7QUFDRCxXQUFPLENBQVA7QUFDSCxDQUxEOztBQU9BO0FBQ0EsSUFBSSxpQkFBSixHQUF3QixVQUFVLFFBQVYsRUFBb0IsU0FBcEIsRUFBK0I7QUFDbkQsUUFBSSxZQUFZLElBQWhCLEVBQXNCO0FBQ2xCLGVBRGtCLENBQ1Y7QUFDWDs7QUFFRCxRQUFJLFNBQVMsSUFBVCxLQUFrQixPQUF0QixFQUErQjtBQUMzQixrQkFBVSxTQUFTLFdBQW5CO0FBQ0gsS0FGRCxNQUdLLElBQUksU0FBUyxJQUFULEtBQWtCLFlBQWxCLElBQWtDLFNBQVMsSUFBVCxLQUFrQixZQUF4RCxFQUFzRTtBQUN2RSxpQkFBUyxXQUFULENBQXFCLE9BQXJCLENBQTZCLFNBQTdCO0FBQ0gsS0FGSSxNQUdBLElBQUksU0FBUyxJQUFULEtBQWtCLFNBQWxCLElBQStCLFNBQVMsSUFBVCxLQUFrQixpQkFBckQsRUFBd0U7QUFDekUsaUJBQVMsV0FBVCxDQUFxQixPQUFyQixDQUE2QjtBQUFBLG1CQUFlLFlBQVksT0FBWixDQUFvQixTQUFwQixDQUFmO0FBQUEsU0FBN0I7QUFDSCxLQUZJLE1BR0EsSUFBSSxTQUFTLElBQVQsS0FBa0IsY0FBdEIsRUFBc0M7QUFDdkMsaUJBQVMsV0FBVCxDQUFxQixPQUFyQixDQUE2QixtQkFBVztBQUNwQyxvQkFBUSxPQUFSLENBQWdCO0FBQUEsdUJBQWUsWUFBWSxPQUFaLENBQW9CLFNBQXBCLENBQWY7QUFBQSxhQUFoQjtBQUNILFNBRkQ7QUFHSDtBQUNEO0FBQ0gsQ0FwQkQ7O0FBc0JBLElBQUksWUFBSixHQUFtQixVQUFVLEVBQVYsRUFBYyxFQUFkLEVBQWtCO0FBQ2pDLFdBQU8sRUFDSCxHQUFHLEVBQUgsQ0FBTSxDQUFOLEdBQVUsR0FBRyxFQUFILENBQU0sQ0FBaEIsSUFDQSxHQUFHLEVBQUgsQ0FBTSxDQUFOLEdBQVUsR0FBRyxFQUFILENBQU0sQ0FEaEIsSUFFQSxHQUFHLEVBQUgsQ0FBTSxDQUFOLEdBQVUsR0FBRyxFQUFILENBQU0sQ0FGaEIsSUFHQSxHQUFHLEVBQUgsQ0FBTSxDQUFOLEdBQVUsR0FBRyxFQUFILENBQU0sQ0FKYixDQUFQO0FBTUgsQ0FQRDs7QUFTQTtBQUNBLElBQUksZUFBSixHQUFzQixVQUFVLE9BQVYsRUFBbUI7QUFDckMsUUFBSSxRQUFRLFFBQVo7QUFBQSxRQUNJLFFBQVEsQ0FBQyxRQURiO0FBQUEsUUFFSSxRQUFRLFFBRlo7QUFBQSxRQUdJLFFBQVEsQ0FBQyxRQUhiOztBQUtBO0FBQ0EsUUFBSSxhQUFhLFFBQVEsQ0FBUixFQUFXLE1BQTVCO0FBQ0EsU0FBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksVUFBbEIsRUFBOEIsR0FBOUIsRUFBbUM7QUFDL0IsWUFBSSxRQUFRLFFBQVEsQ0FBUixFQUFXLENBQVgsQ0FBWjs7QUFFQSxZQUFJLE1BQU0sQ0FBTixJQUFXLEtBQWYsRUFBc0I7QUFDbEIsb0JBQVEsTUFBTSxDQUFOLENBQVI7QUFDSDtBQUNELFlBQUksTUFBTSxDQUFOLElBQVcsS0FBZixFQUFzQjtBQUNsQixvQkFBUSxNQUFNLENBQU4sQ0FBUjtBQUNIO0FBQ0QsWUFBSSxNQUFNLENBQU4sSUFBVyxLQUFmLEVBQXNCO0FBQ2xCLG9CQUFRLE1BQU0sQ0FBTixDQUFSO0FBQ0g7QUFDRCxZQUFJLE1BQU0sQ0FBTixJQUFXLEtBQWYsRUFBc0I7QUFDbEIsb0JBQVEsTUFBTSxDQUFOLENBQVI7QUFDSDtBQUNKOztBQUVELFdBQU8sQ0FBQyxLQUFELEVBQVEsS0FBUixFQUFlLEtBQWYsRUFBc0IsS0FBdEIsQ0FBUDtBQUNILENBMUJEOztBQTRCQTtBQUNBLElBQUksWUFBSixHQUFtQixVQUFTLElBQVQsRUFBZTtBQUM5QixRQUFJLFNBQVMsU0FBVCxJQUFzQixTQUFTLGNBQW5DLEVBQW1EO0FBQy9DLGVBQU8sU0FBUDtBQUNILEtBRkQsTUFHSyxJQUFJLFNBQVMsWUFBVCxJQUF5QixTQUFTLGlCQUF0QyxFQUF5RDtBQUMxRCxlQUFPLE1BQVA7QUFDSDtBQUNELFFBQUksU0FBUyxPQUFULElBQW9CLFNBQVMsWUFBakMsRUFBK0M7QUFDM0MsZUFBTyxPQUFQO0FBQ0g7QUFDSixDQVZEOztBQVlBLElBQUksUUFBSixHQUFlLFVBQVUsT0FBVixFQUFtQjtBQUM5QjtBQUNBLFFBQUksSUFBSSxDQUFSO0FBQUEsUUFBVyxJQUFJLENBQWY7QUFBQSxRQUFrQixPQUFPLENBQXpCO0FBQ0EsUUFBSSxPQUFPLFFBQVEsQ0FBUixDQUFYLENBSDhCLENBR1A7QUFDdkIsUUFBSSxNQUFNLEtBQUssTUFBZjs7QUFFQSxTQUFLLElBQUksSUFBSSxDQUFSLEVBQVcsSUFBSSxNQUFNLENBQTFCLEVBQTZCLElBQUksR0FBakMsRUFBc0MsSUFBSSxDQUFKLEVBQU8sR0FBN0MsRUFBa0Q7QUFDOUMsWUFBSSxLQUFLLEtBQUssQ0FBTCxDQUFUO0FBQ0EsWUFBSSxLQUFLLEtBQUssQ0FBTCxDQUFUO0FBQ0EsWUFBSSxJQUFJLEdBQUcsQ0FBSCxJQUFRLEdBQUcsQ0FBSCxDQUFSLEdBQWdCLEdBQUcsQ0FBSCxJQUFRLEdBQUcsQ0FBSCxDQUFoQzs7QUFFQSxhQUFLLENBQUMsR0FBRyxDQUFILElBQVEsR0FBRyxDQUFILENBQVQsSUFBa0IsQ0FBdkI7QUFDQSxhQUFLLENBQUMsR0FBRyxDQUFILElBQVEsR0FBRyxDQUFILENBQVQsSUFBa0IsQ0FBdkI7QUFDQSxnQkFBUSxJQUFJLENBQVo7QUFDSDs7QUFFRCxXQUFPLENBQUMsSUFBSSxJQUFMLEVBQVcsSUFBSSxJQUFmLENBQVA7QUFDSCxDQWpCRDs7QUFtQkEsSUFBSSxhQUFKLEdBQW9CLFVBQVUsUUFBVixFQUFvQjtBQUNwQyxRQUFJLElBQUksU0FBUyxNQUFqQjtBQUNBLFFBQUksV0FBVyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQWY7O0FBRUEsU0FBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksU0FBUyxNQUEzQixFQUFtQyxHQUFuQyxFQUF3QztBQUNwQyxZQUFJLElBQUksSUFBSSxRQUFKLENBQWEsU0FBUyxDQUFULENBQWIsQ0FBUjtBQUNBLGlCQUFTLENBQVQsS0FBZSxFQUFFLENBQUYsQ0FBZjtBQUNBLGlCQUFTLENBQVQsS0FBZSxFQUFFLENBQUYsQ0FBZjtBQUNIOztBQUVELGFBQVMsQ0FBVCxLQUFlLENBQWY7QUFDQSxhQUFTLENBQVQsS0FBZSxDQUFmOztBQUVBLFdBQU8sUUFBUDtBQUNILENBZEQ7O0FBZ0JBLElBQUksd0JBQUosR0FBK0IsVUFBVSxJQUFWLEVBQWdCO0FBQzNDLFFBQUksT0FBTyxDQUFYO0FBQ0EsUUFBSSxJQUFJLEtBQUssTUFBYjs7QUFFQSxTQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksSUFBSSxDQUF4QixFQUEyQixHQUEzQixFQUFnQztBQUM1QixZQUFJLEtBQUssS0FBSyxDQUFMLENBQVQ7QUFDQSxZQUFJLEtBQUssS0FBSyxJQUFFLENBQVAsQ0FBVDs7QUFFQSxnQkFBUSxHQUFHLENBQUgsSUFBUSxHQUFHLENBQUgsQ0FBUixHQUFnQixHQUFHLENBQUgsSUFBUSxHQUFHLENBQUgsQ0FBaEM7QUFDSDs7QUFFRCxZQUFRLEtBQUssSUFBSSxDQUFULEVBQVksQ0FBWixJQUFpQixLQUFLLENBQUwsRUFBUSxDQUFSLENBQWpCLEdBQThCLEtBQUssQ0FBTCxFQUFRLENBQVIsSUFBYSxLQUFLLElBQUksQ0FBVCxFQUFZLENBQVosQ0FBbkQ7QUFDQSxXQUFPLElBQVA7QUFDSCxDQWJEOztBQWVBLElBQUksZUFBSixHQUFzQixVQUFVLElBQVYsRUFBZ0I7QUFDbEMsV0FBTyxLQUFLLEdBQUwsQ0FBUyxJQUFJLHdCQUFKLENBQTZCLElBQTdCLENBQVQsSUFBK0MsQ0FBdEQ7QUFDSCxDQUZEOztBQUlBO0FBQ0EsSUFBSSxXQUFKLEdBQWtCLFVBQVUsT0FBVixFQUFtQjtBQUNqQyxXQUFPLElBQUksZUFBSixDQUFvQixRQUFRLENBQVIsQ0FBcEIsQ0FBUDtBQUNILENBRkQ7O0FBSUEsSUFBSSxnQkFBSixHQUF1QixVQUFVLFFBQVYsRUFBb0I7QUFDdkMsUUFBSSxPQUFPLENBQVg7O0FBRUEsU0FBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksU0FBUyxNQUEzQixFQUFtQyxHQUFuQyxFQUF3QztBQUNwQyxnQkFBUSxJQUFJLFdBQUosQ0FBZ0IsU0FBUyxDQUFULENBQWhCLENBQVI7QUFDSDs7QUFFRCxXQUFPLElBQVA7QUFDSCxDQVJEOztBQVVBLElBQUksV0FBSixHQUFrQixVQUFVLElBQVYsRUFBZ0I7QUFDOUIsUUFBSSxPQUFPLElBQUksd0JBQUosQ0FBNkIsSUFBN0IsQ0FBWDtBQUNBLFFBQUksT0FBTyxDQUFYLEVBQWM7QUFDVixlQUFPLElBQVA7QUFDSCxLQUZELE1BR0ssSUFBSSxPQUFPLENBQVgsRUFBYztBQUNmLGVBQU8sS0FBUDtBQUNIO0FBQ0Q7QUFDSCxDQVREOzs7Ozs7OztBQ3pQQTs7QUFFQSxJQUFJLEVBQUo7a0JBQ2UsS0FBSyxFOztBQUVwQjs7QUFDQSxHQUFHLElBQUgsR0FBb0MsTUFBcEM7QUFDQSxHQUFHLGFBQUgsR0FBb0MsTUFBcEM7QUFDQSxHQUFHLEtBQUgsR0FBb0MsTUFBcEM7QUFDQSxHQUFHLGNBQUgsR0FBb0MsTUFBcEM7QUFDQSxHQUFHLEdBQUgsR0FBb0MsTUFBcEM7QUFDQSxHQUFHLFlBQUgsR0FBb0MsTUFBcEM7QUFDQSxHQUFHLEtBQUgsR0FBb0MsTUFBcEM7Ozs7Ozs7O0FDWkE7O0FBRUEsSUFBSSxPQUFKO2tCQUNlLFVBQVUsRTs7O0FBRXpCLElBQUksYUFBYSxDQUFqQjs7QUFFQTtBQUNBO0FBQ0EsUUFBUSxVQUFSLEdBQXFCLFNBQVMsVUFBVCxDQUFxQixNQUFyQixFQUE2QixPQUE3QixFQUNyQjtBQUNJLFFBQUksYUFBYSxLQUFqQjtBQUNBLFFBQUksVUFBVSxJQUFkLEVBQW9CO0FBQ2hCLGlCQUFTLFNBQVMsYUFBVCxDQUF1QixRQUF2QixDQUFUO0FBQ0EsZUFBTyxLQUFQLENBQWEsUUFBYixHQUF3QixVQUF4QjtBQUNBLGVBQU8sS0FBUCxDQUFhLEdBQWIsR0FBbUIsQ0FBbkI7QUFDQSxlQUFPLEtBQVAsQ0FBYSxJQUFiLEdBQW9CLENBQXBCO0FBQ0EsZUFBTyxLQUFQLENBQWEsTUFBYixHQUFzQixDQUFDLENBQXZCO0FBQ0EsaUJBQVMsSUFBVCxDQUFjLFdBQWQsQ0FBMEIsTUFBMUI7QUFDQSxxQkFBYSxJQUFiO0FBQ0g7O0FBRUQsUUFBSSxLQUFLLE9BQU8sVUFBUCxDQUFrQixPQUFsQixFQUEyQixPQUEzQixLQUF1QyxPQUFPLFVBQVAsQ0FBa0Isb0JBQWxCLEVBQXdDLE9BQXhDLENBQWhEO0FBQ0EsUUFBSSxDQUFDLEVBQUwsRUFBUztBQUNMLGNBQU0sSUFBSSxLQUFKLENBQVUsZ0NBQVYsQ0FBTjtBQUNIO0FBQ0QsT0FBRyxXQUFILEdBQWlCLFlBQWpCOztBQUVBLFFBQUksQ0FBQyxVQUFMLEVBQWlCO0FBQ2IsZ0JBQVEsTUFBUixDQUFlLEVBQWYsRUFBbUIsV0FBVyxPQUFPLEtBQVAsQ0FBYSxLQUF4QixDQUFuQixFQUFtRCxXQUFXLE9BQU8sS0FBUCxDQUFhLE1BQXhCLENBQW5ELEVBQW9GLFFBQVEsa0JBQTVGO0FBQ0gsS0FGRCxNQUdLO0FBQ0QsZ0JBQVEsTUFBUixDQUFlLEVBQWYsRUFBbUIsT0FBTyxVQUExQixFQUFzQyxPQUFPLFdBQTdDLEVBQTBELFFBQVEsa0JBQWxFO0FBQ0EsZUFBTyxnQkFBUCxDQUF3QixRQUF4QixFQUFrQyxZQUFZO0FBQzFDLG9CQUFRLE1BQVIsQ0FBZSxFQUFmLEVBQW1CLE9BQU8sVUFBMUIsRUFBc0MsT0FBTyxXQUE3QyxFQUEwRCxRQUFRLGtCQUFsRTtBQUNILFNBRkQ7QUFHSDs7QUFFRCxXQUFPLEVBQVA7QUFDSCxDQTlCRDs7QUFnQ0EsUUFBUSxNQUFSLEdBQWlCLFVBQVUsRUFBVixFQUFjLEtBQWQsRUFBcUIsTUFBckIsRUFBNkIsa0JBQTdCLEVBQ2pCO0FBQ0kseUJBQXFCLHNCQUFzQixPQUFPLGdCQUE3QixJQUFpRCxDQUF0RTtBQUNBLE9BQUcsTUFBSCxDQUFVLEtBQVYsQ0FBZ0IsS0FBaEIsR0FBd0IsUUFBUSxJQUFoQztBQUNBLE9BQUcsTUFBSCxDQUFVLEtBQVYsQ0FBZ0IsTUFBaEIsR0FBeUIsU0FBUyxJQUFsQztBQUNBLE9BQUcsTUFBSCxDQUFVLEtBQVYsR0FBa0IsS0FBSyxLQUFMLENBQVcsUUFBUSxrQkFBbkIsQ0FBbEI7QUFDQSxPQUFHLE1BQUgsQ0FBVSxNQUFWLEdBQW1CLEtBQUssS0FBTCxDQUFXLFNBQVMsa0JBQXBCLENBQW5CO0FBQ0EsT0FBRyxlQUFILENBQW1CLEdBQUcsV0FBdEIsRUFBbUMsSUFBbkM7QUFDQSxPQUFHLFFBQUgsQ0FBWSxDQUFaLEVBQWUsQ0FBZixFQUFrQixHQUFHLE1BQUgsQ0FBVSxLQUE1QixFQUFtQyxHQUFHLE1BQUgsQ0FBVSxNQUE3QztBQUNILENBVEQ7Ozs7Ozs7O2tCQ25Dd0IsWTtBQU54QjtBQUNBOztBQUVBO0FBQ0EsSUFBSSxhQUFhLEVBQWpCOztBQUVlLFNBQVMsWUFBVCxDQUF1QixFQUF2QixFQUEyQixJQUEzQixFQUFpQztBQUM1QyxRQUFJLE9BQU8sV0FBVyxNQUFYLENBQWtCO0FBQUEsZUFBSyxFQUFFLENBQUYsTUFBUyxFQUFkO0FBQUEsS0FBbEIsRUFBb0MsQ0FBcEMsQ0FBWDtBQUNBLFdBQU8sUUFBUSxLQUFLLENBQUwsQ0FBZjs7QUFFQSxRQUFJLENBQUMsSUFBTCxFQUFXO0FBQ1AsbUJBQVcsSUFBWCxDQUFnQixDQUFDLEVBQUQsRUFBSyxFQUFMLENBQWhCO0FBQ0EsZUFBTyxXQUFXLFdBQVcsTUFBWCxHQUFrQixDQUE3QixFQUFnQyxDQUFoQyxDQUFQO0FBQ0g7O0FBRUQsUUFBSSxDQUFDLEtBQUssSUFBTCxDQUFMLEVBQWlCO0FBQ2IsYUFBSyxJQUFMLElBQWEsR0FBRyxZQUFILENBQWdCLElBQWhCLENBQWI7QUFDSDtBQUNELFdBQU8sS0FBSyxJQUFMLENBQVA7QUFDSDs7Ozs7Ozs7Ozs7QUNuQkQsSUFBSSxPQUFPLEVBQVg7a0JBQ2UsSTs7QUFFZjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkEsS0FBSyxhQUFMLEdBQXFCLFVBQVUsUUFBVixFQUFvQjtBQUNyQyxRQUFJLFNBQVMsRUFBYjs7QUFFQSxTQUFLLElBQUksSUFBVCxJQUFpQixRQUFqQixFQUEyQjtBQUN2QixZQUFJLE1BQU0sSUFBVixDQUR1QixDQUNQO0FBQ2hCLFlBQUksVUFBVSxTQUFTLElBQVQsQ0FBZDtBQUNBLFlBQUksQ0FBSjs7QUFFQTtBQUNBLFlBQUksT0FBTyxPQUFQLEtBQW1CLFFBQXZCLEVBQWlDO0FBQzdCLG1CQUFPLElBQVAsQ0FBWTtBQUNSLHNCQUFNLE9BREU7QUFFUix3QkFBUSxJQUZBO0FBR1IsMEJBSFE7QUFJUix1QkFBTyxPQUpDO0FBS1Isd0JBTFE7QUFNUjtBQU5RLGFBQVo7QUFRSDtBQUNEO0FBVkEsYUFXSyxJQUFJLE1BQU0sT0FBTixDQUFjLE9BQWQsQ0FBSixFQUE0QjtBQUM3QjtBQUNBLG9CQUFJLE9BQU8sUUFBUSxDQUFSLENBQVAsS0FBc0IsUUFBMUIsRUFBb0M7QUFDaEM7QUFDQSx3QkFBSSxRQUFRLE1BQVIsSUFBa0IsQ0FBbEIsSUFBdUIsUUFBUSxNQUFSLElBQWtCLENBQTdDLEVBQWdEO0FBQzVDLCtCQUFPLElBQVAsQ0FBWTtBQUNSLGtDQUFNLFFBQVEsUUFBUSxNQURkO0FBRVIsb0NBQVEsUUFBUSxNQUFSLEdBQWlCLElBRmpCO0FBR1Isc0NBSFE7QUFJUixtQ0FBTyxPQUpDO0FBS1Isb0NBTFE7QUFNUjtBQU5RLHlCQUFaO0FBUUg7QUFDRDtBQVZBLHlCQVdLLElBQUksUUFBUSxNQUFSLEdBQWlCLENBQXJCLEVBQXdCO0FBQ3pCLG1DQUFPLElBQVAsQ0FBWTtBQUNSLHNDQUFNLFNBREU7QUFFUix3Q0FBUSxLQUZBO0FBR1Isc0NBQU0sT0FBTyxLQUhMO0FBSVIsdUNBQU8sT0FKQztBQUtSLHdDQUxRO0FBTVI7QUFOUSw2QkFBWjtBQVFIO0FBQ0Q7QUFDSDtBQUNEO0FBekJBLHFCQTBCSyxJQUFJLE9BQU8sUUFBUSxDQUFSLENBQVAsS0FBc0IsUUFBMUIsRUFBb0M7QUFDckMsNkJBQUssSUFBRSxDQUFQLEVBQVUsSUFBSSxRQUFRLE1BQXRCLEVBQThCLEdBQTlCLEVBQW1DO0FBQy9CLG1DQUFPLElBQVAsQ0FBWTtBQUNSLHNDQUFNLFdBREU7QUFFUix3Q0FBUSxJQUZBO0FBR1Isc0NBQU0sT0FBTyxHQUFQLEdBQWEsQ0FBYixHQUFpQixHQUhmO0FBSVIsdUNBQU8sUUFBUSxDQUFSLENBSkM7QUFLUixxQ0FBSyxDQUxHO0FBTVIsMENBQVU7QUFORiw2QkFBWjtBQVFIO0FBQ0o7QUFDRDtBQVpLLHlCQWFBLElBQUksTUFBTSxPQUFOLENBQWMsUUFBUSxDQUFSLENBQWQsS0FBNkIsT0FBTyxRQUFRLENBQVIsRUFBVyxDQUFYLENBQVAsS0FBeUIsUUFBMUQsRUFBb0U7QUFDckU7QUFDQSxnQ0FBSSxRQUFRLENBQVIsRUFBVyxNQUFYLElBQXFCLENBQXJCLElBQTBCLFFBQVEsQ0FBUixFQUFXLE1BQVgsSUFBcUIsQ0FBbkQsRUFBc0Q7QUFDbEQ7QUFDQSxxQ0FBSyxJQUFFLENBQVAsRUFBVSxJQUFJLFFBQVEsTUFBdEIsRUFBOEIsR0FBOUIsRUFBbUM7QUFDL0IsMkNBQU8sSUFBUCxDQUFZO0FBQ1IsOENBQU0sUUFBUSxRQUFRLENBQVIsRUFBVyxNQURqQjtBQUVSLGdEQUFRLFFBQVEsQ0FBUixFQUFXLE1BQVgsR0FBb0IsSUFGcEI7QUFHUiw4Q0FBTSxPQUFPLEdBQVAsR0FBYSxDQUFiLEdBQWlCLEdBSGY7QUFJUiwrQ0FBTyxRQUFRLENBQVIsQ0FKQztBQUtSLDZDQUFLLENBTEc7QUFNUixrREFBVTtBQU5GLHFDQUFaO0FBUUg7QUFDSjtBQUNKO0FBQ0Q7QUFDSDtBQUNEO0FBM0RLLGlCQTREQSxJQUFJLE9BQU8sT0FBUCxLQUFtQixTQUF2QixFQUFrQztBQUNuQywyQkFBTyxJQUFQLENBQVk7QUFDUiw4QkFBTSxNQURFO0FBRVIsZ0NBQVEsSUFGQTtBQUdSLGtDQUhRO0FBSVIsK0JBQU8sT0FKQztBQUtSLGdDQUxRO0FBTVI7QUFOUSxxQkFBWjtBQVFIO0FBQ0Q7QUFWSyxxQkFXQSxJQUFJLE9BQU8sT0FBUCxLQUFtQixRQUF2QixFQUFpQztBQUNsQywrQkFBTyxJQUFQLENBQVk7QUFDUixrQ0FBTSxXQURFO0FBRVIsb0NBQVEsSUFGQTtBQUdSLHNDQUhRO0FBSVIsbUNBQU8sT0FKQztBQUtSLG9DQUxRO0FBTVI7QUFOUSx5QkFBWjtBQVFIO0FBQ0o7O0FBRUQsV0FBTyxNQUFQO0FBQ0gsQ0F4R0Q7O0FBMEdBOzs7QUFHQSxLQUFLLGNBQUwsR0FBc0IsVUFBVSxJQUFWLEVBQWdCLEtBQWhCLEVBQXVCO0FBQ3pDLFFBQUksSUFBSixFQUFVLEtBQVY7O0FBRUE7QUFDQSxRQUFJLE9BQU8sS0FBUCxLQUFpQixRQUFyQixFQUErQjtBQUMzQixlQUFPLE9BQVA7QUFDSDtBQUNEO0FBSEEsU0FJSyxJQUFJLE1BQU0sT0FBTixDQUFjLEtBQWQsQ0FBSixFQUEwQjtBQUMzQjtBQUNBLGdCQUFJLE9BQU8sTUFBTSxDQUFOLENBQVAsS0FBb0IsUUFBeEIsRUFBa0M7QUFDOUI7QUFDQSxvQkFBSSxNQUFNLE1BQU4sSUFBZ0IsQ0FBaEIsSUFBcUIsTUFBTSxNQUFOLElBQWdCLENBQXpDLEVBQTRDO0FBQ3hDLDJCQUFPLFFBQVEsTUFBTSxNQUFyQjtBQUNIO0FBQ0Q7QUFIQSxxQkFJSztBQUFFO0FBQ0gsK0JBQU8sT0FBUDtBQUNBLGdDQUFRLE1BQU0sTUFBZDtBQUNIO0FBQ0Q7QUFDSDtBQUNEO0FBWkEsaUJBYUssSUFBSSxPQUFPLE1BQU0sQ0FBTixDQUFQLEtBQW9CLFFBQXhCLEVBQWtDO0FBQ25DLDJCQUFPLFdBQVA7QUFDQSw0QkFBUSxNQUFNLE1BQWQ7QUFDSDtBQUNKO0FBQ0Q7QUFwQkssYUFxQkEsSUFBSSxPQUFPLEtBQVAsS0FBaUIsU0FBckIsRUFBZ0M7QUFDakMsdUJBQU8sTUFBUDtBQUNIO0FBQ0Q7QUFISyxpQkFJQSxJQUFJLE9BQU8sS0FBUCxLQUFpQixRQUFyQixFQUErQjtBQUNoQywyQkFBTyxXQUFQO0FBQ0g7O0FBRUQ7QUFDQSxRQUFJLFdBQVcsRUFBZjtBQUNBLGdCQUFlLElBQWYsU0FBdUIsSUFBdkI7QUFDQSxRQUFJLEtBQUosRUFBVztBQUNQLDBCQUFnQixLQUFoQjtBQUNIO0FBQ0QsZ0JBQVksS0FBWjs7QUFFQSxXQUFPLFFBQVA7QUFDSCxDQTlDRDs7QUFnREE7OztBQUdBLEtBQUssYUFBTCxHQUFxQixVQUFVLElBQVYsRUFBZ0IsS0FBaEIsRUFBdUI7QUFDeEMsV0FBTyxhQUFhLEtBQUssY0FBTCxDQUFvQixJQUFwQixFQUEwQixLQUExQixDQUFwQjtBQUNILENBRkQ7O0FBSUE7Ozs7O0FBS0EsS0FBSyxnQkFBTCxHQUF3QixVQUFVLElBQVYsRUFBZ0IsTUFBaEIsRUFBd0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQUksS0FBSyxJQUFJLE1BQUosQ0FBVyx5Q0FBeUMsSUFBekMsR0FBZ0QsS0FBM0QsRUFBa0UsR0FBbEUsQ0FBVDtBQUNBLFFBQUksT0FBTyxLQUFQLENBQWEsRUFBYixDQUFKLEVBQXNCO0FBQ2xCLGVBQU8sSUFBUDtBQUNIO0FBQ0QsV0FBTyxLQUFQO0FBQ0gsQ0FiRDs7QUFlQTs7OztBQUlBLEtBQUssa0JBQUwsR0FBMEIsVUFBVSxJQUFWLEVBQWdCLE1BQWhCLEVBQXdCO0FBQzlDLFFBQUksS0FBSyxJQUFJLE1BQUosQ0FBVyxRQUFRLElBQVIsR0FBZSxLQUExQixFQUFpQyxHQUFqQyxDQUFUO0FBQ0EsUUFBSSxPQUFPLE1BQVAsQ0FBYyxFQUFkLEtBQXFCLENBQXpCLEVBQTRCO0FBQ3hCLGVBQU8sSUFBUDtBQUNIO0FBQ0QsV0FBTyxLQUFQO0FBQ0gsQ0FORDs7QUFRQTs7Ozs7QUFLQSxLQUFLLFVBQUwsR0FBa0IsVUFBVSxDQUFWLEVBQW9CO0FBQUEsUUFBUCxDQUFPLHVFQUFILENBQUc7O0FBQ2xDLFFBQUksVUFBSjtBQUNBLFFBQUksTUFBTSxPQUFOLENBQWMsQ0FBZCxDQUFKLEVBQXNCO0FBQ2xCLFlBQUksRUFBRSxNQUFGLEtBQWEsQ0FBakIsRUFBb0I7QUFDaEIsZ0JBQUksNkJBQUksQ0FBSixJQUFPLENBQVAsR0FBVSxHQUFWLENBQWMsVUFBZCxDQUFKO0FBQ0gsU0FGRCxNQUdLO0FBQ0QsbUJBQU8sQ0FBUDtBQUNIO0FBQ0osS0FQRCxNQVFLO0FBQ0QsWUFBSSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLEdBQVYsQ0FBYyxVQUFkLENBQUo7QUFDSDs7QUFFRCxRQUFJLEtBQUssRUFBRSxLQUFGLENBQVE7QUFBQSxlQUFLLE9BQU8sQ0FBUCxLQUFhLFFBQWIsSUFBeUIsQ0FBQyxNQUFNLENBQU4sQ0FBL0I7QUFBQSxLQUFSLENBQVQsRUFBMkQ7QUFDdkQsZUFBTyxDQUFQO0FBQ0g7QUFDSixDQWpCRDs7QUFtQkE7Ozs7O0FBS0EsS0FBSyxVQUFMLEdBQWtCLFVBQVUsQ0FBVixFQUFvQjtBQUFBLFFBQVAsQ0FBTyx1RUFBSCxDQUFHOztBQUNsQyxRQUFJLFVBQUo7QUFDQSxRQUFJLE1BQU0sT0FBTixDQUFjLENBQWQsQ0FBSixFQUFzQjtBQUNsQixZQUFJLEVBQUUsTUFBRixLQUFhLENBQWpCLEVBQW9CO0FBQ2hCLGdCQUFJLDZCQUFJLENBQUosSUFBTyxDQUFQLEdBQVUsR0FBVixDQUFjLFVBQWQsQ0FBSjtBQUNILFNBRkQsTUFHSztBQUNELG1CQUFPLENBQVA7QUFDSDtBQUNKLEtBUEQsTUFRSztBQUNELFlBQUksQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsR0FBYixDQUFpQixVQUFqQixDQUFKO0FBQ0g7O0FBRUQsUUFBSSxLQUFLLEVBQUUsS0FBRixDQUFRO0FBQUEsZUFBSyxPQUFPLENBQVAsS0FBYSxRQUFiLElBQXlCLENBQUMsTUFBTSxDQUFOLENBQS9CO0FBQUEsS0FBUixDQUFULEVBQTJEO0FBQ3ZELGVBQU8sQ0FBUDtBQUNIO0FBQ0osQ0FqQkQ7Ozs7Ozs7Ozs7Ozs7SUNuUGEsVyxXQUFBLFc7QUFDWix5QkFBYSxLQUFiLEVBQW9CLEtBQXBCLEVBQTJCO0FBQUE7O0FBQ3BCLGNBQU0sS0FBTjtBQUNBLGFBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSxhQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0g7Ozs7NEJBRUksSyxFQUFPO0FBQ1g7QUFDQSxnQkFBSSxLQUFLLFNBQUwsQ0FBZSxLQUFLLEtBQXBCLE1BQStCLEtBQUssU0FBTCxDQUFlLEtBQWYsQ0FBbkMsRUFBMEQ7QUFDekQscUJBQUssS0FBTCxDQUFXLEtBQVg7QUFDQSxxQkFBSyxLQUFMLEdBQWEsS0FBYjtBQUNBO0FBQ0Q7Ozs7OztJQUdnQixrQixHQUVqQiw0QkFBYSxFQUFiLEVBQWlCO0FBQUE7O0FBQ2IsU0FBSyxRQUFMLEdBQWdCLEVBQWhCOztBQUVBO0FBQ0EsU0FBSyxRQUFMLENBQWMsT0FBZCxHQUF3QixJQUF4QjtBQUNBLFNBQUssUUFBTCxDQUFjLFlBQWQsR0FBNkIsR0FBRyxJQUFoQzs7QUFFQTtBQUNBLFNBQUssUUFBTCxDQUFjLFFBQWQsR0FBeUIsS0FBekI7QUFDQSxTQUFLLFFBQUwsQ0FBYyxZQUFkLEdBQTZCLEdBQUcsbUJBQWhDO0FBQ0EsU0FBSyxRQUFMLENBQWMsWUFBZCxHQUE2QixHQUFHLG1CQUFoQztBQUNBLFNBQUssUUFBTCxDQUFjLGtCQUFkLEdBQW1DLEdBQUcsR0FBdEM7QUFDQSxTQUFLLFFBQUwsQ0FBYyxrQkFBZCxHQUFtQyxHQUFHLG1CQUF0Qzs7QUFFQTtBQUNBLFNBQUssUUFBTCxDQUFjLFdBQWQsR0FBNEIsSUFBNUI7QUFDQSxTQUFLLFFBQUwsQ0FBYyxVQUFkLEdBQTJCLElBQTNCO0FBQ0EsT0FBRyxTQUFILENBQWEsR0FBRyxJQUFoQixFQWpCYSxDQWlCVTs7QUFFMUI7QUFDRyxTQUFLLE9BQUwsR0FBZSxJQUFJLFdBQUosQ0FDWCxFQUFFLE1BQU0sS0FBSyxRQUFMLENBQWMsT0FBdEIsRUFBK0IsTUFBTSxLQUFLLFFBQUwsQ0FBYyxZQUFuRCxFQURXLEVBRWpCLFVBQUMsS0FBRCxFQUFXO0FBQ1YsWUFBSSxNQUFNLElBQVYsRUFBZ0I7QUFDZixlQUFHLE1BQUgsQ0FBVSxHQUFHLFNBQWI7QUFDTSxlQUFHLFFBQUgsQ0FBWSxNQUFNLElBQWxCO0FBQ04sU0FIRCxNQUdPO0FBQ04sZUFBRyxPQUFILENBQVcsR0FBRyxTQUFkO0FBQ0E7QUFDRCxLQVRnQixDQUFmOztBQVlIO0FBQ0csU0FBSyxRQUFMLEdBQWdCLElBQUksV0FBSixDQUFnQjtBQUN4QixlQUFPLEtBQUssUUFBTCxDQUFjLFFBREc7QUFFeEIsYUFBSyxLQUFLLFFBQUwsQ0FBYyxZQUZLO0FBR3hCLGFBQUssS0FBSyxRQUFMLENBQWMsWUFISztBQUl4QixtQkFBVyxLQUFLLFFBQUwsQ0FBYyxrQkFKRDtBQUt4QixtQkFBVyxLQUFLLFFBQUwsQ0FBYztBQUxELEtBQWhCLEVBT1osVUFBQyxLQUFELEVBQVc7QUFDaEIsWUFBSSxNQUFNLEtBQVYsRUFBaUI7QUFDVixlQUFHLE1BQUgsQ0FBVSxHQUFHLEtBQWI7O0FBRU0sZ0JBQUksTUFBTSxTQUFOLElBQW1CLE1BQU0sU0FBN0IsRUFBd0M7QUFDcEMsbUJBQUcsaUJBQUgsQ0FBcUIsTUFBTSxHQUEzQixFQUFnQyxNQUFNLEdBQXRDLEVBQTJDLE1BQU0sU0FBakQsRUFBNEQsTUFBTSxTQUFsRTtBQUNILGFBRkQsTUFHSztBQUNELG1CQUFHLFNBQUgsQ0FBYSxNQUFNLEdBQW5CLEVBQXdCLE1BQU0sR0FBOUI7QUFDSDtBQUNiLFNBVEQsTUFTTztBQUNOLGVBQUcsT0FBSCxDQUFXLEdBQUcsS0FBZDtBQUNBO0FBQ0QsS0FwQmlCLENBQWhCOztBQXVCSDtBQUNHLFNBQUssV0FBTCxHQUFtQixJQUFJLFdBQUosQ0FDZixFQUFFLGFBQWEsS0FBSyxRQUFMLENBQWMsV0FBN0IsRUFEZSxFQUVyQixVQUFDLEtBQUQsRUFBVztBQUNQLFdBQUcsU0FBSCxDQUFhLE1BQU0sV0FBbkI7QUFDSCxLQUpvQixDQUFuQjs7QUFPSDtBQUNHLFNBQUssVUFBTCxHQUFrQixJQUFJLFdBQUosQ0FDZCxFQUFFLFlBQVksS0FBSyxRQUFMLENBQWMsVUFBNUIsRUFEYyxFQUVkLFVBQUMsS0FBRCxFQUFXO0FBQ2hCLFlBQUksTUFBTSxVQUFWLEVBQXNCO0FBQ2YsZUFBRyxNQUFILENBQVUsR0FBRyxVQUFiO0FBQ04sU0FGRCxNQUVPO0FBQ0EsZUFBRyxPQUFILENBQVcsR0FBRyxVQUFkO0FBQ047QUFDRCxLQVJtQixDQUFsQjtBQVdILEM7O2tCQTlFZ0Isa0I7Ozs7Ozs7OztxakJDakJyQjtBQUNBOztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBRUE7Ozs7QUFDQTs7Ozs7Ozs7OztBQUVBO0FBQ0EsSUFBTSxZQUFZLGtCQUFsQixDLENBQXdDO0FBQ3hDLElBQU0sbUJBQW1CLFdBQXpCLEMsQ0FBd0M7O0lBRW5CLGE7QUFFakIsMkJBQVksRUFBWixFQUFnQixhQUFoQixFQUErQixlQUEvQixFQUFnRCxPQUFoRCxFQUF5RDtBQUFBOztBQUNyRCxrQkFBVSxXQUFXLEVBQXJCOztBQUVBLGFBQUssRUFBTCxHQUFVLEVBQVY7QUFDQSxhQUFLLE9BQUwsR0FBZSxJQUFmO0FBQ0EsYUFBSyxRQUFMLEdBQWdCLEtBQWhCO0FBQ0EsYUFBSyxTQUFMLEdBQWlCLEtBQWpCO0FBQ0EsYUFBSyxLQUFMLEdBQWEsSUFBYjs7QUFFQTtBQUNBLGFBQUssT0FBTCxHQUFlLE9BQU8sTUFBUCxDQUFjLEVBQWQsRUFBa0IsUUFBUSxPQUFSLElBQWlCLEVBQW5DLENBQWY7O0FBRUE7QUFDQSxhQUFLLE1BQUwsR0FBYyxPQUFPLE1BQVAsQ0FBYyxFQUFkLEVBQWtCLFFBQVEsTUFBUixJQUFnQixFQUFsQyxDQUFkO0FBQ0EsYUFBSyxZQUFMLEdBQW9CLE9BQU8sTUFBUCxDQUFjLEVBQWQsRUFBa0IsUUFBUSxZQUFSLElBQXNCLEVBQXhDLENBQXBCOztBQUVBO0FBQ0EsYUFBSyxVQUFMLEdBQWtCLFFBQVEsVUFBUixJQUFzQixFQUF4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFLLGtCQUFMLEdBQTBCLFFBQVEsUUFBbEM7O0FBRUEsYUFBSyxRQUFMLEdBQWdCLEVBQWhCLENBeEJxRCxDQXdCakM7QUFDcEIsYUFBSyxPQUFMLEdBQWUsRUFBZixDQXpCcUQsQ0F5QmxDOztBQUVuQixhQUFLLGFBQUwsR0FBcUIsYUFBckI7QUFDQSxhQUFLLGVBQUwsR0FBdUIsZUFBdkI7O0FBRUEsYUFBSyxFQUFMLEdBQVUsY0FBYyxFQUFkLEVBQVY7QUFDQSxhQUFLLElBQUwsR0FBWSxRQUFRLElBQXBCLENBL0JxRCxDQStCM0I7QUFDN0I7Ozs7a0NBRVM7QUFDTixpQkFBSyxFQUFMLENBQVEsVUFBUixDQUFtQixJQUFuQjtBQUNBLGlCQUFLLEVBQUwsQ0FBUSxhQUFSLENBQXNCLEtBQUssT0FBM0I7QUFDQSxpQkFBSyxPQUFMLEdBQWUsSUFBZjtBQUNBLGlCQUFLLFFBQUwsR0FBZ0IsRUFBaEI7QUFDQSxpQkFBSyxPQUFMLEdBQWUsRUFBZjtBQUNBLGlCQUFLLFFBQUwsR0FBZ0IsS0FBaEI7QUFDSDs7QUFFRDs7Ozs4QkFDTTtBQUNGLGdCQUFJLENBQUMsS0FBSyxRQUFWLEVBQW9CO0FBQ2hCO0FBQ0g7O0FBRUQsZ0JBQUksY0FBYyxPQUFkLEtBQTBCLElBQTlCLEVBQW9DO0FBQ2hDLHFCQUFLLEVBQUwsQ0FBUSxVQUFSLENBQW1CLEtBQUssT0FBeEI7QUFDSDtBQUNELDBCQUFjLE9BQWQsR0FBd0IsSUFBeEI7QUFDSDs7O2tDQUVTO0FBQUE7O0FBQ04sZ0JBQUksS0FBSyxTQUFULEVBQW9CO0FBQ2hCLHNCQUFNLElBQUksS0FBSiw0Q0FBbUQsS0FBSyxFQUF4RCxVQUErRCxLQUFLLElBQXBFLGlDQUFOO0FBQ0g7QUFDRCxpQkFBSyxTQUFMLEdBQWlCLElBQWpCO0FBQ0EsaUJBQUssUUFBTCxHQUFnQixLQUFoQjtBQUNBLGlCQUFLLEtBQUwsR0FBYSxJQUFiOztBQUVBO0FBQ0EsaUJBQUssc0JBQUwsR0FBOEIsS0FBSyxhQUFuQztBQUNBLGlCQUFLLHdCQUFMLEdBQWdDLEtBQUssZUFBckM7O0FBRUE7QUFDQSxnQkFBSSxhQUFhLEtBQUssZUFBTCxFQUFqQjs7QUFFQTtBQUNBLGdCQUFJLFVBQVUsS0FBSyxlQUFMLEVBQWQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBSSxTQUFTLEtBQUssb0JBQUwsRUFBYjtBQUNBLGdCQUFJLE1BQUo7O0FBRUEsaUJBQUssSUFBSSxHQUFULElBQWdCLE1BQWhCLEVBQXdCO0FBQ3BCLG9CQUFJLFFBQVEsT0FBTyxHQUFQLENBQVo7QUFDQSxvQkFBSSxDQUFDLEtBQUQsSUFBVyxNQUFNLE9BQU4sQ0FBYyxLQUFkLEtBQXdCLE1BQU0sTUFBTixLQUFpQixDQUF4RCxFQUE0RDtBQUN4RDtBQUNIOztBQUVEO0FBQ0EseUJBQVMsSUFBSSxNQUFKLENBQVcsaUNBQWlDLEdBQWpDLEdBQXVDLE9BQWxELEVBQTJELEdBQTNELENBQVQ7QUFDQSxvQkFBSSxnQkFBZ0IsS0FBSyxzQkFBTCxDQUE0QixLQUE1QixDQUFrQyxNQUFsQyxDQUFwQjtBQUNBLG9CQUFJLGtCQUFrQixLQUFLLHdCQUFMLENBQThCLEtBQTlCLENBQW9DLE1BQXBDLENBQXRCOztBQUVBO0FBQ0Esb0JBQUksaUJBQWlCLElBQWpCLElBQXlCLG1CQUFtQixJQUFoRCxFQUFzRDtBQUNsRDtBQUNIOztBQUVEO0FBQ0Esb0JBQUksU0FBUyxFQUFiO0FBQ0Esc0JBQU0sT0FBTixDQUFjLGVBQU87QUFDakI7QUFDQTtBQUNBLHdCQUFJLE9BQVUsSUFBSSxLQUFkLFVBQXdCLElBQUksR0FBNUIsVUFBb0MsSUFBSSxHQUE1QztBQUNBLDZEQUF1QyxJQUF2QztBQUNBLDhCQUFVLElBQUksTUFBZDtBQUNBLDJEQUFxQyxJQUFyQztBQUNILGlCQVBEOztBQVNBO0FBQ0Esb0JBQUksaUJBQWlCLElBQXJCLEVBQTJCO0FBQ3ZCLHlCQUFLLHNCQUFMLEdBQThCLEtBQUssc0JBQUwsQ0FBNEIsT0FBNUIsQ0FBb0MsTUFBcEMsRUFBNEMsTUFBNUMsQ0FBOUI7QUFDSDtBQUNELG9CQUFJLG1CQUFtQixJQUF2QixFQUE2QjtBQUN6Qix5QkFBSyx3QkFBTCxHQUFnQyxLQUFLLHdCQUFMLENBQThCLE9BQTlCLENBQXNDLE1BQXRDLEVBQThDLE1BQTlDLENBQWhDO0FBQ0g7O0FBRUQ7QUFDQSx3QkFBUSxtQkFBbUIsSUFBSSxPQUFKLENBQVksU0FBWixFQUF1QixHQUF2QixFQUE0QixXQUE1QixFQUEzQixJQUF3RSxJQUF4RTtBQUNIOztBQUVEO0FBQ0EsaUJBQUssc0JBQUwsR0FBOEIsS0FBSyxzQkFBTCxDQUE0QixPQUE1QixDQUFvQyxTQUFwQyxFQUErQyxFQUEvQyxDQUE5QjtBQUNBLGlCQUFLLHdCQUFMLEdBQWdDLEtBQUssd0JBQUwsQ0FBOEIsT0FBOUIsQ0FBc0MsU0FBdEMsRUFBaUQsRUFBakQsQ0FBaEM7O0FBRUE7QUFDQSxpQkFBSyxjQUFMLENBQW9CLEtBQUssa0JBQXpCOztBQUVBO0FBQ0E7QUFDQSxnQkFBSSxZQUFZLEVBQWhCO0FBQ0EsZ0JBQUksT0FBTyxLQUFLLEVBQUwsQ0FBUSx3QkFBUixDQUFpQyxLQUFLLEVBQUwsQ0FBUSxlQUF6QyxFQUEwRCxLQUFLLEVBQUwsQ0FBUSxVQUFsRSxDQUFYO0FBQ0EsZ0JBQUksUUFBUSxLQUFLLFNBQUwsR0FBaUIsQ0FBN0IsRUFBZ0M7QUFDNUIsNEJBQVksMEJBQVo7QUFDSCxhQUZELE1BR0s7QUFDRCw0QkFBWSw0QkFBWjtBQUNIOztBQUVELG9CQUFRLHVCQUFSLElBQW1DLElBQW5DO0FBQ0Esb0JBQVEseUJBQVIsSUFBcUMsS0FBckM7QUFDQSxpQkFBSyxzQkFBTCxHQUNJLFlBQ0EsY0FBYyxpQkFBZCxDQUFnQyxPQUFoQyxDQURBLEdBRUEsS0FBSyxzQkFIVDs7QUFLQTtBQUNBO0FBQ0E7QUFDQSxvQkFBUSx1QkFBUixJQUFtQyxLQUFuQztBQUNBLG9CQUFRLHlCQUFSLElBQXFDLElBQXJDO0FBQ0EsaUJBQUssd0JBQUwsR0FDSSxjQUFjLG9CQUFkLENBQW1DLFVBQW5DLElBQ0EsU0FEQSxHQUVBLGNBQWMsaUJBQWQsQ0FBZ0MsT0FBaEMsQ0FGQSxHQUdBLEtBQUssd0JBSlQ7O0FBTUE7QUFDQSxpQkFBSyxzQkFBTCxHQUE4QixLQUFLLHNCQUFMLENBQTRCLE9BQTVCLENBQW9DLGdCQUFwQyxFQUFzRCxFQUF0RCxDQUE5QjtBQUNBLGlCQUFLLHdCQUFMLEdBQWdDLEtBQUssd0JBQUwsQ0FBOEIsT0FBOUIsQ0FBc0MsZ0JBQXRDLEVBQXdELEVBQXhELENBQWhDOztBQUVBO0FBQ0EsZ0JBQUk7QUFDQSxxQkFBSyxPQUFMLEdBQWUsY0FBYyxhQUFkLENBQTRCLEtBQUssRUFBakMsRUFBcUMsS0FBSyxPQUExQyxFQUFtRCxLQUFLLHNCQUF4RCxFQUFnRixLQUFLLHdCQUFyRixDQUFmO0FBQ0EscUJBQUssUUFBTCxHQUFnQixJQUFoQjtBQUNBLHFCQUFLLFNBQUwsR0FBaUIsS0FBakI7QUFDSCxhQUpELENBS0EsT0FBTSxLQUFOLEVBQWE7QUFDVCxxQkFBSyxPQUFMLEdBQWUsSUFBZjtBQUNBLHFCQUFLLFFBQUwsR0FBZ0IsS0FBaEI7QUFDQSxxQkFBSyxTQUFMLEdBQWlCLEtBQWpCO0FBQ0EscUJBQUssS0FBTCxHQUFhLEtBQWI7O0FBRUE7QUFDQSxvQkFBSSxNQUFNLElBQU4sS0FBZSxRQUFmLElBQTJCLE1BQU0sSUFBTixLQUFlLFVBQTlDLEVBQTBEO0FBQ3RELHlCQUFLLGFBQUwsR0FBcUIsTUFBTSxNQUEzQjtBQUNBLHlCQUFLLGFBQUwsQ0FBbUIsT0FBbkIsQ0FBMkIsYUFBSztBQUM1QiwwQkFBRSxJQUFGLEdBQVMsTUFBTSxJQUFmO0FBQ0EsMEJBQUUsS0FBRixHQUFVLE1BQUssS0FBTCxDQUFXLE1BQU0sSUFBakIsRUFBdUIsRUFBRSxJQUF6QixDQUFWO0FBQ0gscUJBSEQ7QUFJSDs7QUFFRCxzQkFBTSxJQUFJLEtBQUosdUNBQThDLEtBQUssRUFBbkQsVUFBMEQsS0FBSyxJQUEvRCxlQUErRSxLQUEvRSxDQUFOO0FBQ0g7O0FBRUQsaUJBQUssR0FBTDtBQUNBLGlCQUFLLGVBQUw7QUFDQSxpQkFBSyxpQkFBTDtBQUNIOztBQUVEOzs7OzBDQUNrQjtBQUNkLGdCQUFJLENBQUo7QUFBQSxnQkFBTyxVQUFVLEVBQWpCO0FBQ0EsaUJBQUssQ0FBTCxJQUFVLGNBQWMsT0FBeEIsRUFBaUM7QUFDN0Isd0JBQVEsQ0FBUixJQUFhLGNBQWMsT0FBZCxDQUFzQixDQUF0QixDQUFiO0FBQ0g7QUFDRCxpQkFBSyxDQUFMLElBQVUsS0FBSyxPQUFmLEVBQXdCO0FBQ3BCLHdCQUFRLENBQVIsSUFBYSxLQUFLLE9BQUwsQ0FBYSxDQUFiLENBQWI7QUFDSDtBQUNELG1CQUFPLE9BQVA7QUFDSDs7QUFFRDs7OzsrQ0FDdUI7QUFDbkIsZ0JBQUksWUFBSjtBQUFBLGdCQUFTLFNBQVMsRUFBbEI7O0FBRUE7QUFDQSxpQkFBSyxHQUFMLElBQVksY0FBYyxNQUExQixFQUFrQztBQUM5Qix1QkFBTyxHQUFQLElBQWMsRUFBZDs7QUFFQSxvQkFBSSxNQUFNLE9BQU4sQ0FBYyxjQUFjLE1BQWQsQ0FBcUIsR0FBckIsQ0FBZCxDQUFKLEVBQThDO0FBQUE7O0FBQzFDLDBDQUFPLEdBQVAsR0FBWSxJQUFaLHVDQUNPLGNBQWMsTUFBZCxDQUFxQixHQUFyQixFQUEwQixHQUExQixDQUE4QixVQUFDLE1BQUQsRUFBUyxHQUFULEVBQWlCO0FBQzlDLCtCQUFPLEVBQUUsUUFBRixFQUFPLGNBQVAsRUFBZSxRQUFmLEVBQW9CLE9BQU8sZUFBM0IsRUFBUDtBQUNILHFCQUZFLENBRFA7QUFLSCxpQkFORCxNQU9LO0FBQ0QsMkJBQU8sR0FBUCxJQUFjLENBQUMsRUFBRSxRQUFGLEVBQU8sUUFBUSxjQUFjLE1BQWQsQ0FBcUIsR0FBckIsQ0FBZixFQUEwQyxLQUFLLENBQS9DLEVBQWtELE9BQU8sZUFBekQsRUFBRCxDQUFkO0FBQ0g7QUFDSjs7QUFFRDtBQUNBLGlCQUFLLEdBQUwsSUFBWSxLQUFLLE1BQWpCLEVBQXlCO0FBQ3JCLHVCQUFPLEdBQVAsSUFBYyxPQUFPLEdBQVAsS0FBZSxFQUE3Qjs7QUFFQSxvQkFBSSxNQUFNLE9BQU4sQ0FBYyxLQUFLLE1BQUwsQ0FBWSxHQUFaLENBQWQsQ0FBSixFQUFxQztBQUNqQyx3QkFBSSxTQUFVLEtBQUssWUFBTCxJQUFxQixLQUFLLFlBQUwsQ0FBa0IsR0FBbEIsQ0FBdEIsSUFBaUQsRUFBOUQ7QUFDQSx3QkFBSSxZQUFZLElBQWhCO0FBQUEsd0JBQXNCLE1BQU0sQ0FBNUI7O0FBRUEseUJBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLEtBQUssTUFBTCxDQUFZLEdBQVosRUFBaUIsTUFBbkMsRUFBMkMsR0FBM0MsRUFBZ0Q7QUFDNUM7QUFDQSw0QkFBSSxPQUFPLENBQVAsTUFBYyxTQUFsQixFQUE2QjtBQUN6Qix3Q0FBWSxPQUFPLENBQVAsQ0FBWjtBQUNBLGtDQUFNLENBQU47QUFDSDs7QUFFRCwrQkFBTyxHQUFQLEVBQVksSUFBWixDQUFpQjtBQUNiLG9DQURhO0FBRWIsb0NBQVEsS0FBSyxNQUFMLENBQVksR0FBWixFQUFpQixDQUFqQixDQUZLO0FBR2Isb0NBSGE7QUFJYixtQ0FBTyxhQUFhLEtBQUs7QUFKWix5QkFBakI7O0FBT0E7QUFDSDtBQUNKLGlCQXBCRCxNQXFCSztBQUNEO0FBQ0E7QUFDQSwyQkFBTyxHQUFQLEVBQVksSUFBWixDQUFpQixFQUFFLFFBQUYsRUFBTyxRQUFRLEtBQUssTUFBTCxDQUFZLEdBQVosQ0FBZixFQUFpQyxLQUFLLENBQXRDLEVBQXlDLE9BQU8sS0FBSyxJQUFyRCxFQUFqQjtBQUNIO0FBQ0o7QUFDRCxtQkFBTyxNQUFQO0FBQ0g7O0FBRUQ7Ozs7dUNBQ2UsUSxFQUFVO0FBQ3JCLGdCQUFJLENBQUMsUUFBTCxFQUFlO0FBQ1g7QUFDSDs7QUFFRCxnQkFBSSxLQUFLLDZCQUFNLEtBQUssc0JBQVgsQ0FBVDtBQUNBLGdCQUFJLEtBQUssNkJBQU0sS0FBSyx3QkFBWCxDQUFUO0FBQ0EsZ0JBQUksTUFBSjtBQUFBLGdCQUFZLGdCQUFnQixFQUE1QjtBQUFBLGdCQUFnQyxnQkFBZ0IsRUFBaEQ7O0FBRUE7QUFDQSxpQkFBSyxJQUFJLElBQVQsSUFBaUIsUUFBakIsRUFBMkI7QUFDdkIseUJBQVMsSUFBVDs7QUFFQTtBQUNBLG9CQUFJLENBQUMsZUFBSyxnQkFBTCxDQUFzQixJQUF0QixFQUE0QixFQUE1QixDQUFMLEVBQXNDO0FBQ2xDLHdCQUFJLENBQUMsTUFBTCxFQUFhO0FBQ1QsaUNBQVMsZUFBSyxhQUFMLENBQW1CLElBQW5CLEVBQXlCLFNBQVMsSUFBVCxDQUF6QixDQUFUO0FBQ0g7QUFDRCx1Q0FBSSxPQUFKLGVBQXdCLEtBQUssSUFBN0IsVUFBc0MsSUFBdEMsb0RBQXdGLE1BQXhGO0FBQ0Esa0NBQWMsSUFBZCxDQUFtQixNQUFuQjtBQUVIO0FBQ0Q7QUFDQSxvQkFBSSxDQUFDLGVBQUssZ0JBQUwsQ0FBc0IsSUFBdEIsRUFBNEIsRUFBNUIsQ0FBTCxFQUFzQztBQUNsQyx3QkFBSSxDQUFDLE1BQUwsRUFBYTtBQUNULGlDQUFTLGVBQUssYUFBTCxDQUFtQixJQUFuQixFQUF5QixTQUFTLElBQVQsQ0FBekIsQ0FBVDtBQUNIO0FBQ0QsdUNBQUksT0FBSixlQUF3QixLQUFLLElBQTdCLFVBQXNDLElBQXRDLHNEQUEwRixNQUExRjtBQUNBLGtDQUFjLElBQWQsQ0FBbUIsTUFBbkI7QUFDSDtBQUNKOztBQUVEO0FBQ0E7QUFDQTtBQUNBLGdCQUFJLGNBQWMsTUFBZCxHQUF1QixDQUEzQixFQUE4QjtBQUMxQixxQkFBSyxzQkFBTCxHQUE4QixjQUFjLElBQWQsQ0FBbUIsSUFBbkIsSUFBMkIsS0FBSyxzQkFBOUQ7QUFDSDs7QUFFRCxnQkFBSSxjQUFjLE1BQWQsR0FBdUIsQ0FBM0IsRUFBOEI7QUFDMUIscUJBQUssd0JBQUwsR0FBZ0MsY0FBYyxJQUFkLENBQW1CLElBQW5CLElBQTJCLEtBQUssd0JBQWhFO0FBQ0g7QUFDSjs7QUFFRDs7OztvQ0FDWSxRLEVBQXFDO0FBQUEsZ0JBQTNCLGtCQUEyQix1RUFBTixJQUFNOztBQUM3QyxnQkFBSSxDQUFDLEtBQUssUUFBVixFQUFvQjtBQUNoQjtBQUNIOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQUksa0JBQUosRUFBd0I7QUFDcEIscUJBQUssWUFBTCxHQUFvQixDQUFwQjtBQUNIOztBQUVEO0FBQ0EsZ0JBQU0sU0FBUyxlQUFLLGFBQUwsQ0FBbUIsUUFBbkIsQ0FBZjs7QUFFQTtBQUNBLGlCQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxPQUFPLE1BQXpCLEVBQWlDLEdBQWpDLEVBQXNDO0FBQ2xDLG9CQUFNLFVBQVUsT0FBTyxDQUFQLENBQWhCO0FBQ0Esb0JBQUksUUFBUSxJQUFSLEtBQWlCLFdBQXJCLEVBQWtDO0FBQzlCO0FBQ0EseUJBQUssaUJBQUwsQ0FBdUIsUUFBUSxJQUEvQixFQUFxQyxRQUFRLEtBQTdDO0FBQ0gsaUJBSEQsTUFJSztBQUNELHlCQUFLLE9BQUwsQ0FBYSxRQUFRLE1BQXJCLEVBQTZCLFFBQVEsSUFBckMsRUFBMkMsUUFBUSxLQUFuRDtBQUNIO0FBQ0o7QUFDSjs7QUFFRDs7OztxQ0FDYSxNLEVBQVE7QUFDakIsZ0JBQUksV0FBVyxVQUFVLEtBQUssUUFBOUI7QUFDQSxpQkFBSyxJQUFJLENBQVQsSUFBYyxRQUFkLEVBQXdCO0FBQ3BCLG9CQUFJLFVBQVUsS0FBSyxRQUFMLENBQWMsQ0FBZCxDQUFkO0FBQ0Esb0JBQUksT0FBSixFQUFhO0FBQ1QsNEJBQVEsV0FBUixHQUFzQixRQUFRLEtBQTlCO0FBQ0g7QUFDSjtBQUNELGlCQUFLLGtCQUFMLEdBQTBCLEtBQUssWUFBTCxJQUFxQixDQUEvQztBQUNIOztBQUVEOzs7O3dDQUNnQixNLEVBQVE7QUFDcEIsZ0JBQUksV0FBVyxVQUFVLEtBQUssUUFBOUI7QUFDQSxpQkFBSyxJQUFJLENBQVQsSUFBYyxRQUFkLEVBQXdCO0FBQ3BCLG9CQUFJLFVBQVUsS0FBSyxRQUFMLENBQWMsQ0FBZCxDQUFkO0FBQ0Esb0JBQUksV0FBVyxRQUFRLFdBQXZCLEVBQW9DO0FBQ2hDLDRCQUFRLEtBQVIsR0FBZ0IsUUFBUSxXQUF4QjtBQUNBLHlCQUFLLGFBQUwsQ0FBbUIsT0FBbkI7QUFDSDtBQUNKO0FBQ0QsaUJBQUssWUFBTCxHQUFvQixLQUFLLGtCQUFMLElBQTJCLENBQS9DO0FBQ0g7O0FBRUQ7Ozs7MENBQ2tCLFksRUFBYyxZLEVBQWM7QUFDMUMsZ0JBQUksVUFBVSxrQkFBUSxRQUFSLENBQWlCLFlBQWpCLENBQWQ7QUFDQSxnQkFBSSxXQUFXLElBQWYsRUFBcUI7QUFDakIsbUNBQUksTUFBSiw2QkFBb0MsWUFBcEM7QUFDQTtBQUNIOztBQUVELG9CQUFRLElBQVIsQ0FBYSxLQUFLLFlBQWxCO0FBQ0EsaUJBQUssT0FBTCxDQUFhLElBQWIsRUFBbUIsWUFBbkIsRUFBaUMsS0FBSyxZQUF0QztBQUNBLGlCQUFLLFlBQUwsR0FUMEMsQ0FTckI7QUFDeEI7O0FBRUQ7QUFDQTs7OztnQ0FDUSxNLEVBQVEsSSxFQUFNLEssRUFBTztBQUFFO0FBQzNCLGdCQUFJLENBQUMsS0FBSyxRQUFWLEVBQW9CO0FBQ2hCO0FBQ0g7O0FBRUQsaUJBQUssUUFBTCxDQUFjLElBQWQsSUFBc0IsS0FBSyxRQUFMLENBQWMsSUFBZCxLQUF1QixFQUE3QztBQUNBLGdCQUFJLFVBQVUsS0FBSyxRQUFMLENBQWMsSUFBZCxDQUFkO0FBQ0Esb0JBQVEsSUFBUixHQUFlLElBQWY7QUFDQSxnQkFBSSxRQUFRLFFBQVIsS0FBcUIsU0FBekIsRUFBb0M7QUFDaEMsd0JBQVEsUUFBUixHQUFtQixLQUFLLEVBQUwsQ0FBUSxrQkFBUixDQUEyQixLQUFLLE9BQWhDLEVBQXlDLElBQXpDLENBQW5CO0FBQ0g7QUFDRCxvQkFBUSxNQUFSLEdBQWlCLE1BQWpCO0FBQ0Esb0JBQVEsS0FBUixHQUFnQixLQUFoQjtBQUNBLGlCQUFLLGFBQUwsQ0FBbUIsT0FBbkI7QUFDSDs7QUFFRDs7OztzQ0FDYyxPLEVBQVM7QUFDbkIsZ0JBQUksQ0FBQyxLQUFLLFFBQVYsRUFBb0I7QUFDaEI7QUFDSDs7QUFFRCxnQkFBSSxDQUFDLE9BQUQsSUFBWSxRQUFRLFFBQVIsSUFBb0IsSUFBcEMsRUFBMEM7QUFDdEM7QUFDSDs7QUFFRCxpQkFBSyxHQUFMO0FBQ0EsaUJBQUssYUFBTCxDQUFtQixPQUFuQjtBQUNIOztBQUVEOzs7O3NDQUNjLE8sRUFBUTtBQUNsQixnQkFBSSxXQUFXLFFBQVEsUUFBdkI7QUFDQSxnQkFBSSxRQUFRLFFBQVEsS0FBcEI7O0FBRUEsb0JBQVEsUUFBUSxNQUFoQjtBQUNJLHFCQUFLLElBQUw7QUFDSSx5QkFBSyxFQUFMLENBQVEsU0FBUixDQUFrQixRQUFsQixFQUE0QixLQUE1QjtBQUNBO0FBQ0oscUJBQUssSUFBTDtBQUNJLHlCQUFLLEVBQUwsQ0FBUSxTQUFSLENBQWtCLFFBQWxCLEVBQTRCLEtBQTVCO0FBQ0E7QUFDSixxQkFBSyxJQUFMO0FBQ0kseUJBQUssRUFBTCxDQUFRLFNBQVIsQ0FBa0IsUUFBbEIsRUFBNEIsTUFBTSxDQUFOLENBQTVCLEVBQXNDLE1BQU0sQ0FBTixDQUF0QztBQUNBO0FBQ0oscUJBQUssSUFBTDtBQUNJLHlCQUFLLEVBQUwsQ0FBUSxTQUFSLENBQWtCLFFBQWxCLEVBQTRCLE1BQU0sQ0FBTixDQUE1QixFQUFzQyxNQUFNLENBQU4sQ0FBdEMsRUFBZ0QsTUFBTSxDQUFOLENBQWhEO0FBQ0E7QUFDSixxQkFBSyxJQUFMO0FBQ0kseUJBQUssRUFBTCxDQUFRLFNBQVIsQ0FBa0IsUUFBbEIsRUFBNEIsTUFBTSxDQUFOLENBQTVCLEVBQXNDLE1BQU0sQ0FBTixDQUF0QyxFQUFnRCxNQUFNLENBQU4sQ0FBaEQsRUFBMEQsTUFBTSxDQUFOLENBQTFEO0FBQ0E7QUFDSixxQkFBSyxLQUFMO0FBQ0kseUJBQUssRUFBTCxDQUFRLFVBQVIsQ0FBbUIsUUFBbkIsRUFBNkIsS0FBN0I7QUFDQTtBQUNKLHFCQUFLLEtBQUw7QUFDSSx5QkFBSyxFQUFMLENBQVEsVUFBUixDQUFtQixRQUFuQixFQUE2QixLQUE3QjtBQUNBO0FBQ0oscUJBQUssS0FBTDtBQUNJLHlCQUFLLEVBQUwsQ0FBUSxVQUFSLENBQW1CLFFBQW5CLEVBQTZCLEtBQTdCO0FBQ0E7QUFDSixxQkFBSyxLQUFMO0FBQ0kseUJBQUssRUFBTCxDQUFRLFVBQVIsQ0FBbUIsUUFBbkIsRUFBNkIsS0FBN0I7QUFDQTtBQUNKLHFCQUFLLEtBQUw7QUFDSSx5QkFBSyxFQUFMLENBQVEsVUFBUixDQUFtQixRQUFuQixFQUE2QixLQUE3QjtBQUNBO0FBQ0oscUJBQUssS0FBTDtBQUNJLHlCQUFLLEVBQUwsQ0FBUSxVQUFSLENBQW1CLFFBQW5CLEVBQTZCLEtBQTdCO0FBQ0E7QUFDSixxQkFBSyxXQUFMO0FBQ0kseUJBQUssRUFBTCxDQUFRLGdCQUFSLENBQXlCLFFBQXpCLEVBQW1DLEtBQW5DLEVBQTBDLEtBQTFDO0FBQ0E7QUFDSixxQkFBSyxXQUFMO0FBQ0kseUJBQUssRUFBTCxDQUFRLGdCQUFSLENBQXlCLFFBQXpCLEVBQW1DLEtBQW5DLEVBQTBDLEtBQTFDO0FBQ0E7QUF2Q1I7QUF5Q0g7O0FBRUQ7Ozs7MENBQ2tCO0FBQ2QsZ0JBQUksQ0FBQyxLQUFLLFFBQVYsRUFBb0I7QUFDaEI7QUFDSDs7QUFFRCxpQkFBSyxJQUFJLENBQVQsSUFBYyxLQUFLLFFBQW5CLEVBQTZCO0FBQ3pCLG9CQUFJLFVBQVUsS0FBSyxRQUFMLENBQWMsQ0FBZCxDQUFkO0FBQ0Esd0JBQVEsUUFBUixHQUFtQixLQUFLLEVBQUwsQ0FBUSxrQkFBUixDQUEyQixLQUFLLE9BQWhDLEVBQXlDLENBQXpDLENBQW5CO0FBQ0EscUJBQUssYUFBTCxDQUFtQixPQUFuQjtBQUNIO0FBQ0o7Ozs0Q0FFbUI7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBSyxPQUFMLEdBQWUsRUFBZjtBQUNIOztBQUVEOzs7O2tDQUNVLEksRUFBTTtBQUNaLGdCQUFJLENBQUMsS0FBSyxRQUFWLEVBQW9CO0FBQ2hCO0FBQ0g7O0FBRUQsZ0JBQUksU0FBVSxLQUFLLE9BQUwsQ0FBYSxJQUFiLElBQXFCLEtBQUssT0FBTCxDQUFhLElBQWIsS0FBc0IsRUFBekQ7QUFDQSxnQkFBSSxPQUFPLFFBQVAsSUFBbUIsSUFBdkIsRUFBNkI7QUFDekIsdUJBQU8sTUFBUDtBQUNIOztBQUVELG1CQUFPLElBQVAsR0FBYyxJQUFkO0FBQ0EsbUJBQU8sUUFBUCxHQUFrQixLQUFLLEVBQUwsQ0FBUSxpQkFBUixDQUEwQixLQUFLLE9BQS9CLEVBQXdDLElBQXhDLENBQWxCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBTyxNQUFQO0FBQ0g7O0FBRUQ7Ozs7K0JBQ08sSSxFQUFNO0FBQ1QsZ0JBQUksU0FBUyxRQUFiLEVBQXVCO0FBQ25CLHVCQUFPLEtBQUssc0JBQVo7QUFDSCxhQUZELE1BR0ssSUFBSSxTQUFTLFVBQWIsRUFBeUI7QUFDMUIsdUJBQU8sS0FBSyx3QkFBWjtBQUNIO0FBQ0o7O0FBRUQ7Ozs7OEJBQ00sSSxFQUFNO0FBQ1IsZ0JBQUksU0FBUyxLQUFLLE1BQUwsQ0FBWSxJQUFaLENBQWI7QUFDQSxnQkFBSSxNQUFKLEVBQVk7QUFDUix1QkFBTyxPQUFPLEtBQVAsQ0FBYSxJQUFiLENBQVA7QUFDSDtBQUNELG1CQUFPLEVBQVA7QUFDSDs7QUFFRDs7Ozs2QkFDSyxJLEVBQU0sRyxFQUFLO0FBQ1osZ0JBQUksU0FBUyxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWI7QUFDQSxnQkFBSSxNQUFKLEVBQVk7QUFDUix1QkFBTyxPQUFPLEdBQVAsQ0FBUDtBQUNIO0FBQ0o7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs4QkFDTSxJLEVBQU0sRyxFQUFLO0FBQ2IsZ0JBQUksUUFBUSxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQVo7QUFDQSxnQkFBSSxjQUFKO0FBQ0EsaUJBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLEdBQUosSUFBVyxJQUFJLE1BQU0sTUFBbkMsRUFBMkMsR0FBM0MsRUFBZ0Q7QUFDNUMsb0JBQUksT0FBTyxNQUFNLENBQU4sQ0FBWDtBQUNBLG9CQUFJLFFBQVEsS0FBSyxLQUFMLENBQVcscUVBQVgsQ0FBWjtBQUNBLG9CQUFJLFNBQVMsTUFBTSxNQUFOLEdBQWUsQ0FBNUIsRUFBK0I7QUFDM0I7QUFDQSw0QkFBUTtBQUNKLCtCQUFPLE1BQU0sQ0FBTixDQURIO0FBRUosOEJBQU0sTUFBTSxDQUFOLENBRkY7QUFHSiw2QkFBSyxNQUFNLENBQU47QUFIRCxxQkFBUjtBQUtILGlCQVBELE1BUUs7QUFDRCw0QkFBUSxLQUFLLEtBQUwsQ0FBVyxtRUFBWCxDQUFSO0FBQ0Esd0JBQUksU0FBUyxNQUFNLE1BQU4sR0FBZSxDQUE1QixFQUErQjtBQUMzQixnQ0FBUSxJQUFSLENBRDJCLENBQ2I7QUFDakI7QUFDSjs7QUFFRDtBQUNBLG9CQUFJLEtBQUosRUFBVztBQUNQO0FBQ0EsMEJBQU0sSUFBTixHQUFjLE1BQU0sSUFBTixJQUFjLElBQWYsR0FBdUIsQ0FBQyxDQUF4QixHQUE0QixNQUFNLElBQU4sR0FBYSxDQUF0RDtBQUNBLDBCQUFNLE1BQU4sR0FBZSxJQUFmO0FBQ0g7QUFDSjtBQUNELG1CQUFPLEtBQVA7QUFDSDs7QUFFRDtBQUNBOzs7OzBDQUNrQjtBQUFBOztBQUNkLGdCQUFJLE9BQU8sRUFBWDtBQUNBLGlCQUFLLFVBQUwsQ0FBZ0IsT0FBaEIsQ0FBd0IsZ0JBQVE7QUFDNUIsb0JBQUksTUFBTSwwQkFBYSxPQUFLLEVBQWxCLEVBQXNCLElBQXRCLENBQVY7QUFDQSxvQkFBSSw2QkFBMkIsSUFBL0I7O0FBRUEsdUJBQUssT0FBTCxDQUFhLEdBQWIsSUFBcUIsT0FBTyxJQUE1Qjs7QUFFQSxvQkFBSSxHQUFKLEVBQVM7QUFDTCx5QkFBSyxJQUFMLENBQVUsSUFBVjtBQUNILGlCQUZELE1BR0s7QUFDRCx1Q0FBSSxPQUFKLG9DQUE0QyxJQUE1QztBQUNIO0FBQ0osYUFaRDtBQWFBLG1CQUFPLElBQVA7QUFDSDs7Ozs7O0FBS0w7OztrQkEza0JxQixhO0FBNGtCckIsY0FBYyxFQUFkLEdBQW1CLENBQW5CLEMsQ0FBd0M7QUFDeEMsY0FBYyxPQUFkLEdBQXdCLElBQXhCLEMsQ0FBd0M7O0FBRXhDO0FBQ0EsY0FBYyxPQUFkLEdBQXdCLEVBQXhCO0FBQ0EsY0FBYyxNQUFkLEdBQXVCLEVBQXZCOztBQUVBO0FBQ0EsY0FBYyxLQUFkLEdBQXNCLFlBQVk7QUFDOUIsa0JBQWMsa0JBQWQsR0FBbUMsRUFBbkMsQ0FEOEIsQ0FDVTtBQUN4QyxrQkFBYyxpQkFBZCxHQUFrQyxFQUFsQyxDQUY4QixDQUVVO0FBQzNDLENBSEQ7QUFJQSxjQUFjLEtBQWQ7O0FBRUE7QUFDQSxjQUFjLGlCQUFkLEdBQWtDLFVBQVUsT0FBVixFQUFtQjtBQUNqRCxRQUFJLGFBQWEsRUFBakI7QUFDQSxTQUFLLElBQUksQ0FBVCxJQUFjLE9BQWQsRUFBdUI7QUFDbkIsWUFBSSxRQUFRLENBQVIsS0FBYyxJQUFkLElBQXNCLFFBQVEsQ0FBUixNQUFlLEtBQXpDLEVBQWdEO0FBQzVDO0FBQ0gsU0FGRCxNQUdLLElBQUksT0FBTyxRQUFRLENBQVIsQ0FBUCxLQUFzQixTQUF0QixJQUFtQyxRQUFRLENBQVIsTUFBZSxJQUF0RCxFQUE0RDtBQUFFO0FBQy9ELDBCQUFjLGFBQWEsQ0FBYixHQUFpQixJQUEvQjtBQUNILFNBRkksTUFHQSxJQUFJLE9BQU8sUUFBUSxDQUFSLENBQVAsS0FBc0IsUUFBdEIsSUFBa0MsS0FBSyxLQUFMLENBQVcsUUFBUSxDQUFSLENBQVgsTUFBMkIsUUFBUSxDQUFSLENBQWpFLEVBQTZFO0FBQUU7QUFDaEYsMEJBQWMsYUFBYSxDQUFiLEdBQWlCLEdBQWpCLEdBQXVCLFFBQVEsQ0FBUixFQUFXLE9BQVgsQ0FBbUIsQ0FBbkIsQ0FBdkIsR0FBK0MsSUFBN0Q7QUFDSCxTQUZJLE1BR0E7QUFBRTtBQUNILDBCQUFjLGFBQWEsQ0FBYixHQUFpQixHQUFqQixHQUF1QixRQUFRLENBQVIsQ0FBdkIsR0FBb0MsSUFBbEQ7QUFDSDtBQUNKO0FBQ0QsV0FBTyxVQUFQO0FBQ0gsQ0FqQkQ7O0FBbUJBO0FBQ0EsY0FBYyxvQkFBZCxHQUFxQyxVQUFVLFVBQVYsRUFBc0I7QUFDdkQsaUJBQWEsY0FBYyxFQUEzQjtBQUNBLFFBQUksTUFBTSxFQUFWO0FBQ0EsZUFBVyxPQUFYLENBQW1CLGVBQU87QUFDdEIsOEJBQW9CLEdBQXBCLHdCQUEwQyxHQUExQztBQUNILEtBRkQ7QUFHQSxXQUFPLEdBQVA7QUFDSCxDQVBEOztBQVNBLGNBQWMsUUFBZCxHQUF5QixVQUFVLEdBQVYsRUFBMEI7QUFBQTs7QUFDL0Msa0JBQWMsTUFBZCxDQUFxQixHQUFyQixJQUE0QixjQUFjLE1BQWQsQ0FBcUIsR0FBckIsS0FBNkIsRUFBekQ7O0FBRCtDLHNDQUFSLE1BQVE7QUFBUixjQUFRO0FBQUE7O0FBRS9DLDJDQUFjLE1BQWQsQ0FBcUIsR0FBckIsR0FBMEIsSUFBMUIsOEJBQWtDLE1BQWxDO0FBQ0gsQ0FIRDs7QUFLQTtBQUNBLGNBQWMsV0FBZCxHQUE0QixVQUFVLEdBQVYsRUFBZTtBQUN2QyxrQkFBYyxNQUFkLENBQXFCLEdBQXJCLElBQTRCLEVBQTVCO0FBQ0gsQ0FGRDs7QUFJQSxjQUFjLFlBQWQsR0FBNkIsVUFBVSxHQUFWLEVBQTBCO0FBQ25ELGtCQUFjLFdBQWQsQ0FBMEIsR0FBMUI7O0FBRG1ELHVDQUFSLE1BQVE7QUFBUixjQUFRO0FBQUE7O0FBRW5ELGtCQUFjLFFBQWQsdUJBQXVCLEdBQXZCLFNBQStCLE1BQS9CO0FBQ0gsQ0FIRDs7QUFLQTtBQUNBO0FBQ0EsY0FBYyxhQUFkLEdBQThCLFVBQVUsRUFBVixFQUFjLE9BQWQsRUFBdUIsb0JBQXZCLEVBQTZDLHNCQUE3QyxFQUFxRTtBQUMvRjtBQUNBLFFBQUksTUFBTSxHQUFHLFdBQUgsR0FBaUIsSUFBakIsR0FBd0Isb0JBQXhCLEdBQStDLElBQS9DLEdBQXNELHNCQUFoRTtBQUNBLFFBQUksY0FBYyxrQkFBZCxDQUFpQyxHQUFqQyxDQUFKLEVBQTJDO0FBQ3ZDLDJCQUFJLE9BQUosRUFBYSw0Q0FBYjtBQUNBLGVBQU8sY0FBYyxrQkFBZCxDQUFpQyxHQUFqQyxDQUFQO0FBQ0g7O0FBRUQsUUFBSTtBQUNBLFlBQUksZ0JBQWdCLGNBQWMsWUFBZCxDQUEyQixFQUEzQixFQUErQixvQkFBL0IsRUFBcUQsR0FBRyxhQUF4RCxDQUFwQjtBQUNBLFlBQUksa0JBQWtCLGNBQWMsWUFBZCxDQUEyQixFQUEzQixFQUErQixzQkFBL0IsRUFBdUQsR0FBRyxlQUExRCxDQUF0QjtBQUNILEtBSEQsQ0FJQSxPQUFNLEdBQU4sRUFBVztBQUNQLDJCQUFJLE9BQUosRUFBYSxJQUFJLE9BQWpCO0FBQ0EsY0FBTSxHQUFOO0FBQ0g7O0FBRUQsT0FBRyxVQUFILENBQWMsSUFBZDtBQUNBLFFBQUksV0FBVyxJQUFmLEVBQXFCO0FBQ2pCLFlBQUksY0FBYyxHQUFHLGtCQUFILENBQXNCLE9BQXRCLENBQWxCO0FBQ0EsYUFBSSxJQUFJLElBQUksQ0FBWixFQUFlLElBQUksWUFBWSxNQUEvQixFQUF1QyxHQUF2QyxFQUE0QztBQUN4QyxlQUFHLFlBQUgsQ0FBZ0IsT0FBaEIsRUFBeUIsWUFBWSxDQUFaLENBQXpCO0FBQ0g7QUFDSixLQUxELE1BS087QUFDSCxrQkFBVSxHQUFHLGFBQUgsRUFBVjtBQUNIOztBQUVELFFBQUksaUJBQWlCLElBQWpCLElBQXlCLG1CQUFtQixJQUFoRCxFQUFzRDtBQUNsRCxlQUFPLE9BQVA7QUFDSDs7QUFFRCxPQUFHLFlBQUgsQ0FBZ0IsT0FBaEIsRUFBeUIsYUFBekI7QUFDQSxPQUFHLFlBQUgsQ0FBZ0IsT0FBaEIsRUFBeUIsZUFBekI7O0FBRUEsT0FBRyxXQUFILENBQWUsT0FBZjs7QUFFQTs7QUFFQSxRQUFJLENBQUMsR0FBRyxtQkFBSCxDQUF1QixPQUF2QixFQUFnQyxHQUFHLFdBQW5DLENBQUwsRUFBc0Q7QUFDbEQsWUFBSSxVQUFVLElBQUksS0FBSix5REFFUyxHQUFHLG1CQUFILENBQXVCLE9BQXZCLEVBQWdDLEdBQUcsZUFBbkMsQ0FGVCw2QkFHRCxHQUFHLFFBQUgsRUFIQyx5REFLUixvQkFMUSwyREFPUixzQkFQUSxDQUFkOztBQVNBLFlBQUksUUFBUSxFQUFFLE1BQU0sU0FBUixFQUFtQixnQkFBbkIsRUFBWjtBQUNBLDJCQUFJLE9BQUosRUFBYSxNQUFNLE9BQW5CO0FBQ0EsY0FBTSxLQUFOO0FBQ0g7O0FBRUQsa0JBQWMsa0JBQWQsQ0FBaUMsR0FBakMsSUFBd0MsT0FBeEMsQ0FyRCtGLENBcUQ5QztBQUNqRCxXQUFPLE9BQVA7QUFDSCxDQXZERDs7QUF5REE7QUFDQSxjQUFjLFlBQWQsR0FBNkIsVUFBVSxFQUFWLEVBQWMsTUFBZCxFQUFzQixLQUF0QixFQUE2QjtBQUN0RDtBQUNBLFFBQUksTUFBTSxHQUFHLFdBQUgsR0FBaUIsSUFBakIsR0FBd0IsTUFBbEM7QUFDQSxRQUFJLGNBQWMsaUJBQWQsQ0FBZ0MsR0FBaEMsQ0FBSixFQUEwQztBQUN0QywyQkFBSSxPQUFKLEVBQWEsMkNBQWI7QUFDQSxlQUFPLGNBQWMsaUJBQWQsQ0FBZ0MsR0FBaEMsQ0FBUDtBQUNIOztBQUVELFFBQUksU0FBUyxHQUFHLFlBQUgsQ0FBZ0IsS0FBaEIsQ0FBYjs7QUFFQSxPQUFHLFlBQUgsQ0FBZ0IsTUFBaEIsRUFBd0IsTUFBeEI7QUFDQSxPQUFHLGFBQUgsQ0FBaUIsTUFBakI7O0FBRUEsUUFBSSxDQUFDLEdBQUcsa0JBQUgsQ0FBc0IsTUFBdEIsRUFBOEIsR0FBRyxjQUFqQyxDQUFMLEVBQXVEO0FBQ25ELFlBQUksT0FBUSxVQUFVLEdBQUcsYUFBYixHQUE2QixRQUE3QixHQUF3QyxVQUFwRDtBQUNBLFlBQUksVUFBVSxHQUFHLGdCQUFILENBQW9CLE1BQXBCLENBQWQ7QUFDQSxZQUFJLFNBQVMsOEJBQWtCLE9BQWxCLENBQWI7QUFDQSxjQUFNLEVBQUUsVUFBRixFQUFRLGdCQUFSLEVBQWlCLGNBQWpCLEVBQU47QUFDSDs7QUFFRCxrQkFBYyxpQkFBZCxDQUFnQyxHQUFoQyxJQUF1QyxNQUF2QyxDQXBCc0QsQ0FvQlA7QUFDL0MsV0FBTyxNQUFQO0FBQ0gsQ0F0QkQ7Ozs7Ozs7OztxakJDbHRCQTs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7O0FBRUE7SUFDcUIsTztBQUVqQixxQkFBWSxFQUFaLEVBQWdCLElBQWhCLEVBQW9DO0FBQUEsWUFBZCxPQUFjLHVFQUFKLEVBQUk7O0FBQUE7O0FBQ2hDLGFBQUssRUFBTCxHQUFVLEVBQVY7QUFDQSxhQUFLLE9BQUwsR0FBZSxHQUFHLGFBQUgsRUFBZjtBQUNBLFlBQUksS0FBSyxPQUFULEVBQWtCO0FBQ2QsaUJBQUssS0FBTCxHQUFhLElBQWI7QUFDSDtBQUNELGFBQUssSUFBTDs7QUFFQSxhQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsYUFBSyxZQUFMLEdBQW9CLENBQXBCO0FBQ0EsYUFBSyxNQUFMLEdBQWMsSUFBZDtBQUNBLGFBQUssV0FBTCxHQUFtQixJQUFuQjtBQUNBLGFBQUssV0FBTCxHQUFtQixJQUFuQjtBQUNBLGFBQUssT0FBTCxHQUFlLElBQWYsQ0FiZ0MsQ0FhUjtBQUN4QixhQUFLLE1BQUwsR0FBYyxLQUFkLENBZGdDLENBY1I7QUFDeEIsYUFBSyxTQUFMLEdBQWlCLFFBQVEsU0FBekI7QUFDQSxhQUFLLE9BQUwsR0FBZSxRQUFRLE9BQXZCO0FBQ0EsYUFBSyxTQUFMLEdBQWlCLEVBQWpCLENBakJnQyxDQWlCUjtBQUN4QixhQUFLLEtBQUwsR0FBYSxFQUFiLENBbEJnQyxDQWtCUjs7QUFFeEI7QUFDQTtBQUNBLGFBQUssT0FBTCxDQUFhLENBQWIsRUFBZ0IsQ0FBaEIsRUFBbUIsSUFBSSxVQUFKLENBQWUsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxHQUFWLENBQWYsQ0FBbkIsRUFBbUQsRUFBRSxXQUFXLFNBQWIsRUFBbkQ7O0FBRUE7QUFDQSxZQUFJLFFBQVEsUUFBUixDQUFpQixLQUFLLElBQXRCLENBQUosRUFBaUM7QUFDN0I7QUFDQSxpQkFBSyxZQUFMLEdBQW9CLFFBQVEsUUFBUixDQUFpQixLQUFLLElBQXRCLEVBQTRCLFlBQWhEO0FBQ0Esb0JBQVEsUUFBUixDQUFpQixLQUFLLElBQXRCLEVBQTRCLFlBQTVCLEdBQTJDLENBQTNDLENBSDZCLENBR2lCO0FBQzlDLG9CQUFRLFFBQVIsQ0FBaUIsS0FBSyxJQUF0QixFQUE0QixPQUE1QjtBQUNIOztBQUVEO0FBQ0EsZ0JBQVEsUUFBUixDQUFpQixLQUFLLElBQXRCLElBQThCLElBQTlCO0FBQ0EsZ0JBQVEsZUFBUixDQUF3QixLQUFLLElBQTdCLElBQXFDLE9BQU8sTUFBUCxDQUFjLEVBQUUsVUFBRixFQUFkLEVBQXdCLE9BQXhCLENBQXJDOztBQUVBLGFBQUssSUFBTCxDQUFVLE9BQVY7QUFDQSwyQkFBSSxPQUFKLHdCQUFpQyxLQUFLLElBQXRDO0FBQ0g7O0FBRUQ7Ozs7O2tDQUN3QjtBQUFBLDJGQUFKLEVBQUk7QUFBQSxnQkFBZCxLQUFjLFFBQWQsS0FBYzs7QUFDcEIsZ0JBQUksS0FBSyxZQUFMLEdBQW9CLENBQXBCLElBQXlCLENBQUMsS0FBOUIsRUFBcUM7QUFDakMsbUNBQUksT0FBSixpQkFBeUIsS0FBSyxJQUE5QixzREFBaUYsS0FBSyxZQUF0RjtBQUNBO0FBQ0g7O0FBRUQsZ0JBQUksQ0FBQyxLQUFLLEtBQVYsRUFBaUI7QUFDYjtBQUNIO0FBQ0QsaUJBQUssRUFBTCxDQUFRLGFBQVIsQ0FBc0IsS0FBSyxPQUEzQjtBQUNBLGlCQUFLLE9BQUwsR0FBZSxJQUFmO0FBQ0EsbUJBQU8sS0FBSyxJQUFaO0FBQ0EsaUJBQUssSUFBTCxHQUFZLElBQVo7QUFDQSxtQkFBTyxRQUFRLFFBQVIsQ0FBaUIsS0FBSyxJQUF0QixDQUFQO0FBQ0EsaUJBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSwrQkFBSSxPQUFKLDBCQUFtQyxLQUFLLElBQXhDO0FBQ0g7OztpQ0FFUztBQUNOLGlCQUFLLFlBQUw7QUFDSDs7O2tDQUVVO0FBQ1AsZ0JBQUksS0FBSyxZQUFMLElBQXFCLENBQXpCLEVBQTRCO0FBQ3hCLG1DQUFJLE9BQUosaUJBQXlCLEtBQUssSUFBOUIscURBQWdGLEtBQUssWUFBckY7QUFDSDs7QUFFRCxpQkFBSyxZQUFMO0FBQ0EsZ0JBQUksS0FBSyxZQUFMLElBQXFCLENBQXpCLEVBQTRCO0FBQ3hCLHFCQUFLLE9BQUw7QUFDSDtBQUNKOzs7K0JBRWM7QUFBQSxnQkFBVixJQUFVLHVFQUFILENBQUc7O0FBQ1gsZ0JBQUksQ0FBQyxLQUFLLEtBQVYsRUFBaUI7QUFDYjtBQUNIOztBQUVELGdCQUFJLFFBQVEsVUFBUixLQUF1QixJQUEzQixFQUFpQztBQUM3QixxQkFBSyxFQUFMLENBQVEsYUFBUixDQUFzQixLQUFLLEVBQUwsQ0FBUSxRQUFSLEdBQW1CLElBQXpDO0FBQ0Esd0JBQVEsVUFBUixHQUFxQixJQUFyQjtBQUNBLHdCQUFRLFlBQVIsR0FBdUIsSUFBdkIsQ0FINkIsQ0FHQTtBQUNoQzs7QUFFRCxnQkFBSSxRQUFRLFlBQVIsS0FBeUIsS0FBSyxPQUFsQyxFQUEyQztBQUN2QyxxQkFBSyxFQUFMLENBQVEsV0FBUixDQUFvQixLQUFLLEVBQUwsQ0FBUSxVQUE1QixFQUF3QyxLQUFLLE9BQTdDO0FBQ0Esd0JBQVEsWUFBUixHQUF1QixLQUFLLE9BQTVCO0FBQ0g7QUFDSjs7OzZCQUVJLE8sRUFBUztBQUFBOztBQUNWLGdCQUFJLENBQUMsT0FBTCxFQUFjO0FBQ1YsdUJBQU8sS0FBSyxPQUFMLElBQWdCLFFBQVEsT0FBUixDQUFnQixJQUFoQixDQUF2QjtBQUNIOztBQUVELGlCQUFLLE9BQUwsR0FBZSxJQUFmO0FBQ0EsZ0JBQUksT0FBTyxRQUFRLEdBQWYsS0FBdUIsUUFBM0IsRUFBcUM7QUFDakMscUJBQUssV0FBTCxHQUFtQixLQUFuQjtBQUNBLHFCQUFLLE1BQUwsQ0FBWSxRQUFRLEdBQXBCLEVBQXlCLE9BQXpCO0FBQ0gsYUFIRCxNQUdPLElBQUksUUFBUSxPQUFaLEVBQXFCO0FBQ3hCLHFCQUFLLFdBQUwsR0FBbUIsU0FBbkI7QUFDQSxxQkFBSyxVQUFMLENBQWdCLFFBQVEsT0FBeEIsRUFBaUMsT0FBakM7QUFDSCxhQUhNLE1BR0EsSUFBSSxRQUFRLElBQVIsSUFBZ0IsUUFBUSxLQUF4QixJQUFpQyxRQUFRLE1BQTdDLEVBQXFEO0FBQ3hELHFCQUFLLFdBQUwsR0FBbUIsTUFBbkI7QUFDQSxxQkFBSyxPQUFMLENBQWEsUUFBUSxLQUFyQixFQUE0QixRQUFRLE1BQXBDLEVBQTRDLFFBQVEsSUFBcEQsRUFBMEQsT0FBMUQ7QUFDSDs7QUFFRCxpQkFBSyxPQUFMLEdBQ0ssS0FBSyxPQUFMLElBQWdCLEtBQUssT0FBTCxDQUFhLElBQWIsQ0FBa0IsWUFBTTtBQUFFLHNCQUFLLGdCQUFMLEdBQXlCO0FBQWMsYUFBakUsQ0FBakIsSUFDQSxRQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsQ0FGSjtBQUdBLG1CQUFPLEtBQUssT0FBWjtBQUNIOztBQUVEOzs7OytCQUNPLEcsRUFBbUI7QUFBQTs7QUFBQSxnQkFBZCxPQUFjLHVFQUFKLEVBQUk7O0FBQ3RCLGdCQUFJLENBQUMsS0FBSyxLQUFWLEVBQWlCO0FBQ2I7QUFDSDs7QUFFRCxpQkFBSyxHQUFMLEdBQVcsR0FBWCxDQUxzQixDQUtOO0FBQ2hCLGlCQUFLLE1BQUwsR0FBYyxLQUFLLEdBQW5CO0FBQ0EsaUJBQUssV0FBTCxHQUFtQixLQUFuQjs7QUFFQSxpQkFBSyxPQUFMLEdBQWUsSUFBSSxPQUFKLENBQVksVUFBQyxPQUFELEVBQVUsTUFBVixFQUFxQjtBQUM1QyxvQkFBSSxRQUFRLElBQUksS0FBSixFQUFaO0FBQ0Esc0JBQU0sTUFBTixHQUFlLFlBQU07QUFDakIsd0JBQUk7QUFDQSwrQkFBSyxVQUFMLENBQWdCLEtBQWhCLEVBQXVCLE9BQXZCO0FBQ0gscUJBRkQsQ0FHQSxPQUFPLENBQVAsRUFBVTtBQUNOLCtCQUFLLE1BQUwsR0FBYyxLQUFkO0FBQ0EsMkNBQUksTUFBSixpQkFBd0IsT0FBSyxJQUE3QixrQ0FBNEQsT0FBSyxNQUFqRSxTQUE0RSxDQUE1RSxFQUErRSxPQUEvRTtBQUNBLGdDQUFRLE9BQVIsQ0FBZ0IsU0FBaEIsRUFBMkIsRUFBRSwwQ0FBd0MsT0FBSyxNQUEvQyxFQUF5RCxPQUFPLENBQWhFLEVBQW1FLFNBQVMsT0FBNUUsRUFBM0I7QUFDSDs7QUFFRCwyQkFBSyxNQUFMLEdBQWMsSUFBZDtBQUNBO0FBQ0gsaUJBWkQ7QUFhQSxzQkFBTSxPQUFOLEdBQWdCLGFBQUs7QUFDakI7QUFDQSwyQkFBSyxNQUFMLEdBQWMsS0FBZDtBQUNBLHVDQUFJLE1BQUosaUJBQXdCLE9BQUssSUFBN0Isa0NBQTRELE9BQUssTUFBakUsU0FBNEUsQ0FBNUUsRUFBK0UsT0FBL0U7QUFDQSw0QkFBUSxPQUFSLENBQWdCLFNBQWhCLEVBQTJCLEVBQUUsMENBQXdDLE9BQUssTUFBL0MsRUFBeUQsT0FBTyxDQUFoRSxFQUFtRSxTQUFTLE9BQTVFLEVBQTNCO0FBQ0E7QUFDSCxpQkFORDs7QUFRQTtBQUNBO0FBQ0Esb0JBQUksRUFBRSxnQkFBTSxRQUFOLE1BQW9CLE9BQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsQ0FBbEIsRUFBcUIsQ0FBckIsTUFBNEIsT0FBbEQsQ0FBSixFQUFnRTtBQUM1RCwwQkFBTSxXQUFOLEdBQW9CLFdBQXBCO0FBQ0g7O0FBRUQsc0JBQU0sR0FBTixHQUFZLE9BQUssTUFBakI7QUFDSCxhQTlCYyxDQUFmO0FBK0JBLG1CQUFPLEtBQUssT0FBWjtBQUNIOztBQUVEOzs7O2dDQUNRLEssRUFBTyxNLEVBQVEsSSxFQUFvQjtBQUFBLGdCQUFkLE9BQWMsdUVBQUosRUFBSTs7QUFDdkMsaUJBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSxpQkFBSyxNQUFMLEdBQWMsTUFBZDs7QUFFQSxpQkFBSyxNQUFMLEdBQWMsSUFBZDtBQUNBLGlCQUFLLFdBQUwsR0FBbUIsTUFBbkI7O0FBRUE7QUFDQSxnQkFBSSxNQUFNLE9BQU4sQ0FBYyxLQUFLLE1BQW5CLENBQUosRUFBZ0M7QUFDNUIscUJBQUssTUFBTCxHQUFjLElBQUksVUFBSixDQUFlLEtBQUssTUFBcEIsQ0FBZDtBQUNIOztBQUVELGlCQUFLLE1BQUwsQ0FBWSxPQUFaO0FBQ0EsaUJBQUssWUFBTCxDQUFrQixPQUFsQjs7QUFFQSxpQkFBSyxNQUFMLEdBQWMsSUFBZDtBQUNBLGlCQUFLLE9BQUwsR0FBZSxRQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsQ0FBZjtBQUNBLG1CQUFPLEtBQUssT0FBWjtBQUNIOztBQUVEOzs7O21DQUNXLE8sRUFBUyxPLEVBQVM7QUFDekIsZ0JBQUksS0FBSyxPQUFUOztBQUVBO0FBQ0EsZ0JBQUksT0FBTyxPQUFQLEtBQW1CLFFBQXZCLEVBQWlDO0FBQzdCLDBCQUFVLFNBQVMsYUFBVCxDQUF1QixPQUF2QixDQUFWO0FBQ0g7O0FBRUQsZ0JBQUksbUJBQW1CLGlCQUFuQixJQUNBLG1CQUFtQixnQkFEbkIsSUFFQSxtQkFBbUIsZ0JBRnZCLEVBRXlDO0FBQ3JDLHFCQUFLLE1BQUwsR0FBYyxPQUFkO0FBQ0EscUJBQUssV0FBTCxHQUFtQixTQUFuQjs7QUFFQSxxQkFBSyxNQUFMLENBQVksT0FBWjtBQUNBLHFCQUFLLFlBQUwsQ0FBa0IsT0FBbEI7QUFDSCxhQVJELE1BU0s7QUFDRCxxQkFBSyxNQUFMLEdBQWMsS0FBZDtBQUNBLG9CQUFJLGdEQUE2QyxLQUFLLFNBQUwsQ0FBZSxFQUFmLENBQTdDLHNCQUFKO0FBQ0E7QUFDQSxtQ0FBSSxNQUFKLGlCQUF3QixLQUFLLElBQTdCLFlBQXVDLEdBQXZDLEVBQThDLE9BQTlDO0FBQ0Esd0JBQVEsT0FBUixDQUFnQixTQUFoQixFQUEyQixFQUFFLDZDQUEyQyxHQUE3QyxFQUFvRCxTQUFTLE9BQTdELEVBQTNCO0FBQ0g7O0FBRUQsaUJBQUssTUFBTCxHQUFjLElBQWQ7QUFDQSxpQkFBSyxPQUFMLEdBQWUsUUFBUSxPQUFSLENBQWdCLElBQWhCLENBQWY7QUFDQSxtQkFBTyxLQUFLLE9BQVo7QUFDSDs7QUFFRDs7OztpQ0FDcUI7QUFBQSxnQkFBZCxPQUFjLHVFQUFKLEVBQUk7O0FBQ2pCLGdCQUFJLENBQUMsS0FBSyxLQUFWLEVBQWlCO0FBQ2I7QUFDSDs7QUFFRCxpQkFBSyxJQUFMO0FBQ0EsaUJBQUssRUFBTCxDQUFRLFdBQVIsQ0FBb0IsS0FBSyxFQUFMLENBQVEsbUJBQTVCLEVBQWtELFFBQVEsbUJBQVIsS0FBZ0MsS0FBaEMsR0FBd0MsS0FBeEMsR0FBZ0QsSUFBbEc7QUFDQSxpQkFBSyxFQUFMLENBQVEsV0FBUixDQUFvQixLQUFLLEVBQUwsQ0FBUSw4QkFBNUIsRUFBNEQsUUFBUSw4QkFBUixJQUEwQyxLQUF0Rzs7QUFFQTtBQUNBLGdCQUFJLEtBQUssTUFBTCxZQUF1QixpQkFBdkIsSUFBNEMsS0FBSyxNQUFMLFlBQXVCLGdCQUFuRSxJQUNDLEtBQUssTUFBTCxZQUF1QixnQkFBdkIsSUFBMkMsS0FBSyxNQUFMLENBQVksUUFENUQsRUFDdUU7O0FBRW5FLHFCQUFLLEtBQUwsR0FBYSxLQUFLLE1BQUwsQ0FBWSxLQUF6QjtBQUNBLHFCQUFLLE1BQUwsR0FBYyxLQUFLLE1BQUwsQ0FBWSxNQUExQjtBQUNBLHFCQUFLLEVBQUwsQ0FBUSxVQUFSLENBQW1CLEtBQUssRUFBTCxDQUFRLFVBQTNCLEVBQXVDLENBQXZDLEVBQTBDLEtBQUssRUFBTCxDQUFRLElBQWxELEVBQXdELEtBQUssRUFBTCxDQUFRLElBQWhFLEVBQXNFLEtBQUssRUFBTCxDQUFRLGFBQTlFLEVBQTZGLEtBQUssTUFBbEc7QUFDSDtBQUNEO0FBUEEsaUJBUUssSUFBSSxLQUFLLFdBQUwsS0FBcUIsTUFBekIsRUFBaUM7QUFDbEMseUJBQUssRUFBTCxDQUFRLFVBQVIsQ0FBbUIsS0FBSyxFQUFMLENBQVEsVUFBM0IsRUFBdUMsQ0FBdkMsRUFBMEMsS0FBSyxFQUFMLENBQVEsSUFBbEQsRUFBd0QsS0FBSyxLQUE3RCxFQUFvRSxLQUFLLE1BQXpFLEVBQWlGLENBQWpGLEVBQW9GLEtBQUssRUFBTCxDQUFRLElBQTVGLEVBQWtHLEtBQUssRUFBTCxDQUFRLGFBQTFHLEVBQXlILEtBQUssTUFBOUg7QUFDSDs7QUFFRCxvQkFBUSxPQUFSLENBQWdCLFFBQWhCLEVBQTBCLElBQTFCO0FBQ0g7O0FBRUQ7Ozs7dUNBQzJCO0FBQUEsZ0JBQWQsT0FBYyx1RUFBSixFQUFJOztBQUN2QixnQkFBSSxDQUFDLEtBQUssS0FBVixFQUFpQjtBQUNiO0FBQ0g7O0FBRUQsb0JBQVEsU0FBUixHQUFvQixRQUFRLFNBQVIsSUFBcUIsUUFBekM7O0FBRUEsZ0JBQUksS0FBSyxLQUFLLEVBQWQ7QUFDQSxpQkFBSyxJQUFMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQUksZ0JBQU0sVUFBTixDQUFpQixLQUFLLEtBQXRCLEtBQWdDLGdCQUFNLFVBQU4sQ0FBaUIsS0FBSyxNQUF0QixDQUFwQyxFQUFtRTtBQUMvRCxxQkFBSyxVQUFMLEdBQWtCLElBQWxCO0FBQ0EsbUJBQUcsYUFBSCxDQUFpQixHQUFHLFVBQXBCLEVBQWdDLEdBQUcsY0FBbkMsRUFBbUQsUUFBUSxjQUFSLElBQTJCLFFBQVEsTUFBUixJQUFrQixHQUFHLE1BQWhELElBQTJELEdBQUcsYUFBakg7QUFDQSxtQkFBRyxhQUFILENBQWlCLEdBQUcsVUFBcEIsRUFBZ0MsR0FBRyxjQUFuQyxFQUFtRCxRQUFRLGNBQVIsSUFBMkIsUUFBUSxNQUFSLElBQWtCLEdBQUcsTUFBaEQsSUFBMkQsR0FBRyxhQUFqSDs7QUFFQSxvQkFBSSxRQUFRLFNBQVIsS0FBc0IsUUFBMUIsRUFBb0M7QUFDaEMseUJBQUssU0FBTCxHQUFpQixRQUFqQjtBQUNBLHVCQUFHLGFBQUgsQ0FBaUIsR0FBRyxVQUFwQixFQUFnQyxHQUFHLGtCQUFuQyxFQUF1RCxHQUFHLG9CQUExRCxFQUZnQyxDQUVpRDtBQUNqRix1QkFBRyxhQUFILENBQWlCLEdBQUcsVUFBcEIsRUFBZ0MsR0FBRyxrQkFBbkMsRUFBdUQsR0FBRyxNQUExRDtBQUNBLHVCQUFHLGNBQUgsQ0FBa0IsR0FBRyxVQUFyQjtBQUNILGlCQUxELE1BTUssSUFBSSxRQUFRLFNBQVIsS0FBc0IsUUFBMUIsRUFBb0M7QUFDckMseUJBQUssU0FBTCxHQUFpQixRQUFqQjtBQUNBLHVCQUFHLGFBQUgsQ0FBaUIsR0FBRyxVQUFwQixFQUFnQyxHQUFHLGtCQUFuQyxFQUF1RCxHQUFHLE1BQTFEO0FBQ0EsdUJBQUcsYUFBSCxDQUFpQixHQUFHLFVBQXBCLEVBQWdDLEdBQUcsa0JBQW5DLEVBQXVELEdBQUcsTUFBMUQ7QUFDSCxpQkFKSSxNQUtBLElBQUksUUFBUSxTQUFSLEtBQXNCLFNBQTFCLEVBQXFDO0FBQ3RDLHlCQUFLLFNBQUwsR0FBaUIsU0FBakI7QUFDQSx1QkFBRyxhQUFILENBQWlCLEdBQUcsVUFBcEIsRUFBZ0MsR0FBRyxrQkFBbkMsRUFBdUQsR0FBRyxPQUExRDtBQUNBLHVCQUFHLGFBQUgsQ0FBaUIsR0FBRyxVQUFwQixFQUFnQyxHQUFHLGtCQUFuQyxFQUF1RCxHQUFHLE9BQTFEO0FBQ0g7QUFDSixhQXJCRCxNQXNCSztBQUNEO0FBQ0E7QUFDQSxxQkFBSyxVQUFMLEdBQWtCLEtBQWxCO0FBQ0EsbUJBQUcsYUFBSCxDQUFpQixHQUFHLFVBQXBCLEVBQWdDLEdBQUcsY0FBbkMsRUFBbUQsR0FBRyxhQUF0RDtBQUNBLG1CQUFHLGFBQUgsQ0FBaUIsR0FBRyxVQUFwQixFQUFnQyxHQUFHLGNBQW5DLEVBQW1ELEdBQUcsYUFBdEQ7O0FBRUEsb0JBQUksUUFBUSxTQUFSLEtBQXNCLFNBQTFCLEVBQXFDO0FBQ2pDLHlCQUFLLFNBQUwsR0FBaUIsU0FBakI7QUFDQSx1QkFBRyxhQUFILENBQWlCLEdBQUcsVUFBcEIsRUFBZ0MsR0FBRyxrQkFBbkMsRUFBdUQsR0FBRyxPQUExRDtBQUNBLHVCQUFHLGFBQUgsQ0FBaUIsR0FBRyxVQUFwQixFQUFnQyxHQUFHLGtCQUFuQyxFQUF1RCxHQUFHLE9BQTFEO0FBQ0gsaUJBSkQsTUFLSztBQUFFO0FBQ0gseUJBQUssU0FBTCxHQUFpQixRQUFqQjtBQUNBLHVCQUFHLGFBQUgsQ0FBaUIsR0FBRyxVQUFwQixFQUFnQyxHQUFHLGtCQUFuQyxFQUF1RCxHQUFHLE1BQTFEO0FBQ0EsdUJBQUcsYUFBSCxDQUFpQixHQUFHLFVBQXBCLEVBQWdDLEdBQUcsa0JBQW5DLEVBQXVELEdBQUcsTUFBMUQ7QUFDSDtBQUNKOztBQUVELG9CQUFRLE9BQVIsQ0FBZ0IsUUFBaEIsRUFBMEIsSUFBMUI7QUFDSDs7QUFFRDs7OzsyQ0FDbUI7QUFDZixnQkFBSSxLQUFLLE9BQVQsRUFBa0I7QUFDZCxxQkFBSyxJQUFJLENBQVQsSUFBYyxLQUFLLE9BQW5CLEVBQTRCO0FBQ3hCLHdCQUFJLFNBQVMsS0FBSyxPQUFMLENBQWEsQ0FBYixDQUFiOztBQUVBO0FBQ0EseUJBQUssU0FBTCxDQUFlLENBQWYsSUFBb0IsUUFBUSxxQkFBUixDQUNoQixDQUFDLE9BQU8sQ0FBUCxDQUFELEVBQVksT0FBTyxDQUFQLENBQVosQ0FEZ0IsRUFFaEIsQ0FBQyxPQUFPLENBQVAsQ0FBRCxFQUFZLE9BQU8sQ0FBUCxDQUFaLENBRmdCLEVBR2hCLENBQUMsS0FBSyxLQUFOLEVBQWEsS0FBSyxNQUFsQixDQUhnQixDQUFwQjs7QUFNQTtBQUNBLHlCQUFLLEtBQUwsQ0FBVyxDQUFYLElBQWdCLENBQUMsT0FBTyxDQUFQLENBQUQsRUFBWSxPQUFPLENBQVAsQ0FBWixDQUFoQjtBQUNIO0FBQ0o7QUFDSjs7Ozs7O0FBS0w7O2tCQS9UcUIsTztBQWlVckIsUUFBUSxNQUFSLEdBQWlCLFVBQVUsRUFBVixFQUFjLElBQWQsRUFBb0IsT0FBcEIsRUFBNkI7QUFDMUMsV0FBTyxJQUFJLE9BQUosQ0FBWSxFQUFaLEVBQWdCLElBQWhCLEVBQXNCLE9BQXRCLENBQVA7QUFDSCxDQUZEOztBQUlBLFFBQVEsTUFBUixHQUFpQixVQUFVLElBQVYsRUFBZ0I7QUFDN0IsUUFBSSxRQUFRLFFBQVIsQ0FBaUIsSUFBakIsQ0FBSixFQUE0QjtBQUN4QixnQkFBUSxRQUFSLENBQWlCLElBQWpCLEVBQXVCLE1BQXZCO0FBQ0g7QUFDSixDQUpEOztBQU1BLFFBQVEsT0FBUixHQUFrQixVQUFVLElBQVYsRUFBZ0I7QUFDOUIsUUFBSSxRQUFRLFFBQVIsQ0FBaUIsSUFBakIsQ0FBSixFQUE0QjtBQUN4QixnQkFBUSxRQUFSLENBQWlCLElBQWpCLEVBQXVCLE9BQXZCO0FBQ0g7QUFDSixDQUpEOztBQU1BO0FBQ0EsUUFBUSxPQUFSLEdBQWtCLFVBQVUsRUFBVixFQUFjO0FBQzVCLFFBQUksV0FBVyxPQUFPLElBQVAsQ0FBWSxRQUFRLFFBQXBCLENBQWY7QUFDQSxhQUFTLE9BQVQsQ0FBaUIsYUFBSztBQUNsQixZQUFJLFVBQVUsUUFBUSxRQUFSLENBQWlCLENBQWpCLENBQWQ7QUFDQSxZQUFJLFFBQVEsRUFBUixLQUFlLEVBQW5CLEVBQXVCO0FBQ25CLG9CQUFRLE9BQVIsQ0FBZ0IsRUFBRSxPQUFPLElBQVQsRUFBaEI7QUFDSDtBQUNKLEtBTEQ7QUFNSCxDQVJEOztBQVVBO0FBQ0EsUUFBUSxhQUFSLEdBQXdCLFVBQVUsT0FBVixFQUFtQixNQUFuQixFQUEyQjtBQUMvQyxRQUFJLFVBQVUsUUFBUSxRQUFSLENBQWlCLE9BQWpCLENBQWQ7QUFDQSxXQUFPLFdBQVcsRUFBRSxNQUFNLFFBQVEsS0FBUixDQUFjLE1BQWQsQ0FBUixFQUErQixXQUFXLFFBQVEsU0FBUixDQUFrQixNQUFsQixDQUExQyxFQUFsQjtBQUNILENBSEQ7O0FBS0E7QUFDQSxRQUFRLHFCQUFSLEdBQWdDLFVBQVUsV0FBVixFQUF1QixTQUF2QixFQUFrQyxRQUFsQyxFQUE0QztBQUN4RSxRQUFJLGdCQUFnQixTQUFTLENBQVQsSUFBYyxZQUFZLENBQVosQ0FBZCxHQUErQixVQUFVLENBQVYsQ0FBbkQ7O0FBRUEsV0FBTyxDQUNILFlBQVksQ0FBWixJQUFpQixTQUFTLENBQVQsQ0FEZCxFQUVILGdCQUFnQixTQUFTLENBQVQsQ0FGYixFQUdILENBQUMsVUFBVSxDQUFWLElBQWUsWUFBWSxDQUFaLENBQWhCLElBQWtDLFNBQVMsQ0FBVCxDQUgvQixFQUlILENBQUMsVUFBVSxDQUFWLElBQWUsYUFBaEIsSUFBaUMsU0FBUyxDQUFULENBSjlCLENBQVA7QUFNSCxDQVREOztBQVdBO0FBQ0E7QUFDQSxRQUFRLGdCQUFSLEdBQTJCLFVBQVUsRUFBVixFQUFjLFFBQWQsRUFBd0I7QUFDL0MsUUFBSSxVQUFVLEVBQWQ7QUFDQSxRQUFJLFFBQUosRUFBYztBQUNWLGFBQUssSUFBSSxPQUFULElBQW9CLFFBQXBCLEVBQThCO0FBQzFCLGdCQUFJLFNBQVMsU0FBUyxPQUFULENBQWI7O0FBRUE7QUFDQTtBQUNBLGdCQUFJLENBQUMsUUFBUSxPQUFSLENBQWdCLE9BQWhCLEVBQXlCLE1BQXpCLENBQUwsRUFBdUM7QUFDbkM7QUFDSDs7QUFFRCxnQkFBSSxVQUFVLFFBQVEsTUFBUixDQUFlLEVBQWYsRUFBbUIsT0FBbkIsRUFBNEIsTUFBNUIsQ0FBZDtBQUNBLG9CQUFRLElBQVIsQ0FBYSxRQUFRLE9BQXJCO0FBQ0g7QUFDSjtBQUNELFdBQU8sUUFBUSxHQUFSLENBQVksT0FBWixDQUFQO0FBQ0gsQ0FqQkQ7O0FBbUJBO0FBQ0E7QUFDQSxRQUFRLE9BQVIsR0FBa0IsV0FBbEI7QUFDQSxRQUFRLGFBQVIsR0FBd0IsVUFBVSxFQUFWLEVBQWM7QUFDbEMsV0FBTyxRQUFRLE1BQVIsQ0FBZSxFQUFmLEVBQW1CLFFBQVEsT0FBM0IsQ0FBUDtBQUNILENBRkQ7O0FBSUE7QUFDQSxRQUFRLE9BQVIsR0FBa0IsVUFBVSxJQUFWLEVBQWdCLE1BQWhCLEVBQXdCO0FBQ3RDLFFBQUksVUFBVSxRQUFRLFFBQVIsQ0FBaUIsSUFBakIsQ0FBZDtBQUNBLFFBQUksT0FBSixFQUFhO0FBQUU7QUFDWDtBQUNBLFlBQUksUUFBUSxXQUFSLEtBQXdCLFNBQXhCLElBQXFDLE9BQU8sT0FBUCxJQUFrQixJQUEzRCxFQUFpRTtBQUM3RCxtQkFBTyxJQUFQO0FBQ0g7O0FBRUQ7QUFDQSxZQUFJLEtBQUssU0FBTCxDQUFlLFFBQVEsZUFBUixDQUF3QixJQUF4QixDQUFmLE1BQ0EsS0FBSyxTQUFMLENBQWUsT0FBTyxNQUFQLENBQWMsRUFBRSxVQUFGLEVBQWQsRUFBd0IsTUFBeEIsQ0FBZixDQURKLEVBQ3FEO0FBQ2pELG1CQUFPLEtBQVA7QUFDSDtBQUNKO0FBQ0QsV0FBTyxJQUFQO0FBQ0gsQ0FmRDs7QUFpQkE7QUFDQTtBQUNBO0FBQ0EsUUFBUSxPQUFSLEdBQWtCLFVBQVUsSUFBVixFQUFnQjtBQUM5QjtBQUNBLFFBQUksQ0FBQyxJQUFMLEVBQVc7QUFDUCxlQUFPLE9BQU8sSUFBUCxDQUFZLFFBQVEsUUFBcEIsQ0FBUDtBQUNIOztBQUVEO0FBQ0EsUUFBSSxNQUFNLE9BQU4sQ0FBYyxJQUFkLENBQUosRUFBeUI7QUFDckIsZUFBTyxRQUFRLEdBQVIsQ0FBWSxLQUFLLEdBQUwsQ0FBUztBQUFBLG1CQUFLLFFBQVEsT0FBUixDQUFnQixDQUFoQixDQUFMO0FBQUEsU0FBVCxDQUFaLENBQVA7QUFDSDs7QUFFRDtBQUNBLFFBQUksTUFBTSxRQUFRLFFBQVIsQ0FBaUIsSUFBakIsQ0FBVjtBQUNBLFFBQUksR0FBSixFQUFTO0FBQ0w7QUFDQSxZQUFJLFVBQVUsSUFBSSxPQUFKLElBQWUsUUFBUSxPQUFSLENBQWdCLEdBQWhCLENBQTdCO0FBQ0EsZUFBTyxRQUFRLElBQVIsQ0FBYSxZQUFNO0FBQ3RCO0FBQ0E7QUFDQSxtQkFBTztBQUNILHNCQUFNLElBQUksSUFEUDtBQUVILHVCQUFPLElBQUksS0FGUjtBQUdILHdCQUFRLElBQUksTUFIVDtBQUlILHlCQUFTLElBQUksT0FKVjtBQUtILDJCQUFXLElBQUksU0FMWjtBQU1ILHVCQUFPLElBQUksS0FOUjtBQU9ILDJCQUFXLElBQUksU0FQWjtBQVFILDRCQUFZLElBQUksVUFSYjtBQVNILHVCQUFPLElBQUk7QUFUUixhQUFQO0FBV0gsU0FkTSxDQUFQO0FBZUgsS0FsQkQsTUFtQks7QUFDRDtBQUNBLGVBQU8sUUFBUSxPQUFSLENBQWdCLElBQWhCLENBQVA7QUFDSDtBQUNKLENBcENEOztBQXNDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLG9CQUFSLEdBQStCLFVBQVUsS0FBVixFQUFpQjtBQUM1QyxXQUFPLHdCQUFhLFdBQWIsQ0FBeUIsaUJBQXpCLEVBQTRDLEtBQTVDLEVBQ0gsSUFERyxDQUNFLG9CQUFZO0FBQ2IsaUJBQVMsT0FBVCxDQUFpQixlQUFPO0FBQ3BCLG9CQUFRLFFBQVIsQ0FBaUIsSUFBSSxJQUFyQixJQUE2QixHQUE3QjtBQUNILFNBRkQ7QUFHQSxlQUFPLFFBQVEsUUFBZjtBQUNILEtBTkUsQ0FBUDtBQU9ILENBUkQ7O0FBVUE7QUFDQSxRQUFRLGlCQUFSLEdBQTRCLFVBQVUsRUFBVixFQUFjO0FBQ3RDLFdBQU8sR0FBRyxZQUFILENBQWdCLEdBQUcsZ0JBQW5CLENBQVA7QUFDSCxDQUZEOztBQUlBO0FBQ0EsUUFBUSxRQUFSLEdBQW1CLEVBQW5CO0FBQ0EsUUFBUSxlQUFSLEdBQTBCLEVBQTFCO0FBQ0EsUUFBUSxZQUFSLEdBQXVCLElBQXZCO0FBQ0EsUUFBUSxVQUFSLEdBQXFCLElBQXJCOztBQUVBLHdCQUFhLFNBQWIsQ0FBdUIsU0FBdkIsRUFBa0MsT0FBbEM7QUFDQSx5QkFBZSxPQUFmOzs7Ozs7Ozs7QUNuZUE7Ozs7QUFDQTs7Ozs7O0FBSEE7O2tCQUtlOztBQUVYLGNBQVUsS0FGQyxFQUVNO0FBQ2pCLGVBQVcsRUFIQSxFQUdNOztBQUVqQixRQUxXLGdCQUtMLEVBTEssRUFLRDtBQUNOLFlBQUksWUFBSjtBQUNBLFlBQUksS0FBSyxRQUFMLEtBQWtCLElBQXRCLEVBQTRCO0FBQ3hCLGtCQUFNLDBCQUFhLEVBQWIsRUFBaUIseUJBQWpCLENBQU47QUFDSDs7QUFFRCxZQUFJLE9BQU8sSUFBWCxFQUFpQjtBQUNiLCtCQUFJLE1BQUosRUFBWSx5Q0FBWjtBQUNILFNBRkQsTUFHSyxJQUFJLEtBQUssUUFBTCxLQUFrQixJQUF0QixFQUE0QjtBQUM3QiwrQkFBSSxNQUFKLEVBQVksNkNBQVo7QUFDSCxTQUZJLE1BR0E7QUFDRCwrQkFBSSxNQUFKLEVBQVksOENBQVo7QUFDSDtBQUNKLEtBcEJVO0FBc0JYLFVBdEJXLGtCQXNCSCxFQXRCRyxFQXNCQyxLQXRCRCxFQXNCUSxRQXRCUixFQXNCa0I7QUFDekIsWUFBSSxNQUFNLEVBQVY7QUFDQSxZQUFJLEtBQUosR0FBWSxLQUFaO0FBQ0EsWUFBSSxRQUFKLEdBQWUsUUFBZjs7QUFFQSxZQUFJLE1BQU0sMEJBQWEsRUFBYixFQUFpQix5QkFBakIsQ0FBVjtBQUNBLFlBQUksT0FBTyxJQUFYLEVBQWlCO0FBQ2IsZ0JBQUksSUFBSixHQUFXLElBQUksb0JBQUosRUFBWDtBQUNBLGdCQUFJLGtCQUFKLENBQXVCLElBQUksSUFBM0I7QUFDSDs7QUFFRCxZQUFJLEtBQUosQ0FBVSxJQUFWOztBQUVBLGVBQU8sR0FBUDtBQUNILEtBcENVO0FBc0NYLHFCQXRDVyw2QkFzQ1EsRUF0Q1IsRUFzQ1k7QUFDbkIsWUFBSSxRQUFRLEtBQUssU0FBTCxDQUFlLE1BQWYsQ0FBc0I7QUFBQSxtQkFBSyxFQUFFLENBQUYsTUFBUyxFQUFkO0FBQUEsU0FBdEIsRUFBd0MsQ0FBeEMsQ0FBWjtBQUNBLGVBQU8sU0FBUyxNQUFNLENBQU4sQ0FBaEI7QUFDSCxLQXpDVTtBQTJDWCxxQkEzQ1csNkJBMkNRLEVBM0NSLEVBMkNZLEdBM0NaLEVBMkNpQjtBQUN4QixZQUFJLFlBQVksS0FBSyxTQUFyQjtBQUNBLFlBQUksVUFBVSxVQUFVLE1BQVYsQ0FBaUI7QUFBQSxtQkFBSyxFQUFFLENBQUYsTUFBUyxFQUFkO0FBQUEsU0FBakIsRUFBbUMsQ0FBbkMsQ0FBZDtBQUNBLFlBQUksV0FBVyxJQUFmLEVBQXFCO0FBQ2pCLHNCQUFVLElBQVYsQ0FBZSxDQUFDLEVBQUQsRUFBSyxHQUFMLENBQWY7QUFDSCxTQUZELE1BR0s7QUFDRCxvQkFBUSxDQUFSLElBQWEsR0FBYjtBQUNIO0FBQ0osS0FwRFU7QUFzRFgsUUF0RFcsZ0JBc0RMLEVBdERLLEVBc0RELEdBdERDLEVBc0RJO0FBQ1gsWUFBSSxNQUFNLDBCQUFhLEVBQWIsRUFBaUIseUJBQWpCLENBQVY7QUFDQSxZQUFJLE9BQU8sSUFBWCxFQUFpQjtBQUNiLGdCQUFJLE9BQU8sSUFBUCxJQUFlLElBQUksSUFBSixJQUFZLElBQS9CLEVBQXFDO0FBQ2pDLG9CQUFJLGtCQUFKLENBQXVCLElBQUksSUFBM0I7QUFDQSxxQkFBSyxpQkFBTCxDQUF1QixFQUF2QixFQUEyQixHQUEzQjtBQUNILGFBSEQsTUFJSztBQUNELG9CQUFJLEtBQUosQ0FBVSxLQUFWO0FBQ0g7QUFDSixTQVJELE1BU0s7QUFDRCxnQkFBSSxZQUFZLEtBQUssaUJBQUwsQ0FBdUIsRUFBdkIsQ0FBaEI7QUFDQSxnQkFBSSxPQUFPLElBQVgsRUFBaUI7QUFDYixvQkFBSSxrQkFBSixDQUF1QixJQUF2QjtBQUNILGFBRkQsTUFHSyxJQUFJLGFBQWEsSUFBYixJQUFxQixPQUFPLFVBQVUsUUFBakIsS0FBOEIsVUFBdkQsRUFBbUU7QUFDcEUsMEJBQVUsUUFBVjtBQUNIO0FBQ0QsaUJBQUssaUJBQUwsQ0FBdUIsRUFBdkIsRUFBMkIsSUFBM0I7QUFDSDtBQUNKLEtBM0VVO0FBNkVYLFdBN0VXLG1CQTZFRixFQTdFRSxFQTZFRSxHQTdFRixFQTZFTztBQUNkLFlBQUksTUFBTSwwQkFBYSxFQUFiLEVBQWlCLHlCQUFqQixDQUFWO0FBQ0EsWUFBSSxPQUFPLElBQVAsSUFBZSxPQUFPLElBQXRCLElBQThCLElBQUksSUFBSixJQUFZLElBQTlDLEVBQW9EO0FBQ2hELGdCQUFJLG9CQUFKLENBQXlCLElBQUksSUFBN0I7QUFDQSxnQkFBSSxJQUFKLEdBQVcsSUFBWDtBQUNIO0FBQ0Q7QUFDSDtBQXBGVSxDOzs7Ozs7Ozs7cWpCQ0xmOzs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7O0FBRUE7SUFDcUIsTztBQUVqQixxQkFBWSxFQUFaLEVBQWdCLFdBQWhCLEVBQTZCLFlBQTdCLEVBQTJDLGFBQTNDLEVBQTBELE9BQTFELEVBQW1FO0FBQUE7O0FBQy9ELGtCQUFVLFdBQVcsRUFBckI7O0FBRUEsYUFBSyxFQUFMLEdBQVUsRUFBVjtBQUNBLGFBQUssV0FBTCxHQUFtQixXQUFuQixDQUorRCxDQUkvQjtBQUNoQyxhQUFLLFlBQUwsR0FBb0IsWUFBcEIsQ0FMK0QsQ0FLN0I7QUFDbEMsYUFBSyxhQUFMLEdBQXFCLGFBQXJCO0FBQ0EsYUFBSyxhQUFMLEdBQXFCLEtBQUssRUFBTCxDQUFRLFlBQVIsRUFBckI7QUFDQSxhQUFLLFNBQUwsR0FBaUIsUUFBUSxTQUFSLElBQXFCLEtBQUssRUFBTCxDQUFRLFNBQTlDO0FBQ0EsYUFBSyxVQUFMLEdBQWtCLFFBQVEsVUFBUixJQUFzQixLQUFLLEVBQUwsQ0FBUSxXQUFoRDtBQUNBLGFBQUsscUJBQUwsR0FBNkIsQ0FBN0IsQ0FWK0QsQ0FVL0I7QUFDaEMsYUFBSyxRQUFMLEdBQWdCLFFBQVEsUUFBeEI7QUFDQSxhQUFLLE1BQUwsR0FBYyxRQUFRLE1BQVIsSUFBa0IsS0FBaEMsQ0FaK0QsQ0FZeEI7QUFDdkMsYUFBSyxVQUFMLEdBQWtCLENBQUMsSUFBSSxJQUFKLEVBQW5CO0FBQ0EsYUFBSyxZQUFMLEdBQW9CLFFBQVEsWUFBUixJQUF3QixDQUE1QyxDQWQrRCxDQWNoQjs7QUFFL0MsYUFBSyxZQUFMLEdBQW9CLEtBQUssV0FBTCxDQUFpQixVQUFqQixHQUE4QixLQUFLLGFBQUwsQ0FBbUIsTUFBckU7QUFDQSxhQUFLLElBQUwsR0FBWSxFQUFaLENBakIrRCxDQWlCL0M7O0FBRWhCLGFBQUssb0JBQUwsR0FBNEIsS0FBNUI7QUFDQSxZQUFJLEtBQUssWUFBVCxFQUFzQjtBQUNsQixpQkFBSyxvQkFBTCxHQUE0QixJQUE1QjtBQUNBLGlCQUFLLGFBQUwsR0FBcUIsS0FBSyxZQUFMLENBQWtCLE1BQXZDO0FBQ0EsaUJBQUssY0FBTCxHQUFzQixLQUFLLGFBQUwsR0FBcUIsS0FBSyxxQkFBaEQ7QUFDQSxpQkFBSyxZQUFMLEdBQXFCLEtBQUssWUFBTCxDQUFrQixXQUFsQixLQUFrQyxXQUFuQyxHQUFrRCxLQUFLLEVBQUwsQ0FBUSxjQUExRCxHQUEwRSxLQUFLLEVBQUwsQ0FBUSxZQUF0RztBQUNBLGlCQUFLLGNBQUwsR0FBc0IsS0FBSyxFQUFMLENBQVEsWUFBUixFQUF0QjtBQUNBLGlCQUFLLEVBQUwsQ0FBUSxVQUFSLENBQW1CLEtBQUssRUFBTCxDQUFRLG9CQUEzQixFQUFpRCxLQUFLLGNBQXREO0FBQ0EsaUJBQUssRUFBTCxDQUFRLFVBQVIsQ0FBbUIsS0FBSyxFQUFMLENBQVEsb0JBQTNCLEVBQWlELEtBQUssWUFBdEQsRUFBb0UsS0FBSyxVQUF6RTtBQUNILFNBUkQsTUFTSztBQUNELGlCQUFLLGNBQUwsR0FBc0IsS0FBSyxZQUFMLEdBQW9CLEtBQUsscUJBQS9DO0FBQ0g7O0FBRUQsYUFBSyxFQUFMLENBQVEsVUFBUixDQUFtQixLQUFLLEVBQUwsQ0FBUSxZQUEzQixFQUF5QyxLQUFLLGFBQTlDO0FBQ0EsYUFBSyxFQUFMLENBQVEsVUFBUixDQUFtQixLQUFLLEVBQUwsQ0FBUSxZQUEzQixFQUF5QyxLQUFLLFdBQTlDLEVBQTJELEtBQUssVUFBaEU7O0FBRUEsWUFBSSxDQUFDLEtBQUssTUFBVixFQUFrQjtBQUNkLG1CQUFPLEtBQUssV0FBWjtBQUNBLG1CQUFPLEtBQUssWUFBWjtBQUNIO0FBQ0QsYUFBSyxLQUFMLEdBQWEsSUFBYjtBQUNIOztBQUVEO0FBQ0E7Ozs7O2lDQUNxQjtBQUFBLGdCQUFkLE9BQWMsdUVBQUosRUFBSTs7QUFDakIsZ0JBQUksQ0FBQyxLQUFLLEtBQVYsRUFBaUI7QUFDYix1QkFBTyxLQUFQO0FBQ0g7O0FBRUQsZ0JBQUksVUFBVSxRQUFRLE9BQVIsSUFBbUIseUJBQWMsT0FBL0M7QUFDQSxvQkFBUSxHQUFSOztBQUVBLGdCQUFJLEtBQUssUUFBVCxFQUFtQjtBQUNmLHdCQUFRLFlBQVIsQ0FBcUIsS0FBSyxRQUExQjtBQUNBLHdCQUFRLFdBQVIsQ0FBb0IsS0FBSyxRQUF6QixFQUFtQyxLQUFuQyxFQUZlLENBRTRCO0FBQzlDOztBQUVELGdCQUFJLGVBQWUsQ0FBQyxDQUFDLElBQUksSUFBSixFQUFELEdBQWMsS0FBSyxVQUFwQixJQUFrQyxJQUFyRDtBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0IsZ0JBQXRCLEVBQXdDLFlBQXhDOztBQUVBLGlCQUFLLElBQUwsQ0FBVSxPQUFWOztBQUVBLGdCQUFJLEtBQUssb0JBQVQsRUFBOEI7QUFDMUIscUJBQUssRUFBTCxDQUFRLFlBQVIsQ0FBcUIsS0FBSyxTQUExQixFQUFxQyxLQUFLLGFBQTFDLEVBQXlELEtBQUssWUFBOUQsRUFBNEUsQ0FBNUU7QUFDSCxhQUZELE1BR0s7QUFDRCxxQkFBSyxFQUFMLENBQVEsVUFBUixDQUFtQixLQUFLLFNBQXhCLEVBQW1DLENBQW5DLEVBQXNDLEtBQUssWUFBM0M7QUFDSDs7QUFFRCwwQkFBa0IsSUFBbEIsQ0FBdUIsS0FBSyxFQUE1QixFQUFnQyxJQUFoQzs7QUFFQSxnQkFBSSxLQUFLLFFBQVQsRUFBbUI7QUFDZix3QkFBUSxlQUFSLENBQXdCLEtBQUssUUFBN0I7QUFDSDs7QUFFRDtBQUNBLG1CQUFRLGVBQWUsS0FBSyxZQUE1QjtBQUNIOztBQUVEOzs7OzZCQUNLLE8sRUFBUztBQUFBOztBQUNWO0FBQ0EsZ0JBQUksTUFBTSxLQUFLLElBQUwsQ0FBVSxRQUFRLEVBQWxCLENBQVY7QUFDQSxnQkFBSSxHQUFKLEVBQVM7QUFDTCw4QkFBa0IsSUFBbEIsQ0FBdUIsS0FBSyxFQUE1QixFQUFnQyxHQUFoQztBQUNILGFBRkQsTUFHSztBQUNELHFCQUFLLElBQUwsQ0FBVSxRQUFRLEVBQWxCLElBQXdCLGNBQWtCLE1BQWxCLENBQXlCLEtBQUssRUFBOUIsRUFBa0MsVUFBQyxLQUFELEVBQVc7QUFDakUsMEJBQUssRUFBTCxDQUFRLFVBQVIsQ0FBbUIsTUFBSyxFQUFMLENBQVEsWUFBM0IsRUFBeUMsTUFBSyxhQUE5QztBQUNBLHdCQUFJLE1BQUssb0JBQVQsRUFBK0I7QUFDM0IsOEJBQUssRUFBTCxDQUFRLFVBQVIsQ0FBbUIsTUFBSyxFQUFMLENBQVEsb0JBQTNCLEVBQWlELE1BQUssY0FBdEQ7QUFDSDtBQUNELDBCQUFLLGFBQUwsQ0FBbUIsTUFBbkIsQ0FBMEIsTUFBSyxFQUEvQixFQUFtQyxPQUFuQyxFQUE0QyxLQUE1QztBQUNILGlCQU51QixDQUF4QjtBQU9IO0FBQ0o7OztrQ0FFUztBQUNOLGdCQUFJLENBQUMsS0FBSyxLQUFWLEVBQWlCO0FBQ2IsdUJBQU8sS0FBUDtBQUNIO0FBQ0QsaUJBQUssS0FBTCxHQUFhLEtBQWI7O0FBRUEsaUJBQUssSUFBSSxDQUFULElBQWMsS0FBSyxJQUFuQixFQUF5QjtBQUNyQiw4QkFBa0IsT0FBbEIsQ0FBMEIsS0FBSyxFQUEvQixFQUFtQyxLQUFLLElBQUwsQ0FBVSxDQUFWLENBQW5DO0FBQ0g7O0FBRUQsK0JBQUksT0FBSixFQUFhLG9DQUFvQyxLQUFLLFdBQUwsaUJBQStCLEtBQUssV0FBTCxDQUFpQixVQUFoRCxHQUErRCxFQUFuRyxDQUFiOztBQUVBLGlCQUFLLEVBQUwsQ0FBUSxZQUFSLENBQXFCLEtBQUssYUFBMUI7QUFDQSxpQkFBSyxhQUFMLEdBQXFCLElBQXJCOztBQUVBLGdCQUFJLEtBQUssY0FBVCxFQUF5QjtBQUNyQixxQkFBSyxFQUFMLENBQVEsWUFBUixDQUFxQixLQUFLLGNBQTFCO0FBQ0EscUJBQUssY0FBTCxHQUFzQixJQUF0QjtBQUNIOztBQUVELG1CQUFPLEtBQUssV0FBWjtBQUNBLG1CQUFPLEtBQUssWUFBWjs7QUFFQSxtQkFBTyxJQUFQO0FBQ0g7Ozs7OztrQkE1SGdCLE87Ozs7Ozs7Ozs7Ozs7QUNOckI7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7O2tOQUY4Qjs7O0FBSTlCO0FBQ0EsSUFBSSxnRUFDQyxvQkFBRyxLQURKLEVBQ1ksWUFEWixpQ0FFQyxvQkFBRyxJQUZKLEVBRVcsU0FGWCxpQ0FHQyxvQkFBRyxhQUhKLEVBR29CLFVBSHBCLGlDQUlDLG9CQUFHLEdBSkosRUFJVSxVQUpWLGlDQUtDLG9CQUFHLFlBTEosRUFLbUIsV0FMbkIsaUNBTUMsb0JBQUcsS0FOSixFQU1ZLFVBTlosaUNBT0Msb0JBQUcsY0FQSixFQU9xQixXQVByQixnQkFBSjs7QUFVQTtBQUNBOztJQUNxQixVO0FBRWpCLHdCQUFhLGFBQWIsRUFBcUQ7QUFBQSx1RkFBSixFQUFJO0FBQUEsaUNBQXZCLFFBQXVCO0FBQUEsWUFBdkIsUUFBdUIsaUNBQVosR0FBWTs7QUFBQTs7QUFDakQsYUFBSyxhQUFMLEdBQXFCLGFBQXJCO0FBQ0EsYUFBSyxlQUFMLEdBQXVCLCtCQUF2Qjs7QUFFQSxZQUFJLFdBQVcsVUFBWCxDQUFzQixNQUF0QixHQUErQixDQUFuQyxFQUFzQztBQUNsQyxpQkFBSyxhQUFMLEdBQXFCLFdBQVcsVUFBWCxDQUFzQixHQUF0QixFQUFyQjtBQUNBLGlCQUFLLFdBQUwsR0FBbUIsS0FBSyxhQUFMLENBQW1CLFVBQXRDO0FBQ0EsaUJBQUssSUFBTCxHQUFZLEtBQUssS0FBTCxDQUFXLEtBQUssV0FBTCxHQUFtQixLQUFLLGFBQUwsQ0FBbUIsTUFBakQsQ0FBWjtBQUNBLCtCQUFJLE9BQUosMENBQW1ELEtBQUssV0FBeEQsVUFBd0UsS0FBSyxJQUE3RTtBQUNILFNBTEQsTUFNSztBQUNELGlCQUFLLElBQUwsR0FBWSxRQUFaLENBREMsQ0FDcUI7QUFDdEIsaUJBQUssV0FBTCxHQUFtQixLQUFLLGFBQUwsQ0FBbUIsTUFBbkIsR0FBNEIsS0FBSyxJQUFwRDtBQUNBLGlCQUFLLGFBQUwsR0FBcUIsSUFBSSxVQUFKLENBQWUsS0FBSyxXQUFwQixDQUFyQjtBQUNIO0FBQ0QsYUFBSyxNQUFMLEdBQWMsQ0FBZCxDQWZpRCxDQWVwQjs7QUFFN0IsYUFBSyxVQUFMLEdBQWtCLEVBQWxCO0FBQ0EsYUFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksS0FBSyxhQUFMLENBQW1CLFVBQW5CLENBQThCLE1BQWhELEVBQXdELEdBQXhELEVBQTZEO0FBQ3pELGlCQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsOEJBQXlCLEtBQUssYUFBTCxDQUFtQixVQUFuQixDQUE4QixDQUE5QixDQUF6QjtBQUNIO0FBQ0QsYUFBSyxZQUFMLEdBQW9CLENBQXBCO0FBQ0EsYUFBSyxhQUFMLEdBQXFCLENBQXJCO0FBQ0EsYUFBSyxjQUFMO0FBQ0g7O0FBRUQ7Ozs7O3lDQUNrQjtBQUNkLGlCQUFLLEtBQUwsR0FBYSxFQUFiO0FBQ0EsaUJBQUssS0FBTCxDQUFXLG9CQUFHLGFBQWQsSUFBK0IsS0FBSyxhQUFwQztBQUNBLGlCQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxLQUFLLGFBQUwsQ0FBbUIsT0FBbkIsQ0FBMkIsTUFBN0MsRUFBcUQsR0FBckQsRUFBMEQ7QUFDdEQsb0JBQU0sU0FBUyxLQUFLLGFBQUwsQ0FBbUIsT0FBbkIsQ0FBMkIsQ0FBM0IsQ0FBZjs7QUFFQTtBQUNBLG9CQUFJLEtBQUssS0FBTCxDQUFXLE9BQU8sSUFBbEIsS0FBMkIsSUFBL0IsRUFBcUM7QUFDakMsd0JBQUksYUFBYSxZQUFZLE9BQU8sSUFBbkIsQ0FBakI7QUFDQSx5QkFBSyxLQUFMLENBQVcsT0FBTyxJQUFsQixJQUEwQixJQUFJLFVBQUosQ0FBZSxLQUFLLGFBQUwsQ0FBbUIsTUFBbEMsQ0FBMUI7QUFDSDtBQUNKOztBQUVEO0FBQ0EsaUJBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLEtBQUssVUFBTCxDQUFnQixNQUFsQyxFQUEwQyxHQUExQyxFQUErQztBQUMzQyxvQkFBTSxZQUFZLEtBQUssVUFBTCxDQUFnQixDQUFoQixDQUFsQjtBQUNBLDBCQUFVLENBQVYsSUFBZSxLQUFLLEtBQUwsQ0FBVyxVQUFVLENBQVYsQ0FBWCxDQUFmO0FBQ0g7QUFDSjs7QUFFRDs7OzswQ0FDbUI7QUFDZixnQkFBSyxLQUFLLE1BQUwsR0FBYyxLQUFLLGFBQUwsQ0FBbUIsTUFBbEMsR0FBNEMsS0FBSyxXQUFyRCxFQUFrRTtBQUM5RCxxQkFBSyxJQUFMLEdBQVksS0FBSyxLQUFMLENBQVcsS0FBSyxJQUFMLEdBQVksR0FBdkIsQ0FBWjtBQUNBLHFCQUFLLElBQUwsSUFBYSxLQUFLLElBQUwsR0FBWSxDQUF6QjtBQUNBLHFCQUFLLFdBQUwsR0FBbUIsS0FBSyxhQUFMLENBQW1CLE1BQW5CLEdBQTRCLEtBQUssSUFBcEQ7QUFDQSxvQkFBSSxXQUFXLElBQUksVUFBSixDQUFlLEtBQUssV0FBcEIsQ0FBZjtBQUNBLHlCQUFTLEdBQVQsQ0FBYSxLQUFLLGFBQWxCLEVBTDhELENBSzVCO0FBQ2xDLDJCQUFXLFVBQVgsQ0FBc0IsSUFBdEIsQ0FBMkIsS0FBSyxhQUFoQyxFQU44RCxDQU1kO0FBQ2hELHFCQUFLLGFBQUwsR0FBcUIsUUFBckI7QUFDQSxxQkFBSyxjQUFMO0FBQ0EscUJBQUssYUFBTDtBQUNBO0FBQ0g7QUFDSjs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7OztrQ0FDVyxNLEVBQVE7QUFDZixpQkFBSyxlQUFMO0FBQ0EsZ0JBQUksSUFBRSxDQUFOOztBQUVBLGdCQUFJLE9BQU8sS0FBSyxVQUFMLENBQWdCLE1BQTNCO0FBQ0EsaUJBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLElBQWxCLEVBQXdCLEdBQXhCLEVBQTZCO0FBQ3pCLG9CQUFJLFlBQVksS0FBSyxVQUFMLENBQWdCLENBQWhCLENBQWhCO0FBQ0EsMEJBQVUsQ0FBVixFQUFhLENBQUMsS0FBSyxNQUFMLElBQWUsVUFBVSxDQUFWLENBQWhCLElBQWdDLFVBQVUsQ0FBVixDQUE3QyxJQUE2RCxPQUFPLEdBQVAsQ0FBN0Q7QUFDSDs7QUFFRCxpQkFBSyxNQUFMLElBQWUsS0FBSyxhQUFMLENBQW1CLE1BQWxDO0FBQ0EsaUJBQUssWUFBTDtBQUNIOztBQUVEOzs7OzhCQUNPO0FBQ0g7QUFDQSxpQkFBSyxhQUFMLEdBQXFCLEtBQUssYUFBTCxDQUFtQixRQUFuQixDQUE0QixDQUE1QixFQUErQixLQUFLLE1BQXBDLENBQXJCO0FBQ0EsaUJBQUssY0FBTCxHQUFzQixLQUFLLGVBQUwsQ0FBcUIsR0FBckIsRUFBdEI7O0FBRUEsK0JBQUksT0FBSixtQkFBNEIsS0FBSyxJQUFqQyx1Q0FBdUUsS0FBSyxhQUE1RTs7QUFFQSxtQkFBTyxJQUFQO0FBQ0g7Ozs7OztrQkE1RmdCLFU7OztBQWdHckIsV0FBVyxVQUFYLEdBQXdCLEVBQXhCLEMsQ0FBNEI7Ozs7Ozs7Ozs7O0FDakg1Qjs7Ozs7Ozs7QUFFQSxJQUFJLFlBQVksS0FBSyxHQUFMLENBQVMsQ0FBVCxFQUFZLEVBQVosSUFBa0IsQ0FBbEM7QUFDQSxJQUFJLGNBQWMsS0FBbEI7O0lBRXFCLGM7QUFDakIsOEJBQWU7QUFBQTs7QUFDWCxhQUFLLEtBQUwsR0FBYSxFQUFiO0FBQ0EsYUFBSyxhQUFMLEdBQXFCLEtBQXJCO0FBQ0g7Ozs7NkJBQ0ssSyxFQUFPO0FBQ1Q7QUFDQSxnQkFBSSxLQUFLLGFBQUwsSUFBc0IsQ0FBQyxXQUEzQixFQUF3QztBQUNwQztBQUNIOztBQUVEO0FBQ0EsZ0JBQUksUUFBUSxTQUFaLEVBQXVCO0FBQ25CLHFCQUFLLGFBQUwsR0FBcUIsSUFBckI7QUFDQSxvQkFBSSxDQUFDLFdBQUwsRUFBa0I7QUFDZDtBQUNIO0FBQ0o7O0FBRUQsaUJBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsS0FBaEI7QUFDSDs7OzhCQUNNO0FBQ0gsZ0JBQUksS0FBSyxLQUFMLENBQVcsTUFBZixFQUFzQjtBQUNsQixvQkFBSSxTQUFTLGFBQWEsS0FBSyxLQUFsQixFQUF5QixLQUFLLGFBQTlCLENBQWI7QUFDQSxxQkFBSyxLQUFMLEdBQWEsRUFBYjtBQUNBLHFCQUFLLGFBQUwsR0FBcUIsS0FBckI7QUFDQSx1QkFBTyxNQUFQO0FBQ0gsYUFMRCxNQU1LO0FBQ0QsdUJBQU8sS0FBUDtBQUNIO0FBQ0o7Ozs7OztrQkEvQmdCLGM7OztBQWtDckIsZUFBZSxhQUFmLEdBQStCLFVBQVMsSUFBVCxFQUFlO0FBQzFDLGtCQUFjLElBQWQ7QUFDSCxDQUZEOztBQUlBLFNBQVMsWUFBVCxDQUFzQixLQUF0QixFQUE2QixTQUE3QixFQUF3QztBQUNwQyxRQUFJLGFBQWMsYUFBYSxXQUFkLEdBQTZCLFdBQTdCLEdBQTJDLFdBQTVEO0FBQ0EsV0FBTyxJQUFJLFVBQUosQ0FBZSxLQUFmLENBQVA7QUFDSDs7QUFFRCx3QkFBYSxTQUFiLENBQXVCLGdCQUF2QixFQUF5QyxjQUF6Qzs7Ozs7Ozs7O3FqQkNoRDhCOzs7QUFBOUI7Ozs7QUFDQTs7Ozs7Ozs7QUFFQTtJQUNxQixZO0FBQ2pCO0FBQ0E7QUFDQSwwQkFBYSxPQUFiLEVBQXNCO0FBQUE7O0FBQ2xCLGFBQUssT0FBTCxHQUFlLE9BQWYsQ0FEa0IsQ0FDTTtBQUN4QixhQUFLLFVBQUwsR0FBa0IsRUFBbEIsQ0FGa0IsQ0FFTTtBQUN4QixhQUFLLEtBQUwsR0FBYSxFQUFiLENBSGtCLENBR007O0FBRXhCO0FBQ0EsYUFBSyxNQUFMLEdBQWMsQ0FBZDs7QUFFQSxZQUFJLFFBQVEsQ0FBWjtBQUNBLGFBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLEtBQUssT0FBTCxDQUFhLE1BQS9CLEVBQXVDLEdBQXZDLEVBQTRDO0FBQ3hDLGdCQUFJLFNBQVMsS0FBSyxPQUFMLENBQWEsQ0FBYixDQUFiO0FBQ0EsbUJBQU8sTUFBUCxHQUFnQixLQUFLLE1BQXJCO0FBQ0EsbUJBQU8sU0FBUCxHQUFtQixPQUFPLElBQTFCO0FBQ0EsZ0JBQUksUUFBUSxDQUFaOztBQUVBLG9CQUFRLE9BQU8sSUFBZjtBQUNJLHFCQUFLLG9CQUFHLEtBQVI7QUFDQSxxQkFBSyxvQkFBRyxHQUFSO0FBQ0EscUJBQUssb0JBQUcsWUFBUjtBQUNJLDJCQUFPLFNBQVAsSUFBb0IsQ0FBcEI7QUFDQSw0QkFBUSxDQUFSO0FBQ0E7QUFDSixxQkFBSyxvQkFBRyxLQUFSO0FBQ0EscUJBQUssb0JBQUcsY0FBUjtBQUNJLDJCQUFPLFNBQVAsSUFBb0IsQ0FBcEI7QUFDQSw0QkFBUSxDQUFSO0FBQ0E7QUFYUjs7QUFjQTtBQUNBLGlCQUFLLE1BQUwsSUFBZSxPQUFPLFNBQXRCO0FBQ0EsZ0JBQUksS0FBSyxNQUFMLEdBQWMsQ0FBbEIsRUFBcUI7QUFBRTtBQUNuQixxQkFBSyxNQUFMLElBQWUsS0FBSyxLQUFLLE1BQUwsR0FBYyxDQUFuQixDQUFmO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBSSxlQUFlLE9BQU8sTUFBUCxJQUFpQixLQUFwQztBQUNBLGdCQUFJLE9BQU8sSUFBUCxHQUFjLENBQWxCLEVBQXFCO0FBQ2pCLHFCQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxPQUFPLElBQXpCLEVBQStCLEdBQS9CLEVBQW9DO0FBQ2hDLHlCQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBcUIsQ0FBQyxPQUFPLElBQVIsRUFBYyxJQUFkLEVBQW9CLEtBQXBCLEVBQTJCLGNBQTNCLENBQXJCO0FBQ0g7QUFDSixhQUpELE1BS0s7QUFDRCxxQkFBSyxVQUFMLENBQWdCLElBQWhCLENBQXFCLENBQUMsT0FBTyxJQUFSLEVBQWMsSUFBZCxFQUFvQixLQUFwQixFQUEyQixZQUEzQixDQUFyQjtBQUNIOztBQUVEO0FBQ0EsaUJBQUssS0FBTCxDQUFXLE9BQU8sSUFBbEIsSUFBMEIsS0FBMUI7QUFDQSxxQkFBUyxPQUFPLElBQWhCO0FBQ0g7QUFDSjs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7Ozs7K0JBQ1EsRSxFQUFJLE8sRUFBUyxLLEVBQ3JCO0FBQ0ksZ0JBQUksTUFBSixFQUFZLFFBQVo7O0FBRUE7QUFDQSxpQkFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksS0FBSyxPQUFMLENBQWEsTUFBL0IsRUFBdUMsR0FBdkMsRUFBNEM7QUFDeEMseUJBQVMsS0FBSyxPQUFMLENBQWEsQ0FBYixDQUFUO0FBQ0EsMkJBQVcsUUFBUSxTQUFSLENBQWtCLE9BQU8sSUFBekIsRUFBK0IsUUFBMUM7O0FBRUEsb0JBQUksYUFBYSxDQUFDLENBQWxCLEVBQXFCO0FBQ2pCLHdCQUFJLENBQUMsYUFBYSxlQUFiLENBQTZCLFFBQTdCLENBQUQsSUFBMkMsS0FBL0MsRUFBc0Q7QUFDbEQsMkJBQUcsdUJBQUgsQ0FBMkIsUUFBM0I7QUFDSDtBQUNELHVCQUFHLG1CQUFILENBQXVCLFFBQXZCLEVBQWlDLE9BQU8sSUFBeEMsRUFBOEMsT0FBTyxJQUFyRCxFQUEyRCxPQUFPLFVBQWxFLEVBQThFLEtBQUssTUFBbkYsRUFBMkYsT0FBTyxNQUFsRztBQUNBLGlDQUFhLGVBQWIsQ0FBNkIsUUFBN0IsSUFBeUMsT0FBekM7QUFDSDtBQUNKOztBQUVEO0FBQ0EsaUJBQUssUUFBTCxJQUFpQixhQUFhLGVBQTlCLEVBQStDO0FBQzNDLHFCQUFLLHNCQUFMLENBQTRCLEVBQTVCLEVBQWdDLFFBQWhDLEVBQTBDLE9BQTFDO0FBQ0g7QUFDSjs7QUFFRDtBQUNBOzs7OytDQUN3QixFLEVBQUksUSxFQUFVLE8sRUFBUztBQUMzQyxnQkFBSSxhQUFhLGVBQWIsQ0FBNkIsUUFBN0IsTUFBMkMsT0FBL0MsRUFBd0Q7QUFDcEQsbUJBQUcsd0JBQUgsQ0FBNEIsUUFBNUI7QUFDQSx1QkFBTyxhQUFhLGVBQWIsQ0FBNkIsUUFBN0IsQ0FBUDtBQUNIO0FBQ0o7OzsyQ0FFbUI7QUFDaEIsbUJBQU8sMEJBQWUsSUFBZixDQUFQO0FBQ0g7Ozs7OztBQUlMO0FBQ0E7OztrQkF0R3FCLFk7QUF1R3JCLGFBQWEsZUFBYixHQUErQixFQUEvQjs7Ozs7Ozs7O0FDM0dBOzs7O0FBQ0E7Ozs7OztBQUVBLElBQUksU0FBSjs7a0JBRWUsWUFBWTs7QUFFdkIsV0FBTyxFQUZnQjs7QUFJdkIsYUFKdUIscUJBSVosSUFKWSxFQUlOO0FBQ2IsWUFBSSxRQUFRLEtBQUssS0FBTCxDQUFXLElBQVgsSUFBbUI7QUFDM0Isb0JBQVEsRUFBWTtBQUNoQixzQkFBTSxFQURGO0FBRUoscUJBQUs7QUFGRCxhQURtQjtBQUszQixxQkFBUyxFQUxrQixFQUtQO0FBQ3BCLGtCQUFNLEVBTnFCLEVBTVA7QUFDcEIsb0JBQVEsRUFQbUIsQ0FPUDtBQVBPLFNBQS9COztBQVVBO0FBQ0EsY0FBTSxRQUFOLEdBQWlCLElBQUksT0FBSixDQUFZLFVBQUMsT0FBRCxFQUFVLE1BQVYsRUFBcUI7QUFDOUMsa0JBQU0sT0FBTixHQUFnQixPQUFoQjtBQUNBLGtCQUFNLE1BQU4sR0FBZSxNQUFmO0FBQ0gsU0FIZ0IsQ0FBakI7QUFJSCxLQXBCc0I7QUFzQnZCLGFBdEJ1QixxQkFzQlosSUF0QlksRUFzQk47QUFDYixlQUFPLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBUDtBQUNILEtBeEJzQjs7O0FBMEJ2QjtBQUNBLFlBM0J1QixvQkEyQmIsS0EzQmEsRUEyQk4sSUEzQk0sRUEyQkE7QUFDbkIsYUFBSyxLQUFMLENBQVcsSUFBWCxFQUFpQixNQUFqQixDQUF3QixLQUF4QixJQUFpQyxJQUFqQztBQUNILEtBN0JzQjs7O0FBK0J2QjtBQUNBLFdBaEN1QixtQkFnQ2QsT0FoQ2MsRUFnQ0wsS0FoQ0ssRUFnQ0UsSUFoQ0YsRUFnQ1E7QUFDM0IsWUFBSSxRQUFRLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBWjtBQUNBLFlBQUksQ0FBQyxLQUFMLEVBQVk7QUFDUiwrQkFBSSxPQUFKLEVBQWEsMkNBQWIsRUFBMEQsSUFBMUQsRUFBZ0UsS0FBSyxLQUFyRSxFQUE0RSxLQUE1RSxFQUFtRixPQUFuRjtBQUNBLG1CQUFPLFFBQVEsT0FBUixDQUFnQixFQUFoQixDQUFQO0FBQ0g7O0FBRUQ7QUFDQSxZQUFJLGVBQWUsTUFBTSxPQUF6QjtBQUNBLGFBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLFFBQVEsTUFBMUIsRUFBa0MsR0FBbEMsRUFBdUM7QUFDbkMsZ0JBQUksTUFBTSxRQUFRLENBQVIsQ0FBVjtBQUNBLGdCQUFJLFdBQVcsSUFBSSxLQUFKLENBQVUsTUFBVixDQUFpQixRQUFoQztBQUNBLHlCQUFhLFFBQWIsSUFBeUIsYUFBYSxRQUFiLEtBQTBCLEVBQW5EO0FBQ0EseUJBQWEsUUFBYixFQUF1QixLQUF2QixJQUFnQyxhQUFhLFFBQWIsRUFBdUIsS0FBdkIsS0FBaUMsRUFBakU7QUFDQSx5QkFBYSxRQUFiLEVBQXVCLEtBQXZCLEVBQThCLElBQTlCLENBQW1DLEdBQW5DO0FBQ0g7O0FBRUQ7QUFDQSxlQUFPLE1BQU0sTUFBTixDQUFhLEtBQWIsQ0FBUDtBQUNBLFlBQUksT0FBTyxJQUFQLENBQVksTUFBTSxNQUFsQixFQUEwQixNQUExQixLQUFxQyxDQUF6QyxFQUE0QztBQUN4QyxpQkFBSyxPQUFMLENBQWEsSUFBYjtBQUNIOztBQUVEO0FBQ0EsZUFBTyxNQUFNLFFBQU4sQ0FBZSxJQUFmLENBQW9CLFlBQU07QUFDN0IsbUJBQU8sTUFBTSxJQUFOLENBQVcsS0FBWCxLQUFxQixFQUE1QjtBQUNILFNBRk0sQ0FBUDtBQUdILEtBM0RzQjs7O0FBNkR2QjtBQUNBO0FBQ0EsV0EvRHVCLG1CQStEZCxJQS9EYyxFQStEUjtBQUNYLFlBQUksUUFBUSxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQVo7QUFDQSxZQUFJLE9BQU8sTUFBTSxJQUFqQjs7QUFFQSwrQkFBWSxLQUFaLENBQWtCLElBQWxCOztBQUVBO0FBQ0EsWUFBSSxhQUFhLE9BQU8sSUFBUCxDQUFZLE1BQU0sT0FBbEIsRUFBMkIsSUFBM0IsQ0FBZ0MsVUFBQyxDQUFELEVBQUksQ0FBSjtBQUFBLG1CQUFVLElBQUksQ0FBZDtBQUFBLFNBQWhDLENBQWpCO0FBQ0EsYUFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksV0FBVyxNQUE3QixFQUFxQyxHQUFyQyxFQUEwQztBQUN0QyxnQkFBSSxnQkFBZ0IsTUFBTSxPQUFOLENBQWMsV0FBVyxDQUFYLENBQWQsQ0FBcEI7QUFDQSxnQkFBSSxDQUFDLGFBQUwsRUFBb0I7QUFBRTtBQUNsQjtBQUNIOztBQUVEO0FBQ0EsaUJBQUssSUFBSSxLQUFULElBQWtCLGFBQWxCLEVBQWlDO0FBQzdCLG9CQUFJLFVBQVUsY0FBYyxLQUFkLENBQWQ7QUFDQSxxQkFBSyxLQUFMLElBQWMsS0FBSyxLQUFMLEtBQWUsRUFBN0I7O0FBRUEscUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxRQUFRLE1BQTVCLEVBQW9DLEdBQXBDLEVBQXlDO0FBQ3JDLHdCQUFJLFNBQVMsUUFBUSxDQUFSLENBQWI7QUFDQSx3QkFBSSxLQUFLLFdBQUwsQ0FBaUIsTUFBakIsRUFBeUIsSUFBekIsRUFBK0IsT0FBTyxNQUF0QyxDQUFKLEVBQW1EO0FBQy9DO0FBQ0EsNEJBQUksQ0FBQyxPQUFPLE1BQVosRUFBb0I7QUFDaEIsaUNBQUssS0FBTCxFQUFZLElBQVosQ0FBaUIsTUFBakI7QUFDQSxpQ0FBSyxLQUFMLENBQVcsTUFBWCxFQUFtQixJQUFuQjtBQUNIO0FBQ0Q7QUFKQSw2QkFLSyxJQUFJLEtBQUssV0FBTCxDQUFpQixPQUFPLE1BQXhCLEVBQWdDLElBQWhDLEVBQXNDLE1BQXRDLENBQUosRUFBbUQ7QUFDcEQscUNBQUssS0FBTCxFQUFZLElBQVosQ0FBaUIsTUFBakI7QUFDQSxxQ0FBSyxLQUFMLENBQVcsTUFBWCxFQUFtQixJQUFuQjtBQUNBLHFDQUFLLEtBQUwsQ0FBVyxPQUFPLE1BQWxCLEVBQTBCLElBQTFCO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7QUFDSjs7QUFFRCxlQUFPLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBUDtBQUNBLGNBQU0sT0FBTjtBQUNILEtBdkdzQjs7O0FBeUd2QjtBQUNBLGVBMUd1Qix1QkEwR1YsTUExR1UsRUEwR0YsSUExR0UsRUEwR29CO0FBQUEsWUFBaEIsT0FBZ0IsdUVBQU4sSUFBTTs7QUFDdkMsWUFBSSxRQUFRLE9BQU8sS0FBbkI7QUFDQSxZQUFJLFNBQVMsT0FBTyxLQUFQLENBQWEsTUFBMUI7O0FBRUE7QUFDQSxZQUFJLE1BQU0sTUFBTixJQUFnQixJQUFwQixFQUEwQjtBQUN0QixtQkFBTyxNQUFNLE1BQWI7QUFDSDs7QUFFRDtBQUNBLFlBQUksU0FBUyxLQUFLLEtBQUwsQ0FBVyxJQUFYLEVBQWlCLE1BQTlCO0FBQ0EsWUFBSSxDQUFDLE9BQU8sT0FBUixJQUFtQixDQUFDLE1BQU0sT0FBTixDQUFjLE1BQWQsRUFBc0IsV0FBVyxRQUFRLEtBQXpDLENBQXhCLEVBQXlFO0FBQ3JFO0FBQ0EsZ0JBQUksU0FBUyx1QkFBWSxLQUFaLENBQWtCLEtBQWxCLEVBQXlCLE1BQXpCLEVBQWlDLElBQWpDLENBQWI7QUFDQSxnQkFBSSxNQUFKLEVBQVk7QUFDUjtBQUNBLHNCQUFNLE1BQU4sR0FBZSxLQUFmO0FBQ0gsYUFIRCxNQUlLO0FBQ0QsdUJBQU8sSUFBUDtBQUNIO0FBQ0osU0FWRCxNQVdLLElBQUksT0FBTyxPQUFYLEVBQW9CO0FBQ3JCO0FBQ0Esa0JBQU0sTUFBTixHQUFlLEtBQWY7QUFDSDtBQUNELGVBQU8sTUFBTSxNQUFiO0FBQ0gsS0FySXNCOzs7QUF1SXZCO0FBQ0EsU0F4SXVCLHVCQXdJTCxJQXhJSyxFQXdJQztBQUFBLFlBQWYsS0FBZSxRQUFmLEtBQWU7O0FBQ3BCO0FBQ0EsWUFBSSxNQUFNLE1BQU4sSUFBZ0IsSUFBcEIsRUFBMEI7QUFDdEI7QUFDSDs7QUFFRDtBQUNBLCtCQUFZLEdBQVosQ0FBZ0IsS0FBaEIsRUFBdUIsTUFBTSxNQUE3QixFQUFxQyxJQUFyQztBQUNBLGNBQU0sR0FBTixDQUFVLEtBQUssS0FBTCxDQUFXLElBQVgsRUFBaUIsTUFBM0I7QUFDSDtBQWpKc0IsQzs7Ozs7Ozs7UUNIWCxnQixHQUFBLGdCO1FBYUEsaUIsR0FBQSxpQjs7QUFkaEI7QUFDTyxTQUFTLGdCQUFULENBQTJCLENBQTNCLEVBQThCLENBQTlCLEVBQWlDO0FBQ3BDLFFBQUksRUFBRSxDQUFGLElBQU8sRUFBRSxDQUFGLENBQVAsSUFBZTtBQUNmLE1BQUUsQ0FBRixJQUFPLEVBQUUsQ0FBRixDQURQLElBQ2U7QUFDZixNQUFFLENBQUYsSUFBTyxFQUFFLENBQUYsQ0FGUCxJQUVlO0FBQ2YsTUFBRSxDQUFGLElBQU8sRUFBRSxDQUFGLENBSFgsRUFHaUI7QUFBRTtBQUNmLGVBQU8sS0FBUDtBQUNIO0FBQ0QsV0FBTyxJQUFQLENBUG9DLENBT3ZCO0FBQ2hCOztBQUVEO0FBQ0E7QUFDQTtBQUNPLFNBQVMsaUJBQVQsQ0FBNEIsQ0FBNUIsRUFBK0IsS0FBL0IsRUFBc0MsUUFBdEMsRUFBZ0Q7QUFDbkQsU0FBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksTUFBTSxNQUF4QixFQUFnQyxHQUFoQyxFQUFxQztBQUNqQyxZQUFJLGlCQUFpQixDQUFqQixFQUFvQixNQUFNLENBQU4sQ0FBcEIsQ0FBSixFQUFtQztBQUMvQixnQkFBSSxTQUFTLENBQVQsS0FBZSxJQUFuQixFQUF5QjtBQUNyQjtBQUNIO0FBQ0o7QUFDSjtBQUNKOzs7Ozs7Ozs7OztBQ3ZCRDs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7Ozs7O0FBQ0E7O0lBRXFCLEs7QUFFakIsbUJBQWEsSUFBYixFQUFnQztBQUFBLFlBQWIsTUFBYSx1RUFBSixFQUFJOztBQUFBOztBQUM1QixhQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsYUFBSyxNQUFMLEdBQWMsTUFBZDtBQUNBLGFBQUssUUFBTCxHQUFnQixJQUFoQjtBQUNBLGFBQUssTUFBTCxHQUFjLE1BQU0sT0FBTixDQUFjLEtBQUssTUFBTCxDQUFZLE1BQTFCLElBQW9DLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsQ0FBbkIsQ0FBcEMsR0FBNEQsS0FBSyxNQUFMLENBQVksTUFBdEYsQ0FKNEIsQ0FJa0U7QUFDOUYsYUFBSyxNQUFMLEdBQWMsSUFBZDtBQUNBLGFBQUssTUFBTCxHQUFjLE9BQU8sTUFBckI7QUFDQSxhQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsYUFBSyxHQUFMLEdBQVcsSUFBWDtBQUNBLGFBQUssS0FBTCxHQUFhLFFBQWI7QUFDQSxhQUFLLFVBQUwsR0FBa0IsS0FBbEIsQ0FWNEIsQ0FVQTtBQUMvQjs7OztpQ0FFUztBQUNOLGlCQUFLLEtBQUwsR0FBYSxLQUFLLE1BQUwsQ0FBWSxLQUFaLElBQXFCLHVCQUFZLGNBQVosQ0FBMkIsS0FBSyxNQUFoQyxDQUFsQztBQUNIOztBQUVEOzs7O2lDQUNVLE0sRUFBd0I7QUFBQTs7QUFBQSxnQkFBaEIsT0FBZ0IsdUVBQU4sSUFBTTs7QUFDOUIsZ0JBQUksWUFBWSxLQUFoQjtBQUNBLGdCQUFJLFFBQVEsT0FBTyxJQUFuQjtBQUNBLGdCQUFJLE9BQU8sT0FBTyxHQUFsQjs7QUFFQTtBQUNBLGdCQUFJLE1BQU0sTUFBTixHQUFlLENBQW5CLEVBQXNCO0FBQ2xCLGtEQUFrQixLQUFLLElBQXZCLEVBQTZCLEtBQTdCLEVBQW9DLFVBQUMsQ0FBRCxFQUFPO0FBQ3ZDOztBQUVBO0FBQ0Esd0JBQUksV0FBVyxNQUFNLENBQU4sTUFBYSxRQUFRLElBQXBDLEVBQTBDO0FBQ3RDO0FBQ0E7QUFDSDs7QUFFRDtBQUNBLHdCQUFJLE1BQUssR0FBTCxDQUFTLEtBQVQsS0FBbUIsQ0FBbkIsSUFBd0IsS0FBSyxDQUFMLEVBQVEsS0FBUixLQUFrQixDQUE5QyxFQUFpRDtBQUM3QztBQUNBLG9DQUFZLElBQVo7QUFDQSwrQkFBTyxJQUFQO0FBQ0g7O0FBRUQ7QUFDQSx3QkFBSSxjQUFJLFNBQUosQ0FBYyxNQUFLLEdBQW5CLEVBQXdCLEtBQUssQ0FBTCxDQUF4QixDQUFKLEVBQXNDO0FBQ2xDO0FBQ0Esb0NBQVksSUFBWjtBQUNBLCtCQUFPLElBQVA7QUFDSDtBQUNKLGlCQXRCRDtBQXVCSDtBQUNELG1CQUFPLFNBQVA7QUFDSDs7QUFFRDs7Ozs0QkFDSyxNLEVBQVE7QUFDVCxpQkFBSyxNQUFMLEdBQWMsSUFBZDtBQUNBLG1CQUFPLElBQVAsQ0FBWSxJQUFaLENBQWlCLEtBQUssSUFBdEI7QUFDQSxtQkFBTyxHQUFQLENBQVcsSUFBWCxDQUFnQixLQUFLLEdBQXJCO0FBQ0g7O0FBRUQ7Ozs7dUNBQ2dCO0FBQ1osZ0JBQUksTUFBTSxDQUFFLEtBQUssSUFBTCxDQUFVLENBQVYsQ0FBRixFQUFnQixLQUFLLElBQUwsQ0FBVSxDQUFWLENBQWhCLENBQVY7QUFDQSxnQkFBSSxNQUFNLENBQUUsS0FBSyxJQUFMLENBQVUsQ0FBVixDQUFGLEVBQWdCLEtBQUssSUFBTCxDQUFVLENBQVYsQ0FBaEIsQ0FBVjs7QUFFQSxnQkFBSSxDQUFDLGdCQUFNLFdBQU4sQ0FBa0IsR0FBbEIsQ0FBRCxJQUEyQixDQUFDLGdCQUFNLFdBQU4sQ0FBa0IsR0FBbEIsQ0FBaEMsRUFBd0Q7QUFDcEQsdUJBQU8sS0FBUDtBQUNIOztBQUVELG1CQUFPLElBQVA7QUFDSDs7QUFFRDtBQUNBOzs7O2dDQUNRLE0sRUFBd0I7QUFBQSxnQkFBaEIsT0FBZ0IsdUVBQU4sSUFBTTs7QUFDNUIsZ0JBQUksS0FBSyxVQUFULEVBQXFCO0FBQ2pCLHVCQUFPLElBQVA7QUFDSDtBQUNELG1CQUFPLEtBQUssUUFBTCxDQUFjLE1BQWQsRUFBc0IsT0FBdEIsQ0FBUDtBQUNIOzs7Ozs7a0JBaEZnQixLOzs7QUFtRnJCLE1BQU0sT0FBTixHQUFnQixNQUFoQixDLENBQXdCOzs7Ozs7Ozs7OztBQ3pGeEI7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7OztBQUVBLElBQU0sWUFBWTtBQUNkLGVBQVcsQ0FERztBQUVkLFlBQVE7QUFGTSxDQUFsQjs7QUFLQSxJQUFNLFlBQVksS0FBSyxFQUFMLEdBQVUsQ0FBNUIsQyxDQUFvQztBQUNwQyxJQUFNLHVCQUF1QixHQUE3QixDLENBQW9DO0FBQ3BDLElBQU0scUJBQXFCLEdBQTNCLEMsQ0FBb0M7O0lBRWYsUztBQUVqQix1QkFBYSxJQUFiLEVBQW1CLEtBQW5CLEVBQTBCLE1BQTFCLEVBQWtDO0FBQUE7O0FBQzlCLGFBQUssSUFBTCxHQUFZLElBQVo7QUFDQSxhQUFLLE1BQUwsR0FBYyxNQUFkO0FBQ0EsYUFBSyxLQUFMLEdBQWEsS0FBYjtBQUNBLGFBQUssV0FBTCxHQUFtQixPQUFPLFdBQTFCLENBSjhCLENBSVM7QUFDdkMsYUFBSyxZQUFMLEdBQW9CLEtBQUssTUFBekIsQ0FMOEIsQ0FLRztBQUNqQyxhQUFLLFlBQUwsR0FBb0IsS0FBSyxNQUFMLENBQVksVUFBUyxJQUFULEVBQWUsSUFBZixFQUFvQjtBQUFFLG1CQUFPLE9BQU8sS0FBSyxDQUFMLENBQWQ7QUFBd0IsU0FBMUQsRUFBNEQsQ0FBNUQsSUFBaUUsQ0FBQyxLQUFLLE1BQUwsR0FBYyxDQUFmLElBQW9CLEtBQUssV0FBOUc7QUFDQSxhQUFLLFlBQUwsR0FBb0IsS0FBSyxDQUFMLEVBQVEsQ0FBUixDQUFwQjtBQUNBLGFBQUssU0FBTCxHQUFrQixPQUFPLFNBQVAsS0FBcUIsU0FBdEIsR0FBbUMsVUFBVSxTQUE3QyxHQUF5RCxPQUFPLFNBQWpGOztBQUVBLGFBQUssVUFBTCxHQUFrQixDQUFsQixDQVY4QixDQVVUO0FBQ3JCLGFBQUssYUFBTCxHQUFxQixHQUFyQixDQVg4QixDQVdKO0FBQzFCLGFBQUssT0FBTCxHQUFlLENBQWYsQ0FaOEIsQ0FZWjs7QUFFbEI7QUFDQSxhQUFLLFFBQUwsR0FBZ0IsRUFBaEI7QUFDQSxhQUFLLEtBQUwsR0FBYSxFQUFiO0FBQ0EsYUFBSyxPQUFMLEdBQWUsRUFBZjtBQUNBLGFBQUssSUFBTCxHQUFZLEVBQVo7QUFDQSxhQUFLLEtBQUwsR0FBYSxFQUFiOztBQUVBO0FBQ0E7QUFDQSxhQUFLLGFBQUwsR0FBcUIsT0FBTyxhQUFQLElBQXdCLE9BQU8sYUFBL0IsSUFBZ0QsQ0FBckU7QUFDQSxhQUFLLFdBQUwsR0FBbUIsT0FBTyxXQUFQLElBQXNCLEtBQUssS0FBTCxDQUFXLE1BQXBEOztBQUVBO0FBQ0EsWUFBSSxVQUFVLEtBQUsscUJBQUwsQ0FBMkIsS0FBSyxpQkFBTCxFQUEzQixDQUFkO0FBQ0EsYUFBSyxVQUFMLEdBQW1CLENBQUMsT0FBcEI7QUFDSDs7QUFFRDs7Ozs7OztBQW1CQTtBQUNBO0FBQ0E7eUNBQ2lCO0FBQ2Isb0JBQVEsS0FBSyxTQUFiO0FBQ0kscUJBQUssVUFBVSxNQUFmO0FBQ0kseUJBQUssU0FBTCxHQUFpQixVQUFVLFNBQTNCO0FBQ0E7QUFDSixxQkFBSyxVQUFVLFNBQWY7QUFDSSx3QkFBSSxLQUFLLGFBQUwsSUFBc0IsS0FBSyxLQUFMLENBQVcsTUFBWCxHQUFvQixDQUE5QyxFQUFpRDtBQUM3QywrQkFBTyxLQUFQO0FBQ0gscUJBRkQsTUFHSyxJQUFJLEtBQUssSUFBTCxDQUFVLE1BQVYsR0FBbUIsQ0FBdkIsRUFBMEI7QUFDM0IsNkJBQUssU0FBTCxHQUFpQixVQUFVLE1BQTNCO0FBQ0g7QUFDRCx5QkFBSyxhQUFMO0FBQ0E7QUFaUjs7QUFlQSxtQkFBTyxLQUFLLGlCQUFMLEVBQVA7QUFDSDs7QUFFRDtBQUNBO0FBQ0E7Ozs7NENBQ29CO0FBQ2hCLGdCQUFJLFdBQUo7QUFBQSxnQkFBUSxXQUFSO0FBQUEsZ0JBQVksZ0JBQVo7QUFDQSxvQkFBUSxLQUFLLFNBQWI7QUFDSSxxQkFBSyxVQUFVLE1BQWY7QUFDSSx5QkFBSyxLQUFLLEtBQUwsQ0FBVyxLQUFLLGFBQUwsR0FBcUIsQ0FBaEMsQ0FBTDtBQUNBLHlCQUFLLEtBQUssS0FBTCxDQUFXLEtBQUssYUFBaEIsQ0FBTDtBQUNBLHdCQUFJLEtBQUssS0FBSyxLQUFMLENBQVcsS0FBSyxhQUFMLEdBQXFCLENBQWhDLENBQVQ7QUFDQSw4QkFBVSxDQUFFLEVBQUYsRUFBTSxFQUFOLEVBQVUsRUFBVixDQUFWO0FBQ0E7QUFDSixxQkFBSyxVQUFVLFNBQWY7QUFDSSx5QkFBSyxLQUFLLEtBQUwsQ0FBVyxLQUFLLGFBQWhCLENBQUw7QUFDQSx5QkFBSyxLQUFLLEtBQUwsQ0FBVyxLQUFLLGFBQUwsR0FBcUIsQ0FBaEMsQ0FBTDtBQUNBLDhCQUFVLENBQUUsRUFBRixFQUFNLEVBQU4sQ0FBVjtBQUNBO0FBWFI7O0FBY0EsbUJBQU8sT0FBUDtBQUNIOztBQUVEOzs7OzhDQUNzQixPLEVBQVM7QUFDM0Isc0JBQVUsV0FBVyxLQUFLLGNBQUwsRUFBckI7QUFDQSxnQkFBSSxDQUFDLE9BQUwsRUFBYztBQUNWLHVCQUFPLEtBQVA7QUFDSDs7QUFFRCxnQkFBSSxLQUFLLGNBQUwsQ0FBb0IsT0FBcEIsQ0FBSixFQUFrQztBQUM5QixxQkFBSyxNQUFMO0FBQ0Esb0JBQUksS0FBSyxZQUFMLE1BQXVCLEtBQUssYUFBTCxFQUEzQixFQUFpRDtBQUM3QywyQkFBTyxPQUFQO0FBQ0g7QUFDSjs7QUFFRCxtQkFBTyxLQUFLLHFCQUFMLEVBQVA7QUFDSDs7QUFFRDs7Ozt1Q0FDZSxPLEVBQVM7QUFDcEIsb0JBQVEsS0FBSyxTQUFiO0FBQ0kscUJBQUssVUFBVSxNQUFmO0FBQ0ksMkJBQU8sS0FBSyxnQkFBTCxDQUFzQixPQUF0QixDQUFQO0FBQ0oscUJBQUssVUFBVSxTQUFmO0FBQ0ksMkJBQU8sS0FBSyxrQkFBTCxDQUF3QixPQUF4QixDQUFQO0FBSlI7QUFNSDs7QUFFRDtBQUNBO0FBQ0E7Ozs7eUNBQ2lCLE8sRUFBUztBQUN0QixnQkFBSSxNQUFNLEtBQUssTUFBTCxDQUFZLGVBQXRCOztBQUVBLGdCQUFJLE9BQU8saUJBQU8sR0FBUCxDQUFXLFFBQVEsQ0FBUixDQUFYLEVBQXVCLFFBQVEsQ0FBUixDQUF2QixDQUFYO0FBQ0EsZ0JBQUksT0FBTyxpQkFBTyxHQUFQLENBQVcsUUFBUSxDQUFSLENBQVgsRUFBdUIsUUFBUSxDQUFSLENBQXZCLENBQVg7O0FBRUE7QUFDQSxnQkFBSSxLQUFLLENBQUwsSUFBVSxLQUFLLENBQUwsQ0FBVixHQUFvQixDQUFwQixJQUF5QixLQUFLLENBQUwsSUFBVSxLQUFLLENBQUwsQ0FBVixHQUFvQixDQUFqRCxFQUFvRDtBQUNoRCx1QkFBTyxLQUFQO0FBQ0g7O0FBRUQsZ0JBQUksZUFBZSxpQkFBTyxNQUFQLENBQWMsSUFBZCxJQUFzQixHQUF6QztBQUNBLGdCQUFJLGVBQWUsaUJBQU8sTUFBUCxDQUFjLElBQWQsSUFBc0IsR0FBekM7O0FBRUE7QUFDQSxnQkFBSSxnQkFBZ0IsS0FBSyxZQUF6QjtBQUNBLGdCQUFJLGdCQUFnQixDQUFwQjtBQUNBLGdCQUFJLGNBQUo7QUFBQSxnQkFBVyxVQUFVLENBQXJCO0FBQ0EsZ0JBQUksYUFBYSxLQUFLLFlBQUwsR0FBb0IsQ0FBckM7QUFDQSxnQkFBSSxZQUFZLEVBQWhCOztBQUVBLG1CQUFPLGFBQWEsQ0FBcEIsRUFBdUI7QUFDbkIsd0JBQVEsS0FBSyxJQUFMLENBQVUsVUFBVixFQUFzQixDQUF0QixJQUEyQixLQUFLLFdBQXhDOztBQUVBLGlDQUFpQixLQUFqQjtBQUNBLGlDQUFpQixLQUFqQjs7QUFFQSwwQkFBVSxLQUFLLEdBQUwsQ0FBUyxZQUFZLFlBQVosRUFBMEIsYUFBMUIsQ0FBVCxFQUFtRCxZQUFZLFlBQVosRUFBMEIsYUFBMUIsQ0FBbkQsQ0FBVjtBQUNBLDBCQUFVLE9BQVYsQ0FBa0IsT0FBbEI7O0FBRUE7QUFDSDs7QUFFRCxnQkFBSSxjQUFjLEtBQUssR0FBTCxDQUFTLEtBQVQsQ0FBZSxJQUFmLEVBQXFCLFNBQXJCLENBQWxCOztBQUVBLGdCQUFJLGNBQWMsa0JBQWxCLEVBQXNDO0FBQ2xDLHFCQUFLLFVBQUwsR0FBa0IsVUFBVSxPQUFWLENBQWtCLFdBQWxCLElBQWlDLENBQW5EO0FBQ0EscUJBQUssT0FBTCxHQUFlLFdBQWY7QUFDQSx1QkFBTyxJQUFQO0FBQ0gsYUFKRCxNQUtLO0FBQ0QscUJBQUssVUFBTCxHQUFrQixDQUFsQjtBQUNBLHVCQUFPLEtBQVA7QUFDSDtBQUNKOztBQUVEO0FBQ0E7QUFDQTs7OzsyQ0FDbUIsTyxFQUFTO0FBQ3hCLGdCQUFJLE1BQU0sS0FBSyxNQUFMLENBQVksZUFBdEI7QUFDQSxnQkFBSSxjQUFjLGlCQUFPLE1BQVAsQ0FBYyxpQkFBTyxHQUFQLENBQVcsUUFBUSxDQUFSLENBQVgsRUFBdUIsUUFBUSxDQUFSLENBQXZCLENBQWQsSUFBb0QsR0FBdEU7QUFDQSxnQkFBSSxVQUFVLFlBQVksV0FBWixFQUF5QixLQUFLLFlBQTlCLENBQWQ7O0FBRUEsZ0JBQUksVUFBVSxvQkFBZCxFQUFtQztBQUMvQixxQkFBSyxPQUFMLEdBQWUsT0FBZjtBQUNBLHVCQUFPLElBQVA7QUFDSCxhQUhELE1BSUs7QUFDRCx1QkFBTyxLQUFQO0FBQ0g7QUFDSjs7QUFFRDs7OztpQ0FDUztBQUNMLGlCQUFLLEtBQUwsR0FBYSxLQUFLLGVBQUwsRUFBYjtBQUNBLGlCQUFLLFFBQUwsR0FBZ0IsS0FBSyxrQkFBTCxFQUFoQjtBQUNBLGlCQUFLLFlBQUw7QUFDSDs7OzBDQUVpQjtBQUNkLGdCQUFJLFVBQVUsS0FBSyxpQkFBTCxFQUFkO0FBQ0EsZ0JBQUksU0FBUyxFQUFiOztBQUVBLG9CQUFRLEtBQUssU0FBYjtBQUNJLHFCQUFLLFVBQVUsTUFBZjtBQUNJLHdCQUFJLFNBQVMsb0JBQW9CLFFBQVEsQ0FBUixDQUFwQixFQUFnQyxRQUFRLENBQVIsQ0FBaEMsQ0FBYjtBQUNBLHdCQUFJLFNBQVMsb0JBQW9CLFFBQVEsQ0FBUixDQUFwQixFQUFnQyxRQUFRLENBQVIsQ0FBaEMsQ0FBYjs7QUFFQSx3QkFBSSxPQUFPLGlCQUFPLEdBQVAsQ0FBVyxRQUFRLENBQVIsQ0FBWCxFQUF1QixRQUFRLENBQVIsQ0FBdkIsQ0FBWDtBQUNBLHdCQUFJLE9BQU8saUJBQU8sR0FBUCxDQUFXLFFBQVEsQ0FBUixDQUFYLEVBQXVCLFFBQVEsQ0FBUixDQUF2QixDQUFYOztBQUVBLHdCQUFJLGNBQWUsS0FBSyxDQUFMLEtBQVcsQ0FBWCxJQUFnQixLQUFLLENBQUwsS0FBVyxDQUE1QixHQUFpQyxDQUFqQyxHQUFxQyxDQUFDLENBQXhEO0FBQ0Esd0JBQUksY0FBSjs7QUFFQSx5QkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssWUFBekIsRUFBdUMsR0FBdkMsRUFBMkM7QUFDdkMsNEJBQUksSUFBSSxLQUFLLFVBQWIsRUFBd0I7QUFDcEIsb0NBQVMsY0FBYyxDQUFmLEdBQW9CLE1BQXBCLEdBQTZCLE1BQXJDO0FBQ0gseUJBRkQsTUFHSztBQUNELG9DQUFTLGNBQWMsQ0FBZixHQUFvQixNQUFwQixHQUE2QixNQUFyQztBQUNIO0FBQ0QsK0JBQU8sSUFBUCxDQUFZLEtBQVo7QUFDSDtBQUNEO0FBQ0oscUJBQUssVUFBVSxTQUFmO0FBQ0ksd0JBQUksUUFBUSxvQkFBb0IsUUFBUSxDQUFSLENBQXBCLEVBQWdDLFFBQVEsQ0FBUixDQUFoQyxDQUFaO0FBQ0EseUJBQUssSUFBSSxLQUFJLENBQWIsRUFBZ0IsS0FBSSxLQUFLLFlBQXpCLEVBQXVDLElBQXZDLEVBQTJDO0FBQ3ZDLCtCQUFPLElBQVAsQ0FBWSxLQUFaO0FBQ0g7QUFDRDtBQTFCUjs7QUE2QkEsbUJBQU8sTUFBUDtBQUNIOztBQUVEOzs7OzZDQUNxQjtBQUNqQixnQkFBSSxVQUFVLEtBQUssaUJBQUwsRUFBZDtBQUNBLGdCQUFJLGlCQUFKOztBQUVBLG9CQUFRLEtBQUssU0FBYjtBQUNJLHFCQUFLLFVBQVUsTUFBZjtBQUNJLCtCQUFXLFFBQVEsQ0FBUixFQUFXLEtBQVgsRUFBWDtBQUNBO0FBQ0oscUJBQUssVUFBVSxTQUFmO0FBQ0ksK0JBQVcsQ0FDUCxPQUFPLFFBQVEsQ0FBUixFQUFXLENBQVgsSUFBZ0IsUUFBUSxDQUFSLEVBQVcsQ0FBWCxDQUF2QixDQURPLEVBRVAsT0FBTyxRQUFRLENBQVIsRUFBVyxDQUFYLElBQWdCLFFBQVEsQ0FBUixFQUFXLENBQVgsQ0FBdkIsQ0FGTyxDQUFYO0FBSUE7QUFUUjs7QUFZQSxtQkFBTyxRQUFQO0FBQ0g7O0FBRUQ7Ozs7d0NBQ2dCO0FBQ1osb0JBQVEsS0FBSyxTQUFiO0FBQ0kscUJBQUssVUFBVSxNQUFmO0FBQ0ksd0JBQUksU0FBUyxLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQWI7QUFDQSx3QkFBSSxTQUFTLENBQWIsRUFBZ0I7QUFDWixrQ0FBVSxJQUFJLEtBQUssRUFBbkI7QUFDSDs7QUFFRCx3QkFBSSxTQUFTLEtBQUssS0FBTCxDQUFXLENBQVgsQ0FBYjtBQUNBLHdCQUFJLFNBQVMsQ0FBYixFQUFnQjtBQUNaLGtDQUFVLElBQUksS0FBSyxFQUFuQjtBQUNIOztBQUVELHdCQUFJLFFBQVEsS0FBSyxHQUFMLENBQVMsU0FBUyxNQUFsQixDQUFaO0FBQ0EsNEJBQVEsS0FBSyxHQUFMLENBQVMsSUFBSSxLQUFLLEVBQVQsR0FBYyxLQUF2QixFQUE4QixLQUE5QixDQUFSOztBQUVBLDJCQUFPLFNBQVMsU0FBaEI7QUFDSixxQkFBSyxVQUFVLFNBQWY7QUFDSSwyQkFBTyxJQUFQO0FBakJSO0FBbUJIOztBQUVEOzs7O3VDQUNlO0FBQ1gsZ0JBQUksTUFBTSxLQUFLLE1BQUwsQ0FBWSxlQUF0QjtBQUNBLGdCQUFJLFNBQVMsQ0FBQyxLQUFLLFlBQUwsR0FBb0IsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFuQixJQUF3QixDQUE3QyxJQUFrRCxHQUFsRCxHQUF3RCxnQkFBTSxPQUEzRTs7QUFFQTtBQUNBLGlCQUFLLElBQUwsR0FBWSxFQUFaO0FBQ0EsaUJBQUssS0FBTCxHQUFhLEVBQWI7O0FBRUE7QUFDQSxnQkFBSSxpQkFBa0IsS0FBSyxNQUFMLENBQVksTUFBYixHQUF1QixJQUFJLEdBQTNCLEdBQWlDLENBQXREOztBQUVBLG9CQUFRLEtBQUssU0FBYjtBQUNJLHFCQUFLLFVBQVUsTUFBZjtBQUNJLHdCQUFJLFNBQVMsS0FBSyxLQUFMLENBQVcsS0FBSyxVQUFMLEdBQWtCLENBQTdCLENBQWIsQ0FESixDQUNrRDtBQUM5Qyx3QkFBSSxTQUFTLEtBQUssS0FBTCxDQUFXLEtBQUssVUFBaEIsQ0FBYixDQUZKLENBRThDO0FBQzFDLHdCQUFJLFFBQVEsS0FBSyxHQUFMLENBQVMsU0FBUyxNQUFsQixDQUFaLENBSEosQ0FHMkM7O0FBRXZDO0FBQ0E7QUFDQSx3QkFBSSxLQUFLLEtBQUssYUFBTCxHQUFxQixLQUFLLEdBQUwsQ0FBUyxLQUFLLFlBQUwsR0FBb0IsS0FBSyxHQUFMLENBQVMsTUFBTSxLQUFmLENBQTdCLENBQTlCO0FBQ0Esd0JBQUksUUFBUSxPQUFPLENBQUMsRUFBRCxHQUFNLEtBQUssV0FBbEIsQ0FBWjs7QUFFQTtBQUNBLHlCQUFLLElBQUksSUFBSSxLQUFLLFVBQUwsR0FBa0IsQ0FBL0IsRUFBa0MsS0FBSyxDQUF2QyxFQUEwQyxHQUExQyxFQUErQztBQUMzQyw0QkFBSSxXQUFXLEtBQUssSUFBTCxDQUFVLENBQVYsRUFBYSxDQUFiLENBQWY7QUFDQSw0QkFBSSxRQUFRLEtBQUssS0FBTCxDQUFXLENBQVgsQ0FBWjs7QUFFQSw0QkFBSSxRQUFRLENBQUMsV0FBVyxJQUFJLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsQ0FBbkIsQ0FBaEIsSUFBeUMsR0FBekMsR0FBK0MsZ0JBQU0sT0FBakU7O0FBRUEsaUNBQVMsTUFBTSxRQUFmOztBQUVBLDRCQUFJLFNBQVMsaUJBQU8sR0FBUCxDQUFXLENBQUMsUUFBUSxHQUFULEVBQWMsQ0FBZCxDQUFYLEVBQTZCLENBQUMsS0FBOUIsQ0FBYjtBQUNBLDRCQUFJLFdBQVcsaUJBQU8sR0FBUCxDQUFXLEtBQUssUUFBaEIsRUFBMEIsTUFBMUIsQ0FBZjs7QUFFQSw0QkFBSSxNQUFNLE9BQU8sUUFBUCxFQUFpQixRQUFRLGNBQXpCLEVBQXlDLE1BQXpDLEVBQWlELEtBQWpELEVBQXdELEtBQUssTUFBN0QsRUFBcUUsR0FBckUsQ0FBVjtBQUNBLDRCQUFJLE9BQU8sSUFBSSxTQUFKLEVBQVg7O0FBRUEsNkJBQUssSUFBTCxDQUFVLElBQVYsQ0FBZSxHQUFmO0FBQ0EsNkJBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsSUFBaEI7O0FBRUEsNkJBQUssT0FBTCxDQUFhLENBQWIsSUFBa0IsQ0FDZCxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLENBQW5CLElBQXdCLEtBRFYsRUFFZCxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLENBQW5CLENBRmMsQ0FBbEI7O0FBS0EsaUNBQVMsTUFBTSxRQUFOLEdBQWlCLEtBQUssV0FBL0I7QUFDSDs7QUFFRDtBQUNBLDRCQUFRLE9BQU8sS0FBSyxLQUFLLFdBQWpCLENBQVI7O0FBRUEseUJBQUssSUFBSSxNQUFJLEtBQUssVUFBbEIsRUFBOEIsTUFBSSxLQUFLLFlBQXZDLEVBQXFELEtBQXJELEVBQXlEO0FBQ3JELDRCQUFJLFlBQVcsS0FBSyxJQUFMLENBQVUsR0FBVixFQUFhLENBQWIsQ0FBZjtBQUNBLDRCQUFJLFNBQVEsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFaOztBQUVBLDRCQUFJLFNBQVEsQ0FBQyxZQUFXLElBQUksS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFuQixDQUFoQixJQUF5QyxHQUF6QyxHQUErQyxnQkFBTSxPQUFqRTs7QUFFQSxpQ0FBUyxNQUFNLFNBQWY7O0FBRUEsNEJBQUksVUFBUyxpQkFBTyxHQUFQLENBQVcsQ0FBQyxRQUFRLEdBQVQsRUFBYyxDQUFkLENBQVgsRUFBNkIsQ0FBQyxNQUE5QixDQUFiO0FBQ0EsNEJBQUksWUFBVyxpQkFBTyxHQUFQLENBQVcsS0FBSyxRQUFoQixFQUEwQixPQUExQixDQUFmOztBQUVBLDRCQUFJLE9BQU0sT0FBTyxTQUFQLEVBQWlCLFNBQVEsY0FBekIsRUFBeUMsTUFBekMsRUFBaUQsTUFBakQsRUFBd0QsS0FBSyxNQUE3RCxFQUFxRSxHQUFyRSxDQUFWO0FBQ0EsNEJBQUksUUFBTyxLQUFJLFNBQUosRUFBWDs7QUFFQSw2QkFBSyxJQUFMLENBQVUsSUFBVixDQUFlLElBQWY7QUFDQSw2QkFBSyxLQUFMLENBQVcsSUFBWCxDQUFnQixLQUFoQjs7QUFFQSw2QkFBSyxPQUFMLENBQWEsR0FBYixJQUFrQixDQUNkLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsQ0FBbkIsSUFBd0IsS0FEVixFQUVkLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsQ0FBbkIsQ0FGYyxDQUFsQjs7QUFLQSxpQ0FBUyxNQUFNLFNBQU4sR0FBaUIsS0FBSyxXQUEvQjtBQUNIO0FBQ0Q7QUFDSixxQkFBSyxVQUFVLFNBQWY7QUFDSSx3QkFBSSxRQUFRLENBQUMsR0FBRCxHQUFPLEtBQUssWUFBeEIsQ0FESixDQUMwQzs7QUFFdEMseUJBQUssSUFBSSxNQUFJLENBQWIsRUFBZ0IsTUFBSSxLQUFLLFlBQXpCLEVBQXVDLEtBQXZDLEVBQTJDO0FBQ3ZDLDRCQUFJLGFBQVcsS0FBSyxJQUFMLENBQVUsR0FBVixFQUFhLENBQWIsQ0FBZjtBQUNBLDRCQUFJLFVBQVEsQ0FBQyxhQUFXLElBQUksS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFuQixDQUFoQixJQUF5QyxHQUF6QyxHQUErQyxnQkFBTSxPQUFqRTtBQUNBLDRCQUFJLFVBQVEsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFaOztBQUVBLGlDQUFTLE1BQU0sVUFBZjs7QUFFQSw0QkFBSSxXQUFTLGlCQUFPLEdBQVAsQ0FBVyxDQUFDLFFBQVEsR0FBVCxFQUFjLENBQWQsQ0FBWCxFQUE2QixDQUFDLE9BQTlCLENBQWI7QUFDQSw0QkFBSSxhQUFXLGlCQUFPLEdBQVAsQ0FBVyxLQUFLLFFBQWhCLEVBQTBCLFFBQTFCLENBQWY7O0FBRUEsNEJBQUksUUFBTSxPQUFPLFVBQVAsRUFBaUIsVUFBUSxjQUF6QixFQUF5QyxNQUF6QyxFQUFpRCxPQUFqRCxFQUF3RCxLQUFLLE1BQTdELEVBQXFFLEdBQXJFLENBQVY7QUFDQSw0QkFBSSxTQUFPLE1BQUksU0FBSixFQUFYOztBQUVBLDZCQUFLLElBQUwsQ0FBVSxJQUFWLENBQWUsS0FBZjtBQUNBLDZCQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLE1BQWhCOztBQUVBLDZCQUFLLE9BQUwsQ0FBYSxHQUFiLElBQWtCLENBQ2QsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFuQixJQUF3QixLQURWLEVBRWQsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFuQixDQUZjLENBQWxCOztBQUtBLGlDQUFTLE1BQU0sVUFBTixHQUFpQixLQUFLLFdBQS9CO0FBQ0g7O0FBRUQ7QUE1RlI7QUE4Rkg7O0FBRUQ7QUFDQTs7Ozt1Q0FDZTtBQUNYLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxLQUFMLENBQVcsTUFBL0IsRUFBdUMsR0FBdkMsRUFBNEM7QUFDeEMsb0JBQUksT0FBTyxLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQVg7QUFDQSxvQkFBSSxNQUFNLEVBQUUsVUFBRixFQUFWO0FBQ0Esb0JBQUksWUFBWSxnQkFBTSxTQUFOLENBQWdCLFlBQWhCLENBQTZCLElBQTdCLENBQWtDLEdBQWxDLENBQWhCO0FBQ0Esb0JBQUksQ0FBQyxTQUFMLEVBQWdCO0FBQ1osMkJBQU8sS0FBUDtBQUNIO0FBQ0o7QUFDRCxtQkFBTyxJQUFQO0FBQ0g7O0FBRUQ7QUFDQTs7Ozs0QkFDSSxNLEVBQVE7QUFDUixpQkFBSyxNQUFMLEdBQWMsSUFBZDtBQUNBLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxLQUFMLENBQVcsTUFBL0IsRUFBdUMsR0FBdkMsRUFBNEM7QUFDeEMsb0JBQUksT0FBTyxLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQVg7QUFDQSxvQkFBSSxNQUFNLEtBQUssSUFBTCxDQUFVLENBQVYsQ0FBVjtBQUNBLG9CQUFJLE1BQU0sRUFBRSxVQUFGLEVBQVEsUUFBUixFQUFWO0FBQ0EsZ0NBQU0sU0FBTixDQUFnQixHQUFoQixDQUFvQixJQUFwQixDQUF5QixHQUF6QixFQUE4QixNQUE5QjtBQUNIO0FBQ0o7O0FBRUQ7QUFDQTs7OztnQ0FDUSxNLEVBQXdCO0FBQUEsZ0JBQWhCLE9BQWdCLHVFQUFOLElBQU07O0FBQzVCLGdCQUFJLEtBQUssVUFBVCxFQUFxQjtBQUNqQix1QkFBTyxJQUFQO0FBQ0g7O0FBRUQsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFLLElBQUwsQ0FBVSxNQUE5QixFQUFzQyxHQUF0QyxFQUEwQztBQUN0QyxvQkFBSSxPQUFPLEtBQUssS0FBTCxDQUFXLENBQVgsQ0FBWDtBQUNBLG9CQUFJLE1BQU0sS0FBSyxJQUFMLENBQVUsQ0FBVixDQUFWO0FBQ0Esb0JBQUksTUFBTSxFQUFFLFVBQUYsRUFBUSxRQUFSLEVBQVY7O0FBRUEsb0JBQUksZ0JBQWdCLGdCQUFNLFNBQU4sQ0FBZ0IsUUFBaEIsQ0FBeUIsSUFBekIsQ0FBOEIsR0FBOUIsRUFBbUMsTUFBbkMsRUFBMkMsT0FBM0MsQ0FBcEI7QUFDQSxvQkFBSSxhQUFKLEVBQW1CO0FBQ2YsMkJBQU8sSUFBUDtBQUNIO0FBQ0o7QUFDRCxtQkFBTyxLQUFQO0FBQ0g7OztrQ0F6WWdCLEssRUFBTztBQUNwQjtBQUNBLGdCQUFJLFVBQVUsTUFBTSxjQUFOLEVBQWQ7QUFDQSxnQkFBSSxDQUFDLE9BQUwsRUFBYztBQUNWLHVCQUFPLEtBQVA7QUFDSDs7QUFFRDtBQUNBLGdCQUFJLFNBQVMsT0FBTyxNQUFQLENBQWMsTUFBTSxNQUFwQixDQUFiO0FBQ0EsbUJBQU8sYUFBUCxHQUF1QixNQUFNLGFBQTdCO0FBQ0EsbUJBQU8sU0FBUCxHQUFtQixNQUFNLFNBQXpCOztBQUVBO0FBQ0EsZ0JBQUksWUFBWSxJQUFJLFNBQUosQ0FBYyxNQUFNLElBQXBCLEVBQTBCLE1BQU0sS0FBaEMsRUFBdUMsTUFBdkMsQ0FBaEI7O0FBRUEsbUJBQVEsVUFBVSxVQUFYLEdBQXlCLEtBQXpCLEdBQWlDLFNBQXhDO0FBQ0g7Ozs7OztBQTRYTDs7O2tCQTlhcUIsUztBQSthckIsU0FBUyxNQUFULENBQWdCLFFBQWhCLEVBQTBCLEtBQTFCLEVBQWlDLE1BQWpDLEVBQXlDLEtBQXpDLEVBQWdELE1BQWhELEVBQXdELEdBQXhELEVBQTZEO0FBQ3pELFFBQUksV0FBSjtBQUFBLFFBQVEsV0FBUjtBQUNBO0FBQ0EsUUFBSSxXQUFXLE9BQU8sQ0FBUCxNQUFjLENBQWQsSUFBbUIsT0FBTyxDQUFQLE1BQWMsQ0FBNUMsQ0FBSixFQUFvRDtBQUNoRCxpQkFBUyxpQkFBTyxHQUFQLENBQVcsTUFBWCxFQUFtQixLQUFuQixDQUFUO0FBQ0EsYUFBSyxTQUFTLENBQVQsSUFBZSxPQUFPLENBQVAsSUFBWSxHQUFoQztBQUNBLGFBQUssU0FBUyxDQUFULElBQWUsT0FBTyxDQUFQLElBQVksR0FBaEM7QUFDSCxLQUpELE1BS0s7QUFDRCxhQUFLLFNBQVMsQ0FBVCxDQUFMO0FBQ0EsYUFBSyxTQUFTLENBQVQsQ0FBTDtBQUNIOztBQUVEO0FBQ0EsV0FBTyxrQkFBUSxFQUFSLEVBQVksRUFBWixFQUFnQixDQUFDLEtBQWpCLEVBQXdCLEtBQXhCLEVBQStCLE1BQS9CLENBQVA7QUFDSDs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxTQUFTLG1CQUFULENBQTZCLEdBQTdCLEVBQWtDLEdBQWxDLEVBQXVDO0FBQ25DLFFBQUksS0FBSyxLQUFLLEVBQWQ7QUFDQSxRQUFJLE9BQU8sS0FBSyxDQUFoQjtBQUNBLFFBQUksT0FBTyxpQkFBTyxHQUFQLENBQVcsR0FBWCxFQUFnQixHQUFoQixDQUFYO0FBQ0EsUUFBSSxRQUFRLEtBQUssS0FBTCxDQUFXLEtBQUssQ0FBTCxDQUFYLEVBQW9CLEtBQUssQ0FBTCxDQUFwQixJQUErQixJQUEzQzs7QUFFQSxRQUFJLFFBQVEsSUFBWixFQUFrQjtBQUNkO0FBQ0EsaUJBQVMsRUFBVDtBQUNBLGlCQUFTLElBQUksS0FBSyxFQUFsQjtBQUNILEtBSkQsTUFLSyxJQUFJLFFBQVEsQ0FBWixFQUFlO0FBQ2hCO0FBQ0EsaUJBQVMsSUFBSSxFQUFiO0FBQ0g7O0FBRUQsV0FBTyxLQUFQO0FBQ0g7O0FBRUQsU0FBUyxXQUFULENBQXFCLFdBQXJCLEVBQWtDLFlBQWxDLEVBQStDO0FBQzNDLFdBQU8sSUFBSSxjQUFjLFlBQXpCO0FBQ0g7Ozs7Ozs7Ozs7Ozs7QUNyZUQ7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7OztJQUVxQixVOzs7QUFFakIsd0JBQWEsUUFBYixFQUF1QixJQUF2QixFQUE2QixNQUE3QixFQUFxQztBQUFBOztBQUFBLDRIQUMzQixJQUQyQixFQUNyQixNQURxQjs7QUFFakMsY0FBSyxRQUFMLEdBQWdCLENBQUMsU0FBUyxDQUFULENBQUQsRUFBYyxTQUFTLENBQVQsQ0FBZCxDQUFoQjtBQUNBLGNBQUssTUFBTCxHQUFjLE1BQUssTUFBTCxDQUFZLE1BQTFCO0FBQ0EsY0FBSyxNQUFMOztBQUVBLGNBQUssa0JBQUwsR0FBMEIsQ0FBMUI7QUFDQSxjQUFLLFVBQUwsR0FBa0IsQ0FBQyxNQUFLLElBQUwsQ0FBVSxDQUFWLENBQUQsSUFBaUIsQ0FBQyxNQUFLLElBQUwsQ0FBVSxDQUFWLENBQWxCLElBQWtDLENBQUMsTUFBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFuQixDQUFuQyxJQUE0RCxDQUFDLE1BQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsQ0FBbkIsQ0FBL0U7QUFDQSxjQUFLLFVBQUwsR0FBa0IsQ0FBQyxNQUFLLFVBQUwsRUFBbkI7QUFSaUM7QUFTcEM7Ozs7aUNBRVE7QUFDTDtBQUNBLGlCQUFLLGFBQUw7QUFDQSxpQkFBSyxZQUFMO0FBQ0g7Ozt3Q0FFZ0I7QUFDYixpQkFBSyxNQUFMLEdBQWMsQ0FBQyxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLENBQW5CLENBQUQsRUFBd0IsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFuQixDQUF4QixDQUFkOztBQUVBO0FBQ0EsZ0JBQUksS0FBSyxNQUFULEVBQWlCO0FBQ2Isb0JBQUksU0FBUyxLQUFLLE1BQWxCO0FBQ0E7QUFDQSxxQkFBSyxNQUFMLEdBQWMsdUJBQVksYUFBWixDQUEwQixLQUFLLE1BQS9CLEVBQXVDLE9BQU8sSUFBOUMsRUFBb0QsT0FBTyxNQUEzRCxFQUFtRSx1QkFBWSxXQUEvRSxDQUFkO0FBQ0EscUJBQUssTUFBTCxHQUFjLHVCQUFZLGFBQVosQ0FBMEIsS0FBSyxNQUEvQixFQUF1QyxPQUFPLElBQTlDLEVBQW9ELEtBQUssTUFBekQsRUFBaUUsdUJBQVksV0FBN0UsQ0FBZDtBQUNBLG9CQUFJLE9BQU8sTUFBUCxLQUFrQiwwQkFBWSxRQUFsQyxFQUE0QztBQUFTO0FBQ2pELHdCQUFJLEtBQUssTUFBTCxLQUFnQiwwQkFBWSxRQUFoQyxFQUEwQztBQUFPO0FBQzdDLDZCQUFLLE1BQUwsR0FBYyxPQUFPLE1BQXJCO0FBQ0gscUJBRkQsTUFHSztBQUE0QztBQUM3Qyw2QkFBSyxNQUFMLENBQVksQ0FBWixLQUFrQixPQUFPLE1BQVAsQ0FBYyxDQUFkLENBQWxCO0FBQ0EsNkJBQUssTUFBTCxDQUFZLENBQVosS0FBa0IsT0FBTyxNQUFQLENBQWMsQ0FBZCxDQUFsQjtBQUNIO0FBQ0o7QUFDSjs7QUFFRCxpQkFBSyxNQUFMLEdBQWMsdUJBQVksYUFBWixDQUEwQixLQUFLLE1BQS9CLEVBQXVDLEtBQUssSUFBNUMsRUFBa0QsS0FBSyxNQUF2RCxDQUFkO0FBQ0g7Ozt1Q0FFZTtBQUNaLGdCQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUwsQ0FBVSxDQUFWLElBQWUsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFuQixJQUF3QixDQUF4QyxJQUE2QyxLQUFLLE1BQUwsQ0FBWSxlQUF6RCxHQUEyRSxnQkFBTSxPQUE3RjtBQUNBLGdCQUFJLFNBQVMsQ0FBQyxLQUFLLElBQUwsQ0FBVSxDQUFWLElBQWUsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFuQixJQUF3QixDQUF4QyxJQUE2QyxLQUFLLE1BQUwsQ0FBWSxlQUF6RCxHQUEyRSxnQkFBTSxPQUE5Rjs7QUFFQTtBQUNBLGdCQUFJLEtBQUssTUFBTCxDQUFZLE1BQWhCLEVBQXVCO0FBQ25CLHlCQUFTLElBQUksS0FBSyxNQUFMLENBQVksZUFBekI7QUFDSDs7QUFFRCxnQkFBSSxJQUFJLENBQ0osS0FBSyxRQUFMLENBQWMsQ0FBZCxJQUFvQixLQUFLLE1BQUwsQ0FBWSxDQUFaLElBQWlCLEtBQUssTUFBTCxDQUFZLGVBRDdDLEVBRUosS0FBSyxRQUFMLENBQWMsQ0FBZCxJQUFvQixLQUFLLE1BQUwsQ0FBWSxDQUFaLElBQWlCLEtBQUssTUFBTCxDQUFZLGVBRjdDLENBQVI7O0FBS0EsaUJBQUssR0FBTCxHQUFXLGtCQUFRLEVBQUUsQ0FBRixDQUFSLEVBQWMsRUFBRSxDQUFGLENBQWQsRUFBb0IsQ0FBcEIsRUFBdUIsS0FBdkIsRUFBOEIsTUFBOUIsQ0FBWDtBQUNBLGlCQUFLLElBQUwsR0FBWSxLQUFLLEdBQUwsQ0FBUyxTQUFULEVBQVo7QUFDSDs7QUFFRDtBQUNBOzs7O3VDQUNnQjtBQUNaLGdCQUFJLFVBQVUsS0FBZDs7QUFFQSxnQkFBSSxLQUFLLElBQUwsQ0FBVSxDQUFWLElBQWUsQ0FBbkIsRUFBc0I7QUFDbEIscUJBQUssUUFBTCxDQUFjLENBQWQsS0FBb0IsQ0FBQyxLQUFLLElBQUwsQ0FBVSxDQUFWLENBQXJCO0FBQ0EsMEJBQVUsSUFBVjtBQUNIOztBQUVELGdCQUFJLEtBQUssSUFBTCxDQUFVLENBQVYsS0FBZ0IsY0FBSSxVQUF4QixFQUFvQztBQUNoQyxxQkFBSyxRQUFMLENBQWMsQ0FBZCxLQUFvQixLQUFLLElBQUwsQ0FBVSxDQUFWLElBQWUsY0FBSSxVQUFuQixHQUFnQyxDQUFwRDtBQUNBLDBCQUFVLElBQVY7QUFDSDs7QUFFRCxnQkFBSSxLQUFLLElBQUwsQ0FBVSxDQUFWLElBQWUsQ0FBbkIsRUFBc0I7QUFDbEIscUJBQUssUUFBTCxDQUFjLENBQWQsS0FBb0IsS0FBSyxJQUFMLENBQVUsQ0FBVixDQUFwQjtBQUNBLDBCQUFVLElBQVY7QUFDSDs7QUFFRCxnQkFBSSxLQUFLLElBQUwsQ0FBVSxDQUFWLEtBQWdCLENBQUMsY0FBSSxVQUF6QixFQUFxQztBQUNqQyxxQkFBSyxRQUFMLENBQWMsQ0FBZCxLQUFvQixLQUFLLElBQUwsQ0FBVSxDQUFWLElBQWUsY0FBSSxVQUFuQixHQUFnQyxDQUFwRDtBQUNBLDBCQUFVLElBQVY7QUFDSDs7QUFFRCxnQkFBSSxPQUFKLEVBQWE7QUFDVCxxQkFBSyxZQUFMO0FBQ0g7O0FBRUQsbUJBQU8sT0FBUDtBQUNIOzs7cUNBRVk7QUFDVCxnQkFBSSxDQUFDLEtBQUssTUFBTCxDQUFZLGNBQWIsSUFBK0IsS0FBSyxZQUFMLEVBQW5DLEVBQXdEO0FBQ3BELHVCQUFPLElBQVA7QUFDSDs7QUFFRCxnQkFBSSxLQUFLLE1BQUwsQ0FBWSxjQUFoQixFQUErQjtBQUMzQixxQkFBSyxZQUFMO0FBQ0EsdUJBQU8sSUFBUDtBQUNILGFBSEQsTUFJSztBQUNELG9CQUFJLE1BQU0sT0FBTixDQUFjLEtBQUssTUFBTCxDQUFZLE1BQTFCLENBQUosRUFBdUM7QUFDbkM7QUFDQSx5QkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsTUFBdkMsRUFBK0MsR0FBL0MsRUFBb0Q7QUFDaEQsNkJBQUssTUFBTCxHQUFjLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsQ0FBbkIsQ0FBZDtBQUNBLDZCQUFLLE1BQUw7O0FBRUEsNkJBQUssa0JBQUwsR0FBMEIsQ0FBMUI7O0FBRUEsNEJBQUksS0FBSyxZQUFMLEVBQUosRUFBeUI7QUFDckIsbUNBQU8sSUFBUDtBQUNIO0FBQ0o7QUFDSjs7QUFFRDtBQUNBLHVCQUFPLEtBQVA7QUFDSDtBQUNKOzs7Z0NBRVEsTSxFQUF3QjtBQUFBLGdCQUFoQixPQUFnQix1RUFBTixJQUFNOztBQUM3QixnQkFBSSxLQUFLLFVBQVQsRUFBcUI7QUFDakIsdUJBQU8sS0FBUDtBQUNIOztBQUVELGdJQUFrQixNQUFsQixFQUEwQixPQUExQixHQUFvQztBQUNoQztBQUNBLG9CQUFJLE1BQU0sT0FBTixDQUFjLEtBQUssTUFBTCxDQUFZLE1BQTFCLENBQUosRUFBdUM7QUFDbkM7QUFDQSx5QkFBSyxJQUFJLElBQUUsS0FBSyxrQkFBaEIsRUFBb0MsSUFBSSxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLE1BQTNELEVBQW1FLEdBQW5FLEVBQXdFO0FBQ3BFLDZCQUFLLE1BQUwsR0FBYyxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLENBQW5CLENBQWQ7QUFDQSw2QkFBSyxNQUFMOztBQUVBLDRCQUFJLEtBQUssTUFBTCxDQUFZLGNBQVosSUFBOEIsQ0FBQyxLQUFLLFlBQUwsRUFBbkMsRUFBd0Q7QUFDcEQ7QUFDSDs7QUFFRCw0QkFBSSxpSEFBZSxNQUFmLEVBQXVCLE9BQXZCLENBQUosRUFBcUM7QUFDakMsbUNBQU8sS0FBUDtBQUNIO0FBQ0o7QUFDSjtBQUNELHVCQUFPLElBQVA7QUFDSDtBQUNELG1CQUFPLEtBQVA7QUFDSDs7Ozs7O0FBSUw7OztrQkF0SnFCLFU7QUF1SnJCLFdBQVcsU0FBWCxHQUF1QjtBQUNuQixZQUFRLENBRFcsRUFDQztBQUNwQixjQUFVLENBRlMsRUFFQztBQUNwQixZQUFRLENBSFcsRUFHQztBQUNwQixjQUFVLENBSlMsQ0FJQztBQUpELENBQXZCOzs7Ozs7OztBQzdKQTtBQUNBLElBQU0sUUFBUSxDQUFDLE1BQUQsRUFBUyxVQUFULEVBQXFCLGFBQXJCLENBQWQ7QUFDQSxJQUFNLFNBQVMsQ0FBQyxPQUFELEVBQVUsV0FBVixFQUF1QixjQUF2QixDQUFmO0FBQ0EsSUFBTSxPQUFPLENBQUMsS0FBRCxFQUFRLFVBQVIsRUFBb0IsV0FBcEIsQ0FBYjtBQUNBLElBQU0sVUFBVSxDQUFDLFFBQUQsRUFBVyxhQUFYLEVBQTBCLGNBQTFCLENBQWhCOztBQUVBLElBQUksb0JBQUo7O2tCQUVlLGNBQWM7QUFFekIsaUJBRnlCLHlCQUVWLE1BRlUsRUFFRixJQUZFLEVBRUksTUFGSixFQUUyQjtBQUFBLFlBQWYsTUFBZSx1RUFBTixJQUFNOztBQUNoRCxZQUFJLENBQUMsTUFBRCxJQUFXLFdBQVcsUUFBMUIsRUFBb0M7QUFDaEMsbUJBQU8sTUFBUDtBQUNIOztBQUVELFlBQUksVUFBVSxDQUFDLE9BQU8sQ0FBUCxDQUFELEVBQVksT0FBTyxDQUFQLENBQVosQ0FBZDtBQUNBLGlCQUFTLFVBQVUsS0FBSyxjQUF4Qjs7QUFFQTtBQUNBLFlBQUksS0FBSyxZQUFMLENBQWtCLE1BQWxCLENBQUosRUFBK0I7QUFDM0Isb0JBQVEsQ0FBUixLQUFjLEtBQUssQ0FBTCxJQUFVLENBQXhCO0FBQ0EsZ0JBQUksV0FBVyxNQUFmLEVBQXVCO0FBQ25CLHdCQUFRLENBQVIsS0FBYyxPQUFPLENBQVAsQ0FBZDtBQUNIO0FBQ0osU0FMRCxNQU1LLElBQUksS0FBSyxhQUFMLENBQW1CLE1BQW5CLENBQUosRUFBZ0M7QUFDakMsb0JBQVEsQ0FBUixLQUFjLEtBQUssQ0FBTCxJQUFVLENBQXhCO0FBQ0EsZ0JBQUksV0FBVyxPQUFmLEVBQXdCO0FBQ3BCLHdCQUFRLENBQVIsS0FBYyxPQUFPLENBQVAsQ0FBZDtBQUNIO0FBQ0o7O0FBRUQ7QUFDQSxZQUFJLEtBQUssV0FBTCxDQUFpQixNQUFqQixDQUFKLEVBQThCO0FBQzFCLG9CQUFRLENBQVIsS0FBYyxLQUFLLENBQUwsSUFBVSxDQUF4QjtBQUNBLGdCQUFJLFdBQVcsS0FBZixFQUFzQjtBQUNsQix3QkFBUSxDQUFSLEtBQWMsT0FBTyxDQUFQLENBQWQ7QUFDSDtBQUNKLFNBTEQsTUFNSyxJQUFJLEtBQUssY0FBTCxDQUFvQixNQUFwQixDQUFKLEVBQWlDO0FBQ2xDLG9CQUFRLENBQVIsS0FBYyxLQUFLLENBQUwsSUFBVSxDQUF4QjtBQUNBLGdCQUFJLFdBQVcsUUFBZixFQUF5QjtBQUNyQix3QkFBUSxDQUFSLEtBQWMsT0FBTyxDQUFQLENBQWQ7QUFDSDtBQUNKOztBQUVELGVBQU8sT0FBUDtBQUNILEtBdkN3QjtBQXlDekIsa0JBekN5QiwwQkF5Q1QsTUF6Q1MsRUF5Q0Q7QUFDcEIsWUFBSSxVQUFVLFdBQVcsUUFBekIsRUFBbUM7QUFDL0IsZ0JBQUksS0FBSyxZQUFMLENBQWtCLE1BQWxCLENBQUosRUFBK0I7QUFDM0IsdUJBQU8sT0FBUDtBQUNILGFBRkQsTUFHSyxJQUFJLEtBQUssYUFBTCxDQUFtQixNQUFuQixDQUFKLEVBQWdDO0FBQ2pDLHVCQUFPLE1BQVA7QUFDSDtBQUNKO0FBQ0QsZUFBTyxRQUFQO0FBQ0gsS0FuRHdCO0FBcUR6QixnQkFyRHlCLHdCQXFEWCxNQXJEVyxFQXFESDtBQUNsQixlQUFRLE1BQU0sT0FBTixDQUFjLE1BQWQsSUFBd0IsQ0FBQyxDQUFqQztBQUNILEtBdkR3QjtBQXlEekIsaUJBekR5Qix5QkF5RFYsTUF6RFUsRUF5REY7QUFDbkIsZUFBUSxPQUFPLE9BQVAsQ0FBZSxNQUFmLElBQXlCLENBQUMsQ0FBbEM7QUFDSCxLQTNEd0I7QUE2RHpCLGVBN0R5Qix1QkE2RFosTUE3RFksRUE2REo7QUFDakIsZUFBUSxLQUFLLE9BQUwsQ0FBYSxNQUFiLElBQXVCLENBQUMsQ0FBaEM7QUFDSCxLQS9Ed0I7QUFpRXpCLGtCQWpFeUIsMEJBaUVULE1BakVTLEVBaUVEO0FBQ3BCLGVBQVEsUUFBUSxPQUFSLENBQWdCLE1BQWhCLElBQTBCLENBQUMsQ0FBbkM7QUFDSCxLQW5Fd0I7OztBQXFFekI7QUFDQSxvQkFBZ0IsQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXLEdBQVgsRUFBZ0IsSUFBaEIsQ0F0RVM7QUF1RXpCLGlCQUFhLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVjs7QUF2RVksQzs7Ozs7Ozs7a0JDQUwsaUI7O0FBTnhCOzs7O0FBQ0E7Ozs7QUFIQTs7QUFLQSxJQUFNLFlBQVksc0JBQVcsU0FBN0I7QUFDQSxJQUFNLGtCQUFrQixFQUF4QixDLENBQTRCOztBQUViLFNBQVMsaUJBQVQsQ0FBNEIsSUFBNUIsRUFBa0MsSUFBbEMsRUFBd0MsT0FBeEMsRUFBaUQ7QUFDNUQsUUFBSSxTQUFTLEVBQWI7QUFDQSxRQUFJLFdBQVcsUUFBUSxTQUF2QjtBQUNBLFFBQUksYUFBYSxLQUFLLEdBQUwsQ0FBUyxLQUFLLENBQUwsQ0FBVCxFQUFrQixLQUFLLENBQUwsQ0FBbEIsSUFBNkIsUUFBUSwwQkFBckMsR0FBa0UsUUFBUSxlQUEzRjs7QUFFQSxZQUFRLFFBQVI7QUFDSSxhQUFLLFVBQVUsTUFBZjtBQUNJLGdCQUFJLFNBQVMsc0JBQXNCLElBQXRCLEVBQTRCLFVBQTVCLEVBQXdDLE9BQXhDLENBQWI7QUFDQTtBQUNBLGdCQUFJLENBQUMsTUFBTCxFQUFhO0FBQ1QsdUJBQU8sRUFBUDtBQUNIOztBQUVELGdCQUFJLFlBQVksT0FBTyxTQUF2QjtBQUNBLGdCQUFJLFNBQVMsT0FBTyxNQUFwQjtBQUNBLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksVUFBVSxNQUE5QixFQUFzQyxHQUF0QyxFQUEwQztBQUN0QyxvQkFBSSxXQUFXLFVBQVUsQ0FBVixDQUFmO0FBQ0Esb0JBQUksUUFBUSxPQUFPLENBQVAsQ0FBWjtBQUNBLG9CQUFJLFFBQVEsVUFBUixLQUF1QixJQUF2QixJQUErQixDQUFDLGdDQUFtQixRQUFuQixDQUFwQyxFQUFrRTtBQUM5RCx3QkFBSSxTQUFRLDBCQUFlLFFBQWYsRUFBeUIsSUFBekIsRUFBK0IsT0FBL0IsQ0FBWjtBQUNBLDJCQUFNLEtBQU4sR0FBYyxLQUFkO0FBQ0EsMkJBQU8sSUFBUCxDQUFZLE1BQVo7QUFDSDtBQUNKO0FBQ0Q7QUFDSixhQUFLLFVBQVUsTUFBZjtBQUNJLGdCQUFJLFVBQUo7QUFBQSxnQkFBTyxVQUFQO0FBQUEsZ0JBQVUsY0FBVjtBQUNBLGlCQUFLLElBQUksS0FBSSxDQUFiLEVBQWdCLEtBQUksS0FBSyxNQUFMLEdBQWMsQ0FBbEMsRUFBcUMsSUFBckMsRUFBeUM7QUFDckMsb0JBQUksS0FBSyxFQUFMLENBQUo7QUFDQSxvQkFBSSxLQUFLLEtBQUksQ0FBVCxDQUFKO0FBQ0Esb0JBQUksUUFBUSxVQUFSLEtBQXVCLElBQXZCLElBQStCLENBQUMsZ0NBQW1CLENBQW5CLENBQXBDLEVBQTJEO0FBQ3ZELDRCQUFRLDBCQUFlLENBQWYsRUFBa0IsSUFBbEIsRUFBd0IsT0FBeEIsQ0FBUjtBQUNBLDBCQUFNLEtBQU4sR0FBYyxTQUFTLENBQVQsRUFBWSxDQUFaLEVBQWUsUUFBUSxLQUF2QixDQUFkO0FBQ0EsMkJBQU8sSUFBUCxDQUFZLEtBQVo7QUFDSDtBQUNKOztBQUVEO0FBQ0Esb0JBQVEsMEJBQWUsQ0FBZixFQUFrQixJQUFsQixFQUF3QixPQUF4QixDQUFSO0FBQ0Esa0JBQU0sS0FBTixHQUFjLFNBQVMsQ0FBVCxFQUFZLENBQVosRUFBZSxRQUFRLEtBQXZCLENBQWQ7QUFDQSxtQkFBTyxJQUFQLENBQVksS0FBWjtBQUNBO0FBQ0osYUFBSyxVQUFVLFFBQWY7QUFDSSxpQkFBSyxJQUFJLE1BQUksQ0FBYixFQUFnQixNQUFJLEtBQUssTUFBTCxHQUFjLENBQWxDLEVBQXFDLEtBQXJDLEVBQXlDO0FBQ3JDLG9CQUFJLEtBQUksS0FBSyxHQUFMLENBQVI7QUFDQSxvQkFBSSxLQUFJLEtBQUssTUFBSSxDQUFULENBQVI7QUFDQSxvQkFBSSxZQUFXLENBQ1gsT0FBTyxHQUFFLENBQUYsSUFBTyxHQUFFLENBQUYsQ0FBZCxDQURXLEVBRVgsT0FBTyxHQUFFLENBQUYsSUFBTyxHQUFFLENBQUYsQ0FBZCxDQUZXLENBQWY7QUFJQSxvQkFBSSxRQUFRLFVBQVIsS0FBdUIsSUFBdkIsSUFBK0IsQ0FBQyxnQ0FBbUIsU0FBbkIsQ0FBcEMsRUFBa0U7QUFDOUQsd0JBQUksQ0FBQyxVQUFELElBQWUsS0FBSyxFQUFMLEVBQVEsRUFBUixJQUFhLFVBQWhDLEVBQTRDO0FBQ3hDLDRCQUFJLFVBQVEsMEJBQWUsU0FBZixFQUF5QixJQUF6QixFQUErQixPQUEvQixDQUFaO0FBQ0EsZ0NBQU0sS0FBTixHQUFjLFNBQVMsRUFBVCxFQUFZLEVBQVosRUFBZSxRQUFRLEtBQXZCLENBQWQ7QUFDQSwrQkFBTyxJQUFQLENBQVksT0FBWjtBQUNIO0FBQ0o7QUFDSjtBQUNEO0FBckRSO0FBdURBLFdBQU8sTUFBUDtBQUNIOztBQUVELFNBQVMscUJBQVQsQ0FBK0IsSUFBL0IsRUFBcUMsVUFBckMsRUFBaUQsT0FBakQsRUFBeUQ7QUFDckQsUUFBSSxNQUFNLFFBQVEsZUFBbEI7QUFDQSxRQUFJLFVBQVUsQ0FBQyxRQUFRLGlCQUFSLElBQTZCLGVBQTlCLElBQWlELEdBQS9EOztBQUVBLFFBQUksU0FBUyxjQUFjLElBQWQsQ0FBYjtBQUNBLFFBQUksVUFBVSxVQUFkLEVBQTBCO0FBQ3RCLGVBQU8sS0FBUDtBQUNIOztBQUVELFFBQUksYUFBYSxLQUFLLEdBQUwsQ0FBUyxLQUFLLEtBQUwsQ0FBVyxTQUFTLE9BQXBCLENBQVQsRUFBdUMsQ0FBdkMsQ0FBakI7QUFDQSxRQUFJLFlBQVksU0FBUyxDQUFDLGFBQWEsQ0FBZCxJQUFtQixPQUE1QztBQUNBLFFBQUksWUFBWSxFQUFoQjtBQUNBLFFBQUksU0FBUyxFQUFiOztBQUVBLFFBQUksV0FBVyxNQUFNLFNBQXJCO0FBQ0EsU0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFVBQXBCLEVBQWdDLEdBQWhDLEVBQW9DO0FBQUEsK0JBQ1IsZ0JBQWdCLElBQWhCLEVBQXNCLFFBQXRCLEVBQWdDLFVBQWhDLEVBQTRDLE9BQTVDLENBRFE7QUFBQSxZQUMzQixRQUQyQixvQkFDM0IsUUFEMkI7QUFBQSxZQUNqQixLQURpQixvQkFDakIsS0FEaUI7O0FBRWhDLFlBQUksWUFBWSxJQUFaLElBQW9CLFNBQVMsSUFBakMsRUFBdUM7QUFDbkMsc0JBQVUsSUFBVixDQUFlLFFBQWY7QUFDQSxtQkFBTyxJQUFQLENBQVksS0FBWjtBQUNIO0FBQ0Qsb0JBQVksT0FBWjtBQUNIOztBQUVELFdBQU8sRUFBQyxvQkFBRCxFQUFZLGNBQVosRUFBUDtBQUNIOztBQUVELFNBQVMsUUFBVCxDQUFrQixDQUFsQixFQUFxQixDQUFyQixFQUFrQztBQUFBLFFBQVYsS0FBVSx1RUFBRixDQUFFOztBQUM5QixXQUFRLFVBQVUsTUFBWCxHQUFxQixLQUFLLEtBQUwsQ0FBVyxFQUFFLENBQUYsSUFBTyxFQUFFLENBQUYsQ0FBbEIsRUFBd0IsRUFBRSxDQUFGLElBQU8sRUFBRSxDQUFGLENBQS9CLENBQXJCLEdBQTRELEtBQW5FO0FBQ0g7O0FBRUQsU0FBUyxhQUFULENBQXVCLElBQXZCLEVBQTRCO0FBQ3hCLFFBQUksV0FBVyxDQUFmO0FBQ0EsU0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssTUFBTCxHQUFjLENBQWxDLEVBQXFDLEdBQXJDLEVBQXlDO0FBQ3JDLG9CQUFZLEtBQUssS0FBSyxDQUFMLENBQUwsRUFBYyxLQUFLLElBQUUsQ0FBUCxDQUFkLENBQVo7QUFDSDtBQUNELFdBQU8sUUFBUDtBQUNIOztBQUVELFNBQVMsSUFBVCxDQUFjLENBQWQsRUFBaUIsQ0FBakIsRUFBbUI7QUFDZixXQUFPLEtBQUssSUFBTCxDQUFVLEtBQUssR0FBTCxDQUFTLEVBQUUsQ0FBRixJQUFPLEVBQUUsQ0FBRixDQUFoQixFQUFzQixDQUF0QixJQUEyQixLQUFLLEdBQUwsQ0FBUyxFQUFFLENBQUYsSUFBTyxFQUFFLENBQUYsQ0FBaEIsRUFBc0IsQ0FBdEIsQ0FBckMsQ0FBUDtBQUNIOztBQUVELFNBQVMsZUFBVCxDQUF5QixJQUF6QixFQUErQixRQUEvQixFQUF5QyxVQUF6QyxFQUFxRCxPQUFyRCxFQUE2RDtBQUN6RCxRQUFJLE1BQU0sQ0FBVjtBQUNBLFFBQUksaUJBQUo7QUFBQSxRQUFjLGNBQWQ7QUFDQSxTQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxNQUFMLEdBQVksQ0FBaEMsRUFBbUMsR0FBbkMsRUFBdUM7QUFDbkMsWUFBSSxJQUFJLEtBQUssQ0FBTCxDQUFSO0FBQ0EsWUFBSSxJQUFJLEtBQUssSUFBRSxDQUFQLENBQVI7O0FBRUEsWUFBTSxTQUFTLEtBQUssQ0FBTCxFQUFRLENBQVIsQ0FBZjtBQUNBLFlBQUksVUFBVSxVQUFkLEVBQTBCO0FBQ3RCO0FBQ0g7O0FBRUQsZUFBTyxNQUFQOztBQUVBLFlBQUksTUFBTSxRQUFWLEVBQW1CO0FBQ2YsdUJBQVcsbUJBQW1CLENBQW5CLEVBQXNCLENBQXRCLEVBQXlCLE1BQU0sUUFBL0IsQ0FBWDtBQUNBLG9CQUFRLFNBQVMsQ0FBVCxFQUFZLENBQVosRUFBZSxRQUFRLEtBQXZCLENBQVI7QUFDQTtBQUNIO0FBQ0o7QUFDRCxXQUFPLEVBQUMsa0JBQUQsRUFBVyxZQUFYLEVBQVA7QUFDSDs7QUFFRCxTQUFTLGtCQUFULENBQTRCLENBQTVCLEVBQStCLENBQS9CLEVBQWtDLFFBQWxDLEVBQTJDO0FBQ3ZDLFFBQUksU0FBUyxLQUFLLENBQUwsRUFBUSxDQUFSLENBQWI7QUFDQSxRQUFJLFFBQVEsV0FBVyxNQUF2QjtBQUNBLFdBQU8sQ0FDSCxRQUFRLEVBQUUsQ0FBRixDQUFSLEdBQWUsQ0FBQyxJQUFJLEtBQUwsSUFBYyxFQUFFLENBQUYsQ0FEMUIsRUFFSCxRQUFRLEVBQUUsQ0FBRixDQUFSLEdBQWUsQ0FBQyxJQUFJLEtBQUwsSUFBYyxFQUFFLENBQUYsQ0FGMUIsQ0FBUDtBQUlIOzs7Ozs7Ozs7OztBQ2hKRDs7Ozs7Ozs7SUFFcUIsVztBQUVqQix5QkFBYSxHQUFiLEVBQWtCLFdBQWxCLEVBQStCLGVBQS9CLEVBQWdEO0FBQUE7O0FBQzVDLGFBQUssR0FBTCxHQUFXLEdBQVg7QUFDQSxhQUFLLFdBQUwsR0FBbUIsV0FBbkI7QUFDQSxhQUFLLGNBQUwsR0FBc0IsS0FBSyxXQUFMLEdBQW1CLEtBQUssV0FBOUM7QUFDQSxhQUFLLGtCQUFMLEdBQTBCLGtCQUFrQixlQUE1QztBQUNBLGFBQUssYUFBTCxHQUFzQixLQUFLLGNBQUwsSUFBdUIsS0FBSyxrQkFBN0IsR0FBbUQsSUFBbkQsR0FBMEQsS0FBL0U7QUFDQSxhQUFLLFNBQUwsR0FBaUIsRUFBakI7QUFDSDs7QUFFRDs7Ozs7OEJBQ08sRyxFQUFLO0FBQ1I7QUFDQSxnQkFBSSxLQUFLLGFBQVQsRUFBd0I7QUFDcEIsb0JBQUksS0FBSyxTQUFMLENBQWUsTUFBZixHQUF3QixDQUE1QixFQUErQjtBQUMzQjtBQUNBO0FBQ0EsMkJBQU87QUFDSCxpQ0FBUyxLQUFLLGtCQURYO0FBRUgsd0NBQWdCLEtBQUssY0FGbEI7QUFHSCx1Q0FBZSxLQUFLO0FBSGpCLHFCQUFQO0FBS0g7QUFDRCx1QkFWb0IsQ0FVWjtBQUNYOztBQUVEO0FBQ0EsZ0JBQUksS0FBSyxJQUFJLFFBQWI7QUFDQSxpQkFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksS0FBSyxTQUFMLENBQWUsTUFBakMsRUFBeUMsR0FBekMsRUFBOEM7QUFDMUMsb0JBQUksS0FBSyxLQUFLLFNBQUwsQ0FBZSxDQUFmLENBQVQ7QUFDQSxvQkFBSSxLQUFLLEdBQUcsQ0FBSCxJQUFRLEdBQUcsQ0FBSCxDQUFqQjtBQUNBLG9CQUFJLEtBQUssR0FBRyxDQUFILElBQVEsR0FBRyxDQUFILENBQWpCO0FBQ0Esb0JBQUksVUFBVSxLQUFLLEVBQUwsR0FBVSxLQUFLLEVBQTdCOztBQUVBO0FBQ0Esb0JBQUksVUFBVSxLQUFLLGNBQW5CLEVBQW1DO0FBQy9CLDJCQUFPO0FBQ0gsd0NBREc7QUFFSCx3Q0FBZ0IsS0FBSztBQUZsQixxQkFBUDtBQUlIO0FBQ0o7QUFDSjs7QUFFRDs7Ozs0QkFDSyxHLEVBQUs7QUFDTjtBQUNBLGdCQUFJLE9BQU8sSUFBSSxRQUFmLEVBQXlCO0FBQ3JCLHFCQUFLLFNBQUwsQ0FBZSxJQUFmLENBQW9CLElBQUksUUFBeEI7QUFDSDtBQUNKOztBQUVEOztBQUVBOzs7OzhCQUNjLEksRUFBTTtBQUNoQixpQkFBSyxNQUFMLENBQVksSUFBWixJQUFvQixFQUFwQjtBQUNIOztBQUVEOzs7OzhCQUNjLEcsRUFBSyxNLEVBQVEsSSxFQUFNO0FBQzdCLGdCQUFJLE9BQU8sZUFBUCxJQUEwQixPQUFPLFlBQWpDLElBQWlELEtBQUssTUFBTCxDQUFZLElBQVosRUFBa0IsT0FBTyxZQUF6QixDQUFyRCxFQUE2RjtBQUN6Rix1QkFBTyxLQUFLLE1BQUwsQ0FBWSxJQUFaLEVBQWtCLE9BQU8sWUFBekIsRUFBdUMsS0FBdkMsQ0FBNkMsR0FBN0MsQ0FBUDtBQUNIO0FBQ0o7O0FBRUQ7Ozs7NEJBQ1ksRyxFQUFLLE0sRUFBUSxJLEVBQU07QUFDM0IsZ0JBQUksT0FBTyxlQUFQLElBQTBCLE9BQU8sWUFBckMsRUFBbUQ7QUFDL0Msb0JBQUksS0FBSyxNQUFMLENBQVksSUFBWixFQUFrQixPQUFPLFlBQXpCLEtBQTBDLElBQTlDLEVBQW9EO0FBQ2hELHlCQUFLLE1BQUwsQ0FBWSxJQUFaLEVBQWtCLE9BQU8sWUFBekIsSUFBeUMsSUFBSSxXQUFKLENBQ3JDLE9BQU8sWUFEOEIsRUFFckMsT0FBTyxlQUY4QixFQUdyQyxZQUFZLGVBSHlCLENBQXpDO0FBS0g7QUFDRCxxQkFBSyxNQUFMLENBQVksSUFBWixFQUFrQixPQUFPLFlBQXpCLEVBQXVDLEdBQXZDLENBQTJDLEdBQTNDO0FBQ0g7QUFDSjs7Ozs7O0FBSUw7OztrQkFuRnFCLFc7QUFvRnJCLFlBQVksTUFBWixHQUFxQixFQUFyQjs7QUFFQTtBQUNBO0FBQ0EsWUFBWSxlQUFaLEdBQThCLGNBQUksVUFBbEM7Ozs7Ozs7Ozs7OztRQ3BGZ0IsWSxHQUFBLFk7O0FBTmhCOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUE7QUFDTyxJQUFJLCtDQUFKO0FBQ0EsU0FBUyxZQUFULENBQXNCLE9BQXRCLEVBQStCO0FBQ2xDLFdBQU8sY0FBYyxPQUFkLENBQVA7QUFDSDs7QUFFRCxTQUFTLGFBQVQsQ0FBdUIsT0FBdkIsRUFBZ0M7O0FBRTVCO0FBQ0E7QUFDQSxRQUFJLE9BQU8sWUFBUCxLQUF3QixXQUE1QixFQUF5QztBQUNyQyxlQUFPLElBQUksWUFBSixDQUFpQixPQUFqQixDQUFQO0FBQ0g7O0FBRUQ7QUFDQSxRQUFJLGlCQUFPLE9BQVgsRUFBb0I7QUFBQTs7QUFFaEIsZ0JBQUksSUFBSSxRQUFRLE9BQVIsSUFBbUIsT0FBTyxDQUFsQzs7QUFFQTtBQUNBO0FBQ0EsZ0JBQUksaUJBQWlCLEVBQUUsU0FBRixHQUFjLEVBQUUsU0FBaEIsR0FBNEIsRUFBRSxTQUFuRDtBQUNBLGdCQUFJLGlCQUFpQixtQkFBbUIsRUFBRSxTQUFyQixHQUFpQyxLQUFqQyxHQUF5QyxPQUE5RDtBQUNBLGdCQUFJLG1CQUFtQixFQUF2Qjs7QUFFQTtBQUNBLGdCQUFJLG1CQUFtQixFQUFFLFNBQXpCLEVBQW9DO0FBQ2hDLGlDQUFpQixRQUFqQixHQUE0QixZQUFVLENBQUUsQ0FBeEM7QUFDQSxpQ0FBaUIsV0FBakIsR0FBK0IsWUFBVSxDQUFFLENBQTNDO0FBQ0EsaUNBQWlCLE1BQWpCLEdBQTBCLFlBQVc7QUFDakMsbUNBQWUsU0FBZixDQUF5QixNQUF6QixDQUFnQyxLQUFoQyxDQUFzQyxJQUF0QyxFQUE0QyxTQUE1QztBQUNBO0FBQ0Esd0JBQUksS0FBSyxLQUFMLElBQWMsS0FBSyxLQUFMLENBQVcsU0FBekIsSUFBc0MsS0FBSyxLQUFMLENBQVcsTUFBckQsRUFBNkQ7QUFDekQsNkJBQUssS0FBTCxDQUFXLFNBQVgsQ0FBcUIsV0FBckIsQ0FBaUMsS0FBSyxLQUFMLENBQVcsTUFBNUM7QUFDSDtBQUNKLGlCQU5EO0FBT0g7O0FBRUQ7QUFDQSxtQkFBTyxNQUFQLENBQWMsZ0JBQWQsRUFBZ0M7QUFFNUIsMEJBRjRCLHNCQUVoQixPQUZnQixFQUVQO0FBQ2pCO0FBQ0EsNEJBQVEsU0FBUixHQUFxQixDQUFDLFFBQVEsU0FBVCxHQUFxQixLQUFyQixHQUE2QixJQUFsRDs7QUFFQSxzQkFBRSxVQUFGLENBQWEsSUFBYixFQUFtQixPQUFuQjtBQUNBLHlCQUFLLFdBQUw7QUFDQSx5QkFBSyxLQUFMLEdBQWEsRUFBYjtBQUNBLHlCQUFLLGlCQUFMLEdBQXlCLEtBQXpCOztBQUVBO0FBQ0EseUJBQUssYUFBTCxHQUFxQixLQUFyQjtBQUNILGlCQWIyQjtBQWU1QiwyQkFmNEIseUJBZWI7QUFDWCx5QkFBSyxLQUFMLEdBQWEsZ0JBQU0sTUFBTixDQUNULEtBQUssT0FBTCxDQUFhLEtBREosRUFFVDtBQUNJLG9DQUFZLEtBQUssT0FBTCxDQUFhLFVBRDdCO0FBRUksbUNBQVcsS0FBSyxPQUFMLENBQWEsU0FGNUI7QUFHSSxvQ0FBWSxLQUFLLE9BQUwsQ0FBYSxVQUg3QjtBQUlJLHdDQUFpQixhQUFhLGNBQWIsS0FBZ0MsS0FKckQ7QUFLSSw0Q0FBb0IsS0FBSyxPQUFMLENBQWEsa0JBTHJDO0FBTUksa0NBQVUsS0FBSyxPQUFMLENBQWEsUUFOM0I7QUFPSSx1Q0FBZSxLQUFLLE9BQUwsQ0FBYSxhQVBoQztBQVFJO0FBQ0EsMkNBQW1CLEtBQUssT0FBTCxDQUFhLGlCQVRwQztBQVVJO0FBQ0EsaURBQXlCLEtBQUssT0FBTCxDQUFhO0FBWDFDLHFCQUZTLENBQWI7QUFlSCxpQkEvQjJCOzs7QUFpQzVCO0FBQ0EscUJBbEM0QixpQkFrQ3JCLEdBbENxQixFQWtDaEI7QUFBQTs7QUFDUix3QkFBSSxDQUFDLEtBQUssS0FBVixFQUFpQjtBQUNiLDZCQUFLLFdBQUw7QUFDSDs7QUFFRCxtQ0FBZSxTQUFmLENBQXlCLEtBQXpCLENBQStCLEtBQS9CLENBQXFDLElBQXJDLEVBQTJDLFNBQTNDOztBQUVBLHlCQUFLLEtBQUwsQ0FBVyxNQUFYLEdBQW9CLFlBQU07QUFDdEIsOEJBQUssaUJBQUwsR0FBeUIsSUFBekI7QUFDQSw4QkFBSyxVQUFMO0FBQ0EsOEJBQUssaUJBQUwsR0FBeUIsS0FBekI7QUFDSCxxQkFKRDtBQUtBLHdCQUFJLEVBQUosQ0FBTyxRQUFQLEVBQWlCLEtBQUssS0FBTCxDQUFXLE1BQTVCOztBQUVBLHlCQUFLLEtBQUwsQ0FBVyxJQUFYLEdBQWtCLFlBQU07QUFDcEIsNEJBQUksTUFBSyxpQkFBVCxFQUE0QjtBQUN4QjtBQUNIOztBQUVELDhCQUFLLGlCQUFMLEdBQXlCLElBQXpCO0FBQ0EsNEJBQUksT0FBTyxJQUFJLFNBQUosRUFBWDtBQUNBLDZCQUFLLElBQUwsR0FBWSxLQUFLLEdBQUwsQ0FBUyxJQUFJLE9BQUosRUFBVCxFQUF3QixJQUFJLFVBQUosTUFBb0IsY0FBSSxxQkFBaEQsQ0FBWjs7QUFFQSw4QkFBSyxLQUFMLENBQVcsSUFBWCxDQUFnQixPQUFoQixDQUF3QixJQUF4QjtBQUNBLDhCQUFLLEtBQUwsQ0FBVyxlQUFYO0FBQ0EsOEJBQUssZ0JBQUw7QUFDQSw4QkFBSyxpQkFBTCxHQUF5QixLQUF6QjtBQUNILHFCQWJEO0FBY0Esd0JBQUksRUFBSixDQUFPLE1BQVAsRUFBZSxLQUFLLEtBQUwsQ0FBVyxJQUExQjs7QUFFQSx5QkFBSyxLQUFMLENBQVcsU0FBWCxHQUF1QixZQUFNO0FBQ3pCLDRCQUFJLE1BQUssaUJBQVQsRUFBNEI7QUFDeEI7QUFDSDs7QUFFRCw4QkFBSyxpQkFBTCxHQUF5QixJQUF6QjtBQUNBLDhCQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLFNBQWhCO0FBQ0EsOEJBQUssaUJBQUwsR0FBeUIsS0FBekI7QUFDSCxxQkFSRDtBQVNBLHdCQUFJLEVBQUosQ0FBTyxXQUFQLEVBQW9CLEtBQUssS0FBTCxDQUFXLFNBQS9COztBQUVBLHlCQUFLLEtBQUwsQ0FBVyxTQUFYLEdBQXVCLFlBQU07QUFDekIsOEJBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsVUFBaEIsQ0FBMkIsSUFBM0I7QUFDSCxxQkFGRDtBQUdBLHdCQUFJLEVBQUosQ0FBTyxXQUFQLEVBQW9CLEtBQUssS0FBTCxDQUFXLFNBQS9COztBQUVBLHlCQUFLLEtBQUwsQ0FBVyxPQUFYLEdBQXFCLFlBQU07QUFDdkIsOEJBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsVUFBaEIsQ0FBMkIsS0FBM0I7QUFDQSw4QkFBSyxLQUFMLENBQVcsYUFBWDtBQUNILHFCQUhEO0FBSUEsd0JBQUksRUFBSixDQUFPLFNBQVAsRUFBa0IsS0FBSyxLQUFMLENBQVcsT0FBN0I7O0FBRUE7QUFDQSx3QkFBSSxhQUFKLEdBQW9CLEtBQXBCOztBQUVBO0FBQ0EseUJBQUsseUJBQUwsQ0FBK0IsR0FBL0I7QUFDQSx5QkFBSyxxQkFBTCxDQUEyQixHQUEzQjs7QUFFQTtBQUNBLHlCQUFLLDJCQUFMLENBQWlDLEdBQWpDO0FBQ0EseUJBQUssa0JBQUwsQ0FBd0IsS0FBSyxPQUFMLENBQWEsTUFBckM7O0FBRUE7QUFDQSx5QkFBSyxLQUFMLENBQVcsU0FBWCxHQUF1QixLQUFLLFlBQUwsRUFBdkI7QUFDQSx5QkFBSyxVQUFMOztBQUVBO0FBQ0EseUJBQUssVUFBTDtBQUNBLHlCQUFLLG9CQUFMOztBQUVBO0FBQ0EseUJBQUssS0FBTCxDQUFXLFNBQVgsQ0FBcUI7QUFDakIsOEJBQU0sS0FBSyxtQkFBTCxDQUF5QixJQUF6QixDQUE4QixJQUE5QjtBQURXLHFCQUFyQjs7QUFJQTtBQUNBLHlCQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLEtBQUssT0FBTCxDQUFhLEtBQTdCLEVBQ0ksRUFBRSxhQUFhLEtBQUssT0FBTCxDQUFhLGFBQTVCLEVBQTJDLFVBQVUsS0FBckQsRUFESixFQUNrRSxJQURsRSxDQUN1RSxZQUFNOztBQUV6RSw4QkFBSyxpQkFBTCxHQUF5QixJQUF6Qjs7QUFFQSw4QkFBSyxVQUFMO0FBQ0EsOEJBQUssVUFBTDtBQUNBLDhCQUFLLGdCQUFMOztBQUVBLDhCQUFLLGlCQUFMLEdBQXlCLEtBQXpCOztBQUVBLDhCQUFLLElBQUwsQ0FBVSxNQUFWO0FBQ0gscUJBWkQsRUFZRyxLQVpILENBWVMsaUJBQVM7QUFDZCw4QkFBSyxJQUFMLENBQVUsT0FBVixFQUFtQixLQUFuQjtBQUNILHFCQWREO0FBZUgsaUJBOUgyQjtBQWdJNUIsd0JBaEk0QixvQkFnSWxCLEdBaElrQixFQWdJYjtBQUNYLG1DQUFlLFNBQWYsQ0FBeUIsUUFBekIsQ0FBa0MsS0FBbEMsQ0FBd0MsSUFBeEMsRUFBOEMsU0FBOUM7O0FBRUEsd0JBQUksR0FBSixDQUFRLFFBQVIsRUFBa0IsS0FBSyxLQUFMLENBQVcsTUFBN0I7QUFDQSx3QkFBSSxHQUFKLENBQVEsTUFBUixFQUFnQixLQUFLLEtBQUwsQ0FBVyxJQUEzQjtBQUNBLHdCQUFJLEdBQUosQ0FBUSxXQUFSLEVBQXFCLEtBQUssS0FBTCxDQUFXLFNBQWhDO0FBQ0Esd0JBQUksR0FBSixDQUFRLFdBQVIsRUFBcUIsS0FBSyxLQUFMLENBQVcsU0FBaEM7QUFDQSx3QkFBSSxHQUFKLENBQVEsU0FBUixFQUFtQixLQUFLLEtBQUwsQ0FBVyxPQUE5QjtBQUNBLHdCQUFJLEdBQUosQ0FBUSxPQUFSLEVBQWlCLEtBQUssS0FBTCxDQUFXLEtBQTVCO0FBQ0Esd0JBQUksR0FBSixDQUFRLFdBQVIsRUFBcUIsS0FBSyxLQUFMLENBQVcsU0FBaEM7QUFDQSx3QkFBSSxHQUFKLENBQVEsVUFBUixFQUFvQixLQUFLLEtBQUwsQ0FBVyxRQUEvQjtBQUNBLDZCQUFTLG1CQUFULENBQTZCLGtCQUE3QixFQUFpRCxLQUFLLEtBQUwsQ0FBVyxnQkFBNUQ7QUFDQSx5QkFBSyxLQUFMLEdBQWEsRUFBYjs7QUFFQSx3QkFBSSxLQUFLLEtBQVQsRUFBZ0I7QUFDWiw2QkFBSyxLQUFMLENBQVcsT0FBWDtBQUNBLDZCQUFLLEtBQUwsR0FBYSxJQUFiO0FBQ0g7QUFDSixpQkFsSjJCO0FBb0o1QiwwQkFwSjRCLHNCQW9KaEIsTUFwSmdCLEVBb0pSO0FBQ2hCLHdCQUFJLE1BQU0sT0FBTyxDQUFQLEdBQVcsR0FBWCxHQUFpQixPQUFPLENBQXhCLEdBQTRCLEdBQTVCLEdBQWtDLE9BQU8sQ0FBbkQ7QUFDQSx3QkFBSSxNQUFNLFNBQVMsYUFBVCxDQUF1QixLQUF2QixDQUFWO0FBQ0Esd0JBQUksWUFBSixDQUFpQixlQUFqQixFQUFrQyxHQUFsQztBQUNBLHdCQUFJLEtBQUosQ0FBVSxLQUFWLEdBQWtCLE9BQWxCO0FBQ0Esd0JBQUksS0FBSixDQUFVLE1BQVYsR0FBbUIsT0FBbkI7O0FBRUEsd0JBQUksS0FBSyxPQUFMLENBQWEsU0FBakIsRUFBNEI7QUFDeEIsNEJBQUksZ0JBQWdCLFNBQVMsYUFBVCxDQUF1QixLQUF2QixDQUFwQjtBQUNBLHNDQUFjLFdBQWQsR0FBNEIsR0FBNUI7QUFDQSxzQ0FBYyxLQUFkLENBQW9CLFFBQXBCLEdBQStCLFVBQS9CO0FBQ0Esc0NBQWMsS0FBZCxDQUFvQixJQUFwQixHQUEyQixDQUEzQjtBQUNBLHNDQUFjLEtBQWQsQ0FBb0IsR0FBcEIsR0FBMEIsQ0FBMUI7QUFDQSxzQ0FBYyxLQUFkLENBQW9CLEtBQXBCLEdBQTRCLE9BQTVCO0FBQ0Esc0NBQWMsS0FBZCxDQUFvQixRQUFwQixHQUErQixNQUEvQjtBQUNBLHNDQUFjLEtBQWQsQ0FBb0IsV0FBcEIsR0FBa0MsYUFBbEM7QUFDQSxzQ0FBYyxLQUFkLENBQW9CLE9BQXBCLEdBQThCLEtBQTlCOztBQUVBLDRCQUFJLFdBQUosQ0FBZ0IsYUFBaEI7QUFDQSw0QkFBSSxLQUFKLENBQVUsV0FBVixHQUF3QixPQUF4QjtBQUNBLDRCQUFJLEtBQUosQ0FBVSxXQUFWLEdBQXdCLE9BQXhCO0FBQ0EsNEJBQUksS0FBSixDQUFVLFdBQVYsR0FBd0IsS0FBeEI7QUFDSDs7QUFFRCwyQkFBTyxHQUFQO0FBQ0gsaUJBN0syQjs7O0FBK0s1QjtBQUNBO0FBQ0EseUNBakw0QixxQ0FpTEQsR0FqTEMsRUFpTEk7QUFDNUIsd0JBQUksS0FBSyxLQUFMLENBQVcsSUFBWCxDQUFnQixlQUFoQixJQUFtQyxJQUFJLGVBQXZDLElBQTBELEtBQUssT0FBTCxDQUFhLGlCQUFiLEtBQW1DLEtBQWpHLEVBQXdHO0FBQ3BHLDRCQUFJLE9BQUosQ0FBWSxRQUFaLEdBQXVCLENBQXZCOztBQUVBLDRCQUFNLFVBQVUsSUFBSSxlQUFKLENBQW9CLE9BQXBCLEVBQWhCO0FBQ0EsNEJBQUksZUFBSixDQUFvQixPQUFwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0QkFBSSxFQUFFLE9BQUYsQ0FBVSxNQUFWLElBQW9CLEVBQUUsT0FBRixDQUFVLE1BQWxDLEVBQTBDO0FBQ3RDLGdDQUFJLGVBQUosQ0FBb0IsY0FBcEIsR0FBcUMsVUFBVSxDQUFWLEVBQWE7QUFDOUMsb0NBQUksUUFBUSxFQUFFLFFBQUYsQ0FBVyxhQUFYLENBQXlCLENBQXpCLENBQVo7QUFDQSxxQ0FBSyxNQUFMLElBQWUsS0FBZjtBQUNBLHFDQUFLLGFBQUwsR0FBcUIsS0FBSyxJQUFMLENBQVUsMEJBQVYsQ0FBcUMsQ0FBckMsQ0FBckI7QUFDQSxxQ0FBSyxZQUFMO0FBQ0Esa0NBQUUsUUFBRixDQUFXLElBQVgsQ0FBZ0IsQ0FBaEI7QUFDSCw2QkFORDtBQU9ILHlCQVJELE1BU0s7QUFDRCxnQ0FBSSxPQUFKLENBQVksaUJBQVosR0FBZ0MsRUFBaEMsQ0FEQyxDQUNtQztBQUN2Qzs7QUFFRCw0QkFBSSxlQUFKLENBQW9CLFlBQXBCLEdBQW1DLFlBQVk7QUFDM0MsZ0NBQUksTUFBTSxLQUFLLElBQWY7QUFBQSxnQ0FDSSxPQUFPLElBQUksT0FBSixFQURYOztBQUdBLGdDQUFJLEtBQUosR0FKMkMsQ0FJOUI7O0FBRWIsZ0NBQUksUUFBUSxLQUFLLE1BQUwsSUFBZSxLQUFLLElBQUwsQ0FBVSxPQUFWLENBQWtCLG1CQUFsQixHQUF3QyxDQUF2RCxDQUFaO0FBQ0EsaUNBQUssTUFBTCxHQUFjLENBQWQ7O0FBRUEsZ0NBQUssT0FBTyxLQUFSLElBQWtCLEtBQUssSUFBTCxDQUFVLFVBQVYsRUFBdEIsRUFBOEM7QUFDMUMsd0NBQVEsS0FBSyxJQUFMLENBQVUsVUFBVixLQUF5QixJQUFqQyxDQUQwQyxDQUNIO0FBQzFDOztBQUVELGdDQUFJLENBQUMsS0FBTCxFQUFZO0FBQUU7QUFBUzs7QUFFdkIsZ0NBQUksSUFBSSxPQUFKLENBQVksZUFBWixLQUFnQyxRQUFwQyxFQUE4QztBQUMxQyxvQ0FBSSxPQUFKLENBQVksT0FBTyxLQUFuQjtBQUNILDZCQUZELE1BRU87QUFDSCxvQ0FBSSxhQUFKLENBQWtCLEtBQUssYUFBdkIsRUFBc0MsT0FBTyxLQUE3QztBQUNIO0FBQ0oseUJBcEJEOztBQXNCQSw0QkFBSSxPQUFKLEVBQWE7QUFDVCxnQ0FBSSxlQUFKLENBQW9CLE1BQXBCO0FBQ0g7QUFDSjtBQUNKLGlCQWxPMkI7OztBQW9PNUI7QUFDQSxxQ0FyTzRCLGlDQXFPTCxHQXJPSyxFQXFPQTtBQUN4Qix3QkFBSSxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLGVBQWhCLElBQW1DLElBQUksZUFBdkMsSUFBMEQsS0FBSyxPQUFMLENBQWEscUJBQWIsS0FBdUMsS0FBckcsRUFBNEc7QUFBQTs7QUFFeEc7QUFDQSxnQ0FBTSx5QkFBeUIsU0FBekIsc0JBQXlCLENBQVUsR0FBVixFQUFlLE1BQWYsRUFBdUIsSUFBdkIsRUFBNkIsT0FBN0IsRUFBc0M7QUFDakUsb0NBQUksUUFBUSxJQUFJLFlBQUosQ0FBaUIsSUFBakIsQ0FBWjtBQUFBLG9DQUNJLFdBQVcsSUFBSSxPQUFKLEdBQWMsUUFBZCxDQUF1QixDQUF2QixDQURmO0FBQUEsb0NBRUksaUJBQWlCLGtCQUFrQixFQUFFLEtBQXBCLEdBQTRCLE1BQTVCLEdBQXFDLElBQUksc0JBQUosQ0FBMkIsTUFBM0IsQ0FGMUQ7QUFBQSxvQ0FJSSxlQUFlLGVBQWUsUUFBZixDQUF3QixRQUF4QixFQUFrQyxVQUFsQyxDQUE2QyxJQUFJLElBQUksS0FBckQsQ0FKbkI7QUFBQSxvQ0FLSSxZQUFZLElBQUksc0JBQUosQ0FBMkIsU0FBUyxHQUFULENBQWEsWUFBYixDQUEzQixDQUxoQjs7QUFPQSx1Q0FBTyxJQUFJLEtBQUosQ0FBVSxTQUFWLEVBQXFCLElBQXJCLEVBQTJCLEVBQUUsT0FBTyxJQUFULEVBQTNCLENBQVA7QUFDSCw2QkFURDs7QUFXQTtBQUNBLGdDQUFNLFlBQVksU0FBWixTQUFZLENBQVUsR0FBVixFQUFlLFlBQWYsRUFBNkIsVUFBN0IsRUFBeUMsT0FBekMsRUFBa0Q7QUFDaEUsMENBQVUsV0FBVyxFQUFyQjtBQUNBLG9DQUFJLFFBQVEsT0FBUixLQUFvQixLQUFwQixJQUE2QixDQUFDLEVBQUUsT0FBRixDQUFVLEtBQTVDLEVBQW1EO0FBQy9DLDJDQUFPLElBQUksT0FBSixDQUFZLFlBQVosRUFBMEIsVUFBMUIsRUFBc0MsT0FBdEMsQ0FBUDtBQUNIOztBQUVELG9DQUFJLEtBQUo7O0FBRUEsb0NBQUksWUFBWSxJQUFJLEtBQXBCOztBQUVBLCtDQUFlLEVBQUUsTUFBRixDQUFTLFlBQVQsQ0FBZjtBQUNBLDZDQUFhLGVBQWUsU0FBZixHQUEyQixTQUEzQixHQUF1QyxVQUFwRDtBQUNBLDZDQUFhLEtBQUssR0FBTCxDQUFTLFVBQVQsRUFBcUIsSUFBSSxVQUFKLEVBQXJCLENBQWIsQ0FaZ0UsQ0FZWDs7QUFFckQsb0NBQUksT0FBTyxJQUFJLE9BQUosQ0FBWSxJQUFJLFNBQUosRUFBWixFQUE2QixTQUE3QixDQUFYO0FBQUEsb0NBQ0ksS0FBSyxJQUFJLE9BQUosQ0FBWSxZQUFaLEVBQTBCLFNBQTFCLENBRFQ7O0FBR0Esb0NBQUksUUFBUSxLQUFLLEdBQUwsRUFBWjtBQUFBLG9DQUNJLFdBQVcsUUFBUSxRQUFSLEdBQW1CLE9BQU8sUUFBUSxRQUFsQyxHQUE2QyxFQUQ1RDs7QUFHQSx5Q0FBUyxLQUFULEdBQWlCO0FBQ2Isd0NBQUksSUFBSSxDQUFDLEtBQUssR0FBTCxLQUFhLEtBQWQsSUFBdUIsUUFBL0I7O0FBRUEsd0NBQUksS0FBSyxDQUFULEVBQVk7QUFDUjtBQUNBLDRDQUFJLFdBQUosR0FBa0IsRUFBRSxJQUFGLENBQU8sZ0JBQVAsQ0FBd0IsS0FBeEIsRUFBK0IsR0FBL0IsQ0FBbEI7O0FBRUEsNENBQUksU0FBUyxLQUFLLEdBQUwsQ0FBUyxHQUFHLFFBQUgsQ0FBWSxJQUFaLEVBQWtCLFVBQWxCLENBQTZCLENBQTdCLENBQVQsQ0FBYjtBQUNBLGlEQUFTLENBQUMsT0FBTyxDQUFSLEVBQVcsT0FBTyxDQUFsQixDQUFUO0FBQ0EsaURBQVMsY0FBSSxjQUFKLENBQW1CLE1BQW5CLENBQVQ7QUFDQSwrREFBdUIsR0FBdkIsRUFBNEIsWUFBNUIsRUFBMEMsWUFBWSxDQUFDLGFBQWEsU0FBZCxJQUEyQixDQUFqRjtBQUNILHFDQVJELE1BUU87QUFDSCwrREFBdUIsR0FBdkIsRUFBNEIsWUFBNUIsRUFBMEMsVUFBMUMsRUFDSyxRQURMLENBQ2MsSUFEZDtBQUVIO0FBQ0o7O0FBRUQsb0NBQUksVUFBSixDQUFlLElBQWY7O0FBRUEsc0NBQU0sSUFBTixDQUFXLEdBQVg7QUFDQSx1Q0FBTyxHQUFQO0FBQ0gsNkJBekNEOztBQTJDQTtBQUNBLGdDQUFNLFVBQVUsSUFBSSxlQUFKLENBQW9CLE9BQXBCLEVBQWhCO0FBQ0EsZ0NBQUksZUFBSixDQUFvQixPQUFwQjs7QUFFQSxnQ0FBSSxlQUFKLENBQW9CLGNBQXBCLEdBQXFDLFVBQVUsQ0FBVixFQUFhO0FBQzlDLG9DQUFJLE1BQU0sS0FBSyxJQUFmO0FBQUEsb0NBQ0ksVUFBVSxJQUFJLE9BQUosRUFEZDtBQUFBLG9DQUVJLFFBQVEsSUFBSSxPQUFKLENBQVksU0FGeEI7QUFBQSxvQ0FHSSxPQUFPLEVBQUUsYUFBRixDQUFnQixRQUFoQixHQUEyQixVQUFVLEtBQXJDLEdBQTZDLFVBQVUsS0FIbEU7O0FBS0Esb0NBQUksSUFBSSxPQUFKLENBQVksZUFBWixLQUFnQyxRQUFwQyxFQUE4QztBQUMxQyw4Q0FBVSxHQUFWLEVBQWUsSUFBSSxTQUFKLEVBQWYsRUFBZ0MsSUFBaEM7QUFDSCxpQ0FGRCxNQUVPO0FBQ0gsOENBQVUsR0FBVixFQUFlLElBQUksc0JBQUosQ0FBMkIsRUFBRSxjQUE3QixDQUFmLEVBQTZELElBQTdEO0FBQ0g7QUFDSiw2QkFYRDs7QUFhQSxnQ0FBSSxPQUFKLEVBQWE7QUFDVCxvQ0FBSSxlQUFKLENBQW9CLE1BQXBCO0FBQ0g7QUE3RXVHO0FBOEUzRztBQUNKLGlCQXJUMkI7QUF1VDVCLDBCQXZUNEIsd0JBdVRkO0FBQ1Ysd0JBQUksT0FBTyxLQUFLLElBQUwsQ0FBVSxTQUFWLEVBQVg7QUFDQSx5QkFBSyxJQUFMLEdBQVksS0FBSyxHQUFMLENBQVMsS0FBSyxJQUFMLENBQVUsT0FBVixFQUFULEVBQThCLEtBQUssSUFBTCxDQUFVLFVBQVYsTUFBMEIsY0FBSSxxQkFBNUQsQ0FBWjtBQUNBLHlCQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLE9BQWhCLENBQXdCLElBQXhCO0FBQ0gsaUJBM1QyQjtBQTZUNUIsMEJBN1Q0Qix3QkE2VGQ7QUFDVix3QkFBSSxPQUFPLEtBQUssSUFBTCxDQUFVLE9BQVYsRUFBWDtBQUNBLHlCQUFLLEtBQUwsQ0FBVyxTQUFYLENBQXFCLEtBQUssQ0FBMUIsRUFBNkIsS0FBSyxDQUFsQztBQUNILGlCQWhVMkI7QUFrVTVCLG9DQWxVNEIsa0NBa1VKO0FBQUE7O0FBQ3BCLHdCQUFJLG1CQUFtQixJQUF2QjtBQUNBLHlCQUFLLEtBQUwsQ0FBVyxnQkFBWCxHQUE4QixZQUFNO0FBQ2hDLDRCQUFJLGdCQUFKLEVBQXNCO0FBQ2xCLCtDQUFtQixLQUFuQjtBQUNBLG1DQUFLLFVBQUw7QUFDSDtBQUNKLHFCQUxEOztBQU9BLDZCQUFTLGdCQUFULENBQTBCLGtCQUExQixFQUE4QyxLQUFLLEtBQUwsQ0FBVyxnQkFBekQ7QUFDSCxpQkE1VTJCO0FBOFU1QixtQ0E5VTRCLGlDQThVTDtBQUNuQix3QkFBSSxDQUFDLEtBQUssSUFBTixJQUFjLEtBQUssaUJBQXZCLEVBQTBDO0FBQ3RDO0FBQ0g7O0FBRUQ7QUFDQSx3QkFBSSxhQUFhLEtBQUssSUFBTCxDQUFVLFNBQVYsRUFBakI7QUFDQSx3QkFBSSxjQUFjLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsTUFBbEM7QUFDQSx3QkFBSSxXQUFXLEdBQVgsS0FBbUIsWUFBWSxHQUEvQixJQUNBLFdBQVcsR0FBWCxLQUFtQixZQUFZLEdBRC9CLElBRUEsS0FBSyxJQUFMLENBQVUsT0FBVixPQUF3QixLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLElBRjVDLEVBRWtEO0FBQzlDO0FBQ0g7O0FBRUQseUJBQUssaUJBQUwsR0FBeUIsSUFBekI7QUFDQSx5QkFBSyxJQUFMLENBQVUsT0FBVixDQUFrQixDQUFDLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsTUFBaEIsQ0FBdUIsR0FBeEIsRUFBNkIsS0FBSyxLQUFMLENBQVcsSUFBWCxDQUFnQixNQUFoQixDQUF1QixHQUFwRCxDQUFsQixFQUE0RSxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLElBQTVGLEVBQWtHLEVBQUUsU0FBUyxLQUFYLEVBQWxHO0FBQ0EseUJBQUssZ0JBQUw7QUFDQSx5QkFBSyxpQkFBTCxHQUF5QixLQUF6QjtBQUNILGlCQWhXMkI7QUFrVzVCLHNCQWxXNEIsb0JBa1dsQjtBQUNOLHdCQUFJLENBQUMsS0FBSyxLQUFWLEVBQWlCO0FBQ2I7QUFDSDtBQUNELHlCQUFLLEtBQUwsQ0FBVyxNQUFYO0FBQ0gsaUJBdlcyQjs7O0FBeVc1QjtBQUNBO0FBQ0EsZ0NBM1c0Qiw4QkEyV1I7QUFDaEIsd0JBQUksQ0FBQyxLQUFLLElBQU4sSUFBYyxDQUFDLEtBQUssS0FBcEIsSUFBNkIsQ0FBQyxLQUFLLEtBQUwsQ0FBVyxTQUE3QyxFQUF3RDtBQUNwRDtBQUNIOztBQUVELHdCQUFJLFdBQVcsS0FBSyxJQUFMLENBQVUsMEJBQVYsQ0FBcUMsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFyQyxDQUFmO0FBQ0Esc0JBQUUsT0FBRixDQUFVLFdBQVYsQ0FBc0IsS0FBSyxLQUFMLENBQVcsU0FBakMsRUFBNEMsUUFBNUM7QUFDSCxpQkFsWDJCOzs7QUFvWDVCO0FBQ0EsMkNBclg0Qix1Q0FxWEMsR0FyWEQsRUFxWE07QUFBQTs7QUFDOUIseUJBQUssaUJBQUwsR0FBeUIsRUFBekI7O0FBRUEseUJBQUssS0FBTCxDQUFXLEtBQVgsR0FBbUIsVUFBQyxLQUFELEVBQVc7QUFDMUIsNEJBQUksT0FBTyxPQUFLLGlCQUFMLENBQXVCLEtBQTlCLEtBQXdDLFVBQTVDLEVBQXdEO0FBQ3BELG1DQUFLLEtBQUwsQ0FBVyxZQUFYLENBQXdCLE1BQU0sY0FBOUIsRUFDSSxJQURKLENBQ1MscUJBQWE7QUFDZCxvQ0FBSSxVQUFVLE9BQU8sTUFBUCxDQUFjLEVBQWQsRUFBa0IsU0FBbEIsRUFBNkIsRUFBRSxlQUFlLEtBQWpCLEVBQTdCLENBQWQ7QUFDQSx1Q0FBSyxpQkFBTCxDQUF1QixLQUF2QixDQUE2QixPQUE3QjtBQUNILDZCQUpMO0FBS0g7QUFDSixxQkFSRDtBQVNBLHdCQUFJLEVBQUosQ0FBTyxPQUFQLEVBQWdCLEtBQUssS0FBTCxDQUFXLEtBQTNCOztBQUVBLHlCQUFLLEtBQUwsQ0FBVyxTQUFYLEdBQXVCLFVBQUMsS0FBRCxFQUFXO0FBQzlCLDRCQUFJLE9BQU8sT0FBSyxpQkFBTCxDQUF1QixLQUE5QixLQUF3QyxVQUE1QyxFQUF3RDtBQUNwRCxtQ0FBSyxLQUFMLENBQVcsWUFBWCxDQUF3QixNQUFNLGNBQTlCLEVBQ0ksSUFESixDQUNTLHFCQUFhO0FBQ2Qsb0NBQUksVUFBVSxPQUFPLE1BQVAsQ0FBYyxFQUFkLEVBQWtCLFNBQWxCLEVBQTZCLEVBQUUsZUFBZSxLQUFqQixFQUE3QixDQUFkO0FBQ0EsdUNBQUssaUJBQUwsQ0FBdUIsS0FBdkIsQ0FBNkIsT0FBN0I7QUFDSCw2QkFKTDtBQUtIO0FBQ0oscUJBUkQ7QUFTQSx3QkFBSSxFQUFKLENBQU8sV0FBUCxFQUFvQixLQUFLLEtBQUwsQ0FBVyxTQUEvQjs7QUFFQSx5QkFBSyxLQUFMLENBQVcsUUFBWCxHQUFzQixVQUFDLEtBQUQsRUFBVztBQUM3QjtBQUNBLDRCQUFJLE9BQU8sT0FBSyxpQkFBTCxDQUF1QixLQUE5QixLQUF3QyxVQUE1QyxFQUF3RDtBQUNwRCxtQ0FBSyxpQkFBTCxDQUF1QixLQUF2QixDQUE2QixFQUFFLFNBQVMsSUFBWCxFQUFpQixlQUFlLEtBQWhDLEVBQTdCO0FBQ0g7QUFDSixxQkFMRDtBQU1BLHdCQUFJLEVBQUosQ0FBTyxVQUFQLEVBQW1CLEtBQUssS0FBTCxDQUFXLFFBQTlCO0FBQ0gsaUJBcloyQjs7O0FBdVo1QjtBQUNBO0FBQ0E7QUFDQSxrQ0ExWjRCLDhCQTBaUixNQTFaUSxFQTBaQTtBQUN4Qix5QkFBSyxpQkFBTCxHQUF5QixPQUFPLE1BQVAsQ0FBYyxLQUFLLGlCQUFuQixFQUFzQyxNQUF0QyxDQUF6QjtBQUNIO0FBNVoyQixhQUFoQzs7QUFnYUE7QUFDQSxvQkF2Y0csWUF1Y0gsa0JBQWUsZUFBZSxNQUFmLENBQXNCLGdCQUF0QixDQUFmOztBQUVBO0FBQ0EsZ0JBQUksT0FBTyxhQUFhLE1BQXBCLEtBQStCLFVBQW5DLEVBQStDO0FBQzNDLDZCQUFhLFNBQWIsQ0FBdUIsTUFBdkIsR0FBZ0MsWUFBVztBQUN2Qyx3QkFBSSxLQUFLLElBQVQsRUFBZTtBQUNYLDZCQUFLLElBQUwsQ0FBVSxXQUFWLENBQXNCLElBQXRCO0FBQ0g7QUFDRCx5QkFBSyxJQUFMLENBQVUsUUFBVjtBQUNILGlCQUxEO0FBTUg7O0FBRUQseUJBQWEsY0FBYixHQUE4QixjQUE5QjtBQUNBLHlCQUFhLGNBQWIsR0FBOEIsY0FBOUI7O0FBRUE7QUFBQSxtQkFBTyxJQUFJLFlBQUosQ0FBaUIsT0FBakI7QUFBUDtBQXhjZ0I7O0FBQUE7QUF5Y25CO0FBQ0o7Ozs7Ozs7Ozs7Ozs7OztBQzdkRDs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7O0FBRUEsSUFBSSxLQUFLLFFBQVEsSUFBUixDQUFUOztBQUVBLElBQU0seUJBQXlCLEdBQUcsWUFBSCxDQUFnQixZQUFZLCtCQUE1QixFQUE2RCxNQUE3RCxDQUEvQjtBQUNBLElBQU0sNkJBQTZCLEdBQUcsWUFBSCxDQUFnQixZQUFZLG1DQUE1QixFQUFpRSxNQUFqRSxDQUFuQztBQUNBLElBQU0sdUJBQXVCLEdBQUcsWUFBSCxDQUFnQixZQUFZLDZCQUE1QixFQUEyRCxNQUEzRCxDQUE3QjtBQUNBLElBQU0sc0JBQXNCLEdBQUcsWUFBSCxDQUFnQixZQUFZLDRCQUE1QixFQUEwRCxNQUExRCxDQUE1Qjs7QUFFQTs7SUFDcUIsSztBQUVqQixtQkFBYSxJQUFiLEVBQW1CLE1BQW5CLEVBQTJCO0FBQUE7O0FBQ3ZCLGFBQUssSUFBTCxHQUFZLE9BQU8sSUFBbkI7QUFDQSxhQUFLLElBQUwsR0FBWSxJQUFaOztBQUVBLFlBQUksT0FBTyxPQUFQLElBQWtCLElBQWxCLElBQTBCLE9BQU8sT0FBTyxPQUFkLEtBQTBCLFFBQXhELEVBQWtFO0FBQzlELGlCQUFLLE9BQUwsR0FBZSxlQUFLLFVBQUwsQ0FBZ0IsT0FBTyxPQUFQLElBQWtCLENBQWxDLENBQWY7QUFDSCxTQUZELE1BR0s7QUFDRCxpQkFBSyxPQUFMLEdBQWUsMEJBQVksVUFBWixDQUF1QixPQUFPLE9BQTlCLEVBQXVDLEtBQXZDLENBQTZDLENBQTdDLEVBQWdELENBQWhELENBQWY7QUFDSDs7QUFFRCxZQUFJLE9BQU8sT0FBUCxJQUFrQixJQUFsQixJQUEwQixPQUFPLE9BQU8sT0FBZCxLQUEwQixRQUF4RCxFQUFrRTtBQUM5RCxpQkFBSyxPQUFMLEdBQWUsZUFBSyxVQUFMLENBQWdCLE9BQU8sT0FBUCxJQUFrQixJQUFsQixHQUF5QixPQUFPLE9BQWhDLEdBQTBDLENBQTFELENBQWY7QUFDSCxTQUZELE1BR0s7QUFDRCxpQkFBSyxPQUFMLEdBQWUsMEJBQVksVUFBWixDQUF1QixPQUFPLE9BQTlCLEVBQXVDLEtBQXZDLENBQTZDLENBQTdDLEVBQWdELENBQWhELENBQWY7QUFDSDs7QUFFRCxZQUFJLE9BQU8sUUFBUCxJQUFtQixJQUFuQixJQUEyQixPQUFPLE9BQU8sUUFBZCxLQUEyQixRQUExRCxFQUFvRTtBQUNoRSxpQkFBSyxRQUFMLEdBQWdCLGVBQUssVUFBTCxDQUFnQixPQUFPLFFBQVAsSUFBbUIsQ0FBbkMsQ0FBaEI7QUFDSCxTQUZELE1BR0s7QUFDRCxpQkFBSyxRQUFMLEdBQWdCLDBCQUFZLFVBQVosQ0FBdUIsT0FBTyxRQUE5QixFQUF3QyxLQUF4QyxDQUE4QyxDQUE5QyxFQUFpRCxDQUFqRCxDQUFoQjtBQUNIO0FBQ0o7O0FBRUQ7QUFDQTs7Ozs7OztBQWlHQTtpQ0FDVTtBQUNOLGdCQUFJLHNDQUNVLEtBQUssV0FEZixXQUNnQyxLQUFLLElBRHJDLHVCQUVFLEtBQUssV0FGUCxTQUVzQixLQUFLLElBRjNCLG9CQUFKO0FBSUEsZ0JBQUksNEJBQ0UsS0FBSyxJQURQLGFBQ21CLEtBQUssSUFEeEIsa0JBQUo7O0FBSUEscUNBQWMsUUFBZCxDQUF1QixNQUFNLEtBQTdCLEVBQW9DLFFBQXBDO0FBQ0EscUNBQWMsUUFBZCxDQUF1QixPQUF2QixFQUFnQyxNQUFoQztBQUNIOztBQUVEOzs7O2lDQUNVLENBQ1Q7O0FBRUQ7QUFDQTs7OztxQ0FDYyxRLEVBQVU7QUFDcEI7QUFDQSxxQkFBUyxPQUFULENBQWlCLEtBQWpCLFNBQTZCLEtBQUssSUFBbEMsZUFBa0QsS0FBSyxPQUF2RDtBQUNBLHFCQUFTLE9BQVQsQ0FBaUIsS0FBakIsU0FBNkIsS0FBSyxJQUFsQyxlQUFrRCxLQUFLLE9BQXZEO0FBQ0EscUJBQVMsT0FBVCxDQUFpQixLQUFqQixTQUE2QixLQUFLLElBQWxDLGdCQUFtRCxLQUFLLFFBQXhEO0FBQ0g7OzsrQkF6SGMsSSxFQUFNLE0sRUFBUTtBQUN6QixnQkFBSSxNQUFNLEtBQU4sQ0FBWSxPQUFPLElBQW5CLENBQUosRUFBOEI7QUFDMUIsdUJBQU8sSUFBSSxNQUFNLEtBQU4sQ0FBWSxPQUFPLElBQW5CLENBQUosQ0FBNkIsSUFBN0IsRUFBbUMsTUFBbkMsQ0FBUDtBQUNIO0FBQ0o7O0FBRUQ7Ozs7Z0NBQ2dCLEksRUFBTSxLLEVBQU87QUFDekIsZ0JBQUksU0FBUyxJQUFiLEVBQW1CO0FBQ2YsdUJBQU8sVUFBUDtBQUNIO0FBQ0QsbUJBQU8sTUFBTSxPQUFOLEtBQW1CLFFBQVEsSUFBVCxHQUFpQixJQUFqQixHQUF3QixVQUExQyxDQUFQLENBSnlCLENBSXFDO0FBQzlELGtCQUFNLE9BQU4sQ0FBYywyQkFBZCxJQUE4QyxTQUFTLFVBQXZEO0FBQ0Esa0JBQU0sT0FBTixDQUFjLHlCQUFkLElBQTRDLFNBQVMsUUFBckQ7QUFDSDs7QUFFRDs7OzsrQkFDZSxNLEVBQVE7QUFDbkI7QUFDQSxxQ0FBYyxXQUFkLENBQTBCLE1BQU0sS0FBaEM7O0FBRUE7QUFDQSxnQkFBSSxDQUFDLE1BQU0sT0FBWCxFQUFvQjtBQUNoQjtBQUNIOztBQUVEO0FBQ0EsZ0JBQUksa0JBQWtCLEVBQXRCO0FBQ0EsZ0JBQUksVUFBVSxPQUFPLElBQVAsQ0FBWSxNQUFaLEVBQW9CLE1BQXBCLEdBQTZCLENBQTNDLEVBQThDO0FBQzFDO0FBQ0Esb0JBQUksUUFBUSxFQUFaO0FBQ0EscUJBQUssSUFBSSxVQUFULElBQXVCLE1BQXZCLEVBQStCO0FBQzNCLDBCQUFNLE9BQU8sVUFBUCxFQUFtQixJQUF6QixJQUFpQyxJQUFqQztBQUNIOztBQUVEO0FBQ0EscUJBQUssSUFBSSxJQUFULElBQWlCLEtBQWpCLEVBQXdCO0FBQ3BCLDBCQUFNLEtBQU4sQ0FBWSxJQUFaLEVBQWtCLE1BQWxCO0FBQ0g7O0FBRUQ7QUFDQSxxQkFBSyxJQUFJLFdBQVQsSUFBdUIsTUFBdkIsRUFBK0I7QUFDM0I7QUFDQSwyQkFBTyxXQUFQLEVBQW1CLE1BQW5COztBQUVBO0FBQ0EsMkRBQXFDLFdBQXJDO0FBQ0g7QUFDSjs7QUFFRDtBQUNBLGdCQUFJLDRYQU9NLGVBUE4sNjBDQUFKOztBQTBDQSxxQ0FBYyxRQUFkLENBQXVCLE1BQU0sS0FBN0IsRUFBb0MsaUJBQXBDO0FBQ0g7Ozs7OztrQkE1SGdCLEs7OztBQTJKckIsTUFBTSxLQUFOLEdBQWMsRUFBZCxDLENBQWtCO0FBQ2xCLE1BQU0sS0FBTixHQUFjLFVBQWQsQyxDQUEwQjtBQUMxQixNQUFNLE9BQU4sR0FBZ0IsSUFBaEIsQyxDQUFzQjs7O0FBR3RCOztJQUNNLFk7OztBQUVGLDBCQUFZLElBQVosRUFBa0IsTUFBbEIsRUFBMEI7QUFBQTs7QUFBQSxnSUFDaEIsSUFEZ0IsRUFDVixNQURVOztBQUV0QixjQUFLLElBQUwsR0FBWSxTQUFaO0FBQ0EsY0FBSyxXQUFMLEdBQW1CLGNBQW5CO0FBSHNCO0FBSXpCOztBQUVEOzs7OztxQ0FLYyxRLEVBQVU7QUFDcEIscUJBQVMsT0FBVCxDQUFpQixLQUFqQixTQUE2QixLQUFLLElBQWxDLGVBQWtELEtBQUssT0FBdkQ7QUFDSDs7O2lDQU5lO0FBQ1oscUNBQWMsUUFBZCxDQUF1QixNQUFNLEtBQTdCLEVBQW9DLHNCQUFwQztBQUNIOzs7O0VBWHNCLEs7O0FBa0IzQixNQUFNLEtBQU4sQ0FBWSxTQUFaLElBQXlCLFlBQXpCOztJQUVNLGdCOzs7QUFFRiw4QkFBWSxJQUFaLEVBQWtCLE1BQWxCLEVBQTBCO0FBQUE7O0FBQUEseUlBQ2hCLElBRGdCLEVBQ1YsTUFEVTs7QUFFdEIsZUFBSyxJQUFMLEdBQVksYUFBWjtBQUNBLGVBQUssV0FBTCxHQUFtQixrQkFBbkI7O0FBRUEsWUFBSSxPQUFPLFNBQVgsRUFBc0I7QUFDbEIsbUJBQUssVUFBTCxHQUFrQixPQUFPLFNBQXpCO0FBQ0gsU0FGRCxNQUdLO0FBQ0Q7QUFDQSxnQkFBSSxRQUFRLEdBQVosQ0FGQyxDQUVnQjtBQUNqQixnQkFBSSxRQUFRLEtBQUssR0FBTCxDQUFTLEtBQUssRUFBTCxHQUFRLEVBQVIsR0FBVyxHQUFwQixDQUFaLENBSEMsQ0FHcUM7QUFDdEMsbUJBQUssVUFBTCxHQUFrQixDQUNkLEtBQUssR0FBTCxDQUFTLEtBQUssRUFBTCxHQUFRLEtBQVIsR0FBYyxHQUF2QixJQUE4QixLQURoQixFQUVkLEtBQUssR0FBTCxDQUFTLEtBQUssRUFBTCxHQUFRLEtBQVIsR0FBYyxHQUF2QixJQUE4QixLQUZoQixFQUdkLENBQUMsR0FIYSxDQUFsQjs7QUFNQSxnQkFBSSxPQUFPLE9BQVAsSUFBa0IsSUFBdEIsRUFBNEI7QUFDeEIsdUJBQUssT0FBTCxHQUFlLGVBQUssVUFBTCxDQUFnQixHQUFoQixDQUFmO0FBQ0g7QUFDSjtBQUNELGVBQUssU0FBTCxHQUFpQixPQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsQ0FBb0IsVUFBcEIsQ0FBakI7QUF0QnNCO0FBdUJ6Qjs7OztxQ0FlYSxRLEVBQVU7QUFDcEIsNklBQW1CLFFBQW5CO0FBQ0EscUJBQVMsT0FBVCxDQUFpQixLQUFqQixTQUE2QixLQUFLLElBQWxDLGlCQUFvRCxLQUFLLFNBQXpEO0FBQ0g7Ozs0QkFoQmdCO0FBQ2IsbUJBQU8sS0FBSyxVQUFaO0FBQ0gsUzswQkFFYyxDLEVBQUc7QUFDZCxpQkFBSyxVQUFMLEdBQWtCLGlCQUFPLFNBQVAsQ0FBaUIsQ0FBakIsQ0FBbEI7QUFDSDs7QUFFRDs7OztpQ0FDZ0I7QUFDWixxQ0FBYyxRQUFkLENBQXVCLE1BQU0sS0FBN0IsRUFBb0MsMEJBQXBDO0FBQ0g7Ozs7RUF0QzBCLEs7O0FBOEMvQixNQUFNLEtBQU4sQ0FBWSxhQUFaLElBQTZCLGdCQUE3Qjs7SUFHTSxVOzs7QUFFRix3QkFBYSxJQUFiLEVBQW1CLE1BQW5CLEVBQTJCO0FBQUE7O0FBQUEsNkhBQ2pCLElBRGlCLEVBQ1gsTUFEVzs7QUFFdkIsZUFBSyxJQUFMLEdBQVksT0FBWjtBQUNBLGVBQUssV0FBTCxHQUFtQixZQUFuQjs7QUFFQSxlQUFLLFFBQUwsR0FBZ0IsT0FBTyxRQUFQLElBQW1CLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxPQUFQLENBQW5DO0FBQ0EsZUFBSyxZQUFMLEdBQW9CLEVBQXBCLENBTnVCLENBTUM7QUFDeEIsZUFBSyxNQUFMLEdBQWMsT0FBTyxNQUFQLElBQWlCLFFBQS9CO0FBQ0EsZUFBSyxXQUFMLEdBQW1CLENBQUMsTUFBTSxXQUFXLE9BQU8sV0FBbEIsQ0FBTixDQUFELEdBQXlDLFdBQVcsT0FBTyxXQUFsQixDQUF6QyxHQUEwRSxDQUE3Rjs7QUFFQSxZQUFJLE9BQU8sTUFBWCxFQUFtQjtBQUNmLGdCQUFJLE1BQU0sT0FBTixDQUFjLE9BQU8sTUFBckIsS0FBZ0MsT0FBTyxNQUFQLENBQWMsTUFBZCxLQUF5QixDQUE3RCxFQUFnRTtBQUM1RCx1QkFBSyxNQUFMLEdBQWMsT0FBTyxNQUFyQjtBQUNILGFBRkQsTUFHSztBQUNELHVCQUFLLE1BQUwsR0FBYyxDQUFDLElBQUQsRUFBTyxPQUFPLE1BQWQsQ0FBZDtBQUNIO0FBQ0osU0FQRCxNQVFLO0FBQ0QsbUJBQUssTUFBTCxHQUFjLElBQWQ7QUFDSDtBQXBCc0I7QUFxQjFCOztBQUVEOzs7Ozs7O0FBS0E7aUNBQ1M7QUFDTDs7QUFFQSxxQ0FBYyxPQUFkLENBQXNCLHlDQUF0QixJQUFvRSxLQUFLLFdBQUwsS0FBcUIsQ0FBekY7QUFDQSxxQ0FBYyxPQUFkLENBQXNCLDZDQUF0QixJQUF3RSxLQUFLLE1BQUwsSUFBZSxJQUFmLElBQXVCLEtBQUssTUFBTCxDQUFZLENBQVosS0FBa0IsSUFBakg7QUFDQSxxQ0FBYyxPQUFkLENBQXNCLDZDQUF0QixJQUF3RSxLQUFLLE1BQUwsSUFBZSxJQUF2RjtBQUNIOzs7aUNBRVM7QUFDTixpQkFBSyxpQkFBTDtBQUNIOzs7NENBRW9CO0FBQ2pCLGdCQUFJLEtBQUssTUFBTCxLQUFnQixPQUFwQixFQUE2QjtBQUN6Qjs7QUFFQTtBQUh5QiwwQ0FJWixjQUFJLGNBQUosQ0FBbUIsS0FBSyxRQUF4QixDQUpZO0FBQUE7QUFBQSxvQkFJcEIsQ0FKb0I7QUFBQSxvQkFJakIsQ0FKaUI7O0FBS3pCLHFCQUFLLFlBQUwsQ0FBa0IsQ0FBbEIsSUFBdUIsSUFBSSxLQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLGVBQWpCLENBQWlDLENBQWpDLENBQTNCO0FBQ0EscUJBQUssWUFBTCxDQUFrQixDQUFsQixJQUF1QixJQUFJLEtBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsZUFBakIsQ0FBaUMsQ0FBakMsQ0FBM0I7O0FBRUEscUJBQUssWUFBTCxDQUFrQixDQUFsQixJQUF1QiwwQkFBWSxZQUFaLENBQXlCLEtBQUssUUFBTCxDQUFjLENBQWQsQ0FBekIsRUFDbkIsRUFBRSxNQUFNLEtBQUssSUFBTCxDQUFVLElBQWxCLEVBQXdCLGtCQUFrQixjQUFJLGNBQUosQ0FBbUIsS0FBSyxJQUFMLENBQVUsSUFBN0IsQ0FBMUMsRUFEbUIsQ0FBdkI7QUFFQSxxQkFBSyxZQUFMLENBQWtCLENBQWxCLElBQXVCLEtBQUssWUFBTCxDQUFrQixDQUFsQixJQUF1QixLQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLGVBQWpCLENBQWlDLENBQWpDLENBQTlDO0FBQ0gsYUFYRCxNQVlLLElBQUksS0FBSyxNQUFMLEtBQWdCLFFBQWhCLElBQTRCLEtBQUssTUFBTCxLQUFnQixRQUFoRCxFQUEwRDtBQUMzRDs7QUFFQTtBQUNBLHFCQUFLLFlBQUwsR0FBb0IsMEJBQVksWUFBWixDQUF5QixLQUFLLFFBQTlCLEVBQ2hCLEVBQUUsTUFBTSxLQUFLLElBQUwsQ0FBVSxJQUFsQixFQUF3QixrQkFBa0IsY0FBSSxjQUFKLENBQW1CLEtBQUssSUFBTCxDQUFVLElBQTdCLENBQTFDLEVBRGdCLENBQXBCOztBQUdBLG9CQUFJLEtBQUssTUFBTCxLQUFnQixRQUFwQixFQUE4QjtBQUMxQjtBQUNBLHlCQUFLLFlBQUwsQ0FBa0IsQ0FBbEIsSUFBdUIsS0FBSyxZQUFMLENBQWtCLENBQWxCLElBQXVCLEtBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsZUFBakIsQ0FBaUMsQ0FBakMsQ0FBOUM7QUFDSDtBQUNKO0FBQ0QsaUJBQUssWUFBTCxDQUFrQixDQUFsQixJQUF1QixDQUF2QjtBQUNIOzs7cUNBRWEsUSxFQUFVO0FBQ3BCLGlJQUFtQixRQUFuQjs7QUFFQSxxQkFBUyxPQUFULENBQWlCLEtBQWpCLFNBQTZCLEtBQUssSUFBbEMsZ0JBQW1ELEtBQUssWUFBeEQ7O0FBRUEsZ0JBQUcseUJBQWMsT0FBZCxDQUFzQix5Q0FBdEIsQ0FBSCxFQUFxRTtBQUNqRSx5QkFBUyxPQUFULENBQWlCLElBQWpCLFNBQTRCLEtBQUssSUFBakMsMkJBQTZELEtBQUssV0FBbEU7QUFDSDs7QUFFRCxnQkFBRyx5QkFBYyxPQUFkLENBQXNCLDZDQUF0QixDQUFILEVBQXlFO0FBQ3JFLHlCQUFTLE9BQVQsQ0FBaUIsSUFBakIsU0FBNEIsS0FBSyxJQUFqQyxtQkFDSSwwQkFBWSxZQUFaLENBQXlCLEtBQUssTUFBTCxDQUFZLENBQVosQ0FBekIsRUFDSSxFQUFFLE1BQU0sS0FBSyxJQUFMLENBQVUsSUFBbEIsRUFBd0Isa0JBQWtCLGNBQUksY0FBSixDQUFtQixLQUFLLElBQUwsQ0FBVSxJQUE3QixDQUExQyxFQURKLENBREo7QUFHSDs7QUFFRCxnQkFBRyx5QkFBYyxPQUFkLENBQXNCLDZDQUF0QixDQUFILEVBQXlFO0FBQ3JFLHlCQUFTLE9BQVQsQ0FBaUIsSUFBakIsU0FBNEIsS0FBSyxJQUFqQyxtQkFDSSwwQkFBWSxZQUFaLENBQXlCLEtBQUssTUFBTCxDQUFZLENBQVosQ0FBekIsRUFDSSxFQUFFLE1BQU0sS0FBSyxJQUFMLENBQVUsSUFBbEIsRUFBd0Isa0JBQWtCLGNBQUksY0FBSixDQUFtQixLQUFLLElBQUwsQ0FBVSxJQUE3QixDQUExQyxFQURKLENBREo7QUFHSDtBQUNKOzs7aUNBakVnQjtBQUNiLHFDQUFjLFFBQWQsQ0FBdUIsTUFBTSxLQUE3QixFQUFvQyxvQkFBcEM7QUFDSDs7OztFQTVCb0IsSzs7QUE2RnpCLE1BQU0sS0FBTixDQUFZLE9BQVosSUFBdUIsVUFBdkI7O0lBR00sUzs7O0FBRUYsdUJBQWEsSUFBYixFQUFtQixNQUFuQixFQUEyQjtBQUFBOztBQUFBLDJIQUNqQixJQURpQixFQUNYLE1BRFc7O0FBRXZCLGVBQUssSUFBTCxHQUFZLFdBQVo7QUFDQSxlQUFLLFdBQUwsR0FBbUIsV0FBbkI7O0FBRUEsZUFBSyxTQUFMLEdBQWlCLE9BQUssVUFBTCxHQUFrQixDQUFDLE9BQU8sU0FBUCxJQUFvQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBQyxDQUFSLENBQXJCLEVBQWlDLEdBQWpDLENBQXFDLFVBQXJDLENBQW5DLENBTHVCLENBSzhEO0FBQ3JGLGVBQUssUUFBTCxHQUFnQixPQUFPLFFBQVAsR0FBa0IsV0FBVyxPQUFPLFFBQWxCLENBQWxCLEdBQWdELEdBQWhFO0FBQ0EsZUFBSyxLQUFMLEdBQWEsT0FBTyxLQUFQLEdBQWUsV0FBVyxPQUFPLEtBQWxCLENBQWYsR0FBMEMsRUFBdkQ7QUFQdUI7QUFRMUI7Ozs7cUNBZWEsUSxFQUFVO0FBQ3BCLCtIQUFtQixRQUFuQjs7QUFFQSxxQkFBUyxPQUFULENBQWlCLEtBQWpCLFNBQTZCLEtBQUssSUFBbEMsaUJBQW9ELEtBQUssU0FBekQ7QUFDQSxxQkFBUyxPQUFULENBQWlCLElBQWpCLFNBQTRCLEtBQUssSUFBakMscUJBQXVELEtBQUssR0FBTCxDQUFTLEtBQUssS0FBTCxHQUFhLE9BQWIsR0FBdUIsR0FBaEMsQ0FBdkQ7QUFDQSxxQkFBUyxPQUFULENBQWlCLElBQWpCLFNBQTRCLEtBQUssSUFBakMsb0JBQXNELEtBQUssUUFBM0Q7QUFDSDs7OzRCQW5CZ0I7QUFDYixtQkFBTyxLQUFLLFVBQVo7QUFDSCxTOzBCQUVjLEMsRUFBRztBQUNkLGlCQUFLLFVBQUwsR0FBa0IsaUJBQU8sU0FBUCxDQUFpQixDQUFqQixDQUFsQjtBQUNIOztBQUVEOzs7O2lDQUNpQjtBQUNiLHFDQUFjLFFBQWQsQ0FBdUIsTUFBTSxLQUE3QixFQUFvQyxtQkFBcEM7QUFDSDs7OztFQXZCbUIsVTs7QUFrQ3hCLE1BQU0sS0FBTixDQUFZLFdBQVosSUFBMkIsU0FBM0I7Ozs7Ozs7Ozs7O0FDdFhBOzs7O0FBQ0E7Ozs7OztBQUVBLElBQUksS0FBSyxRQUFRLElBQVIsQ0FBVDtBQUNBLElBQU0scUJBQXFCLEdBQUcsWUFBSCxDQUFnQixZQUFZLDJCQUE1QixFQUF5RCxNQUF6RCxDQUEzQjs7QUFFQSxJQUFNLGlCQUFpQixDQUFDLFVBQUQsRUFBYSxTQUFiLEVBQXdCLFNBQXhCLEVBQW1DLFVBQW5DLENBQXZCOztJQUVxQixRO0FBQ2pCLHNCQUFhLE1BQWIsRUFBcUI7QUFBQTs7QUFBQTs7QUFFakIsaUJBQVMsVUFBVSxFQUFuQjs7QUFFQTtBQUNBLHVCQUFlLE9BQWYsQ0FBdUIsZ0JBQVE7QUFDM0IsZ0JBQU0sUUFBUSxPQUFPLElBQVAsQ0FBZDtBQUNBLGdCQUFJLFNBQVMsSUFBYixFQUFtQjtBQUNmLG9CQUFJLE1BQU0sT0FBVixFQUFtQjtBQUNmLDBCQUFLLElBQUwsSUFBYTtBQUNULGlDQUFTLE1BQU0sT0FETjtBQUVULGlDQUFTLE1BQU0sT0FBTixJQUFpQixXQUZqQjtBQUdULCtCQUFPLGVBQUssVUFBTCxDQUFnQixNQUFNLEtBQU4sSUFBZSxJQUFmLEdBQXNCLE1BQU0sS0FBNUIsR0FBb0MsQ0FBcEQsQ0FIRTtBQUlULGdDQUFRLGVBQUssVUFBTCxDQUFnQixNQUFNLE1BQU4sSUFBZ0IsSUFBaEIsR0FBdUIsTUFBTSxNQUE3QixHQUFzQyxDQUF0RDtBQUpDLHFCQUFiO0FBTUgsaUJBUEQsTUFRSyxJQUFJLE9BQU8sS0FBUCxLQUFpQixRQUFqQixJQUE2QixNQUFNLE9BQU4sQ0FBYyxLQUFkLENBQWpDLEVBQXVEO0FBQ3hELDBCQUFLLElBQUwsSUFBYSxFQUFFLFFBQVEsZUFBSyxVQUFMLENBQWdCLEtBQWhCLENBQVYsRUFBYjtBQUNILGlCQUZJLE1BR0EsSUFBSSxPQUFPLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDaEMsMEJBQUssSUFBTCxJQUFhLEVBQUUsUUFBUSwwQkFBWSxVQUFaLENBQXVCLEtBQXZCLENBQVYsRUFBYjtBQUNILGlCQUZJLE1BR0E7QUFDRCwwQkFBSyxJQUFMLElBQWEsS0FBYjtBQUNIO0FBQ0o7QUFDSixTQXJCRDs7QUF1QkE7QUFDQSxZQUFJLEtBQUssUUFBVCxFQUFtQjtBQUNmLGlCQUFLLFFBQUwsQ0FBYyxTQUFkLEdBQTBCLE9BQU8sU0FBUCxHQUFtQixXQUFXLE9BQU8sU0FBbEIsQ0FBbkIsR0FBa0QsR0FBNUU7QUFDSDs7QUFFRDtBQUNBLFlBQUksT0FBTyxNQUFQLElBQWlCLElBQXJCLEVBQTJCO0FBQ3ZCLGlCQUFLLE1BQUwsR0FBYztBQUNWLHlCQUFTLE9BQU8sTUFBUCxDQUFjLE9BRGI7QUFFVix5QkFBUyxPQUFPLE1BQVAsQ0FBYyxPQUFkLElBQXlCLFdBRnhCO0FBR1YsdUJBQU8sZUFBSyxVQUFMLENBQWdCLE9BQU8sTUFBUCxDQUFjLEtBQWQsSUFBdUIsSUFBdkIsR0FBOEIsT0FBTyxNQUFQLENBQWMsS0FBNUMsR0FBb0QsQ0FBcEUsQ0FIRztBQUlWLHdCQUFRLE9BQU8sTUFBUCxDQUFjLE1BQWQsSUFBd0IsSUFBeEIsR0FBK0IsT0FBTyxNQUFQLENBQWMsTUFBN0MsR0FBc0Q7QUFKcEQsYUFBZDtBQU1IO0FBQ0o7O0FBRUQ7Ozs7OytCQWdCUSxLLEVBQU87QUFBQTs7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQWUsT0FBZixDQUF1QixnQkFBUTtBQUMzQixvQkFBSSw0QkFBMEIsS0FBSyxXQUFMLEVBQTlCO0FBQ0Esb0JBQUksU0FBUyxNQUFNLFVBQW5CO0FBQ0Esc0JBQU0sT0FBTixDQUFjLEdBQWQsSUFBc0IsT0FBSyxJQUFMLEtBQWMsSUFBcEM7QUFDQSxvQkFBSSxPQUFLLElBQUwsS0FBYyxPQUFLLElBQUwsRUFBVyxPQUE3QixFQUFzQztBQUNsQywwQkFBTSxPQUFOLENBQWMsTUFBZCxJQUF3QixJQUF4QjtBQUNBLDBCQUFNLE9BQU4sQ0FBYyxTQUFTLEdBQVQsR0FBZSxPQUFLLElBQUwsRUFBVyxPQUFYLENBQW1CLFdBQW5CLEVBQTdCLElBQWlFLElBQWpFO0FBQ0EsMEJBQU0sT0FBTiwrQkFBMEMsT0FBSyxJQUFMLEVBQVcsT0FBWCxDQUFtQixXQUFuQixFQUExQyxJQUFnRixJQUFoRjtBQUNBLDBCQUFNLFNBQU4sR0FBa0IsTUFBTSxTQUFOLElBQW9CLE9BQUssSUFBTCxFQUFXLE9BQVgsS0FBdUIsSUFBN0Q7QUFDSDtBQUNKLGFBVkQ7O0FBWUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQUksS0FBSyxNQUFMLElBQWUsS0FBSyxNQUFMLENBQVksT0FBL0IsRUFBd0M7QUFDcEMsc0JBQU0sT0FBTixDQUFjLGlDQUFkLElBQW1ELElBQW5EO0FBQ0Esc0JBQU0sT0FBTixDQUFjLHFDQUFxQyxLQUFLLE1BQUwsQ0FBWSxPQUFaLENBQW9CLFdBQXBCLEVBQW5ELElBQXdGLElBQXhGO0FBQ0Esc0JBQU0sT0FBTiwrQkFBMEMsS0FBSyxNQUFMLENBQVksT0FBWixDQUFvQixXQUFwQixFQUExQyxJQUFpRixJQUFqRjtBQUNBLHNCQUFNLFNBQU4sR0FBa0IsTUFBTSxTQUFOLElBQW9CLEtBQUssTUFBTCxDQUFZLE9BQVosS0FBd0IsSUFBOUQ7QUFDSDs7QUFFRCxrQkFBTSxrQkFBTixDQUF5QixTQUFTLEtBQWxDLEVBQXlDLGtCQUF6QyxFQUE2RCxVQUE3RDtBQUNBLGtCQUFNLGNBQU4sQ0FBcUIsT0FBckIsRUFBOEIsNEJBQTlCLEVBQTRELFVBQTVEO0FBQ0g7OztxQ0FFYSxRLEVBQVU7QUFBQTs7QUFDcEI7QUFDQTtBQUNBLDJCQUFlLE9BQWYsQ0FBdUIsZ0JBQVE7QUFDM0Isb0JBQUksT0FBSyxJQUFMLENBQUosRUFBZ0I7QUFDWix3QkFBSSxPQUFLLElBQUwsRUFBVyxPQUFmLEVBQXdCO0FBQ3BCLGlDQUFTLGlCQUFULGlCQUF5QyxJQUF6QyxlQUF5RCxPQUFLLElBQUwsRUFBVyxPQUFwRTtBQUNBLGlDQUFTLE9BQVQsQ0FBaUIsS0FBakIsa0JBQXNDLElBQXRDLFlBQW1ELE9BQUssSUFBTCxFQUFXLEtBQTlEO0FBQ0EsaUNBQVMsT0FBVCxDQUFpQixLQUFqQixrQkFBc0MsSUFBdEMsRUFBOEMsT0FBSyxJQUFMLEVBQVcsTUFBekQ7QUFDSCxxQkFKRCxNQUlPLElBQUksT0FBSyxJQUFMLEVBQVcsTUFBZixFQUF1QjtBQUMxQixpQ0FBUyxPQUFULENBQWlCLEtBQWpCLGtCQUFzQyxJQUF0QyxFQUE4QyxPQUFLLElBQUwsRUFBVyxNQUF6RDtBQUNIO0FBQ0o7QUFDSixhQVZEOztBQVlBO0FBQ0EsZ0JBQUksS0FBSyxRQUFULEVBQW1CO0FBQ2YseUJBQVMsT0FBVCxDQUFpQixJQUFqQixFQUF1QixzQkFBdkIsRUFBK0MsS0FBSyxRQUFMLENBQWMsU0FBN0Q7QUFDSDs7QUFFRDtBQUNBLGdCQUFJLEtBQUssTUFBTCxJQUFlLEtBQUssTUFBTCxDQUFZLE9BQS9CLEVBQXdDO0FBQ3BDLHlCQUFTLGlCQUFULENBQTJCLDJCQUEzQixFQUF3RCxLQUFLLE1BQUwsQ0FBWSxPQUFwRTtBQUNBLHlCQUFTLE9BQVQsQ0FBaUIsS0FBakIsRUFBd0Isd0JBQXhCLEVBQWtELEtBQUssTUFBTCxDQUFZLEtBQTlEO0FBQ0EseUJBQVMsT0FBVCxDQUFpQixJQUFqQixFQUF1Qix5QkFBdkIsRUFBa0QsS0FBSyxNQUFMLENBQVksTUFBOUQ7QUFDSDtBQUNKOzs7Z0NBekVlLE0sRUFBUTtBQUNwQixnQkFBSSxVQUFVLElBQWQsRUFBb0I7QUFDaEIsdUJBQU8sS0FBUDtBQUNIOztBQUVELGdCQUFJLE9BQU8sUUFBUCxJQUFtQixJQUFuQixJQUNBLE9BQU8sT0FBUCxJQUFrQixJQURsQixJQUVBLE9BQU8sT0FBUCxJQUFrQixJQUZsQixJQUdBLE9BQU8sUUFBUCxJQUFtQixJQUh2QixFQUc2QjtBQUN6Qix1QkFBTyxLQUFQO0FBQ0g7O0FBRUQsbUJBQU8sSUFBUDtBQUNIOzs7Ozs7a0JBM0RnQixROzs7QUEwSHJCLFNBQVMsS0FBVCxHQUFpQixVQUFqQjs7Ozs7QUNoSUE7O0FBR0E7O0FBR0E7Ozs7QUFDQTs7QUFHQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7Ozs7QUFFQTs7O0FBckNBO0FBc0NBLElBQUksUUFBUTtBQUNSLHNCQURRO0FBRVIsMEJBRlE7QUFHUiw0QkFIUTtBQUlSLDBCQUpRO0FBS1Isc0JBTFE7QUFNUiw0QkFOUTtBQU9SLHFDQVBRO0FBUVIsd0JBUlE7QUFTUiwyQ0FUUTtBQVVSLHFDQVZRO0FBV1IsOEJBWFE7QUFZUixnQ0FaUTtBQWFSLDBCQWJRO0FBY1IsMEJBZFE7QUFlUiwwQ0FmUTtBQWdCUix5Q0FoQlE7QUFpQlIsbUNBakJRO0FBa0JSLDZDQWxCUTtBQW1CUiwwQ0FuQlE7QUFvQlIsa0NBcEJRO0FBcUJSLHlDQXJCUTtBQXNCUixxQ0F0QlE7QUF1QlI7QUF2QlEsQ0FBWjs7QUEvQkE7OztBQUpBO0FBUEE7O0FBb0VBLElBQUksaUJBQU8sT0FBWCxFQUFvQjtBQUNoQixvQkFBTSw2QkFBTjs7QUFFQTtBQUNBO0FBQ0EsUUFBSSxPQUFPLE9BQVAsS0FBbUIsU0FBdkIsRUFBa0M7QUFDOUIsZUFBTyxPQUFQLEdBQWlCLE9BQWpCO0FBQ0Esd0JBQU0sUUFBTixDQUFlLE9BQWYsR0FBeUIsT0FBekI7QUFDSDtBQUNKOztBQUVELE9BQU8sT0FBUCxHQUFpQjtBQUNiLDZDQURhO0FBRWIsZ0JBRmE7QUFHYjtBQUhhLENBQWpCOzs7Ozs7Ozs7Ozs7O0FDL0VBOzs7O0FBQ0E7Ozs7QUFDQTs7SUFBWSxJOztBQUNaOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7O0FBRUE7SUFDcUIsSztBQUVqQixtQkFBWSxhQUFaLEVBQTJCLE9BQTNCLEVBQW9DO0FBQUE7O0FBQ2hDLGtCQUFVLFdBQVcsRUFBckI7QUFDQSxpQ0FBZSxJQUFmOztBQUVBLGFBQUssRUFBTCxHQUFVLE1BQU0sRUFBTixFQUFWO0FBQ0EsYUFBSyxXQUFMLEdBQW1CLEtBQW5CO0FBQ0EsYUFBSyxZQUFMLEdBQW9CLElBQXBCLENBTmdDLENBTU47QUFDMUIsYUFBSyxPQUFMLEdBQWUsRUFBZjs7QUFFQSxhQUFLLElBQUwsR0FBWSxtQkFBUyxJQUFULEVBQWUsT0FBZixDQUFaO0FBQ0EsYUFBSyxZQUFMLEdBQW9CLDJCQUFnQixFQUFFLE9BQU8sSUFBVCxFQUFlLE1BQU0sS0FBSyxJQUExQixFQUFoQixDQUFwQjtBQUNBLGFBQUssV0FBTCxHQUFtQixRQUFRLFVBQVIsSUFBc0IsQ0FBekM7QUFDQSxhQUFLLFVBQUwsR0FBa0IsUUFBUSxTQUExQjtBQUNBLFlBQUksUUFBUSx5QkFBUixLQUFzQyxJQUExQyxFQUFnRDtBQUM1QywwQkFBa0IsUUFBbEIsR0FBNkIsSUFBN0I7QUFDSDs7QUFFRCx3QkFBTSx3QkFBTixHQUFpQyxRQUFRLGtCQUFSLEtBQStCLFNBQS9CLEdBQTJDLFFBQVEsa0JBQW5ELEdBQXdFLElBQXpHO0FBQ0Esd0JBQU0sc0JBQU47O0FBRUEsYUFBSyxNQUFMLEdBQWMsSUFBZDtBQUNBLGFBQUssYUFBTCxHQUFxQixhQUFyQjtBQUNBLGFBQUssYUFBTCxHQUFxQixJQUFyQjtBQUNBLGFBQUssaUJBQUwsR0FBeUIsSUFBekI7QUFDQSxhQUFLLHdCQUFMLEdBQWdDLElBQWhDOztBQUVBLGFBQUssTUFBTCxHQUFjLElBQWQ7QUFDQSxhQUFLLGFBQUwsR0FBcUIsaUNBQXJCOztBQUVBLGFBQUssUUFBTCxHQUFnQixJQUFoQixDQTdCZ0MsQ0E2QmdCO0FBQ2hELGFBQUssS0FBTCxHQUFhLElBQWIsQ0E5QmdDLENBOEJnQjtBQUNoRCxhQUFLLFFBQUwsR0FBZ0IsS0FBaEIsQ0EvQmdDLENBK0JnQjtBQUNoRCxhQUFLLFNBQUwsR0FBaUIsUUFBUSxTQUF6QixDQWhDZ0MsQ0FnQ2dCO0FBQ2hELGFBQUssVUFBTCxHQUFrQixRQUFRLFVBQTFCLENBakNnQyxDQWlDZ0I7QUFDaEQsYUFBSyxXQUFMLEdBQW1CLENBQUMsUUFBUSxpQkFBNUIsQ0FsQ2dDLENBa0NnQjtBQUNoRCxhQUFLLGtCQUFMLEdBQTBCLEtBQTFCO0FBQ0EsYUFBSyxnQkFBTCxHQUF3QixLQUF4QjtBQUNBLGFBQUssWUFBTCxHQUFvQixDQUFwQjtBQUNBLGFBQUssaUJBQUwsR0FBeUIsQ0FBekI7QUFDQSxhQUFLLG9CQUFMLEdBQTRCLEtBQTVCO0FBQ0EsYUFBSyxLQUFMLEdBQWEsQ0FBYjtBQUNBLGFBQUssYUFBTCxHQUFxQiw2QkFBckI7QUFDQSxhQUFLLFNBQUwsR0FBaUIsSUFBakI7QUFDQSxhQUFLLGFBQUwsR0FBcUIsS0FBckI7QUFDQSxhQUFLLFNBQUw7O0FBRUEsYUFBSyxTQUFMLEdBQWlCLFFBQVEsU0FBekI7O0FBRUEsYUFBSyxNQUFMLEdBQWMsSUFBZDtBQUNBLGFBQUssVUFBTCxHQUFrQixJQUFsQjs7QUFFQSxhQUFLLGVBQUw7QUFDQSxhQUFLLFFBQUwsR0FBZ0IsQ0FBaEI7QUFDQSxhQUFLLFVBQUwsR0FBa0IsTUFBTSxVQUF4QixDQXJEZ0MsQ0FxREk7QUFDcEMsYUFBSyx3QkFBTCxHQUFnQyxNQUFNLFVBQXRDLENBdERnQyxDQXNEa0I7QUFDbEQsYUFBSyxVQUFMOztBQUVBLGFBQUssU0FBTCxHQUFpQixRQUFRLFFBQVIsSUFBb0IsTUFBckM7QUFDQSxzQkFBSSxRQUFKLENBQWEsS0FBSyxTQUFsQjtBQUNIOzs7Ozs7QUFNRDtBQUNBO0FBQ0E7QUFDQTsrQkFDeUM7QUFBQTs7QUFBQSxnQkFBcEMsYUFBb0MsdUVBQXBCLElBQW9CO0FBQUEsZ0JBQWQsT0FBYyx1RUFBSixFQUFJOztBQUNyQyxnQkFBSSxLQUFLLFlBQVQsRUFBdUI7QUFDbkIsdUJBQU8sS0FBSyxZQUFaO0FBQ0g7O0FBRUQsaUJBQUssUUFBTDtBQUNBLGlCQUFLLFdBQUwsR0FBbUIsS0FBbkI7O0FBRUE7QUFDQTtBQUNBLHNCQUFXLE9BQU8sT0FBUCxLQUFtQixRQUFwQixHQUFnQyxFQUFFLGFBQWEsT0FBZixFQUFoQyxHQUEyRCxPQUFyRTtBQUNBLGdCQUFJLGNBQWMsUUFBUSxXQUExQjs7QUFFQTtBQUNBLG9CQUFRLFFBQVIsR0FBb0IsUUFBUSxRQUFSLEtBQXFCLFNBQXRCLEdBQW1DLFFBQVEsUUFBM0MsR0FBc0QsSUFBekU7O0FBRUE7QUFDQSxpQkFBSyxZQUFMO0FBQ0EsaUJBQUssWUFBTCxHQUFvQixLQUFLLFNBQUwsQ0FBZSxhQUFmLEVBQThCLFdBQTlCLEVBQ2YsSUFEZSxDQUNWO0FBQUEsdUJBQU0sTUFBSyxhQUFMLEVBQU47QUFBQSxhQURVLEVBRWYsSUFGZSxDQUVWLFlBQU07QUFDUixzQkFBSyxxQkFBTDs7QUFFQTtBQUNBO0FBQ0Esb0JBQU0sa0JBQW9CLFFBQU8sTUFBSyxhQUFaLE1BQThCLFFBQS9CLElBQTRDLE1BQUssaUJBQUwsQ0FBdUIsTUFBdkIsQ0FBckU7O0FBRUEsb0JBQU0sV0FBVyxNQUFLLFlBQUwsQ0FBa0IsRUFBRSxnQ0FBRixFQUFtQixTQUFTLElBQTVCLEVBQWxCLENBQWpCO0FBQ0Esb0JBQUksUUFBUSxRQUFSLEtBQXFCLElBQXpCLEVBQStCO0FBQzNCLDJCQUFPLFFBQVA7QUFDSDtBQUNKLGFBYmUsRUFhYixJQWJhLENBYVIsWUFBTTtBQUNWLHNCQUFLLFFBQUw7QUFDQSxzQkFBSyxZQUFMLEdBQW9CLElBQXBCO0FBQ0Esc0JBQUssV0FBTCxHQUFtQixJQUFuQjtBQUNBLHNCQUFLLHdCQUFMLEdBQWdDLE1BQUssYUFBckM7QUFDQSxzQkFBSyxzQkFBTCxHQUE4QixNQUFLLFdBQW5DOztBQUVBLG9CQUFJLE1BQUssV0FBTCxLQUFxQixLQUF6QixFQUFnQztBQUM1QiwwQkFBSyxlQUFMO0FBQ0g7QUFDRCxzQkFBSyxhQUFMO0FBQ1AsYUF4Qm1CLEVBd0JqQixLQXhCaUIsQ0F3QlgsaUJBQVM7QUFDZCxzQkFBSyxZQUFMLEdBQW9CLElBQXBCO0FBQ0Esc0JBQUssUUFBTCxHQUFnQixDQUFoQjs7QUFFQTtBQUNBLG9CQUFJLGFBQUo7QUFBQSxvQkFBVSxnQkFBVjtBQUNBLG9CQUFJLE1BQU0sSUFBTixLQUFlLGVBQW5CLEVBQW9DO0FBQ2hDLDJCQUFPLE1BQVA7QUFDQSw4QkFBVSwwQkFBVjtBQUNILGlCQUhELE1BSUs7QUFDRDtBQUNBLDhCQUFVLDBCQUFWO0FBQ0g7QUFDRCxzQkFBSyxPQUFMLENBQWEsT0FBYixFQUFzQixFQUFFLFVBQUYsRUFBUSxnQkFBUixFQUFpQixZQUFqQixFQUF3QixLQUFLLE1BQUssYUFBbEMsRUFBdEI7O0FBRUEsMkRBQXlDLE1BQUssYUFBOUMsVUFBZ0UsTUFBTSxPQUF0RTtBQUNBLG9CQUFJLE1BQUssd0JBQVQsRUFBbUM7QUFDL0IsdUNBQUksTUFBSixFQUFZLE9BQVosRUFBcUIsS0FBckI7QUFDQSx1Q0FBSSxNQUFKO0FBQ0EsMkJBQU8sTUFBSyxJQUFMLENBQVUsTUFBSyx3QkFBZixFQUF5QyxNQUFLLHNCQUE5QyxDQUFQO0FBQ0g7QUFDRCxtQ0FBSSxPQUFKLEVBQWEsT0FBYixFQUFzQixLQUF0QjtBQUNBLHNCQUFNLEtBQU47QUFDSCxhQWhEbUIsQ0FBcEI7O0FBa0RBLG1CQUFPLEtBQUssWUFBWjtBQUNIOztBQUVEOzs7O2lDQUNpRDtBQUFBLGdCQUExQyxhQUEwQyx1RUFBMUIsSUFBMEI7QUFBQSxnQkFBcEIsV0FBb0IsdUVBQU4sSUFBTTs7QUFDN0MsbUJBQU8sS0FBSyxJQUFMLENBQVUsYUFBVixFQUF5QixXQUF6QixDQUFQO0FBQ0g7OztrQ0FFUztBQUNOLGlCQUFLLFdBQUwsR0FBbUIsS0FBbkI7QUFDQSxpQkFBSyxnQkFBTCxHQUF3QixJQUF4QixDQUZNLENBRXdCOztBQUU5QixpQkFBSyxnQkFBTDs7QUFFQSxnQkFBSSxLQUFLLE1BQUwsSUFBZSxLQUFLLE1BQUwsQ0FBWSxVQUEvQixFQUEyQztBQUN2QyxxQkFBSyxNQUFMLENBQVksVUFBWixDQUF1QixXQUF2QixDQUFtQyxLQUFLLE1BQXhDO0FBQ0EscUJBQUssTUFBTCxHQUFjLElBQWQ7QUFDSDtBQUNELGlCQUFLLFNBQUwsR0FBaUIsSUFBakI7O0FBRUEsZ0JBQUksS0FBSyxTQUFULEVBQW9CO0FBQ2hCLHFCQUFLLFNBQUwsQ0FBZSxPQUFmO0FBQ0g7O0FBRUQsZ0JBQUksS0FBSyxFQUFULEVBQWE7QUFDVCxrQ0FBUSxPQUFSLENBQWdCLEtBQUssRUFBckI7QUFDQSxxQkFBSyxhQUFMLENBQW1CLE9BQW5CLENBQTJCLEtBQUssRUFBaEM7QUFDQSxxQkFBSyxNQUFMLEdBQWMsRUFBZDs7QUFFQSx5Q0FBYyxLQUFkOztBQUVBO0FBQ0Esb0JBQUksTUFBTSxLQUFLLEVBQUwsQ0FBUSxZQUFSLENBQXFCLG9CQUFyQixDQUFWO0FBQ0Esb0JBQUksR0FBSixFQUFTO0FBQ0wsd0JBQUksV0FBSjtBQUNIOztBQUVELHFCQUFLLEVBQUwsR0FBVSxJQUFWO0FBQ0g7O0FBRUQsaUJBQUssT0FBTCxHQUFlLEVBQWY7O0FBRUEsaUJBQUssY0FBTDtBQUNBLGlCQUFLLFlBQUwsQ0FBa0IsT0FBbEI7QUFDQSxpQkFBSyxZQUFMLEdBQW9CLElBQXBCO0FBQ0g7Ozt1Q0FFYztBQUNYLGdCQUFJLEtBQUssTUFBVCxFQUFpQjtBQUNiO0FBQ0g7O0FBRUQsaUJBQUssU0FBTCxHQUFpQixLQUFLLFNBQUwsSUFBa0IsU0FBUyxJQUE1QztBQUNBLGlCQUFLLE1BQUwsR0FBYyxTQUFTLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBZDtBQUNBLGlCQUFLLE1BQUwsQ0FBWSxLQUFaLENBQWtCLFFBQWxCLEdBQTZCLFVBQTdCO0FBQ0EsaUJBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsR0FBbEIsR0FBd0IsQ0FBeEI7QUFDQSxpQkFBSyxNQUFMLENBQVksS0FBWixDQUFrQixJQUFsQixHQUF5QixDQUF6Qjs7QUFFQTtBQUNBLGlCQUFLLFNBQUwsQ0FBZSxLQUFmLENBQXFCLGVBQXJCLEdBQXVDLGFBQXZDO0FBQ0EsaUJBQUssU0FBTCxDQUFlLFdBQWYsQ0FBMkIsS0FBSyxNQUFoQzs7QUFFQSxnQkFBSTtBQUNBLHFCQUFLLEVBQUwsR0FBVSxrQkFBUSxVQUFSLENBQW1CLEtBQUssTUFBeEIsRUFBZ0M7QUFDdEMsMkJBQU8sSUFEK0IsRUFDekIsb0JBQW9CLElBREssRUFDQztBQUN2Qyx3Q0FBb0IsZ0JBQU07QUFGWSxpQkFBaEMsQ0FBVjtBQUlILGFBTEQsQ0FNQSxPQUFNLENBQU4sRUFBUztBQUNMLHNCQUFNLElBQUksS0FBSixDQUNGLG9DQUNBLDBEQURBLEdBRUEsOENBSEUsQ0FBTjtBQUtIOztBQUVELGlCQUFLLFNBQUwsQ0FBZSxLQUFLLFNBQUwsQ0FBZSxXQUE5QixFQUEyQyxLQUFLLFNBQUwsQ0FBZSxZQUExRDtBQUNBLDBCQUFrQixJQUFsQixDQUF1QixLQUFLLEVBQTVCO0FBQ0EsaUJBQUssYUFBTCxHQUFxQiwyQkFBdUIsS0FBSyxFQUE1QixDQUFyQjtBQUNBLGlCQUFLLGFBQUwsQ0FBbUIsU0FBbkIsQ0FBNkIsS0FBSyxNQUFsQztBQUNIOztBQUVEOzs7O3VDQUNlO0FBQ1gsZ0JBQUksYUFBYSxLQUFLLFVBQUwsSUFBbUIsS0FBSyxjQUFMLENBQW9CLGtCQUFwQixFQUF3QyxnQkFBeEMsQ0FBcEM7O0FBRUEsZ0JBQUksQ0FBQyxVQUFMLEVBQWlCO0FBQ2Isc0JBQU0sSUFBSSxLQUFKLENBQVUsK0VBQVYsQ0FBTjtBQUNIOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQUksb0NBQVcsS0FBSyxtQkFBaEIsRUFBSjtBQUNBLGlCQUFLLElBQUwsQ0FBVSxVQUFWLEVBWlcsQ0FZWTtBQUN2QixnQkFBSSwwQkFBd0IsS0FBSyxHQUFMLENBQVM7QUFBQSw4QkFBVyxHQUFYO0FBQUEsYUFBVCxFQUE0QixJQUE1QixDQUFpQyxHQUFqQyxDQUF4QixPQUFKO0FBQ0EsbUJBQU8sS0FBSyxlQUFMLENBQXFCLElBQUksSUFBSixDQUFTLENBQUMsSUFBRCxDQUFULEVBQWlCLEVBQUUsTUFBTSx3QkFBUixFQUFqQixDQUFyQixDQUFQO0FBQ0g7O0FBRUQ7Ozs7a0RBQzJCO0FBQUE7QUFBQTs7QUFDdkIsZ0JBQUksNENBQW9CLEtBQUssbUJBQUwsSUFBMEIsRUFBOUMsRUFBSixDQUR1QixDQUNpQztBQUN4RCxnQkFBSSxVQUFVLE9BQU8sSUFBUCxDQUFZLEtBQUssTUFBTCxDQUFZLE9BQXhCLEVBQWlDLEdBQWpDLENBQXFDO0FBQUEsdUJBQUssT0FBSyxNQUFMLENBQVksT0FBWixDQUFvQixDQUFwQixFQUF1QixPQUE1QjtBQUFBLGFBQXJDLEVBQTBFLE1BQTFFLENBQWlGO0FBQUEsdUJBQUssQ0FBTDtBQUFBLGFBQWpGLENBQWQ7QUFDQSxnQkFBSSxRQUFRLE1BQVIsR0FBaUIsQ0FBckIsRUFBd0I7QUFDcEIsbUNBQUksT0FBSixFQUFhLCtDQUFiLEVBQThELE9BQTlEO0FBQ0g7QUFDRCxpQkFBSyxtQkFBTCxHQUEyQixZQUFHLE1BQUgsZ0NBQWEsT0FBYixHQUFzQixJQUF0QixFQUEzQjs7QUFFQTtBQUNBLG1CQUFPLEVBQUUsS0FBSyxtQkFBTCxDQUF5QixNQUF6QixLQUFvQyxhQUFhLE1BQWpELElBQ0wsS0FBSyxtQkFBTCxDQUF5QixLQUF6QixDQUErQixVQUFDLENBQUQsRUFBSSxDQUFKO0FBQUEsdUJBQVUsTUFBTSxhQUFhLENBQWIsQ0FBaEI7QUFBQSxhQUEvQixDQURHLENBQVA7QUFFSDs7QUFFRDs7Ozt3Q0FDZ0I7QUFDWjtBQUNBLGdCQUFJLEtBQUssdUJBQUwsRUFBSixFQUFvQztBQUNoQyxxQkFBSyxjQUFMO0FBQ0g7O0FBRUQsZ0JBQUksQ0FBQyxLQUFLLE9BQVYsRUFBbUI7QUFDZix1QkFBTyxLQUFLLFdBQUwsQ0FBaUIsS0FBSyxZQUFMLEVBQWpCLENBQVA7QUFDSDtBQUNELG1CQUFPLFFBQVEsT0FBUixFQUFQO0FBQ0g7O0FBRUQ7Ozs7b0NBQ1ksRyxFQUFLO0FBQUE7O0FBQ2IsZ0JBQUksUUFBUSxFQUFaOztBQUVBLGlCQUFLLE9BQUwsR0FBZSxFQUFmOztBQUhhO0FBS0wseUJBQVMsSUFBSSxNQUFKLENBQVcsR0FBWCxDQUxKOztBQU1ULHVCQUFLLE9BQUwsQ0FBYSxFQUFiLElBQW1CLE1BQW5COztBQUVBLHdDQUFhLFNBQWIsQ0FBdUIsTUFBdkI7O0FBRUEsbUNBQUksT0FBSiw4Q0FBdUQsRUFBdkQ7QUFDQSxvQkFBSSxNQUFNLEVBQVY7QUFDQSxzQkFBTSxJQUFOLENBQVcsd0JBQWEsV0FBYixDQUF5QixNQUF6QixFQUFpQyxXQUFqQyxFQUE4QyxPQUFLLEVBQW5ELEVBQXVELEVBQXZELEVBQTJELE9BQUssV0FBaEUsRUFBNkUsT0FBSyxTQUFsRixFQUE2RixnQkFBTSxrQkFBbkcsRUFBdUgsSUFBdkgsQ0FDUCxVQUFDLEVBQUQsRUFBUTtBQUNKLHVDQUFJLE9BQUosNkNBQXNELEVBQXREO0FBQ0EsMkJBQU8sRUFBUDtBQUNILGlCQUpNLEVBS1AsVUFBQyxLQUFELEVBQVc7QUFDUCx1Q0FBSSxPQUFKLHNEQUErRCxHQUEvRCxRQUF1RSxLQUF2RTtBQUNBLDJCQUFPLFFBQVEsTUFBUixDQUFlLEtBQWYsQ0FBUDtBQUNILGlCQVJNLENBQVg7QUFaUzs7QUFJYixpQkFBSyxJQUFJLEtBQUcsQ0FBWixFQUFlLEtBQUssS0FBSyxXQUF6QixFQUFzQyxJQUF0QyxFQUE0QztBQUFBLG9CQUNwQyxNQURvQzs7QUFBQTtBQWtCM0M7O0FBRUQsaUJBQUssV0FBTCxHQUFtQixDQUFuQjtBQUNBLG1CQUFPLFFBQVEsR0FBUixDQUFZLEtBQVosRUFBbUIsSUFBbkIsQ0FBd0IsWUFBTTtBQUNqQyw4QkFBSSxVQUFKLENBQWUsT0FBSyxPQUFwQjs7QUFFQTtBQUNBLG9CQUFJLGNBQWMsT0FBSyxFQUFMLENBQVEsWUFBUixDQUFxQix3QkFBckIsSUFBaUQsSUFBakQsR0FBd0QsS0FBMUU7QUFDQSx3Q0FBYSxXQUFiLENBQXlCLE9BQUssT0FBOUIsRUFBdUMsOEJBQXZDLEVBQXVFLFdBQXZFO0FBQ0gsYUFOTSxDQUFQO0FBT0g7Ozt5Q0FFZ0I7QUFDYixnQkFBSSxNQUFNLE9BQU4sQ0FBYyxLQUFLLE9BQW5CLENBQUosRUFBaUM7QUFDN0IsOEJBQUksVUFBSixDQUFlLElBQWY7QUFDQSxxQkFBSyxPQUFMLENBQWEsT0FBYixDQUFxQixVQUFDLE1BQUQsRUFBWTtBQUM3QiwyQkFBTyxTQUFQO0FBQ0gsaUJBRkQ7QUFHQSxxQkFBSyxPQUFMLEdBQWUsSUFBZjtBQUNIO0FBQ0o7O0FBRUQ7Ozs7K0NBQ3VCLE0sRUFBUTtBQUMzQixnQkFBSSxlQUFKOztBQUVBLGdCQUFJLE9BQU8sS0FBWCxFQUFrQjtBQUNkO0FBQ0EseUJBQVMsS0FBSyxPQUFMLENBQWEsS0FBSyxXQUFsQixDQUFUO0FBQ0EscUJBQUssV0FBTCxHQUFtQixDQUFDLEtBQUssV0FBTCxHQUFtQixDQUFwQixJQUF5QixLQUFLLE9BQUwsQ0FBYSxNQUF6RDtBQUNILGFBSkQsTUFLSztBQUNEO0FBQ0E7QUFDQSx5QkFBUyxLQUFLLE9BQUwsQ0FBYSxPQUFPLEVBQVAsR0FBWSxLQUFLLE9BQUwsQ0FBYSxNQUF0QyxDQUFUO0FBQ0g7O0FBRUQsbUJBQU8sTUFBUDtBQUNIOztBQUVEOzs7O2dDQUNRO0FBQ0osZ0JBQUksQ0FBQyxLQUFLLElBQUwsQ0FBVSxLQUFWLEVBQUQsSUFBc0IsT0FBTyxJQUFQLENBQVksS0FBSyxPQUFqQixFQUEwQixNQUExQixLQUFxQyxDQUEvRCxFQUFrRTtBQUM3RCx1QkFBTyxLQUFQO0FBQ0o7QUFDRCxtQkFBTyxJQUFQO0FBQ0g7O0FBRUQ7Ozs7aURBQzBCO0FBQUE7O0FBQ3RCLGdCQUFJLGdCQUFNLHNCQUFOLEVBQUosRUFBb0M7QUFDaEMsd0NBQWEsV0FBYixDQUF5QixLQUFLLE9BQTlCLEVBQXVDLDZCQUF2QyxFQUFzRSxnQkFBTSxrQkFBNUUsRUFDSyxJQURMLENBQ1U7QUFBQSwyQkFBTSxPQUFLLE9BQUwsRUFBTjtBQUFBLGlCQURWLEVBRUssSUFGTCxDQUVVO0FBQUEsMkJBQU0sT0FBSyxTQUFMLENBQWUsT0FBSyxJQUFMLENBQVUsSUFBVixDQUFlLEdBQWYsQ0FBbUIsS0FBbEMsRUFBeUMsT0FBSyxJQUFMLENBQVUsSUFBVixDQUFlLEdBQWYsQ0FBbUIsTUFBNUQsQ0FBTjtBQUFBLGlCQUZWO0FBR0g7QUFDSjs7O2tDQUVTLEssRUFBTyxNLEVBQVE7QUFDckIsZ0JBQUksVUFBVSxDQUFWLElBQWUsV0FBVyxDQUE5QixFQUFpQztBQUM3QjtBQUNIOztBQUVELGlCQUFLLEtBQUwsR0FBYSxJQUFiO0FBQ0EsaUJBQUssSUFBTCxDQUFVLGVBQVYsQ0FBMEIsS0FBMUIsRUFBaUMsTUFBakM7QUFDQSxnQkFBSSxLQUFLLEVBQVQsRUFBYTtBQUNULGtDQUFRLE1BQVIsQ0FBZSxLQUFLLEVBQXBCLEVBQXdCLEtBQXhCLEVBQStCLE1BQS9CLEVBQXVDLGdCQUFNLGtCQUE3QztBQUNIO0FBQ0o7O0FBRUQ7Ozs7d0NBQ2dCO0FBQ1osaUJBQUssS0FBTCxHQUFhLElBQWI7QUFDSDs7QUFFRDtBQUNBO0FBQ0E7Ozs7MENBQ2tCO0FBQ2QsaUJBQUssS0FBTCxHQUFhLElBQWI7QUFDQSxpQkFBSyxNQUFMO0FBQ0g7OztxQ0FFYTtBQUNWLGlCQUFLLGtCQUFMLEdBQTBCLElBQTFCLENBRFUsQ0FDc0I7O0FBRWhDLGdCQUFJLEtBQUssV0FBVCxFQUFzQjtBQUNsQjtBQUNBLHFCQUFLLE1BQUw7QUFDSDs7QUFFRDtBQUNBLGdCQUFJLENBQUMsS0FBSyxnQkFBVixFQUE0QjtBQUN4Qix1QkFBTyxxQkFBUCxDQUE2QixLQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBcUIsSUFBckIsQ0FBN0I7QUFDSCxhQUZELE1BR0s7QUFDRCxxQkFBSyxnQkFBTCxHQUF3QixLQUF4QjtBQUNBLHFCQUFLLGtCQUFMLEdBQTBCLEtBQTFCO0FBQ0g7QUFDSjs7QUFFRDs7OzswQ0FDa0I7QUFBQTs7QUFDZCxnQkFBSSxDQUFDLEtBQUssa0JBQVYsRUFBOEI7QUFDMUIsMkJBQVcsWUFBTTtBQUFFLDJCQUFLLFVBQUw7QUFBb0IsaUJBQXZDLEVBQXlDLENBQXpDLEVBRDBCLENBQ21CO0FBQ2hEO0FBQ0o7OztpQ0FFUTtBQUNMO0FBQ0EsZ0JBQUksY0FBYyxFQUNkLEtBQUssS0FBTCxLQUFlLEtBQWYsSUFDQSxLQUFLLFdBQUwsS0FBcUIsS0FEckIsSUFFQSxLQUFLLFFBQUwsR0FBZ0IsQ0FGaEIsSUFHQSxLQUFLLEtBQUwsT0FBaUIsS0FKSCxDQUFsQjs7QUFPQTtBQUNBLGdCQUFJLE9BQU8sS0FBSyxTQUFaLEtBQTBCLFVBQTlCLEVBQTBDO0FBQ3RDLHFCQUFLLFNBQUwsQ0FBZSxXQUFmO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBSSxDQUFDLFdBQUwsRUFBa0I7QUFDZCx1QkFBTyxLQUFQO0FBQ0g7QUFDRCxpQkFBSyxLQUFMLEdBQWEsS0FBYixDQWxCSyxDQWtCZTs7QUFFcEI7QUFDQSxpQkFBSyxzQkFBTDtBQUNBLGlCQUFLLE1BQUw7QUFDQSxpQkFBSyxrQkFBTCxHQXZCSyxDQXVCc0I7QUFDM0IsaUJBQUssYUFBTCxDQUFtQixrQkFBbkIsR0F4QkssQ0F3Qm9DOztBQUV6QztBQUNBLGdCQUFJLE9BQU8sS0FBSyxVQUFaLEtBQTJCLFVBQS9CLEVBQTJDO0FBQ3ZDLHFCQUFLLFVBQUwsQ0FBZ0IsV0FBaEI7QUFDSDs7QUFFRDtBQUNBLGdCQUFJLEtBQUssUUFBTCxLQUFrQixJQUFsQixJQUEwQixLQUFLLElBQUwsQ0FBVSxXQUFWLEVBQTlCLEVBQXVEO0FBQ25ELHFCQUFLLEtBQUwsR0FBYSxJQUFiO0FBQ0g7O0FBRUQsaUJBQUssS0FBTDtBQUNBLCtCQUFJLE9BQUosRUFBYSxnQkFBYjtBQUNBLG1CQUFPLElBQVA7QUFDSDs7O2lDQUVRO0FBQUE7O0FBQ0wsZ0JBQUksS0FBSyxLQUFLLEVBQWQ7O0FBRUE7QUFDQSxpQkFBSyxJQUFMLENBQVUsTUFBVjtBQUNBLG1CQUFPLElBQVAsQ0FBWSxLQUFLLE1BQWpCLEVBQXlCLE9BQXpCLENBQWlDO0FBQUEsdUJBQUssT0FBSyxNQUFMLENBQVksQ0FBWixFQUFlLE1BQWYsRUFBTDtBQUFBLGFBQWpDOztBQUVBO0FBQ0EsaUJBQUssWUFBTCxHQUFvQixLQUFLLFVBQUwsRUFBcEI7O0FBRUE7QUFDQSxnQkFBSSxLQUFLLFNBQUwsQ0FBZSxlQUFmLEVBQUosRUFBc0M7QUFDbEMsb0JBQUksS0FBSyxJQUFMLENBQVUsT0FBVixJQUFxQixLQUFLLElBQUwsQ0FBVSxPQUFuQyxFQUE0QztBQUN4Qyx5QkFBSyxTQUFMLENBQWUsb0JBQWY7QUFDQTtBQUNIOztBQUVELHFCQUFLLFNBQUwsQ0FBZSxJQUFmLEdBTmtDLENBTU07QUFDeEMscUJBQUssVUFBTCxDQUNJLG1CQURKLEVBQ3dDO0FBQ3BDLGtCQUFFLGFBQWEsS0FBZixFQUZKO0FBR0EscUJBQUssU0FBTCxDQUFlLElBQWYsR0FWa0MsQ0FVTTs7QUFFeEM7QUFDQSxtQkFBRyxlQUFILENBQW1CLEdBQUcsV0FBdEIsRUFBbUMsSUFBbkM7QUFDQSxtQkFBRyxRQUFILENBQVksQ0FBWixFQUFlLENBQWYsRUFBa0IsS0FBSyxNQUFMLENBQVksS0FBOUIsRUFBcUMsS0FBSyxNQUFMLENBQVksTUFBakQ7QUFDSDs7QUFFRCxpQkFBSyxvQkFBTCxHQUE0QixLQUE1QjtBQUNBLGdCQUFJLEtBQUssWUFBTCxLQUFzQixLQUFLLGlCQUEvQixFQUFrRDtBQUM5QyxxQkFBSyxvQkFBTCxHQUE0QixJQUE1Qjs7QUFFQSxxQkFBSywwQkFBTCxHQUFrQyxJQUFsQyxDQUF1QyxnQkFBUTtBQUMzQyx3QkFBSSxJQUFKLEVBQVU7QUFBRTtBQUNSLDJDQUFJLE1BQUosdUJBQStCLE9BQUssWUFBcEMscUJBQWdFLElBQWhFO0FBQ0g7QUFDSixpQkFKRDtBQUtIO0FBQ0QsaUJBQUssaUJBQUwsR0FBeUIsS0FBSyxZQUE5Qjs7QUFFQSxtQkFBTyxJQUFQO0FBQ0g7O0FBRUQ7QUFDQTs7OztxQ0FDMEQ7QUFBQTs7QUFBQSxnQkFBL0MsV0FBK0MsdUVBQWpDLFNBQWlDOztBQUFBLDRGQUFKLEVBQUk7QUFBQSxnQkFBcEIsV0FBb0IsU0FBcEIsV0FBb0I7O0FBQ3REO0FBQ0EsMEJBQWUsZUFBZSxJQUFoQixHQUF3QixJQUF4QixHQUErQixXQUE3Qzs7QUFFQSxpQkFBSyxVQUFMLENBQWdCLEVBQUUsYUFBYSxJQUFmLEVBQXFCLGFBQWEsSUFBbEMsRUFBaEI7O0FBRUE7QUFDQSxnQkFBSSxTQUFTLEtBQUssWUFBTCxDQUFrQixlQUFsQixHQUNULEdBRFMsQ0FDTDtBQUFBLHVCQUFLLE9BQUssTUFBTCxDQUFZLENBQVosQ0FBTDtBQUFBLGFBREssRUFFVCxNQUZTLENBRUY7QUFBQSx1QkFBSyxDQUFMO0FBQUEsYUFGRSxHQUVPO0FBQ2hCLGdCQUhTLENBR0osYUFBTSxjQUhGLENBQWI7O0FBS0E7QUFDQSxnQkFBSSxRQUFRLENBQVosQ0Fic0QsQ0FhdkM7QUFDZixnQkFBSSxtQkFBSjtBQUNBLGlCQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxPQUFPLE1BQXpCLEVBQWlDLEdBQWpDLEVBQXNDO0FBQ2xDLG9CQUFJLFFBQVEsT0FBTyxDQUFQLENBQVo7O0FBRUE7QUFDQSxvQkFBSSxNQUFNLEtBQU4sS0FBZ0IsVUFBcEIsRUFBZ0M7QUFDNUIsd0JBQUksUUFBUSxPQUFPLE1BQVAsQ0FBYyxFQUFkLEVBQ1IsYUFBTSxhQUFOLENBQW9CLE1BQU0sS0FBMUIsQ0FEUSxFQUNnQztBQUN4QyxzQkFBRSxPQUFRLGVBQWUsTUFBTSxLQUEvQixFQUZRLENBRWdDO0FBRmhDLHFCQUFaO0FBSUEseUJBQUssY0FBTCxDQUFvQixLQUFwQjtBQUNIO0FBQ0QseUJBQVMsS0FBSyxXQUFMLENBQWlCLE1BQU0sSUFBdkIsRUFBNkIsV0FBN0IsQ0FBVDtBQUNBLDZCQUFhLE1BQU0sS0FBbkI7QUFDSDs7QUFFRCxtQkFBTyxLQUFQO0FBQ0g7OztvQ0FFVyxVLEVBQVksVyxFQUFhO0FBQ2pDLGdCQUFJLFFBQVEsS0FBSyxNQUFMLENBQVksVUFBWixDQUFaO0FBQ0EsZ0JBQUksa0JBQWtCLElBQXRCO0FBQ0EsZ0JBQUksZUFBZSxDQUFuQjtBQUNBLGdCQUFJLGdCQUFKOztBQUVBO0FBQ0EsZ0JBQUksbUJBQW1CLEtBQUssWUFBTCxDQUFrQixrQkFBbEIsRUFBdkI7QUFDQSxpQkFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksaUJBQWlCLE1BQW5DLEVBQTJDLEdBQTNDLEVBQWdEO0FBQzVDLG9CQUFJLE9BQU8saUJBQWlCLENBQWpCLENBQVg7O0FBRUEsb0JBQUksS0FBSyxNQUFMLENBQVksVUFBWixLQUEyQixJQUEvQixFQUFxQztBQUNqQztBQUNIOztBQUVEO0FBQ0E7QUFDQTtBQUNBLG9CQUFJLG9CQUFvQixJQUF4QixFQUE4QjtBQUMxQixzQ0FBa0IsS0FBbEI7QUFDQSw4QkFBVSxLQUFLLFVBQUwsQ0FBZ0IsS0FBaEIsRUFBdUIsV0FBdkIsQ0FBVjtBQUNBLHdCQUFJLENBQUMsT0FBTCxFQUFjO0FBQ1YsK0JBQU8sQ0FBUDtBQUNIO0FBQ0o7O0FBRUQ7QUFDQSxvQkFBSSxDQUFDLEtBQUssbUJBQUwsQ0FBeUIsVUFBekIsQ0FBTCxFQUEyQztBQUN2QztBQUNBO0FBQ0g7O0FBRUQ7QUFDQSxxQkFBSyxJQUFMLENBQVUsU0FBVixDQUFvQixJQUFwQixFQUEwQixPQUExQjs7QUFFQTtBQUNBLG9CQUFJLE9BQU8sS0FBSyxNQUFMLENBQVksVUFBWixDQUFYO0FBQ0Esb0JBQUksTUFBTSxNQUFOLENBQWEsSUFBYixDQUFKLEVBQXdCO0FBQ3BCO0FBQ0Esd0JBQUksRUFBRSxLQUFLLElBQUwsQ0FBVSxPQUFWLElBQXFCLEtBQUssSUFBTCxDQUFVLE9BQWpDLENBQUosRUFBK0M7QUFDNUMsNkJBQUssYUFBTDtBQUNGO0FBQ0o7QUFDRCxnQ0FBZ0IsS0FBSyxjQUFyQjtBQUNIOztBQUVELG1CQUFPLFlBQVA7QUFDSDs7O21DQUVVLEssRUFBTyxXLEVBQWE7QUFDM0I7QUFDQSxnQkFBSSxnQkFBSjtBQUNBLGdCQUFJO0FBQ0EsMEJBQVUsTUFBTSxVQUFOLENBQWlCLFdBQWpCLENBQVY7QUFDQSxvQkFBSSxDQUFDLE9BQUwsRUFBYztBQUNWO0FBQ0g7QUFDSixhQUxELENBTUEsT0FBTSxLQUFOLEVBQWE7QUFDVCxxQkFBSyxPQUFMLENBQWEsU0FBYixFQUF3QjtBQUNwQiwwQkFBTSxRQURjO0FBRXBCLHdEQUFrQyxNQUFNLElBRnBCO0FBR3BCLGdDQUhvQjtBQUlwQixtQ0FBZSxNQUFNLE9BQU4sSUFBaUIsTUFBTSxPQUFOLENBQWM7QUFKMUIsaUJBQXhCO0FBTUE7QUFDSDs7QUFFRCxvQkFBUSxHQUFSO0FBQ0Esa0JBQU0sS0FBTjs7QUFFQSxvQkFBUSxPQUFSLENBQWdCLElBQWhCLEVBQXNCLFFBQXRCLEVBQWdDLEtBQUssUUFBTCxHQUFpQixDQUFFLENBQUMsSUFBSSxJQUFKLEVBQUYsR0FBZ0IsS0FBSyxVQUF0QixJQUFvQyxJQUFyRCxHQUE2RCxDQUE3RjtBQUNBLGlCQUFLLElBQUwsQ0FBVSxZQUFWLENBQXVCLE9BQXZCO0FBQ0EsaUJBQUssSUFBSSxDQUFULElBQWMsS0FBSyxNQUFuQixFQUEyQjtBQUN2QixxQkFBSyxNQUFMLENBQVksQ0FBWixFQUFlLFlBQWYsQ0FBNEIsT0FBNUI7QUFDSDs7QUFFRCxtQkFBTyxPQUFQO0FBQ0g7OztxQ0FFNkM7QUFBQSw0RkFBSixFQUFJO0FBQUEsZ0JBQWpDLFdBQWlDLFNBQWpDLFdBQWlDO0FBQUEsZ0JBQXBCLFdBQW9CLFNBQXBCLFdBQW9COztBQUMxQyxnQkFBSSxDQUFDLEtBQUssV0FBVixFQUF1QjtBQUNuQjtBQUNIOztBQUVEO0FBQ0EsMEJBQWUsZ0JBQWdCLEtBQWpCLEdBQTBCLEtBQTFCLEdBQWtDLElBQWhELENBTjBDLENBTVk7QUFDdEQsMEJBQWUsZ0JBQWdCLEtBQWpCLEdBQTBCLEtBQTFCLEdBQWtDLElBQWhELENBUDBDLENBT1k7O0FBRXREO0FBQ0EsaUJBQUssYUFBTCxDQUFtQixXQUFuQixDQUErQixHQUEvQixDQUFtQyxFQUFFLGFBQWEsV0FBZixFQUFuQzs7QUFFQSxnQkFBSSxLQUFLLEtBQUssRUFBZDtBQUNBLGdCQUFJLGVBQWUsV0FBbkIsRUFBZ0M7QUFDNUIsb0JBQUksT0FBTyxDQUFDLGVBQWUsR0FBRyxnQkFBbkIsS0FBd0MsZUFBZSxHQUFHLGdCQUExRCxDQUFYO0FBQ0EsbUJBQUcsS0FBSCxDQUFTLElBQVQ7QUFDSDtBQUNKOzs7eUNBRWtFO0FBQUEsNEZBQUosRUFBSTtBQUFBLGdCQUFsRCxVQUFrRCxTQUFsRCxVQUFrRDtBQUFBLGdCQUF0QyxXQUFzQyxTQUF0QyxXQUFzQztBQUFBLGdCQUF6QixTQUF5QixTQUF6QixTQUF5QjtBQUFBLGdCQUFkLEtBQWMsU0FBZCxLQUFjOztBQUMvRCxnQkFBSSxDQUFDLEtBQUssV0FBVixFQUF1QjtBQUNuQjtBQUNIOztBQUVEO0FBQ0E7QUFDQSxnQkFBSSxnQkFBZ0IsS0FBSyxhQUF6QjtBQUNBLHlCQUFjLGVBQWUsS0FBaEIsR0FBeUIsS0FBekIsR0FBaUMsY0FBYyxRQUFkLENBQXVCLFVBQXJFLENBUitELENBUXVCO0FBQ3RGLDBCQUFlLGdCQUFnQixLQUFqQixHQUEwQixLQUExQixHQUFrQyxjQUFjLFFBQWQsQ0FBdUIsV0FBdkUsQ0FUK0QsQ0FTdUI7QUFDdEYsd0JBQWEsY0FBYyxLQUFmLEdBQXdCLEtBQXhCLEdBQWdDLGNBQWMsUUFBZCxDQUF1QixPQUFuRSxDQVYrRCxDQVV1QjtBQUN0RixvQkFBUyxTQUFTLElBQVYsR0FBa0IsS0FBbEIsR0FBMEIsY0FBYyxRQUFkLENBQXVCLFFBQXpELENBWCtELENBV3VCOztBQUV0RjtBQUNBLGdCQUFJLEtBQUssS0FBSyxFQUFkOztBQUVBLDBCQUFjLFVBQWQsQ0FBeUIsR0FBekIsQ0FBNkIsRUFBRSxZQUFZLFVBQWQsRUFBN0I7QUFDQSwwQkFBYyxXQUFkLENBQTBCLEdBQTFCLENBQThCLEVBQUUsYUFBYSxXQUFmLEVBQTlCO0FBQ0EsMEJBQWMsT0FBZCxDQUFzQixHQUF0QixDQUEwQixFQUFFLE1BQU0sU0FBUixFQUFtQixNQUFNLGNBQWMsUUFBZCxDQUF1QixZQUFoRCxFQUExQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBSSxLQUFKLEVBQVc7QUFDUDtBQUNBLG9CQUFJLFVBQVUsUUFBZCxFQUF3QjtBQUNwQixrQ0FBYyxRQUFkLENBQXVCLEdBQXZCLENBQTJCO0FBQ3ZCLCtCQUFPO0FBRGdCLHFCQUEzQjtBQUdIO0FBQ0Q7QUFMQSxxQkFNSyxJQUFJLFVBQVUsU0FBVixJQUF1QixVQUFVLE9BQXJDLEVBQThDO0FBQy9DLHNDQUFjLFFBQWQsQ0FBdUIsR0FBdkIsQ0FBMkI7QUFDdkIsbUNBQU8sSUFEZ0I7QUFFdkIsaUNBQUssR0FBRyxTQUZlLEVBRUosS0FBSyxHQUFHLG1CQUZKO0FBR3ZCLHVDQUFXLEdBQUcsR0FIUyxFQUdKLFdBQVcsR0FBRztBQUhWLHlCQUEzQjtBQUtIO0FBQ0Q7QUFQSyx5QkFRQSxJQUFJLFVBQVUsS0FBZCxFQUFxQjtBQUN0QiwwQ0FBYyxRQUFkLENBQXVCLEdBQXZCLENBQTJCO0FBQ3ZCLHVDQUFPLElBRGdCO0FBRXZCLHFDQUFLLEdBQUcsR0FGZSxFQUVWLEtBQUssR0FBRztBQUZFLDZCQUEzQjtBQUlIO0FBQ0Q7QUFOSyw2QkFPQSxJQUFJLFVBQVUsVUFBZCxFQUEwQjtBQUMzQiw4Q0FBYyxRQUFkLENBQXVCLEdBQXZCLENBQTJCO0FBQ3ZCLDJDQUFPLElBRGdCO0FBRXZCLHlDQUFLLEdBQUcsSUFGZSxFQUVULEtBQUssR0FBRztBQUZDLGlDQUEzQjtBQUlIO0FBQ0osYUE3QkQsTUE4Qks7QUFDRCw4QkFBYyxRQUFkLENBQXVCLEdBQXZCLENBQTJCLEVBQUUsT0FBTyxLQUFULEVBQTNCO0FBQ0g7QUFDSjs7QUFFRDs7OztxQ0FDYSxLLEVBQU87QUFDaEIsZ0JBQUksQ0FBQyxLQUFLLFdBQVYsRUFBdUI7QUFDbkIsbUNBQUksT0FBSixFQUFhLDBEQUFiO0FBQ0EsdUJBQU8sUUFBUSxPQUFSLEVBQVA7QUFDSDs7QUFFRDtBQUNBLGdCQUFJLFFBQVE7QUFDUixtQkFBRyxNQUFNLENBQU4sR0FBVSxnQkFBTSxrQkFBaEIsR0FBcUMsS0FBSyxJQUFMLENBQVUsSUFBVixDQUFlLE1BQWYsQ0FBc0IsS0FEdEQ7QUFFUixtQkFBRyxNQUFNLENBQU4sR0FBVSxnQkFBTSxrQkFBaEIsR0FBcUMsS0FBSyxJQUFMLENBQVUsSUFBVixDQUFlLE1BQWYsQ0FBc0I7QUFGdEQsYUFBWjs7QUFLQSxpQkFBSyxLQUFMLEdBQWEsSUFBYixDQVpnQixDQVlHO0FBQ25CLG1CQUFPLEtBQUssU0FBTCxDQUFlLFlBQWYsQ0FBNEIsS0FBNUIsRUFDSCxJQURHLENBQ0U7QUFBQSx1QkFBYSxPQUFPLE1BQVAsQ0FBYyxTQUFkLEVBQXlCLEVBQUUsWUFBRixFQUF6QixDQUFiO0FBQUEsYUFERixFQUVILEtBRkcsQ0FFRztBQUFBLHVCQUFTLFFBQVEsT0FBUixDQUFnQixFQUFFLFlBQUYsRUFBaEIsQ0FBVDtBQUFBLGFBRkgsQ0FBUDtBQUdIOztBQUVEO0FBQ0E7Ozs7Z0NBQ1EsTyxFQUFTO0FBQ2IsbUJBQU8sS0FBSyxlQUFMLENBQXFCLE9BQXJCLENBQVA7QUFDSDs7QUFFRDtBQUNBO0FBQ0E7Ozs7MENBQ3lHO0FBQUE7O0FBQUEsNEZBQUosRUFBSTtBQUFBLG1DQUF2RixJQUF1RjtBQUFBLGdCQUF2RixJQUF1Riw4QkFBaEYsSUFBZ0Y7QUFBQSxzQ0FBMUUsT0FBMEU7QUFBQSxnQkFBMUUsT0FBMEUsaUNBQWhFLElBQWdFO0FBQUEsZ0JBQTFELGVBQTBELFNBQTFELGVBQTBEO0FBQUEsc0NBQXpDLE9BQXlDO0FBQUEsZ0JBQXpDLE9BQXlDLGlDQUEvQixLQUErQjtBQUFBLHNDQUF4QixPQUF3QjtBQUFBLGdCQUF4QixPQUF3QixpQ0FBZCxLQUFjOztBQUNyRyxtQkFBTyxJQUFJLE9BQUosQ0FBWSxVQUFDLE9BQUQsRUFBVSxNQUFWLEVBQXFCO0FBQ3BDO0FBQ0Esb0JBQUksT0FBSyxRQUFULEVBQW1CO0FBQ2Y7QUFDQSx3QkFBSSxPQUFLLFFBQUwsQ0FBYyxNQUFkLElBQXdCLE9BQUssUUFBTCxDQUFjLE1BQWQsQ0FBcUIsTUFBakQsRUFBeUQ7QUFDckQ7QUFDQSwyQ0FBSSxPQUFKLEVBQWEsbURBQWI7QUFDQSwrQkFBSyxRQUFMLENBQWMsTUFBZCxDQUFxQixPQUFyQixDQUE2QixLQUE3QixFQUhxRCxDQUdoQjtBQUN4Qzs7QUFFRDtBQUNBLHdCQUFJLFVBQVUsRUFBRSxVQUFGLEVBQVEsZ0JBQVIsRUFBaUIsZ0NBQWpCLEVBQWtDLGdCQUFsQyxFQUEyQyxnQkFBM0MsRUFBZDtBQUNBLDJCQUFLLFFBQUwsQ0FBYyxNQUFkLEdBQXVCLEVBQUUsZ0JBQUYsRUFBVyxjQUFYLEVBQW1CLGdCQUFuQixFQUF2QjtBQUNBLHVDQUFJLE9BQUo7QUFDQTtBQUNIOztBQUVEO0FBQ0EsdUJBQUssUUFBTCxHQUFnQixFQUFFLGdCQUFGLEVBQVcsY0FBWCxFQUFoQjs7QUFFQTtBQUNBLG9CQUFJLE9BQUosRUFBYTtBQUNULDJCQUFLLFFBQUwsQ0FBYyxlQUFkO0FBQ0g7O0FBRUQ7QUFDQSxvQkFBSSxJQUFKLEVBQVU7QUFDTiwyQkFBSyxrQkFBTCxDQUF3QixFQUFFLGdDQUFGLEVBQXhCO0FBQ0g7QUFDRCx1QkFBSyxxQkFBTDtBQUNBLHVCQUFLLFNBQUw7O0FBRUE7QUFDQSx1QkFBSyxZQUFMLENBQWtCLG1CQUFsQjtBQUNBLHVCQUFLLFlBQUwsQ0FBa0IsV0FBbEIsQ0FBOEIsZ0JBQVE7QUFDbEMsd0JBQUksQ0FBQyxPQUFELElBQVksUUFBUSxPQUFSLENBQWdCLEtBQUssTUFBTCxDQUFZLElBQTVCLElBQW9DLENBQUMsQ0FBckQsRUFBd0Q7QUFDcEQsK0JBQUssWUFBTCxDQUFrQixTQUFsQixDQUE0QixJQUE1QixFQUFrQyxFQUFFLGdCQUFGLEVBQWxDO0FBQ0g7QUFDSixpQkFKRDtBQUtBLHVCQUFLLFlBQUwsQ0FBa0Isa0JBQWxCLEdBdkNvQyxDQXVDSTtBQUN4Qyx1QkFBSyxZQUFMLENBQWtCLGVBQWxCLEdBeENvQyxDQXdDSTtBQUMzQyxhQXpDTSxFQXlDSixJQXpDSSxDQXlDQyxZQUFNO0FBQ1Y7QUFDQSxvQkFBSSxPQUFKLEVBQWE7QUFDVCwyQkFBSyxXQUFMLENBQWlCLGVBQWpCO0FBQ0g7QUFDSixhQTlDTSxDQUFQO0FBK0NIOztBQUVEO0FBQ0E7Ozs7K0NBQ3VCO0FBQ25CLGdCQUFJLEtBQUssUUFBVCxFQUFtQjtBQUNmLG1DQUFJLE1BQUo7QUFDQSxvQkFBSSxLQUFLLFFBQUwsQ0FBYyxPQUFsQixFQUEyQjtBQUN2Qix5QkFBSyxRQUFMLENBQWMsT0FBZCxDQUFzQixJQUF0QjtBQUNIOztBQUVEO0FBQ0Esb0JBQUksU0FBUyxLQUFLLFFBQUwsQ0FBYyxNQUEzQjtBQUNBLHFCQUFLLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQSxvQkFBSSxNQUFKLEVBQVk7QUFDUix1Q0FBSSxPQUFKO0FBQ0EseUJBQUssT0FBTCxDQUFhLE9BQU8sT0FBcEIsRUFBNkIsSUFBN0IsQ0FBa0MsT0FBTyxPQUF6QyxFQUFrRCxPQUFPLE1BQXpEO0FBQ0g7QUFDSjtBQUNKOztBQUVEOzs7Ozs7O29DQUlvRDtBQUFBOztBQUFBLGdCQUExQyxhQUEwQyx1RUFBMUIsSUFBMEI7QUFBQSxnQkFBcEIsV0FBb0IsdUVBQU4sSUFBTTs7QUFDaEQsaUJBQUssYUFBTCxHQUFxQixpQkFBaUIsS0FBSyxhQUEzQztBQUNBLGlCQUFLLHNCQUFMLEdBQThCLEVBQTlCOztBQUVBLGdCQUFJLE9BQU8sS0FBSyxhQUFaLEtBQThCLFFBQWxDLEVBQTRDO0FBQ3hDLHFCQUFLLFdBQUwsR0FBbUIsS0FBSyxVQUFMLENBQWdCLGVBQWUsS0FBSyxhQUFwQyxDQUFuQjtBQUNILGFBRkQsTUFHSztBQUNELHFCQUFLLFdBQUwsR0FBbUIsS0FBSyxVQUFMLENBQWdCLFdBQWhCLENBQW5CO0FBQ0g7O0FBRUQsbUJBQU8sdUJBQVksU0FBWixDQUFzQixLQUFLLGFBQTNCLEVBQTBDLEtBQUssV0FBL0MsRUFBNEQsSUFBNUQsQ0FBaUUsaUJBQXNCO0FBQUEsb0JBQXBCLE1BQW9CLFNBQXBCLE1BQW9CO0FBQUEsb0JBQVosTUFBWSxTQUFaLE1BQVk7O0FBQzFGLHVCQUFLLE1BQUwsR0FBYyxNQUFkO0FBQ0EsdUJBQUssYUFBTCxHQUFxQixNQUFyQjtBQUNBLHVCQUFLLE9BQUwsQ0FBYSxNQUFiLEVBQXFCLEVBQUUsUUFBUSxPQUFLLE1BQWYsRUFBckI7QUFDQSx1QkFBTyxPQUFLLE1BQVo7QUFDSCxhQUxNLENBQVA7QUFNSDs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztzQ0FDZSxJLEVBQU0sTSxFQUFRO0FBQ3pCLGdCQUFJLENBQUMsSUFBRCxJQUFTLENBQUMsTUFBVixJQUFvQixDQUFDLE9BQU8sSUFBNUIsSUFBcUMsQ0FBQyxPQUFPLEdBQVIsSUFBZSxDQUFDLE9BQU8sSUFBaEUsRUFBdUU7QUFDbkUsbUNBQUksT0FBSixFQUFhLHlDQUFiLEVBQXdELElBQXhELEVBQThELE1BQTlEO0FBQ0E7QUFDSDs7QUFFRCxnQkFBSSxPQUFRLEtBQUssTUFBTCxDQUFZLE9BQVosQ0FBb0IsSUFBcEIsS0FBNkIsSUFBekM7QUFDQSxnQkFBSSxTQUFTLEtBQUssTUFBTCxDQUFZLE9BQVosQ0FBb0IsSUFBcEIsSUFBNEIsT0FBTyxNQUFQLENBQWMsRUFBZCxFQUFrQixNQUFsQixDQUF6Qzs7QUFFQTtBQUNBLGdCQUFJLE9BQU8sSUFBUCxJQUFlLFFBQU8sT0FBTyxJQUFkLE1BQXVCLFFBQTFDLEVBQW9EO0FBQ2hELHVCQUFPLEdBQVAsR0FBYSxLQUFLLGVBQUwsQ0FBcUIsSUFBSSxJQUFKLENBQVMsQ0FBQyxLQUFLLFNBQUwsQ0FBZSxPQUFPLElBQXRCLENBQUQsQ0FBVCxDQUFyQixDQUFiO0FBQ0EsdUJBQU8sT0FBTyxJQUFkO0FBQ0g7O0FBRUQ7QUFDQSxtQ0FBWSxtQkFBWixDQUFnQyxNQUFoQyxFQUF3QyxLQUFLLGFBQTdDOztBQUVBLGdCQUFJLElBQUosRUFBVTtBQUNOLHVCQUFPLEtBQUssWUFBTCxDQUFrQixFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsSUFBRCxDQUFYLEVBQVgsRUFBbEIsQ0FBUDtBQUNILGFBRkQsTUFFTztBQUNILHVCQUFPLEtBQUssT0FBTCxDQUFhLEVBQUUsU0FBUyxDQUFDLElBQUQsQ0FBWCxFQUFiLENBQVA7QUFDSDtBQUNKOzs7NENBRW1CO0FBQUE7O0FBQ2hCLGdCQUFJLFFBQVEsRUFBWixDQURnQixDQUNBO0FBQ2hCLGdCQUFJLG9CQUFvQixPQUFPLElBQVAsQ0FBWSxLQUFLLE9BQWpCLENBQXhCO0FBQ0EsZ0JBQUksWUFBWSxDQUFoQjs7QUFFQSxpQkFBSyxJQUFJLElBQVQsSUFBaUIsS0FBSyxNQUFMLENBQVksT0FBN0IsRUFBc0M7QUFDbEMsb0JBQUksU0FBUyxLQUFLLE1BQUwsQ0FBWSxPQUFaLENBQW9CLElBQXBCLENBQWI7QUFDQSxvQkFBSSxjQUFjLEtBQUssT0FBTCxDQUFhLElBQWIsQ0FBbEI7O0FBRUEsb0JBQUk7QUFDQSx3QkFBSSxTQUFTLE9BQU8sTUFBUCxDQUFjLEVBQWQsRUFBa0IsTUFBbEIsRUFBMEIsRUFBRSxVQUFGLEVBQVEsSUFBSSxXQUFaLEVBQTFCLENBQWI7QUFDQSx5QkFBSyxPQUFMLENBQWEsSUFBYixJQUFxQixzQkFBVyxNQUFYLENBQWtCLE1BQWxCLEVBQTBCLEtBQUssT0FBL0IsQ0FBckI7QUFDQSx3QkFBSSxDQUFDLEtBQUssT0FBTCxDQUFhLElBQWIsQ0FBTCxFQUF5QjtBQUNyQiw4QkFBTSxFQUFOO0FBQ0g7QUFDSixpQkFORCxDQU9BLE9BQU0sQ0FBTixFQUFTO0FBQ0wsMkJBQU8sS0FBSyxPQUFMLENBQWEsSUFBYixDQUFQO0FBQ0Esd0JBQUksNkNBQTJDLEVBQUUsT0FBakQ7QUFDQSx1Q0FBSSxNQUFKLGNBQXNCLE9BQXRCLEVBQWlDLE1BQWpDO0FBQ0EseUJBQUssT0FBTCxDQUFhLFNBQWIsRUFBd0IsRUFBRSxNQUFNLFNBQVIsRUFBbUIsY0FBbkIsRUFBMkIsZ0JBQTNCLEVBQXhCO0FBQ0g7O0FBRUQ7QUFDQSxvQkFBSSxzQkFBVyxPQUFYLENBQW1CLEtBQUssT0FBTCxDQUFhLElBQWIsQ0FBbkIsRUFBdUMsV0FBdkMsQ0FBSixFQUF5RDtBQUNyRCwwQkFBTSxJQUFOLENBQVcsSUFBWDtBQUNIO0FBQ0o7O0FBRUQ7QUFDQSw4QkFBa0IsT0FBbEIsQ0FBMEIsYUFBSztBQUMzQixvQkFBSSxDQUFDLFFBQUssTUFBTCxDQUFZLE9BQVosQ0FBb0IsQ0FBcEIsQ0FBTCxFQUE2QjtBQUN6QiwyQkFBTyxRQUFLLE9BQUwsQ0FBYSxDQUFiLENBQVAsQ0FEeUIsQ0FDRDtBQUN4QiwwQkFBTSxJQUFOLENBQVcsQ0FBWDtBQUNIO0FBQ0osYUFMRDs7QUFPQTtBQUNBLGdCQUFJLE1BQU0sTUFBTixHQUFlLENBQW5CLEVBQXNCO0FBQ2xCLHFCQUFLLFlBQUwsQ0FBa0IsV0FBbEIsQ0FBOEIsZ0JBQVE7QUFDbEMsMkJBQVEsTUFBTSxPQUFOLENBQWMsS0FBSyxNQUFMLENBQVksSUFBMUIsSUFBa0MsQ0FBQyxDQUEzQztBQUNILGlCQUZEO0FBR0g7O0FBRUQ7QUFDQTtBQUNBLGlCQUFLLElBQUksRUFBVCxJQUFlLEtBQUssTUFBTCxDQUFZLE1BQTNCLEVBQW1DO0FBQy9CLG9CQUFJLFFBQVEsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixFQUFuQixDQUFaO0FBQ0Esb0JBQUksTUFBTSxJQUFOLElBQWMsS0FBSyxPQUFMLENBQWEsTUFBTSxJQUFOLENBQVcsTUFBeEIsQ0FBbEIsRUFBbUQ7QUFDL0MseUJBQUssT0FBTCxDQUFhLE1BQU0sSUFBTixDQUFXLE1BQXhCLEVBQWdDLHFCQUFoQyxHQUF3RCxJQUF4RDtBQUNIO0FBQ0o7QUFDSjs7QUFFRDs7Ozt1Q0FDZTtBQUFBOztBQUNYLG1CQUFPLGtCQUFRLGdCQUFSLENBQXlCLEtBQUssRUFBOUIsRUFBa0MsS0FBSyxNQUFMLENBQVksUUFBOUMsRUFDSCxJQURHLENBQ0U7QUFBQSx1QkFBTSxrQkFBUSxhQUFSLENBQXNCLFFBQUssRUFBM0IsQ0FBTjtBQUFBLGFBREYsQ0FBUCxDQURXLENBRXFDO0FBQ25EOztBQUVEOzs7O3VDQUNlO0FBQUE7O0FBQ1gsZ0JBQUksQ0FBQyxLQUFLLFdBQU4sSUFBcUIsQ0FBQyxLQUFLLFlBQS9CLEVBQTZDO0FBQ3pDLHNCQUFNLElBQUksS0FBSixDQUFVLDBEQUFWLENBQU47QUFDSDs7QUFFRDtBQUNBLGlCQUFLLE1BQUwsR0FBYyxLQUFLLGFBQUwsQ0FBbUIsS0FBbkIsQ0FBeUIsS0FBSyxNQUFMLENBQVksTUFBckMsQ0FBZDtBQUNBLGlCQUFLLGFBQUwsQ0FBbUIsVUFBbkIsQ0FBOEIsSUFBOUI7O0FBRUE7QUFDQSxpQkFBSyxJQUFJLEtBQVQsSUFBa0IsS0FBSyxNQUF2QixFQUErQjtBQUMzQixxQkFBSyxNQUFMLENBQVksS0FBWixFQUFtQixLQUFuQixDQUF5QixLQUFLLEVBQTlCO0FBQ0g7O0FBRUQ7QUFDQSxpQkFBSyxRQUFMLEdBQ0ksS0FBSyxNQUFMLENBQVksS0FBWixDQUFrQixRQUFsQixLQUErQixTQUEvQixHQUNJLEtBQUssTUFBTCxDQUFZLEtBQVosQ0FBa0IsUUFEdEIsR0FFSSxPQUFPLElBQVAsQ0FBWSxLQUFLLE1BQWpCLEVBQXlCLElBQXpCLENBQThCO0FBQUEsdUJBQUssUUFBSyxNQUFMLENBQVksQ0FBWixFQUFlLFFBQXBCO0FBQUEsYUFBOUIsQ0FIUjs7QUFLQSxpQkFBSyxLQUFMLEdBQWEsSUFBYjtBQUNIOztBQUVEOzs7OzBDQUNrQjtBQUNkLG1CQUFPLEtBQUssSUFBTCxDQUFVLGVBQVYsRUFBUDtBQUNIOztBQUVEOzs7O3dDQUNnQixJLEVBQU07QUFDbEIsbUJBQU8sS0FBSyxJQUFMLENBQVUsZUFBVixDQUEwQixJQUExQixDQUFQO0FBQ0g7O0FBRUQ7Ozs7dUNBQ2U7QUFDWCxpQkFBSyxNQUFMLEdBQWMsRUFBZDtBQUNBLGlCQUFLLElBQUksQ0FBVCxJQUFjLEtBQUssTUFBTCxDQUFZLE1BQTFCLEVBQWtDO0FBQzlCLG9CQUFJLENBQUMsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFuQixDQUFELElBQTBCLFFBQU8sS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFuQixDQUFQLE1BQWlDLFFBQS9ELEVBQXlFO0FBQ3JFO0FBQ0g7QUFDRCxvQkFBSSxRQUFRLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsQ0FBbkIsQ0FBWjtBQUNBLHNCQUFNLElBQU4sR0FBYSxFQUFFLE9BQUYsQ0FBVSxHQUFWLEVBQWUsR0FBZixDQUFiLENBTDhCLENBS0k7QUFDbEMsc0JBQU0sT0FBTixHQUFpQixNQUFNLE9BQU4sS0FBa0IsS0FBbkIsR0FBNEIsS0FBNUIsR0FBb0MsSUFBcEQ7QUFDQSxvQkFBSSxNQUFNLE9BQVYsRUFBbUI7QUFDZix5QkFBSyxNQUFMLENBQVksTUFBTSxJQUFsQixJQUEwQixnQkFBTSxNQUFOLENBQWEsS0FBSyxJQUFsQixFQUF3QixLQUF4QixDQUExQjtBQUNIO0FBQ0o7QUFDRCw0QkFBTSxNQUFOLENBQWEsS0FBSyxNQUFsQjtBQUNIOztBQUVEOzs7O3dDQUNnQjtBQUFBOztBQUNaLGdCQUFJLEtBQUssS0FBSyxNQUFMLENBQVksS0FBWixDQUFrQixVQUEzQjtBQUNBLGlCQUFLLFVBQUwsR0FBa0IsRUFBbEI7QUFDQSxnQkFBSSxNQUFNLEdBQUcsS0FBYixFQUFvQjtBQUNoQixxQkFBSyxVQUFMLENBQWdCLEtBQWhCLEdBQXdCLDBCQUFZLFVBQVosQ0FBdUIsR0FBRyxLQUExQixDQUF4QjtBQUNIO0FBQ0QsZ0JBQUksQ0FBQyxLQUFLLFVBQUwsQ0FBZ0IsS0FBckIsRUFBNEI7QUFDeEIscUJBQUssVUFBTCxDQUFnQixLQUFoQixHQUF3QixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FBeEIsQ0FEd0IsQ0FDYztBQUN6Qzs7QUFFRDtBQUNBLGdCQUFJLEtBQUssVUFBTCxDQUFnQixLQUFoQixDQUFzQixDQUF0QixNQUE2QixDQUFqQyxFQUFvQztBQUNoQyxxQkFBSyxNQUFMLENBQVksS0FBWixDQUFrQixlQUFsQixhQUNZLEtBQUssVUFBTCxDQUFnQixLQUFoQixDQUFzQixHQUF0QixDQUEwQjtBQUFBLDJCQUFLLEtBQUssS0FBTCxDQUFXLElBQUksR0FBZixDQUFMO0FBQUEsaUJBQTFCLEVBQW9ELElBQXBELENBQXlELElBQXpELENBRFo7QUFFSCxhQUhELE1BSUs7QUFDRCxxQkFBSyxNQUFMLENBQVksS0FBWixDQUFrQixlQUFsQixHQUFvQyxhQUFwQztBQUNIOztBQUVELHdCQUFLLEVBQUwsRUFBUSxVQUFSLCtCQUFzQixLQUFLLFVBQUwsQ0FBZ0IsS0FBdEM7QUFDSDs7QUFFRDs7Ozt5Q0FDa0IsRyxFQUFLO0FBQUE7O0FBQ25CLGlCQUFLLGFBQUwsR0FBcUIsT0FBTyxLQUE1QjtBQUNBLGlCQUFLLFFBQUw7QUFDQSxtQkFBTyxLQUFLLFlBQUwsR0FBb0IsSUFBcEIsQ0FBeUI7QUFBQSx1QkFBTSxRQUFLLFFBQUwsRUFBTjtBQUFBLGFBQXpCLENBQVA7QUFDSDs7QUFFRDtBQUNBOzs7O3VDQUN3RTtBQUFBLDRGQUFKLEVBQUk7QUFBQSxzQ0FBekQsT0FBeUQ7QUFBQSxnQkFBekQsT0FBeUQsaUNBQS9DLElBQStDO0FBQUEsZ0JBQXpDLGVBQXlDLFNBQXpDLGVBQXlDO0FBQUEsc0NBQXhCLE9BQXdCO0FBQUEsZ0JBQXhCLE9BQXdCLGlDQUFkLEtBQWM7O0FBQ3BFLGlCQUFLLFVBQUwsR0FBa0IsRUFBRSxNQUFNLFVBQTFCO0FBQ0EsaUJBQUssUUFBTDs7QUFFQSxpQkFBSyxNQUFMLEdBQWMsdUJBQVkscUJBQVosQ0FBa0MsS0FBSyxNQUF2QyxFQUErQyxLQUFLLHNCQUFwRCxDQUFkO0FBQ0EsbUNBQVksYUFBWixDQUEwQixLQUFLLE1BQS9CLEVBTG9FLENBSzVCO0FBQ3hDLGlCQUFLLGFBQUwsQ0FBbUIsSUFBbkI7QUFDQSxpQkFBSyxJQUFMLENBQVUsS0FBVjtBQUNBLGlCQUFLLFlBQUw7QUFDQSxpQkFBSyxpQkFBTDtBQUNBLGlCQUFLLFlBQUw7QUFDQSxpQkFBSyxhQUFMO0FBQ0EsbUNBQVksU0FBWixDQUFzQixLQUFLLE1BQUwsQ0FBWSxLQUFsQzs7QUFFQTtBQUNBLGlCQUFLLFlBQUw7O0FBRUE7QUFDQSxnQkFBSSxPQUFPLFVBQ1AsS0FBSyxPQUFMLENBQWEsT0FBTyxNQUFQLENBQWMsRUFBRSxnQ0FBRixFQUFtQixnQkFBbkIsRUFBZCxFQUE0QyxRQUFPLE9BQVAseUNBQU8sT0FBUCxPQUFtQixRQUFuQixJQUErQixPQUEzRSxDQUFiLENBRE8sR0FFUCxLQUFLLGtCQUFMLENBQXdCLEVBQUUsZ0NBQUYsRUFBeEIsQ0FGSixDQWxCb0UsQ0FvQmxCOztBQUVsRDtBQUNBLGlCQUFLLFFBQUw7QUFDQSxpQkFBSyxJQUFMLENBQVUsWUFBVjtBQUNBLGlCQUFLLGFBQUw7O0FBRUEsbUJBQU8sSUFBUDtBQUNIOztBQUVEOzs7OzZDQUNvRDtBQUFBLDRGQUFKLEVBQUk7QUFBQSw4Q0FBL0IsZUFBK0I7QUFBQSxnQkFBL0IsZUFBK0IseUNBQWIsSUFBYTs7QUFDaEQ7QUFDQSxpQkFBSyxpQkFBTCxHQUNJLGtCQUFrQixnQkFBTSxzQkFBTixDQUE2QixLQUFLLE1BQWxDLENBQWxCLEdBQThELEtBQUssU0FBTCxDQUFlLEtBQUssTUFBcEIsQ0FEbEU7QUFFQSxtQkFBTyx3QkFBYSxXQUFiLENBQXlCLEtBQUssT0FBOUIsRUFBdUMsbUJBQXZDLEVBQTREO0FBQy9ELHdCQUFRLEtBQUssaUJBRGtEO0FBRS9ELDRCQUFZLEtBQUssVUFGOEM7QUFHL0QsK0JBQWUsS0FBSztBQUgyQyxhQUE1RCxDQUFQO0FBS0g7O0FBRUQ7Ozs7MENBQ21CO0FBQUE7O0FBQ2YsaUJBQUssU0FBTCxHQUFpQixFQUFqQjs7QUFFQSxpQkFBSyxTQUFMLENBQWUsSUFBZixHQUFzQjtBQUNsQixzQkFBTTtBQUFBLDJCQUFNLFFBQUssT0FBTCxDQUFhLE1BQWIsQ0FBTjtBQUFBO0FBRFksYUFBdEI7QUFHQSxpQkFBSyxJQUFMLENBQVUsU0FBVixDQUFvQixLQUFLLFNBQUwsQ0FBZSxJQUFuQzs7QUFFQSxpQkFBSyxTQUFMLENBQWUsT0FBZixHQUF5QjtBQUNyQix3QkFBUTtBQUFBLDJCQUFNLFFBQUssS0FBTCxHQUFhLElBQW5CO0FBQUEsaUJBRGE7QUFFckIseUJBQVMsaUJBQUMsSUFBRDtBQUFBLDJCQUFVLFFBQUssT0FBTCxDQUFhLFNBQWIsRUFBd0IsT0FBTyxNQUFQLENBQWMsRUFBRSxNQUFNLFVBQVIsRUFBZCxFQUFvQyxJQUFwQyxDQUF4QixDQUFWO0FBQUE7QUFGWSxhQUF6QjtBQUlBLDhCQUFRLFNBQVIsQ0FBa0IsS0FBSyxTQUFMLENBQWUsT0FBakM7O0FBRUEsaUJBQUssU0FBTCxDQUFlLFlBQWYsR0FBOEI7QUFDMUIsdUJBQU8sZUFBQyxJQUFEO0FBQUEsMkJBQVUsUUFBSyxPQUFMLENBQWEsT0FBYixFQUFzQixPQUFPLE1BQVAsQ0FBYyxFQUFFLE1BQU0sT0FBUixFQUFkLEVBQWlDLElBQWpDLENBQXRCLENBQVY7QUFBQTtBQURtQixhQUE5QjtBQUdBLG1DQUFZLFNBQVosQ0FBc0IsS0FBSyxTQUFMLENBQWUsWUFBckM7QUFDSDs7OzJDQUVtQjtBQUNoQixpQkFBSyxjQUFMO0FBQ0EsaUJBQUssSUFBTCxDQUFVLFdBQVYsQ0FBc0IsS0FBSyxTQUFMLENBQWUsSUFBckM7QUFDQSw4QkFBUSxXQUFSLENBQW9CLEtBQUssU0FBTCxDQUFlLE9BQW5DO0FBQ0EsbUNBQVksV0FBWixDQUF3QixLQUFLLFNBQUwsQ0FBZSxZQUF2QztBQUNBLGlCQUFLLFNBQUwsR0FBaUIsSUFBakI7QUFDSDs7O2dEQUV1QjtBQUNwQixnQkFBSSxDQUFDLEtBQUssU0FBVixFQUFxQjtBQUNqQixxQkFBSyxTQUFMLEdBQWlCLHdCQUFxQixLQUFLLEVBQTFCLEVBQThCLEtBQUssT0FBbkMsQ0FBakI7QUFDSCxhQUZELE1BR0ssSUFBSSxLQUFLLE9BQVQsRUFBa0I7QUFDbkIsd0NBQWEsV0FBYixDQUF5QixLQUFLLE9BQTlCLEVBQXVDLDRCQUF2QztBQUNIO0FBQ0o7O0FBRUQ7Ozs7cURBQzZCO0FBQUE7O0FBQ3pCLGdCQUFJLEtBQUssc0JBQVQsRUFBaUM7QUFDN0IsdUJBQU8sUUFBUSxPQUFSLEVBQVAsQ0FENkIsQ0FDSDtBQUM3QjtBQUNELGlCQUFLLHNCQUFMLEdBQThCLElBQTlCOztBQUVBLG1CQUFPLHdCQUFhLFdBQWIsQ0FBeUIsS0FBSyxPQUE5QixFQUF1QyxpQ0FBdkMsRUFDRixJQURFLENBQ0csaUJBQVM7QUFDWCx3QkFBSyxzQkFBTCxHQUE4QixLQUE5QjtBQUNBLHVCQUFPLE1BQU0sTUFBTixDQUFhLFVBQUMsQ0FBRCxFQUFJLENBQUo7QUFBQSwyQkFBVSxJQUFJLENBQWQ7QUFBQSxpQkFBYixDQUFQO0FBQ0gsYUFKRSxDQUFQO0FBS0g7O0FBRUQ7Ozs7b0NBQ1k7QUFDUixpQkFBSyxVQUFMLEdBQWtCLENBQUMsSUFBSSxJQUFKLEVBQW5CO0FBQ0g7O0FBRUQ7Ozs7NkNBQ3NCO0FBQ2xCLGdCQUFJLENBQUMsS0FBSyxvQkFBTCxJQUE2QixLQUFLLFVBQUwsS0FBb0IsS0FBSyx3QkFBdkQsS0FDQSxDQUFDLEtBQUssWUFBTCxDQUFrQixxQkFBbEIsRUFETCxFQUNnRDtBQUM1QyxxQkFBSyx3QkFBTCxHQUFnQyxLQUFLLFVBQXJDO0FBQ0EscUJBQUssT0FBTCxDQUFhLGVBQWI7QUFDSDtBQUNKOzs7NENBRW9CO0FBQ2pCLGlCQUFLLHdCQUFMLEdBQWdDLElBQWhDO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBOzs7O3FDQUNjO0FBQ1YsaUJBQUssYUFBTDtBQUNBLG1CQUFPLEtBQUssYUFBTCxDQUFtQixVQUFuQixFQUFQO0FBQ0g7Ozs0Q0FFb0I7QUFDakIsaUJBQUssYUFBTDtBQUNBLG1CQUFPLEtBQUssYUFBTCxDQUFtQixpQkFBbkIsRUFBUDtBQUNIOzs7MkNBRW1CO0FBQ2hCLG1CQUFPLEtBQUssYUFBTCxDQUFtQixnQkFBbkIsRUFBUDtBQUNIOztBQUdEOztBQUVBOzs7O2lDQUNTLEksRUFBTTtBQUNYLG9CQUFRLE9BQVIsbUJBQWdDLElBQWhDO0FBQ0Esb0NBQWEsV0FBYixDQUF5QixLQUFLLE9BQTlCLEVBQXVDLGNBQXZDLEVBQXVELElBQXZEO0FBQ0g7OztvQ0FFVyxJLEVBQU07QUFDZCxvQkFBUSxVQUFSLG1CQUFtQyxJQUFuQztBQUNBLG9DQUFhLFdBQWIsQ0FBeUIsS0FBSyxPQUE5QixFQUF1QyxpQkFBdkMsRUFBMEQsSUFBMUQ7QUFDSDs7QUFFRDs7OztxQ0FDYztBQUNWLGdCQUFJLFFBQVEsSUFBWjtBQUNBLGlCQUFLLEtBQUwsR0FBYTtBQUNUO0FBQ0EsMkJBRlMseUJBRTJCO0FBQUEsd0JBQXZCLEdBQXVCLHVFQUFqQixDQUFpQjtBQUFBLHdCQUFkLE9BQWMsdUVBQUosRUFBSTs7QUFDaEMsd0JBQUksUUFBUSxFQUFaO0FBQ0Esd0JBQUksUUFBUSxTQUFSLEtBQVEsR0FBTTtBQUNkLDRCQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUosRUFBYjtBQUNBLDhCQUFNLE9BQU4sQ0FBYyxPQUFkLEVBQXVCLElBQXZCLENBQTRCLFlBQU07QUFDOUIsa0NBQU0sSUFBTixDQUFXLENBQUMsSUFBSSxJQUFKLEVBQUQsR0FBYyxLQUF6Qjs7QUFFQSxnQ0FBSSxNQUFNLE1BQU4sR0FBZSxHQUFuQixFQUF3QjtBQUNwQjtBQUNILDZCQUZELE1BR0s7QUFDRCxvQ0FBSSxNQUFNLENBQUMsRUFBRSxNQUFNLE1BQU4sQ0FBYSxVQUFDLENBQUQsRUFBSSxDQUFKO0FBQUEsMkNBQVUsSUFBSSxDQUFkO0FBQUEsaUNBQWIsSUFBZ0MsTUFBTSxNQUF4QyxDQUFYO0FBQ0EsbURBQUksTUFBSix3QkFBZ0MsR0FBaEMsZ0JBQThDLEdBQTlDLGNBQTBELEtBQUssR0FBTCxhQUFZLEtBQVosQ0FBMUQsY0FBcUYsS0FBSyxHQUFMLGFBQVksS0FBWixDQUFyRjtBQUNIO0FBQ0oseUJBVkQ7QUFXSCxxQkFiRDtBQWNBO0FBQ0gsaUJBbkJROzs7QUFxQlQ7QUFDQSxvQ0F0QlMsa0NBc0JlO0FBQ3BCLHdCQUFJLFNBQVMsRUFBYjtBQUNBLDBCQUFNLFlBQU4sQ0FBbUIsa0JBQW5CLEdBQXdDLE9BQXhDLENBQWdELGdCQUFRO0FBQ3BELDZCQUFLLElBQUksS0FBVCxJQUFrQixLQUFLLE1BQXZCLEVBQStCO0FBQzNCLG1DQUFPLEtBQVAsSUFBZ0IsT0FBTyxLQUFQLEtBQWlCLENBQWpDO0FBQ0EsbUNBQU8sS0FBUCxLQUFpQixLQUFLLE1BQUwsQ0FBWSxLQUFaLEVBQW1CLGNBQXBDO0FBQ0g7QUFDSixxQkFMRDtBQU1BLDJCQUFPLE1BQVA7QUFDSCxpQkEvQlE7QUFpQ1Qsd0NBakNTLHNDQWlDbUI7QUFDeEIsd0JBQUksZUFBZSxNQUFNLEtBQU4sQ0FBWSxvQkFBWixFQUFuQjtBQUNBLHdCQUFJLFNBQVMsRUFBYjtBQUNBLHlCQUFLLElBQUksS0FBVCxJQUFrQixZQUFsQixFQUFnQztBQUM1Qiw0QkFBSSxPQUFPLE1BQU0sTUFBTixDQUFhLEtBQWIsRUFBb0IsU0FBcEIsRUFBWDtBQUNBLCtCQUFPLElBQVAsSUFBZSxPQUFPLElBQVAsS0FBZ0IsQ0FBL0I7QUFDQSwrQkFBTyxJQUFQLEtBQWdCLGFBQWEsS0FBYixDQUFoQjtBQUNIO0FBQ0QsMkJBQU8sTUFBUDtBQUNIO0FBMUNRLGFBQWI7QUE0Q0g7OzsrQkE1a0NjLE0sRUFBc0I7QUFBQSxnQkFBZCxPQUFjLHVFQUFKLEVBQUk7O0FBQ2pDLG1CQUFPLElBQUksS0FBSixDQUFVLE1BQVYsRUFBa0IsT0FBbEIsQ0FBUDtBQUNIOzs7Ozs7a0JBakVnQixLOzs7QUErb0NyQixNQUFNLEVBQU4sR0FBVyxDQUFYLEMsQ0FBc0I7QUFDdEIsTUFBTSxVQUFOLEdBQW1CLENBQW5CLEMsQ0FBc0I7Ozs7Ozs7Ozs7Ozs7O1FDdCtCTixpQixHQUFBLGlCO1FBUUEsUSxHQUFBLFE7O0FBek1oQjs7OztBQUNBOztJQUFZLEk7O0FBRVo7Ozs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7SUFFYSxXLFdBQUEsVztBQUVULHlCQUFZLEdBQVosRUFBaUIsSUFBakIsRUFBc0M7QUFBQSxZQUFmLE1BQWUsdUVBQU4sSUFBTTs7QUFBQTs7QUFDbEMsYUFBSyxHQUFMLEdBQVcsR0FBWDs7QUFFQTtBQUNBO0FBQ0EsWUFBSSxTQUFTLENBQUMsS0FBSyxhQUFMLENBQW1CLElBQW5CLENBQUQsSUFBNkIsS0FBSyxhQUFMLENBQW1CLEtBQUssR0FBeEIsQ0FBdEMsQ0FBSixFQUF5RTtBQUNyRSxpQkFBSyxJQUFMLEdBQVksSUFBWjtBQUNILFNBRkQsTUFHSztBQUNELGlCQUFLLElBQUwsR0FBWSxLQUFLLFVBQUwsQ0FBZ0IsS0FBSyxHQUFyQixDQUFaO0FBQ0g7O0FBRUQsYUFBSyxlQUFMLEdBQXVCLFFBQVEsS0FBSyxJQUFwQyxDQVprQyxDQVlRO0FBQzFDLGFBQUssTUFBTCxHQUFjLE1BQWQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBSyxTQUFMLEdBQWlCLElBQWpCO0FBQ0EsWUFBSSxLQUFLLE1BQVQsRUFBaUI7QUFDYixnQkFBSSxLQUFLLE1BQUwsQ0FBWSxTQUFoQixFQUEyQjtBQUN2QixxQkFBSyxTQUFMLEdBQWlCLEtBQUssTUFBTCxDQUFZLFNBQTdCO0FBQ0gsYUFGRCxNQUdLLElBQUksS0FBSyxNQUFMLENBQVksV0FBWixFQUFKLEVBQStCO0FBQ2hDLHFCQUFLLFNBQUwsR0FBaUIsS0FBSyxNQUF0QjtBQUNIO0FBQ0o7QUFDSjs7OzsrQkFFTTtBQUNILG1CQUFPLGFBQWEsS0FBSyxHQUFsQixDQUFQO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7Ozs7b0NBQ1ksRyxFQUFLO0FBQ2IsbUJBQU87QUFDSCxxQkFBSyxLQUFLLE1BQUwsQ0FBWSxHQUFaLENBREY7QUFFSCxzQkFBTSxLQUFLLE9BQUwsQ0FBYSxHQUFiLENBRkg7QUFHSCxzQkFBTSxLQUFLLE9BQUwsQ0FBYSxHQUFiO0FBSEgsYUFBUDtBQUtIOzs7K0JBRU0sRyxFQUFLO0FBQ1IsZ0JBQUksU0FBUyxHQUFULENBQUosRUFBbUI7QUFDZix1QkFBTyxHQUFQO0FBQ0g7O0FBRUQsZ0JBQUksS0FBSyxhQUFMLENBQW1CLEdBQW5CLEtBQTJCLEtBQUssU0FBcEMsRUFBK0M7QUFDM0MsdUJBQU8sS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixLQUFLLGVBQUwsR0FBdUIsR0FBMUMsQ0FBUDtBQUNIO0FBQ0QsbUJBQU8sS0FBSyxVQUFMLENBQWdCLEdBQWhCLEVBQXFCLEtBQUssSUFBMUIsQ0FBUDtBQUNIOzs7Z0NBRU8sRyxFQUFLO0FBQ1QsbUJBQU8sS0FBSyxVQUFMLENBQWdCLEdBQWhCLENBQVA7QUFDSDs7O2dDQUVPLEcsRUFBSztBQUNULG1CQUFPLEtBQUssZUFBTCxDQUFxQixHQUFyQixDQUFQO0FBQ0g7OztzQ0FFYTtBQUNWLG1CQUFPLEtBQVA7QUFDSDs7Ozs7O0lBSVEsYyxXQUFBLGM7OztBQUVULDRCQUFZLEdBQVosRUFBaUIsSUFBakIsRUFBdUIsTUFBdkIsRUFBK0I7QUFBQTs7QUFBQSxvSUFDckIsR0FEcUIsRUFDaEIsSUFEZ0IsRUFDVixNQURVOztBQUUzQixjQUFLLEdBQUwsR0FBVyxJQUFYO0FBQ0EsY0FBSyxLQUFMLEdBQWEsRUFBYjtBQUNBLGNBQUssSUFBTCxHQUFZLElBQVo7QUFDQSxjQUFLLElBQUwsR0FBWSxFQUFaO0FBTDJCO0FBTTlCOzs7O3NDQUVhO0FBQ1YsbUJBQU8sSUFBUDtBQUNIOzs7K0JBRU07QUFBQTs7QUFDSCxpQkFBSyxHQUFMLEdBQVcscUJBQVg7O0FBRUEsZ0JBQUksT0FBTyxLQUFLLEdBQVosS0FBb0IsUUFBeEIsRUFBa0M7QUFDOUIsdUJBQU8sZ0JBQU0sRUFBTixDQUFTLEtBQUssR0FBZCxFQUFtQixLQUFuQixFQUEwQixhQUExQixFQUNGLElBREUsQ0FDRztBQUFBLDJCQUFRLE9BQUssR0FBTCxDQUFTLFNBQVQsQ0FBbUIsSUFBbkIsQ0FBUjtBQUFBLGlCQURILEVBRUYsSUFGRSxDQUVHO0FBQUEsMkJBQU0sT0FBSyxhQUFMLEVBQU47QUFBQSxpQkFGSCxFQUdGLElBSEUsQ0FHRztBQUFBLDJCQUFNLE9BQUssUUFBTCxFQUFOO0FBQUEsaUJBSEgsRUFJRixLQUpFLENBSUk7QUFBQSwyQkFBSyxRQUFRLE1BQVIsQ0FBZSxDQUFmLENBQUw7QUFBQSxpQkFKSixDQUFQO0FBS0gsYUFORCxNQU1PO0FBQ0gsdUJBQU8sUUFBUSxPQUFSLENBQWdCLElBQWhCLENBQVA7QUFDSDtBQUNKOzs7K0JBRU0sRyxFQUFLO0FBQ1IsZ0JBQUksU0FBUyxHQUFULENBQUosRUFBbUI7QUFDZix1QkFBTyxHQUFQO0FBQ0g7O0FBRUQsZ0JBQUksS0FBSyxhQUFMLENBQW1CLEdBQW5CLENBQUosRUFBNkI7QUFDekIsdUJBQU8sS0FBSyxhQUFMLENBQW1CLEtBQUssa0JBQUwsQ0FBd0IsR0FBeEIsQ0FBbkIsQ0FBUDtBQUNIO0FBQ0QsMElBQW9CLEdBQXBCO0FBQ0g7OztnQ0FFTyxHLEVBQUs7QUFDVCxnQkFBSSxLQUFLLGFBQUwsQ0FBbUIsR0FBbkIsQ0FBSixFQUE2QjtBQUN6Qix1QkFBTyxLQUFLLGNBQUwsQ0FBb0IsR0FBcEIsQ0FBUDtBQUNIO0FBQ0QsMklBQXFCLEdBQXJCO0FBQ0g7OzttQ0FFVTtBQUFBOztBQUNQLG1CQUFPLEtBQUssUUFBTCxHQUNGLElBREUsQ0FDRztBQUFBLHVCQUFNLGFBQWEsT0FBSyxhQUFMLENBQW1CLE9BQUssSUFBeEIsQ0FBYixDQUFOO0FBQUEsYUFESCxDQUFQO0FBRUg7OzttQ0FFVTtBQUFBOztBQUNQO0FBQ0EsZ0JBQU0sUUFBUSxPQUFPLElBQVAsQ0FBWSxLQUFLLEtBQWpCLEVBQ1QsTUFEUyxDQUNGO0FBQUEsdUJBQVEsT0FBSyxLQUFMLENBQVcsSUFBWCxFQUFpQixLQUFqQixLQUEyQixDQUFuQztBQUFBLGFBREUsRUFFVCxNQUZTLENBRUY7QUFBQSx1QkFBUSxLQUFLLGVBQUwsQ0FBcUIsSUFBckIsTUFBK0IsTUFBdkM7QUFBQSxhQUZFLENBQWQ7O0FBSUEsZ0JBQUksTUFBTSxNQUFOLEtBQWlCLENBQXJCLEVBQXdCO0FBQ3BCLHFCQUFLLElBQUwsR0FBWSxNQUFNLENBQU4sQ0FBWjtBQUNIOztBQUVEO0FBQ0EsZ0JBQUksQ0FBQyxLQUFLLElBQVYsRUFBZ0I7QUFDWixvQkFBSSxrREFBK0MsS0FBSyxHQUFwRCxTQUFKO0FBQ0E7QUFDQSxvQkFBSSxNQUFNLE1BQU4sR0FBZSxDQUFuQixFQUFzQjtBQUNsQiw2RUFBdUQsTUFBTSxHQUFOLENBQVU7QUFBQSwrQkFBSyxPQUFPLENBQVAsR0FBVyxJQUFoQjtBQUFBLHFCQUFWLEVBQWlDLElBQWpDLENBQXNDLElBQXRDLENBQXZEO0FBQ0gsaUJBRkQsTUFHSztBQUNEO0FBQ0g7QUFDRCx1QkFBTyxRQUFRLE1BQVIsQ0FBZSxNQUFNLEdBQU4sQ0FBZixDQUFQO0FBQ0g7QUFDRCxtQkFBTyxRQUFRLE9BQVIsRUFBUDtBQUNIOzs7d0NBRWU7QUFBQTs7QUFDWixnQkFBSSxRQUFRLEVBQVo7QUFDQSxnQkFBSSxRQUFRLEVBQVo7QUFDQSxpQkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixVQUFDLElBQUQsRUFBTyxJQUFQLEVBQWdCO0FBQzdCLG9CQUFJLENBQUMsS0FBSyxHQUFWLEVBQWU7QUFDWCwwQkFBTSxJQUFOLENBQVcsSUFBWDtBQUNBLDBCQUFNLElBQU4sQ0FBVyxLQUFLLEtBQUwsQ0FBVyxhQUFYLENBQVg7QUFDSDtBQUNKLGFBTEQ7O0FBT0EsbUJBQU8sUUFBUSxHQUFSLENBQVksS0FBWixFQUFtQixJQUFuQixDQUF3QixnQkFBUTtBQUNuQyxxQkFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksS0FBSyxNQUF2QixFQUErQixHQUEvQixFQUFvQztBQUNoQyx3QkFBSSxPQUFPLE1BQU0sQ0FBTixDQUFYO0FBQ0Esd0JBQUksUUFBUSxLQUFLLEtBQUwsQ0FBVyxHQUFYLEVBQWdCLE1BQWhCLEdBQXlCLENBQXJDO0FBQ0EsMkJBQUssS0FBTCxDQUFXLElBQVgsSUFBbUI7QUFDZiw4QkFBTSxLQUFLLENBQUwsQ0FEUztBQUVmLDhCQUFNLEtBQUssZUFBTCxDQUFxQixJQUFyQixDQUZTO0FBR2Y7QUFIZSxxQkFBbkI7QUFLSDtBQUNKLGFBVk0sQ0FBUDtBQVdIOzs7c0NBRWEsSSxFQUFNO0FBQ2hCLGdCQUFJLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBSixFQUFzQjtBQUNsQixvQkFBSSxDQUFDLEtBQUssS0FBTCxDQUFXLElBQVgsRUFBaUIsR0FBdEIsRUFBMkI7QUFDdkIseUJBQUssS0FBTCxDQUFXLElBQVgsRUFBaUIsR0FBakIsR0FBdUIsS0FBSyxlQUFMLENBQXFCLElBQUksSUFBSixDQUFTLENBQUMsS0FBSyxLQUFMLENBQVcsSUFBWCxFQUFpQixJQUFsQixDQUFULENBQXJCLENBQXZCO0FBQ0g7O0FBRUQsdUJBQU8sS0FBSyxLQUFMLENBQVcsSUFBWCxFQUFpQixHQUF4QjtBQUNIO0FBQ0o7Ozt1Q0FFYyxJLEVBQU07QUFDakIsbUJBQU8sS0FBSyxLQUFMLENBQVcsSUFBWCxLQUFvQixLQUFLLEtBQUwsQ0FBVyxJQUFYLEVBQWlCLElBQTVDO0FBQ0g7Ozs7RUEvRytCLFc7O0FBbUg3QixTQUFTLGlCQUFULENBQTJCLEdBQTNCLEVBQWdDLElBQWhDLEVBQXNDLE1BQXRDLEVBQTJEO0FBQUEsUUFBYixJQUFhLHVFQUFOLElBQU07O0FBQzlELFFBQUksU0FBUyxLQUFULElBQW1CLE9BQU8sR0FBUCxLQUFlLFFBQWYsSUFBMkIsS0FBSyxlQUFMLENBQXFCLEdBQXJCLE1BQThCLEtBQWhGLEVBQXdGO0FBQ3BGLGVBQU8sSUFBSSxjQUFKLENBQW1CLEdBQW5CLEVBQXdCLElBQXhCLEVBQThCLE1BQTlCLENBQVA7QUFDSDtBQUNELFdBQU8sSUFBSSxXQUFKLENBQWdCLEdBQWhCLEVBQXFCLElBQXJCLEVBQTJCLE1BQTNCLENBQVA7QUFDSDs7QUFFRDtBQUNPLFNBQVMsUUFBVCxDQUFtQixHQUFuQixFQUF3QjtBQUMzQixRQUFJLE9BQU8sSUFBSSxLQUFKLENBQVUsQ0FBVixFQUFhLENBQWIsTUFBb0IsU0FBL0IsRUFBMEM7QUFDdEMsZUFBTyxJQUFQO0FBQ0g7QUFDRCxXQUFPLEtBQVA7QUFDSDs7QUFFRCxTQUFTLGFBQVQsQ0FBd0IsSUFBeEIsRUFBOEI7QUFDMUIsUUFBSSxJQUFKO0FBQ0EsUUFBSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBTyxpQkFBSyxRQUFMLENBQWMsSUFBZCxFQUFvQixFQUFFLE1BQU0sSUFBUixFQUFwQixDQUFQO0FBQ0gsS0FORCxDQU1FLE9BQU8sQ0FBUCxFQUFVO0FBQ1IsY0FBTSxDQUFOO0FBQ0g7QUFDRCxXQUFPLElBQVA7QUFDSDs7QUFFRCxTQUFTLFlBQVQsQ0FBdUIsTUFBdkIsRUFBK0I7QUFDM0IsV0FBTyxJQUFJLE9BQUosQ0FBWSxVQUFDLE9BQUQsRUFBVSxNQUFWLEVBQXFCO0FBQ3BDLFlBQUksT0FBTyxNQUFQLEtBQWtCLFFBQXRCLEVBQWdDO0FBQzVCLDRCQUFNLEVBQU4sQ0FBUyxNQUFULEVBQWlCLElBQWpCLENBQXNCLFVBQUMsSUFBRCxFQUFVO0FBQzVCLG9CQUFJO0FBQ0Esd0JBQUksT0FBTyxjQUFjLElBQWQsQ0FBWDtBQUNBLDRCQUFRLElBQVI7QUFDSCxpQkFIRCxDQUlBLE9BQU0sQ0FBTixFQUFTO0FBQ0wsMkJBQU8sQ0FBUDtBQUNIO0FBQ0osYUFSRCxFQVFHLE1BUkg7QUFTSCxTQVZELE1BVU87QUFDSCxvQkFBUSxNQUFSO0FBQ0g7QUFDSixLQWRNLENBQVA7QUFlSDs7Ozs7Ozs7Ozs7QUM5T0Q7Ozs7QUFDQTs7OztBQUNBOztJQUFZLEk7O0FBQ1o7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7OztBQUVBLElBQUksV0FBSjs7a0JBRWUsY0FBYzs7QUFFekI7QUFDQSxhQUh5QixxQkFHZixHQUhlLEVBR0c7QUFBQTs7QUFBQSxZQUFiLElBQWEsdUVBQU4sSUFBTTs7QUFDeEIsWUFBSSxTQUFTLEVBQWI7QUFDQSxlQUFPLEtBQUssa0JBQUwsQ0FBd0IsRUFBRSxRQUFGLEVBQU8sVUFBUCxFQUF4QixFQUF1QyxJQUF2QyxFQUE2QyxNQUE3QyxFQUNILElBREcsQ0FDRTtBQUFBLG1CQUFVLE1BQUssUUFBTCxDQUFjLE1BQWQsQ0FBVjtBQUFBLFNBREYsRUFFSCxJQUZHLENBRUUsZ0JBQXdCO0FBQUEsZ0JBQXJCLE1BQXFCLFFBQXJCLE1BQXFCO0FBQUEsZ0JBQWIsTUFBYSxRQUFiLE1BQWE7O0FBQ3pCLGdCQUFJLENBQUMsTUFBTCxFQUFhO0FBQ1Q7QUFDQSx1QkFBTyxRQUFRLE1BQVIsQ0FBZSxPQUFPLENBQVAsQ0FBZixDQUFQO0FBQ0gsYUFIRCxNQUlLLElBQUksT0FBTyxNQUFQLEdBQWdCLENBQXBCLEVBQXVCO0FBQ3hCO0FBQ0EsdUJBQU8sT0FBUCxDQUFlLGlCQUFTO0FBQ3BCLHdCQUFJLHVDQUFxQyxNQUFNLEdBQS9DO0FBQ0EsdUNBQUksT0FBSixFQUFhLE9BQWIsRUFBc0IsS0FBdEI7QUFDQSwwQkFBSyxPQUFMLENBQWEsT0FBYixFQUFzQixFQUFFLE1BQU0sY0FBUixFQUF3QixnQkFBeEIsRUFBaUMsWUFBakMsRUFBd0MsS0FBSyxNQUFNLEdBQW5ELEVBQXRCO0FBQ0gsaUJBSkQ7QUFLSDtBQUNELG1CQUFPLEVBQUUsY0FBRixFQUFVLGNBQVYsRUFBUDtBQUNILFNBaEJFLENBQVA7QUFpQkgsS0F0QndCOzs7QUF3QnpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBNUJ5QixxQ0E0QmUsTUE1QmYsRUE0Qm9DO0FBQUEsWUFBeEMsR0FBd0MsU0FBeEMsR0FBd0M7QUFBQSxZQUFuQyxJQUFtQyxTQUFuQyxJQUFtQztBQUFBLFlBQTdCLElBQTZCLFNBQTdCLElBQTZCOztBQUFBOztBQUFBLFlBQWIsTUFBYSx1RUFBSixFQUFJOztBQUN6RCxZQUFJLENBQUMsR0FBTCxFQUFVO0FBQ04sbUJBQU8sUUFBUSxPQUFSLENBQWdCLEVBQWhCLENBQVA7QUFDSDs7QUFFRCxZQUFJLFNBQVMscUNBQWtCLEdBQWxCLEVBQXVCLElBQXZCLEVBQTZCLE1BQTdCLEVBQXFDLElBQXJDLENBQWI7O0FBRUEsZUFBTyxPQUFPLElBQVAsR0FBYyxJQUFkLENBQW1CLGtCQUFVO0FBQ2hDLGdCQUFJLE9BQU8sTUFBUCxJQUFpQixJQUFyQixFQUEyQjtBQUN2Qix1QkFBTyxPQUFLLFNBQUwsQ0FBZSxNQUFmLEVBQXVCLE1BQXZCLENBQVA7QUFDSDs7QUFFRDtBQUNBLGdCQUFJLENBQUMsTUFBTSxPQUFOLENBQWMsT0FBTyxNQUFyQixDQUFMLEVBQW1DO0FBQy9CLHVCQUFPLE1BQVAsR0FBZ0IsQ0FBQyxPQUFPLE1BQVIsQ0FBaEIsQ0FEK0IsQ0FDRTtBQUNwQzs7QUFFRDtBQUNBLGdCQUFJLFVBQVUsRUFBZDtBQUNBLG1CQUFPLE1BQVAsQ0FBYyxPQUFkLENBQXNCLGVBQU87QUFDekI7QUFDQSxvQkFBSSxRQUFPLEdBQVAseUNBQU8sR0FBUCxPQUFlLFFBQW5CLEVBQTZCO0FBQ3pCLDBCQUFNLEtBQUssZUFBTCxDQUFxQixJQUFJLElBQUosQ0FBUyxDQUFDLEtBQUssU0FBTCxDQUFlLEdBQWYsQ0FBRCxDQUFULENBQXJCLENBQU47QUFDSDs7QUFFRCx3QkFBUSxJQUFSLENBQWEsT0FBTyxXQUFQLENBQW1CLEdBQW5CLENBQWI7QUFDSCxhQVBEO0FBUUEsbUJBQU8sT0FBTyxNQUFkLENBcEJnQyxDQW9CVjs7QUFFdEIsbUJBQU8sUUFDSCxHQURHLENBQ0MsUUFBUSxHQUFSLENBQVk7QUFBQSx1QkFBWSxPQUFLLGtCQUFMLENBQXdCLFFBQXhCLEVBQWtDLE1BQWxDLEVBQTBDLE1BQTFDLENBQVo7QUFBQSxhQUFaLENBREQsRUFFQyxJQUZELENBRU0sbUJBQVc7QUFDWixvQkFBSSxVQUFVLFFBQVEsR0FBUixDQUFZO0FBQUEsMkJBQUssRUFBRSxNQUFQO0FBQUEsaUJBQVosQ0FBZDtBQUNBLHlCQUFTLGtDQUFhLEVBQWIsNEJBQW9CLE9BQXBCLElBQTZCLE1BQTdCLEdBQVQ7QUFDQSx1QkFBTyxPQUFLLFNBQUwsQ0FBZSxNQUFmLEVBQXVCLE1BQXZCLENBQVA7QUFDSCxhQU5GLENBQVA7QUFPSCxTQTdCTSxFQTZCSixLQTdCSSxDQTZCRSxpQkFBUztBQUNkO0FBQ0Esa0JBQU0sR0FBTixHQUFZLEdBQVo7QUFDQSxtQkFBTyxJQUFQLENBQVksS0FBWjtBQUNBLG1CQUFPLEVBQVA7QUFDSCxTQWxDTSxDQUFQO0FBbUNILEtBdEV3Qjs7O0FBd0V6QjtBQUNBLGFBekV5QixxQkF5RWYsTUF6RWUsRUF5RVAsTUF6RU8sRUF5RUM7QUFDdEIsYUFBSyxvQkFBTCxDQUEwQixNQUExQixFQUFrQyxNQUFsQztBQUNBLGFBQUssY0FBTCxDQUFvQixNQUFwQixFQUE0QixNQUE1QjtBQUNBLGFBQUssaUJBQUwsQ0FBdUIsTUFBdkIsRUFBK0IsTUFBL0I7QUFDQSxlQUFPLEVBQUUsY0FBRixFQUFVLGNBQVYsRUFBUDtBQUNILEtBOUV3Qjs7O0FBZ0Z6QjtBQUNBLHdCQWpGeUIsZ0NBaUZKLE1BakZJLEVBaUZJLE1BakZKLEVBaUZZO0FBQ2pDLGVBQU8sT0FBUCxHQUFpQixPQUFPLE9BQVAsSUFBa0IsRUFBbkM7O0FBRUEsYUFBSyxJQUFJLEVBQVQsSUFBZSxPQUFPLE9BQXRCLEVBQStCO0FBQzNCLGlCQUFLLG1CQUFMLENBQXlCLE9BQU8sT0FBUCxDQUFlLEVBQWYsQ0FBekIsRUFBNkMsTUFBN0M7QUFDSDs7QUFFRCxlQUFPLE1BQVA7QUFDSCxLQXpGd0I7QUEyRnpCLHVCQTNGeUIsK0JBMkZMLE1BM0ZLLEVBMkZHLE1BM0ZILEVBMkZXO0FBQ2hDLGVBQU8sR0FBUCxHQUFhLE9BQU8sTUFBUCxDQUFjLE9BQU8sR0FBckIsQ0FBYjs7QUFFQSxZQUFJLE1BQU0sT0FBTixDQUFjLE9BQU8sT0FBckIsQ0FBSixFQUFtQztBQUMvQixtQkFBTyxPQUFQLEdBQWlCLE9BQU8sT0FBUCxDQUFlLEdBQWYsQ0FBbUI7QUFBQSx1QkFBTyxPQUFPLE1BQVAsQ0FBYyxHQUFkLENBQVA7QUFBQSxhQUFuQixDQUFqQjtBQUNIOztBQUVELGVBQU8sTUFBUDtBQUNILEtBbkd3Qjs7O0FBcUd6QjtBQUNBLGtCQXRHeUIsMEJBc0dWLE1BdEdVLEVBc0dGLE1BdEdFLEVBc0dNO0FBQzNCLGVBQU8sS0FBUCxHQUFlLE9BQU8sS0FBUCxJQUFnQixFQUEvQjs7QUFFQSxhQUFLLElBQUksTUFBVCxJQUFtQixPQUFPLEtBQTFCLEVBQWlDO0FBQzdCLGdCQUFJLE1BQU0sT0FBTixDQUFjLE9BQU8sS0FBUCxDQUFhLE1BQWIsQ0FBZCxDQUFKLEVBQXlDO0FBQ3JDLHVCQUFPLEtBQVAsQ0FBYSxNQUFiLEVBQXFCLE9BQXJCLENBQTZCLGdCQUFRO0FBQ2pDLHlCQUFLLEdBQUwsR0FBVyxLQUFLLEdBQUwsSUFBWSxPQUFPLE1BQVAsQ0FBYyxLQUFLLEdBQW5CLENBQXZCO0FBQ0gsaUJBRkQ7QUFHSCxhQUpELE1BS0s7QUFDRCxvQkFBSSxPQUFPLE9BQU8sS0FBUCxDQUFhLE1BQWIsQ0FBWDtBQUNBLHFCQUFLLEdBQUwsR0FBVyxLQUFLLEdBQUwsSUFBWSxPQUFPLE1BQVAsQ0FBYyxLQUFLLEdBQW5CLENBQXZCO0FBQ0g7QUFDSjs7QUFFRCxlQUFPLE1BQVA7QUFDSCxLQXRId0I7OztBQXdIekI7QUFDQSxxQkF6SHlCLDZCQXlIUCxNQXpITyxFQXlIQyxNQXpIRCxFQXlIUztBQUM5QixlQUFPLFFBQVAsR0FBa0IsT0FBTyxRQUFQLElBQW1CLEVBQXJDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQUksT0FBTyxRQUFYLEVBQXFCO0FBQ2pCLGlCQUFLLElBQUksRUFBVCxJQUFlLE9BQU8sUUFBdEIsRUFBZ0M7QUFDNUIsb0JBQUksVUFBVSxPQUFPLFFBQVAsQ0FBZ0IsRUFBaEIsQ0FBZDtBQUNBLG9CQUFJLFFBQVEsR0FBWixFQUFpQjtBQUNiLDRCQUFRLEdBQVIsR0FBYyxPQUFPLE1BQVAsQ0FBYyxRQUFRLEdBQXRCLENBQWQ7QUFDSDtBQUNKO0FBQ0o7O0FBRUQ7QUFDQSxZQUFJLE9BQU8sTUFBWCxFQUFtQjtBQUFBLHVDQUNOLEVBRE07QUFFWCxvQkFBSSxRQUFRLE9BQU8sTUFBUCxDQUFjLEVBQWQsQ0FBWjs7QUFFQTtBQUNBLG9CQUFJLE1BQU0sTUFBTSxPQUFoQjtBQUNBLG9CQUFJLE9BQU8sR0FBUCxLQUFlLFFBQWYsSUFBMkIsQ0FBQyxPQUFPLFFBQVAsQ0FBZ0IsR0FBaEIsQ0FBNUIsSUFBb0QsQ0FBQyw0QkFBUyxHQUFULENBQXpELEVBQXdFO0FBQ3BFLDBCQUFNLE9BQU4sR0FBZ0IsT0FBTyxNQUFQLENBQWMsR0FBZCxDQUFoQjtBQUNIOztBQUVEO0FBQ0Esb0JBQUksTUFBTSxRQUFWLEVBQW9CO0FBQ2hCLHFCQUFDLFVBQUQsRUFBYSxTQUFiLEVBQXdCLFNBQXhCLEVBQW1DLFVBQW5DLEVBQStDLFFBQS9DLEVBQXlELE9BQXpELENBQWlFLGdCQUFRO0FBQ3JFO0FBQ0EsNEJBQUksTUFBTSxNQUFNLFFBQU4sQ0FBZSxJQUFmLEtBQXdCLElBQXhCLElBQWdDLE1BQU0sUUFBTixDQUFlLElBQWYsRUFBcUIsT0FBL0Q7QUFDQSw0QkFBSSxPQUFPLEdBQVAsS0FBZSxRQUFmLElBQTJCLENBQUMsT0FBTyxRQUFQLENBQWdCLEdBQWhCLENBQTVCLElBQW9ELENBQUMsNEJBQVMsR0FBVCxDQUF6RCxFQUF3RTtBQUNwRSxrQ0FBTSxRQUFOLENBQWUsSUFBZixFQUFxQixPQUFyQixHQUErQixPQUFPLE1BQVAsQ0FBYyxHQUFkLENBQS9CO0FBQ0g7QUFDSixxQkFORDtBQU9IOztBQUVEO0FBQ0Esb0JBQUksTUFBTSxPQUFOLElBQWlCLE1BQU0sT0FBTixDQUFjLFFBQW5DLEVBQTZDO0FBQ3pDLG1DQUFLLGFBQUwsQ0FBbUIsTUFBTSxPQUFOLENBQWMsUUFBakMsRUFBMkMsT0FBM0MsQ0FBbUQsaUJBQWtDO0FBQUEsNEJBQWhDLElBQWdDLFNBQWhDLElBQWdDO0FBQUEsNEJBQTFCLEtBQTBCLFNBQTFCLEtBQTBCO0FBQUEsNEJBQW5CLEdBQW1CLFNBQW5CLEdBQW1CO0FBQUEsNEJBQWQsUUFBYyxTQUFkLFFBQWM7O0FBQ2pGO0FBQ0EsNEJBQUksU0FBUyxXQUFULElBQXdCLE9BQU8sS0FBUCxLQUFpQixRQUF6QyxJQUFxRCxDQUFDLE9BQU8sUUFBUCxDQUFnQixLQUFoQixDQUF0RCxJQUFnRixDQUFDLDRCQUFTLEtBQVQsQ0FBckYsRUFBc0c7QUFDbEcscUNBQVMsR0FBVCxJQUFnQixPQUFPLE1BQVAsQ0FBYyxLQUFkLENBQWhCO0FBQ0g7QUFDSixxQkFMRDtBQU1IO0FBN0JVOztBQUNmLGlCQUFLLElBQUksRUFBVCxJQUFlLE9BQU8sTUFBdEIsRUFBOEI7QUFBQSxzQkFBckIsRUFBcUI7QUE2QjdCO0FBQ0o7O0FBRUQsZUFBTyxNQUFQO0FBQ0gsS0EzS3dCOzs7QUE2S3pCO0FBQ0E7QUFDQTtBQUNBLHlCQWhMeUIsaUNBZ0xILE1BaExHLEVBZ0xLLE9BaExMLEVBZ0xjO0FBQ25DLFlBQUksQ0FBQyxPQUFPLE1BQVIsSUFBa0IsT0FBTyxJQUFQLENBQVksT0FBTyxNQUFuQixFQUEyQixNQUEzQixLQUFzQyxDQUE1RCxFQUErRDtBQUMzRCxtQkFBTyxNQUFQLENBRDJELENBQzVDO0FBQ2xCOztBQUVEO0FBQ0EsWUFBTSxZQUFZLEdBQWxCO0FBQ0EsWUFBTSxRQUFRLGtCQUFrQixPQUFPLE1BQXpCLEVBQWlDLFNBQWpDLENBQWQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFRLE9BQVIsQ0FBZ0IsaUJBQTJCO0FBQUEsZ0JBQXhCLElBQXdCLFNBQXhCLElBQXdCO0FBQUEsZ0JBQWxCLE1BQWtCLFNBQWxCLE1BQWtCO0FBQUEsZ0JBQVYsR0FBVSxTQUFWLEdBQVU7O0FBQ3ZDLGdCQUFJLE1BQUosRUFBWTtBQUNSLHVCQUFPLEdBQVAsSUFBYyxNQUFNLElBQU4sQ0FBZDtBQUNBO0FBQ0g7QUFDSixTQUxEOztBQU9BO0FBQ0EsaUJBQVMsVUFBVCxDQUFxQixHQUFyQixFQUEwQixNQUExQixFQUFrQyxHQUFsQyxFQUF1QztBQUNuQztBQUNBLGdCQUFJLE9BQU8sR0FBUCxLQUFlLFFBQW5CLEVBQTZCO0FBQ3pCLG9CQUFNLE9BQVEsSUFBSSxLQUFKLENBQVUsQ0FBVixFQUFhLENBQWIsTUFBb0IsU0FBckIsSUFBb0MsSUFBSSxLQUFKLENBQVUsQ0FBVixFQUFhLE9BQWIsQ0FBcUIsS0FBckIsRUFBNEIsU0FBNUIsQ0FBakQ7QUFDQSxvQkFBSSxRQUFRLE1BQU0sSUFBTixNQUFnQixTQUE1QixFQUF1QztBQUNuQztBQUNBLDRCQUFRLElBQVIsQ0FBYSxFQUFFLFVBQUYsRUFBUSxjQUFSLEVBQWdCLFFBQWhCLEVBQWI7O0FBRUE7QUFDQSwwQkFBTSxNQUFNLElBQU4sQ0FBTjtBQUNIO0FBQ0o7QUFDRDtBQVZBLGlCQVdLLElBQUksUUFBTyxHQUFQLHlDQUFPLEdBQVAsT0FBZSxRQUFuQixFQUE2QjtBQUM5Qix5QkFBSyxJQUFJLENBQVQsSUFBYyxHQUFkLEVBQW1CO0FBQ2YsNEJBQUksQ0FBSixJQUFTLFdBQVcsSUFBSSxDQUFKLENBQVgsRUFBbUIsR0FBbkIsRUFBd0IsQ0FBeEIsQ0FBVDtBQUNIO0FBQ0o7QUFDRCxtQkFBTyxHQUFQO0FBQ0g7O0FBRUQsZUFBTyxXQUFXLE1BQVgsQ0FBUDtBQUNILEtBNU53Qjs7O0FBOE56QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBbk95Qix5QkFtT1YsTUFuT1UsRUFtT0Y7QUFDbkIsWUFBSSxPQUFPLE1BQVgsRUFBbUI7QUFBQSx5Q0FDTixFQURNO0FBRVgsb0JBQUksUUFBUSxPQUFPLE1BQVAsQ0FBYyxFQUFkLENBQVo7O0FBRUE7QUFDQSxvQkFBSSxNQUFNLE1BQU0sT0FBaEI7QUFDQSxvQkFBSSxPQUFPLEdBQVAsS0FBZSxRQUFmLElBQTJCLENBQUMsT0FBTyxRQUFQLENBQWdCLEdBQWhCLENBQWhDLEVBQXNEO0FBQ2xELHdCQUFJLE1BQU0sR0FBVjtBQUNBLHdCQUFJLE9BQU8sNEJBQVMsR0FBVCxpQkFBMkIsR0FBM0IsR0FBbUMsR0FBOUM7QUFDQSwyQkFBTyxRQUFQLENBQWdCLElBQWhCLElBQXdCLEVBQUUsUUFBRixFQUF4QjtBQUNBLDBCQUFNLE9BQU4sR0FBZ0IsSUFBaEI7QUFDSDs7QUFFRDtBQUNBLG9CQUFJLE1BQU0sUUFBVixFQUFvQjtBQUNoQixxQkFBQyxVQUFELEVBQWEsU0FBYixFQUF3QixTQUF4QixFQUFtQyxVQUFuQyxFQUErQyxRQUEvQyxFQUF5RCxPQUF6RCxDQUFpRSxnQkFBUTtBQUNyRTtBQUNBLDRCQUFJLE1BQU0sTUFBTSxRQUFOLENBQWUsSUFBZixLQUF3QixJQUF4QixJQUFnQyxNQUFNLFFBQU4sQ0FBZSxJQUFmLEVBQXFCLE9BQS9EO0FBQ0EsNEJBQUksT0FBTyxHQUFQLEtBQWUsUUFBZixJQUEyQixDQUFDLE9BQU8sUUFBUCxDQUFnQixHQUFoQixDQUFoQyxFQUFzRDtBQUNsRCxnQ0FBSSxPQUFNLEdBQVY7QUFDQSxnQ0FBSSxRQUFPLDRCQUFTLElBQVQsaUJBQTJCLElBQTNCLEdBQW1DLElBQTlDO0FBQ0EsbUNBQU8sUUFBUCxDQUFnQixLQUFoQixJQUF3QixFQUFFLFNBQUYsRUFBeEI7QUFDQSxrQ0FBTSxRQUFOLENBQWUsSUFBZixFQUFxQixPQUFyQixHQUErQixLQUEvQjtBQUNIO0FBQ0oscUJBVEQ7QUFVSDs7QUFFRDtBQUNBLG9CQUFJLE1BQU0sT0FBTixJQUFpQixNQUFNLE9BQU4sQ0FBYyxRQUFuQyxFQUE2QztBQUN6QyxtQ0FBSyxhQUFMLENBQW1CLE1BQU0sT0FBTixDQUFjLFFBQWpDLEVBQTJDLE9BQTNDLENBQW1ELGlCQUFrQztBQUFBLDRCQUFoQyxJQUFnQyxTQUFoQyxJQUFnQztBQUFBLDRCQUExQixLQUEwQixTQUExQixLQUEwQjtBQUFBLDRCQUFuQixHQUFtQixTQUFuQixHQUFtQjtBQUFBLDRCQUFkLFFBQWMsU0FBZCxRQUFjOztBQUNqRjtBQUNBLDRCQUFJLFNBQVMsV0FBVCxJQUF3QixPQUFPLEtBQVAsS0FBaUIsUUFBekMsSUFBcUQsQ0FBQyxPQUFPLFFBQVAsQ0FBZ0IsS0FBaEIsQ0FBMUQsRUFBa0Y7QUFDOUUsZ0NBQUksUUFBTSxLQUFWO0FBQ0EsZ0NBQUksU0FBTyw0QkFBUyxLQUFULGlCQUEyQixLQUEzQixHQUFtQyxLQUE5QztBQUNBLG1DQUFPLFFBQVAsQ0FBZ0IsTUFBaEIsSUFBd0IsRUFBRSxVQUFGLEVBQXhCO0FBQ0EscUNBQVMsR0FBVCxJQUFnQixNQUFoQjtBQUNIO0FBQ0oscUJBUkQ7QUFTSDtBQXRDVTs7QUFDZixpQkFBSyxJQUFJLEVBQVQsSUFBZSxPQUFPLE1BQXRCLEVBQThCO0FBQUEsdUJBQXJCLEVBQXFCO0FBc0M3QjtBQUNKO0FBQ0osS0E3UXdCOzs7QUErUXpCO0FBQ0EsWUFoUnlCLDJCQWdSSTtBQUFBLFlBQWxCLE1BQWtCLFNBQWxCLE1BQWtCO0FBQUEsWUFBVixNQUFVLFNBQVYsTUFBVTs7QUFDekIsWUFBSSxDQUFDLE1BQUwsRUFBYTtBQUNULG1CQUFPLEVBQVA7QUFDSDs7QUFFRDtBQUNBLGVBQU8sS0FBUCxHQUFlLE9BQU8sS0FBUCxJQUFnQixFQUEvQjtBQUNBLGVBQU8sT0FBUCxHQUFpQixPQUFPLE9BQVAsSUFBa0IsRUFBbkM7QUFDQSxlQUFPLE1BQVAsR0FBZ0IsT0FBTyxNQUFQLElBQWlCLEVBQWpDO0FBQ0EsZUFBTyxNQUFQLEdBQWdCLE9BQU8sTUFBUCxJQUFpQixFQUFqQztBQUNBLGVBQU8sTUFBUCxHQUFnQixPQUFPLE1BQVAsSUFBaUIsRUFBakM7O0FBRUE7QUFDQSxZQUFJLE9BQU8sTUFBWCxFQUFtQjtBQUNmLG1CQUFPLE9BQVAsQ0FBZSxPQUFmLEdBQXlCLE9BQU8sTUFBaEM7QUFDSDs7QUFFRDtBQUNBLFlBQUksT0FBTyxJQUFQLENBQVksT0FBTyxPQUFuQixFQUE0QixNQUE1QixLQUF1QyxDQUEzQyxFQUE4QztBQUMxQyxtQkFBTyxPQUFQLENBQWUsT0FBZixHQUF5QixFQUF6QjtBQUNIOztBQUVEO0FBQ0EsWUFBSSxPQUFPLElBQVAsQ0FBWSxPQUFPLE1BQW5CLEVBQTJCLE1BQTNCLEtBQXNDLENBQXRDLElBQ0EsT0FBTyxJQUFQLENBQVksT0FBTyxNQUFuQixFQUEyQixLQUEzQixDQUFpQztBQUFBLG1CQUFLLE9BQU8sTUFBUCxDQUFjLENBQWQsRUFBaUIsT0FBakIsS0FBNkIsS0FBbEM7QUFBQSxTQUFqQyxDQURKLEVBQytFO0FBQzNFLG1CQUFPLE1BQVAsQ0FBYyxhQUFkLEdBQThCO0FBQzFCLHNCQUFNO0FBRG9CLGFBQTlCO0FBR0g7O0FBRUQsZUFBTyxFQUFFLGNBQUYsRUFBVSxjQUFWLEVBQVA7QUFDSDtBQS9Td0IsQzs7QUFtVDdCO0FBQ0E7O0FBQ0EsU0FBUyxpQkFBVCxDQUE0QixHQUE1QixFQUE2RTtBQUFBLFFBQTVDLFNBQTRDLHVFQUFoQyxHQUFnQztBQUFBLFFBQTNCLE1BQTJCLHVFQUFsQixJQUFrQjtBQUFBLFFBQVosS0FBWSx1RUFBSixFQUFJOztBQUN6RSxhQUFTLFNBQVUsU0FBUyxTQUFuQixHQUFnQyxFQUF6Qzs7QUFFQSxTQUFLLElBQUksQ0FBVCxJQUFjLEdBQWQsRUFBbUI7QUFDZixZQUFJLE1BQU0sU0FBUyxDQUFuQjtBQUNBLFlBQUksTUFBTSxJQUFJLENBQUosQ0FBVjtBQUNBLGNBQU0sR0FBTixJQUFhLEdBQWI7O0FBRUEsWUFBSSxRQUFPLEdBQVAseUNBQU8sR0FBUCxPQUFlLFFBQWYsSUFBMkIsQ0FBQyxNQUFNLE9BQU4sQ0FBYyxHQUFkLENBQWhDLEVBQW9EO0FBQ2hELDhCQUFrQixHQUFsQixFQUF1QixTQUF2QixFQUFrQyxHQUFsQyxFQUF1QyxLQUF2QztBQUNIO0FBQ0o7QUFDRCxXQUFPLEtBQVA7QUFDSDs7QUFFRCx5QkFBZSxXQUFmOzs7Ozs7Ozs7O0FDNVVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O29NQVpBO0FBSWtEOzs7QUFVM0MsSUFBSSxvQ0FBYyxJQUFsQjs7QUFFUDtBQUNBLElBQUksaUJBQU8sU0FBWCxFQUFzQjs7QUFFdEIsV0FBTyxNQUFQLENBQWMsSUFBZCxFQUFvQjs7QUFFaEIsNkNBRmdCOztBQUloQixpQkFBUyxFQUpPO0FBS2hCLGdCQUFRLEVBTFE7QUFNaEIsZ0JBQVEsRUFOUTtBQU9oQixlQUFPLEVBUFM7QUFRaEIsaUJBQVMsRUFSTztBQVNoQixnQkFBUSxFQVRRLEVBU0E7O0FBRWhCO0FBQ0EsWUFaZ0IsZ0JBWVYsUUFaVSxFQVlBLFNBWkEsRUFZVyxXQVpYLEVBWXdCLFNBWnhCLEVBWW1DLGtCQVpuQyxFQVl1RDtBQUNuRSxpQkFBSyxRQUFMLEdBQWdCLFFBQWhCO0FBQ0EsaUJBQUssVUFBTCxHQUFrQixTQUFsQjtBQUNBLGlCQUFLLFdBQUwsR0FBbUIsV0FBbkI7QUFDQSwwQkFBSSxRQUFKLENBQWEsU0FBYjtBQUNBLDRCQUFNLGtCQUFOLEdBQTJCLGtCQUEzQjtBQUNBLGdDQUFpQixTQUFqQixDQUEyQixLQUFLLFVBQWhDO0FBQ0EsaUJBQUssYUFBTCxHQUFxQixpQ0FBckI7QUFDQSxtQkFBTyxTQUFQO0FBQ0gsU0FyQmU7OztBQXVCaEI7QUFDQSxvQkF4QmdCLDhCQXdCcUM7QUFBQSxnQkFBckMsTUFBcUMsUUFBckMsTUFBcUM7QUFBQSxnQkFBN0IsVUFBNkIsUUFBN0IsVUFBNkI7QUFBQSxnQkFBakIsYUFBaUIsUUFBakIsYUFBaUI7O0FBQ2pELHFCQUFTLEtBQUssS0FBTCxDQUFXLE1BQVgsQ0FBVDs7QUFFQSxpQkFBSyxXQUFMLEdBQW1CLHFCQUFhLEVBQWIsRUFBaUIsS0FBSyxNQUF0QixDQUFuQjtBQUNBLGlCQUFLLE1BQUwsR0FBYyxxQkFBYSxFQUFiLEVBQWlCLE1BQWpCLENBQWQ7QUFDQSxpQkFBSyxVQUFMLEdBQWtCLFVBQWxCO0FBQ0EsaUJBQUssYUFBTCxHQUFxQixhQUFyQjs7QUFFQTtBQUNBO0FBQ0EsaUJBQUssSUFBSSxLQUFULElBQWtCLE9BQU8sTUFBekIsRUFBaUM7QUFDN0Isb0JBQUksT0FBTyxNQUFQLENBQWMsS0FBZCxDQUFKLEVBQTBCO0FBQ3RCLDJCQUFPLE1BQVAsQ0FBYyxLQUFkLEVBQXFCLElBQXJCLEdBQTRCLGdCQUFNLGtCQUFOLENBQXlCLE9BQU8sTUFBUCxDQUFjLEtBQWQsRUFBcUIsSUFBOUMsQ0FBNUI7QUFDSDtBQUNKOztBQUVEO0FBQ0EsaUJBQUssTUFBTCxHQUFjLGdCQUFNLGtCQUFOLENBQXlCLE9BQU8sTUFBaEMsQ0FBZDs7QUFFQTtBQUNBLGlCQUFLLGlCQUFMLENBQXVCLE1BQXZCOztBQUVBO0FBQ0EsbUJBQU8sTUFBUCxHQUFnQixnQkFBTSxrQkFBTixDQUF5QixPQUFPLE1BQWhDLEVBQXdDLDBCQUFZLFlBQXBELENBQWhCO0FBQ0EsaUJBQUssTUFBTCxHQUFjLEtBQUssYUFBTCxDQUFtQixLQUFuQixDQUF5QixPQUFPLE1BQWhDLENBQWQ7QUFDQSxpQkFBSyxhQUFMLENBQW1CLFVBQW5CLENBQThCO0FBQzFCLDRCQUFZLEtBQUssVUFEUztBQUUxQix3QkFBUSxLQUFLLE1BRmE7QUFHMUIseUJBQVMsS0FBSyxPQUhZO0FBSTFCLCtCQUFlLEtBQUs7QUFKTSxhQUE5Qjs7QUFPQTtBQUNBLGlCQUFLLE1BQUwsR0FBYyx3QkFBWSxPQUFPLE1BQW5CLEVBQTJCLEtBQUssYUFBTCxDQUFtQixNQUE5QyxDQUFkOztBQUVBO0FBQ0EsaUJBQUssZ0JBQUwsR0FBd0IsS0FBSyxZQUFMLENBQWtCLE9BQU8sUUFBekIsQ0FBeEI7O0FBRUE7QUFDQSxpQkFBSyxXQUFMLEdBQW1CLEtBQUssZ0JBQUwsQ0FBc0IsSUFBdEIsQ0FBMkIsWUFBTTtBQUNoRCxtQ0FBSSxPQUFKO0FBQ0gsYUFGa0IsQ0FBbkI7QUFHSCxTQWxFZTs7O0FBb0VoQjtBQUNBLHlCQXJFZ0IsNkJBcUVHLE1BckVILEVBcUVXO0FBQ3ZCLG1CQUFPLE9BQVAsR0FBaUIsZ0JBQU0sa0JBQU4sQ0FBeUIsT0FBTyxPQUFoQyxDQUFqQixDQUR1QixDQUNvQztBQUMzRCxpQkFBSyxPQUFMLEdBQWUsRUFBZixDQUZ1QixDQUVKO0FBQ25CLGlCQUFLLElBQUksSUFBVCxJQUFpQixPQUFPLE9BQXhCLEVBQWlDO0FBQzdCLG9CQUFJLGVBQUo7QUFDQSxvQkFBSTtBQUNBLDZCQUFTLHNCQUFXLE1BQVgsQ0FBa0IsT0FBTyxNQUFQLENBQWMsRUFBZCxFQUFrQixPQUFPLE9BQVAsQ0FBZSxJQUFmLENBQWxCLEVBQXdDLEVBQUMsVUFBRCxFQUF4QyxDQUFsQixFQUFtRSxLQUFLLE9BQXhFLENBQVQ7QUFDSCxpQkFGRCxDQUdBLE9BQU0sQ0FBTixFQUFTO0FBQ0w7QUFDSDs7QUFFRCxvQkFBSSxDQUFDLE1BQUwsRUFBYTtBQUNUO0FBQ0g7QUFDRCxxQkFBSyxPQUFMLENBQWEsSUFBYixJQUFxQixNQUFyQjtBQUNIOztBQUVEO0FBQ0EsZ0JBQUksQ0FBQyxLQUFLLE1BQUwsQ0FBWSxPQUFiLElBQ0EsQ0FBQyxLQUFLLFdBQUwsQ0FBaUIsT0FEbEIsSUFFQSxPQUFPLElBQVAsQ0FBWSxLQUFLLE1BQUwsQ0FBWSxPQUF4QixFQUFpQyxJQUFqQyxDQUFzQyxhQUFLO0FBQ3ZDLHVCQUFPLEtBQUssU0FBTCxDQUFlLEtBQUssTUFBTCxDQUFZLE9BQVosQ0FBb0IsQ0FBcEIsQ0FBZixNQUEyQyxLQUFLLFNBQUwsQ0FBZSxLQUFLLFdBQUwsQ0FBaUIsT0FBakIsQ0FBeUIsQ0FBekIsQ0FBZixDQUFsRDtBQUNILGFBRkQsQ0FGSixFQUlRO0FBQ0oscUJBQUssS0FBTCxHQUFhLEVBQWI7QUFDSDtBQUNKLFNBL0ZlOzs7QUFpR2hCO0FBQ0EsMEJBbEdnQixnQ0FrR007QUFDbEIsbUJBQU8sS0FBSyxXQUFaO0FBQ0gsU0FwR2U7OztBQXNHaEI7QUFDQSxpQkF2R2dCLDRCQXVHSztBQUFBLGdCQUFSLElBQVEsU0FBUixJQUFROztBQUNqQjtBQUNBLGdCQUFJLEtBQUssT0FBTCxDQUFhLEtBQUssR0FBbEIsS0FBMEIsSUFBOUIsRUFBb0M7QUFDaEM7QUFDQSxvQkFBSSxLQUFLLE9BQUwsQ0FBYSxLQUFLLEdBQWxCLEVBQXVCLE9BQXZCLEtBQW1DLElBQXZDLEVBQTZDO0FBQ3pDO0FBQ0g7QUFDSjs7QUFFRDtBQUNBLG1CQUFPLEtBQUssS0FBTCxDQUFXLEtBQUssR0FBaEIsSUFBdUIsT0FBTyxNQUFQLENBQWMsS0FBSyxPQUFMLENBQWEsS0FBSyxHQUFsQixLQUEwQixFQUF4QyxFQUE0QyxJQUE1QyxDQUE5Qjs7QUFFQTtBQUNBLG1CQUFPLEtBQUssa0JBQUwsR0FBMEIsSUFBMUIsQ0FBK0IsWUFBTTtBQUN4QztBQUNBLG9CQUFJLEtBQUssTUFBTCxLQUFnQixJQUFwQixFQUEwQjs7QUFFdEIseUJBQUssT0FBTCxHQUFlLElBQWY7QUFDQSx5QkFBSyxNQUFMLEdBQWMsS0FBZDtBQUNBLHlCQUFLLEtBQUwsR0FBYSxJQUFiOztBQUVBLHlCQUFLLGtCQUFMLENBQXdCLElBQXhCLEVBQThCLElBQTlCLENBQW1DLFlBQU07QUFDckMsNEJBQUksQ0FBQyxLQUFLLE9BQUwsQ0FBYSxLQUFLLEdBQWxCLENBQUwsRUFBNkI7QUFDekIsK0NBQUksT0FBSix3RUFBaUYsS0FBSyxHQUF0RjtBQUNBO0FBQ0g7O0FBRUQ7QUFDQSw0QkFBSSxLQUFLLFdBQUwsQ0FBaUIsS0FBckIsRUFBNEI7QUFDeEIsK0NBQUksTUFBSiw4QkFBc0MsS0FBSyxHQUEzQyxVQUFtRCxLQUFLLFdBQUwsQ0FBaUIsS0FBcEU7QUFDSDs7QUFFRCw2QkFBSyxPQUFMLEdBQWUsS0FBZjtBQUNBLDZCQUFLLE1BQUwsR0FBYyxJQUFkO0FBQ0EsdUNBQUssYUFBTCxDQUFtQixJQUFuQixFQUF5QixJQUF6QjtBQUNILHFCQWRELEVBY0csS0FkSCxDQWNTLFVBQUMsS0FBRCxFQUFXO0FBQ2hCLDZCQUFLLE9BQUwsR0FBZSxLQUFmO0FBQ0EsNkJBQUssTUFBTCxHQUFjLEtBQWQ7QUFDQSw2QkFBSyxLQUFMLEdBQWEsTUFBTSxLQUFuQjtBQUNBLDJDQUFJLE9BQUosMkJBQW9DLEtBQUssR0FBekMsVUFBaUQsS0FBSyxLQUF0RDs7QUFFQTtBQUNBLGdEQUFhLFdBQWIsa0JBQXdDLEtBQUssUUFBN0Msc0JBQXdFLGVBQUssS0FBTCxDQUFXLElBQVgsQ0FBeEU7QUFDSCxxQkF0QkQ7QUF1Qkg7QUFDRDtBQTlCQSxxQkErQks7QUFDRCwyQ0FBSSxPQUFKLGtDQUEyQyxLQUFLLEdBQWhEOztBQUVBO0FBQ0EsNEJBQUk7QUFDQSwyQ0FBSyxhQUFMLENBQW1CLElBQW5CLEVBQXlCLElBQXpCO0FBQ0gseUJBRkQsQ0FHQSxPQUFNLEtBQU4sRUFBYTtBQUNUO0FBQ0EsaUNBQUssS0FBTCxHQUFhLE1BQU0sUUFBTixFQUFiO0FBQ0Esb0RBQWEsV0FBYixrQkFBd0MsS0FBSyxRQUE3QyxzQkFBd0UsZUFBSyxLQUFMLENBQVcsSUFBWCxDQUF4RTtBQUNIO0FBQ0o7QUFDSixhQTlDTSxDQUFQO0FBK0NILFNBbktlOzs7QUFxS2hCO0FBQ0EsMEJBdEtnQiw4QkFzS0ksSUF0S0osRUFzS1U7QUFDdEIsZ0JBQUksS0FBSyxPQUFMLENBQWEsS0FBSyxNQUFsQixDQUFKLEVBQStCO0FBQzNCLHVCQUFPLEtBQUssT0FBTCxDQUFhLEtBQUssTUFBbEIsRUFBMEIsSUFBMUIsQ0FBK0IsSUFBL0IsQ0FBUDtBQUNILGFBRkQsTUFHSztBQUNELHFCQUFLLFdBQUwsR0FBbUIsRUFBbkI7QUFDQSx1QkFBTyxRQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsQ0FBUDtBQUNIO0FBQ0osU0E5S2U7QUFnTGhCLGVBaExnQixtQkFnTFIsR0FoTFEsRUFnTEg7QUFDVCxtQkFBTyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQVA7QUFDSCxTQWxMZTs7O0FBb0xoQjtBQUNBLGtCQXJMZ0Isc0JBcUxKLEdBckxJLEVBcUxDO0FBQ2IsZ0JBQUksT0FBTyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQVg7O0FBRUEsZ0JBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2Q7QUFDQSxvQkFBSSxLQUFLLE9BQUwsS0FBaUIsSUFBckIsRUFBMkI7QUFDdkIsdUNBQUksT0FBSiw0QkFBcUMsR0FBckM7QUFDQSx5QkFBSyxPQUFMLEdBQWUsS0FBZjtBQUNBLG1DQUFLLE1BQUwsQ0FBWSxJQUFaO0FBQ0g7O0FBRUQ7QUFDQSxvQ0FBaUIsU0FBakIsQ0FBMkIsR0FBM0I7QUFDQSx1QkFBTyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQVA7QUFDQSxtQ0FBSSxPQUFKLGtDQUEyQyxHQUEzQztBQUNIO0FBQ0osU0FyTWU7OztBQXVNaEI7QUFDQSwyQkF4TWdCLGlDQXdNdUI7QUFBQSw0RkFBSixFQUFJO0FBQUEsZ0JBQWhCLEVBQWdCLFNBQWhCLEVBQWdCO0FBQUEsZ0JBQVosR0FBWSxTQUFaLEdBQVk7O0FBQ25DLGdCQUFJLFlBQVksb0JBQWlCLEdBQWpCLENBQXFCLEdBQXJCLENBQWhCOztBQUVBLG1CQUFPO0FBQ0gsb0JBQUksRUFERDtBQUVILHlCQUFVLGFBQWEsVUFBVTtBQUY5QixhQUFQO0FBSUgsU0EvTWU7OztBQWlOaEI7QUFDQSw2QkFsTmdCLG1DQWtOUztBQUNyQixnQ0FBaUIsS0FBakI7QUFDSCxTQXBOZTs7O0FBc05oQjtBQUNBLGtDQXZOZ0Isd0NBdU5jO0FBQzFCLG1CQUFPLG9CQUFpQixVQUFqQixFQUFQO0FBQ0gsU0F6TmU7OztBQTJOaEI7QUFDQSxvQkE1TmdCLHdCQTRORixVQTVORSxFQTROVTtBQUN0QixnQkFBSSxXQUFXLEVBQWY7QUFDQSxnQkFBSSxVQUFKLEVBQWdCO0FBQ1oseUJBQVMsSUFBVCxvQ0FBaUIsT0FBTyxJQUFQLENBQVksVUFBWixDQUFqQjtBQUNIOztBQUVELCtCQUFJLE9BQUosRUFBYSwwQkFBYixFQUF5QyxRQUF6QztBQUNBLGdCQUFJLFNBQVMsTUFBVCxHQUFrQixDQUF0QixFQUF5QjtBQUNyQix1QkFBTyxrQkFBUSxvQkFBUixDQUE2QixRQUE3QixDQUFQO0FBQ0g7QUFDRCxtQkFBTyxRQUFRLE9BQVIsRUFBUDtBQUNILFNBdk9lOzs7QUF5T2hCO0FBQ0EsOEJBMU9nQixrQ0EwT1Esa0JBMU9SLEVBME80QjtBQUN4Qyw0QkFBTSxrQkFBTixHQUEyQixrQkFBM0I7QUFDSCxTQTVPZTs7O0FBOE9oQjtBQUNBLGVBL09nQixtQkErT1AsSUEvT08sRUErT0Q7QUFDWCxvQkFBUSxPQUFSLGFBQTBCLEtBQUssVUFBL0IsVUFBOEMsSUFBOUM7QUFDSCxTQWpQZTtBQW1QaEIsa0JBblBnQixzQkFtUEosSUFuUEksRUFtUEU7QUFDZCxvQkFBUSxVQUFSLGFBQTZCLEtBQUssVUFBbEMsVUFBaUQsSUFBakQ7QUFDSDtBQXJQZSxLQUFwQjs7QUF5UEEsNEJBQWEsU0FBYixDQUF1QixNQUF2QixFQUErQixJQUEvQjtBQUVDOzs7Ozs7Ozs7OztBQzlRRDs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7O0lBRXFCLGdCO0FBRWpCLDhCQUFZLEVBQVosRUFBZ0IsT0FBaEIsRUFBeUI7QUFBQTs7QUFDckIsYUFBSyxFQUFMLEdBQVUsRUFBVjtBQUNBLGFBQUssT0FBTCxHQUFlLE9BQWYsQ0FGcUIsQ0FFRztBQUN4QixhQUFLLElBQUw7QUFDSDs7OzsrQkFFTTtBQUNIO0FBQ0EsaUJBQUssUUFBTCxHQUFnQixFQUFoQixDQUZHLENBRWlCO0FBQ3BCLGlCQUFLLE9BQUwsR0FBZSxJQUFmLENBSEcsQ0FHa0I7QUFDckIsaUJBQUssVUFBTCxHQUFrQixDQUFsQixDQUpHLENBSWtCO0FBQ3JCLGlCQUFLLGdCQUFMLEdBQXdCLElBQXhCLENBTEcsQ0FLMkI7O0FBRTlCLGlCQUFLLEtBQUwsR0FBYSxJQUFJLFVBQUosQ0FBZSxDQUFmLENBQWI7QUFDQSxpQkFBSyxPQUFMLEdBQWUsSUFBSSxZQUFKLENBQWlCLEtBQUssS0FBTCxDQUFXLE1BQTVCLENBQWY7O0FBRUE7QUFDQTtBQUNBLGlCQUFLLEdBQUwsR0FBVyxLQUFLLEVBQUwsQ0FBUSxpQkFBUixFQUFYO0FBQ0EsaUJBQUssRUFBTCxDQUFRLGVBQVIsQ0FBd0IsS0FBSyxFQUFMLENBQVEsV0FBaEMsRUFBNkMsS0FBSyxHQUFsRDtBQUNBLGlCQUFLLFFBQUwsR0FBZ0IsRUFBRSxPQUFPLEdBQVQsRUFBYyxRQUFRLEdBQXRCLEVBQWhCLENBZEcsQ0FjMEM7QUFDN0MsaUJBQUssUUFBTCxDQUFjLE1BQWQsR0FBdUIsS0FBSyxRQUFMLENBQWMsS0FBZCxHQUFzQixLQUFLLFFBQUwsQ0FBYyxNQUEzRDs7QUFFQTtBQUNBLGdCQUFJLGNBQWMsa0JBQVEsTUFBUixDQUFnQixLQUFLLEVBQXJCLEVBQXlCLGVBQXpCLEVBQTBDLEVBQUUsV0FBVyxTQUFiLEVBQTFDLENBQWxCO0FBQ0Esd0JBQVksT0FBWixDQUFvQixLQUFLLFFBQUwsQ0FBYyxLQUFsQyxFQUF5QyxLQUFLLFFBQUwsQ0FBYyxNQUF2RCxFQUErRCxJQUEvRCxFQUFxRSxFQUFFLFdBQVcsU0FBYixFQUFyRTtBQUNBLGlCQUFLLEVBQUwsQ0FBUSxvQkFBUixDQUE2QixLQUFLLEVBQUwsQ0FBUSxXQUFyQyxFQUFrRCxLQUFLLEVBQUwsQ0FBUSxpQkFBMUQsRUFBNkUsS0FBSyxFQUFMLENBQVEsVUFBckYsRUFBaUcsWUFBWSxPQUE3RyxFQUFzSCxDQUF0SDs7QUFFQTtBQUNBLGdCQUFJLGVBQWUsS0FBSyxFQUFMLENBQVEsa0JBQVIsRUFBbkI7QUFDQSxpQkFBSyxFQUFMLENBQVEsZ0JBQVIsQ0FBeUIsS0FBSyxFQUFMLENBQVEsWUFBakMsRUFBK0MsWUFBL0M7QUFDQSxpQkFBSyxFQUFMLENBQVEsbUJBQVIsQ0FBNEIsS0FBSyxFQUFMLENBQVEsWUFBcEMsRUFBa0QsS0FBSyxFQUFMLENBQVEsaUJBQTFELEVBQTZFLEtBQUssUUFBTCxDQUFjLEtBQTNGLEVBQWtHLEtBQUssUUFBTCxDQUFjLE1BQWhIO0FBQ0EsaUJBQUssRUFBTCxDQUFRLHVCQUFSLENBQWdDLEtBQUssRUFBTCxDQUFRLFdBQXhDLEVBQXFELEtBQUssRUFBTCxDQUFRLGdCQUE3RCxFQUErRSxLQUFLLEVBQUwsQ0FBUSxZQUF2RixFQUFxRyxZQUFyRzs7QUFFQSxpQkFBSyxFQUFMLENBQVEsZUFBUixDQUF3QixLQUFLLEVBQUwsQ0FBUSxXQUFoQyxFQUE2QyxJQUE3QztBQUNIOzs7a0NBRVM7QUFDTixnQkFBSSxLQUFLLEVBQUwsSUFBVyxLQUFLLEdBQXBCLEVBQXlCO0FBQ3JCLHFCQUFLLEVBQUwsQ0FBUSxpQkFBUixDQUEwQixLQUFLLEdBQS9CO0FBQ0EscUJBQUssR0FBTCxHQUFXLElBQVg7QUFDQSxxQkFBSyxFQUFMLENBQVEsZUFBUixDQUF3QixLQUFLLEVBQUwsQ0FBUSxXQUFoQyxFQUE2QyxJQUE3QztBQUNIOztBQUVEO0FBQ0g7OzsrQkFFTTtBQUNIO0FBQ0EsaUJBQUssRUFBTCxDQUFRLGVBQVIsQ0FBd0IsS0FBSyxFQUFMLENBQVEsV0FBaEMsRUFBNkMsS0FBSyxHQUFsRDtBQUNBLGlCQUFLLEVBQUwsQ0FBUSxRQUFSLENBQWlCLENBQWpCLEVBQW9CLENBQXBCLEVBQXVCLEtBQUssUUFBTCxDQUFjLEtBQXJDLEVBQTRDLEtBQUssUUFBTCxDQUFjLE1BQTFEO0FBQ0g7O0FBRUQ7QUFDQTs7OztxQ0FDYSxLLEVBQU87QUFBQTs7QUFDaEIsbUJBQU8sSUFBSSxPQUFKLENBQVksVUFBQyxPQUFELEVBQVUsTUFBVixFQUFxQjtBQUNwQztBQUNBLHNCQUFLLG9CQUFMLEdBQTZCLE1BQUssb0JBQUwsR0FBNEIsQ0FBN0IsSUFBbUMsQ0FBL0Q7QUFDQSxzQkFBSyxRQUFMLENBQWMsTUFBSyxvQkFBbkIsSUFBMkM7QUFDdkMsMEJBQU0sT0FEaUM7QUFFdkMsd0JBQUksTUFBSyxvQkFGOEI7QUFHdkMsZ0NBSHVDO0FBSXZDLG9DQUp1QztBQUt2QztBQUx1QyxpQkFBM0M7QUFPSCxhQVZNLENBQVA7QUFXSDs7QUFFRDs7OzswQ0FDa0I7QUFDZCxtQkFBTyxPQUFPLElBQVAsQ0FBWSxLQUFLLFFBQWpCLEVBQTJCLE1BQTNCLElBQXFDLEtBQUssUUFBakQ7QUFDSDs7OytDQUVzQjtBQUNuQixpQkFBSyxJQUFJLENBQVQsSUFBYyxLQUFLLFFBQW5CLEVBQTZCO0FBQ3pCLG9CQUFJLFVBQVUsS0FBSyxRQUFMLENBQWMsQ0FBZCxDQUFkOztBQUVBO0FBQ0Esb0JBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2Q7QUFDSDs7QUFFRDtBQUNBO0FBQ0Esd0JBQVEsTUFBUixDQUFlLEVBQUUsZ0JBQUYsRUFBZjtBQUNBLHVCQUFPLEtBQUssUUFBTCxDQUFjLENBQWQsQ0FBUDtBQUNIO0FBQ0o7O0FBRUQ7Ozs7K0JBQ087QUFBQTs7QUFDSDtBQUNBO0FBQ0E7QUFDQSxnQkFBSSxLQUFLLGdCQUFMLElBQXlCLElBQTdCLEVBQW1DO0FBQy9CLDZCQUFhLEtBQUssZ0JBQWxCO0FBQ0g7QUFDRCxpQkFBSyxnQkFBTCxHQUF3QixXQUFXLFlBQU07QUFDckMsb0JBQUksS0FBSyxPQUFLLEVBQWQ7O0FBRUEsbUJBQUcsZUFBSCxDQUFtQixHQUFHLFdBQXRCLEVBQW1DLE9BQUssR0FBeEM7O0FBRUEscUJBQUssSUFBSSxDQUFULElBQWMsT0FBSyxRQUFuQixFQUE2QjtBQUN6Qix3QkFBSSxVQUFVLE9BQUssUUFBTCxDQUFjLENBQWQsQ0FBZDs7QUFFQTtBQUNBLHdCQUFJLFFBQVEsSUFBWixFQUFrQjtBQUNkO0FBQ0g7O0FBRUQ7QUFDQSx3QkFBSSxRQUFRLElBQVIsS0FBaUIsT0FBckIsRUFBOEI7QUFDMUI7QUFDSDs7QUFFRDtBQUNBLHVCQUFHLFVBQUgsQ0FDSSxLQUFLLEtBQUwsQ0FBVyxRQUFRLEtBQVIsQ0FBYyxDQUFkLEdBQWtCLE9BQUssUUFBTCxDQUFjLEtBQTNDLENBREosRUFFSSxLQUFLLEtBQUwsQ0FBVyxDQUFDLElBQUksUUFBUSxLQUFSLENBQWMsQ0FBbkIsSUFBd0IsT0FBSyxRQUFMLENBQWMsTUFBakQsQ0FGSixFQUdJLENBSEosRUFHTyxDQUhQLEVBR1UsR0FBRyxJQUhiLEVBR21CLEdBQUcsYUFIdEIsRUFHcUMsT0FBSyxLQUgxQztBQUlBLHdCQUFJLGNBQWUsT0FBSyxLQUFMLENBQVcsQ0FBWCxLQUFpQixPQUFLLEtBQUwsQ0FBVyxDQUFYLEtBQWlCLENBQWxDLEtBQXdDLE9BQUssS0FBTCxDQUFXLENBQVgsS0FBaUIsRUFBekQsS0FBZ0UsT0FBSyxLQUFMLENBQVcsQ0FBWCxLQUFpQixFQUFqRixDQUFELEtBQTJGLENBQTdHOztBQUVBO0FBQ0Esd0JBQUksWUFBWSxPQUFLLEtBQUwsQ0FBVyxDQUFYLENBQWhCO0FBQ0Esd0JBQUksY0FBYyxHQUFsQixFQUF1QjtBQUFFO0FBQ3JCLDRCQUFJLE9BQUssT0FBTCxDQUFhLFNBQWIsS0FBMkIsSUFBL0IsRUFBcUM7QUFDakMsb0RBQWEsV0FBYixDQUNJLE9BQUssT0FBTCxDQUFhLFNBQWIsQ0FESixFQUVJLDBCQUZKLEVBR0ksRUFBRSxJQUFJLFFBQVEsRUFBZCxFQUFrQixLQUFLLFdBQXZCLEVBSEosRUFJQyxJQUpELENBSU0sbUJBQVc7QUFDYix1Q0FBSyxVQUFMLENBQWdCLE9BQWhCO0FBQ0gsNkJBTkQ7QUFPSDtBQUNKO0FBQ0Q7QUFYQSx5QkFZSztBQUNELG1DQUFLLFVBQUwsQ0FBZ0IsRUFBRSxJQUFJLFFBQVEsRUFBZCxFQUFrQixTQUFTLElBQTNCLEVBQWhCO0FBQ0g7O0FBRUQsNEJBQVEsSUFBUixHQUFlLElBQWY7QUFDSDs7QUFFRCxtQkFBRyxlQUFILENBQW1CLEdBQUcsV0FBdEIsRUFBbUMsSUFBbkM7QUFFSCxhQWhEdUIsRUFnRHJCLEtBQUssVUFoRGdCLENBQXhCO0FBaURIOztBQUVEOzs7O21DQUNZLE8sRUFBUztBQUNqQixnQkFBSSxVQUFVLEtBQUssUUFBTCxDQUFjLFFBQVEsRUFBdEIsQ0FBZDtBQUNBLGdCQUFJLENBQUMsT0FBTCxFQUFjO0FBQ1YsbUNBQUksT0FBSixFQUFhLHVEQUFiLEVBQXNFLE9BQXRFO0FBQ0EsdUJBRlUsQ0FFRjtBQUNYOztBQUVELGdCQUFJLFVBQVUsUUFBUSxPQUF0QjtBQUNBLGdCQUFJLFVBQVUsS0FBZDtBQUNBLGdCQUFLLFdBQVcsSUFBWCxJQUFtQixLQUFLLE9BQUwsSUFBZ0IsSUFBcEMsSUFDQyxXQUFXLElBQVgsSUFBbUIsS0FBSyxPQUFMLElBQWdCLElBRHBDLElBRUMsV0FBVyxJQUFYLElBQW1CLEtBQUssT0FBTCxJQUFnQixJQUFuQyxJQUNHLEtBQUssU0FBTCxDQUFlLE9BQWYsTUFBNEIsS0FBSyxTQUFMLENBQWUsS0FBSyxPQUFwQixDQUhwQyxFQUdtRTtBQUMvRCwwQkFBVSxJQUFWO0FBQ0g7O0FBRUQsaUJBQUssT0FBTCxHQUFlLE9BQWYsQ0FoQmlCLENBZ0JPOztBQUV4QjtBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsRUFBRSxnQkFBRixFQUFXLGdCQUFYLEVBQW9CLGdCQUFwQixFQUFoQjtBQUNBLG1CQUFPLEtBQUssUUFBTCxDQUFjLFFBQVEsRUFBdEIsQ0FBUCxDQXBCaUIsQ0FvQmlCO0FBQ3JDOztBQUdEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7a0NBQ2lCLEksRUFBTTtBQUNuQjtBQUNBLGlCQUFLLFNBQUw7QUFDQSxnQkFBSSxLQUFLLEtBQUssU0FBTCxHQUFpQixHQUExQjtBQUNBLGdCQUFJLEtBQU0sS0FBSyxTQUFMLElBQWtCLENBQW5CLEdBQXdCLEdBQWpDO0FBQ0EsZ0JBQUksS0FBTSxLQUFLLFNBQUwsSUFBa0IsRUFBbkIsR0FBeUIsR0FBbEM7QUFDQSxnQkFBSSxLQUFLLEtBQUssVUFBZDtBQUNBLGdCQUFJLElBQUksS0FBSyxHQUFiO0FBQ0EsZ0JBQUksSUFBSSxLQUFLLEdBQWI7QUFDQSxnQkFBSSxJQUFJLEtBQUssR0FBYjtBQUNBLGdCQUFJLElBQUksS0FBSyxHQUFiO0FBQ0EsZ0JBQUksTUFBTyxNQUFNLE1BQU0sQ0FBWixLQUFrQixNQUFNLEVBQXhCLEtBQStCLE1BQU0sRUFBckMsQ0FBRCxLQUErQyxDQUF6RCxDQVhtQixDQVd5Qzs7QUFFNUQsaUJBQUssR0FBTCxDQUFTLEdBQVQsSUFBZ0I7QUFDWix1QkFBTyxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVY7QUFESyxhQUFoQjtBQUdBLGlCQUFLLFFBQUw7O0FBRUE7QUFDQSxnQkFBSSxDQUFDLEtBQUssS0FBTCxDQUFXLEtBQUssR0FBaEIsQ0FBTCxFQUEyQjtBQUN2QixxQkFBSyxLQUFMLENBQVcsS0FBSyxHQUFoQixJQUF1QjtBQUNuQiw2QkFBUyxFQURVLEVBQ2lCO0FBQ3BDLDBCQUFNLEVBQThCO0FBQ2hDLDZCQUFLLEtBQUssR0FEUjtBQUVGLGdDQUFRLEtBQUssTUFGWDtBQUdGLG9DQUFZLEtBQUssVUFIZjtBQUlGLGdDQUFRLEtBQUssTUFKWDtBQUtGLG9DQUFZLEtBQUs7QUFMZjtBQUZhLGlCQUF2QjtBQVVIOztBQUVELGlCQUFLLEtBQUwsQ0FBVyxLQUFLLEdBQWhCLEVBQXFCLE9BQXJCLENBQTZCLElBQTdCLENBQWtDLEdBQWxDOztBQUVBLG1CQUFPLEtBQUssR0FBTCxDQUFTLEdBQVQsQ0FBUDtBQUNIOzs7a0NBRWdCLE8sRUFBUyxJLEVBQU0sTyxFQUFTO0FBQ3JDLGdCQUFJLFdBQVcsS0FBSyxTQUFMLENBQWUsSUFBZixDQUFmO0FBQ0EscUJBQVMsT0FBVCxHQUFtQjtBQUNmLG9CQUFJLFFBQVEsRUFERztBQUVmLDRCQUFZLFFBQVEsVUFGTDtBQUdmLDZCQUFhLFFBQVEsTUFITjtBQUlmLDhCQUFjLFFBQVEsS0FKUDtBQUtmLHdCQUFRLFFBQVEsTUFMRDtBQU1mLHNCQUFNLEtBQUssS0FBTCxDQUFXLEtBQUssR0FBaEIsRUFBcUI7QUFOWixhQUFuQjs7QUFTQSxtQkFBTyxTQUFTLEtBQWhCO0FBQ0g7OztnQ0FFYztBQUNYLGlCQUFLLEtBQUwsR0FBYSxFQUFiO0FBQ0EsaUJBQUssR0FBTCxHQUFXLEVBQVg7QUFDQSxpQkFBSyxRQUFMLEdBQWdCLENBQWhCO0FBQ0EsaUJBQUssU0FBTCxHQUFpQixDQUFqQjtBQUNIOzs7a0NBRWdCLEcsRUFBSztBQUFBOztBQUNsQixnQkFBSSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQUosRUFBcUI7QUFDakIscUJBQUssS0FBTCxDQUFXLEdBQVgsRUFBZ0IsT0FBaEIsQ0FBd0IsT0FBeEIsQ0FBZ0M7QUFBQSwyQkFBSyxPQUFPLE9BQUssR0FBTCxDQUFTLENBQVQsQ0FBWjtBQUFBLGlCQUFoQztBQUNBLHFCQUFLLFFBQUwsSUFBaUIsS0FBSyxLQUFMLENBQVcsR0FBWCxFQUFnQixPQUFoQixDQUF3QixNQUF6QztBQUNBLHVCQUFPLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBUDtBQUNIO0FBQ0o7OztxQ0FFbUI7QUFDaEIsbUJBQU8sS0FBSyxRQUFaO0FBQ0g7OztrQ0FFZ0IsTSxFQUFRO0FBQ3JCLGlCQUFLLFVBQUwsR0FBa0IsTUFBbEI7QUFDSDs7Ozs7O0FBSUw7OztrQkFuUXFCLGdCO0FBb1FyQixpQkFBaUIsR0FBakIsR0FBdUIsRUFBdkIsQyxDQUE2QjtBQUM3QixpQkFBaUIsS0FBakIsR0FBeUIsRUFBekIsQyxDQUE2QjtBQUM3QixpQkFBaUIsUUFBakIsR0FBNEIsQ0FBNUI7QUFDQSxpQkFBaUIsU0FBakIsR0FBNkIsQ0FBN0I7QUFDQSxpQkFBaUIsVUFBakIsR0FBOEIsQ0FBOUIsQyxDQUFpQztBQUNqQyxpQkFBaUIsWUFBakIsR0FBZ0MsQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFWLENBQWhDOzs7Ozs7Ozs7Ozs7OztxakJDN1FBOzs7QUFDQTs7OztBQUNBOztBQUNBOzs7O0FBQ0E7O0lBQVksSTs7Ozs7Ozs7Ozs7Ozs7SUFFUyxVO0FBRWpCLHdCQUFhLE1BQWIsRUFBcUIsT0FBckIsRUFBOEI7QUFBQTs7QUFBQTs7QUFDMUIsYUFBSyxNQUFMLEdBQWMsTUFBZCxDQUQwQixDQUNKO0FBQ3RCLGFBQUssT0FBTCxHQUFlLE9BQWYsQ0FGMEIsQ0FFRjtBQUN4QixhQUFLLEVBQUwsR0FBVSxPQUFPLEVBQWpCO0FBQ0EsYUFBSyxJQUFMLEdBQVksT0FBTyxJQUFuQjtBQUNBLGFBQUssU0FBTCxHQUFpQixPQUFPLFNBQVAsSUFBb0IsTUFBckMsQ0FMMEIsQ0FLbUI7QUFDN0MsYUFBSyxlQUFMLEdBQXVCLElBQXZCLENBTjBCLENBTUc7QUFDN0IsYUFBSyxPQUFMLEdBQWUsRUFBZixDQVAwQixDQU9QO0FBQ25CLFlBQUksTUFBTSxPQUFOLENBQWMsT0FBTyxPQUFyQixDQUFKLEVBQW1DO0FBQUU7QUFDakMsbUJBQU8sT0FBUCxDQUFlLE9BQWYsQ0FBdUIsYUFBSztBQUN4QixvQkFBSSxNQUFLLE9BQUwsQ0FBYSxPQUFiLENBQXFCLENBQXJCLE1BQTRCLENBQUMsQ0FBakMsRUFBb0M7QUFDaEMsMEJBQUssT0FBTCxDQUFhLElBQWIsQ0FBa0IsQ0FBbEI7QUFDSDtBQUNKLGFBSkQ7QUFLSDs7QUFFRDtBQUNBLGFBQUssU0FBTCxHQUFpQixPQUFPLFNBQXhCO0FBQ0EsWUFBSSxPQUFPLEtBQUssU0FBWixLQUEwQixVQUE5QixFQUEwQztBQUN0QyxpQkFBSyxTQUFMLENBQWUsSUFBZixDQUFvQixJQUFwQjtBQUNIOztBQUVEO0FBQ0EsYUFBSyxVQUFMLEdBQWtCLE9BQU8sVUFBekI7O0FBRUE7QUFDQTtBQUNBLGFBQUssT0FBTCxHQUFlLE9BQU8sT0FBdEI7O0FBRUE7QUFDQSxhQUFLLFFBQUwsR0FBaUIsT0FBTyxRQUFQLElBQW1CLElBQXBCLEdBQTRCLE9BQU8sUUFBbkMsR0FBOEMsY0FBSSx1QkFBbEU7O0FBRUE7QUFDQSxhQUFLLGdCQUFMLEdBQXlCLE9BQU8sZ0JBQVAsSUFBMkIsSUFBNUIsR0FBb0MsT0FBTyxnQkFBM0MsR0FBOEQsQ0FBdEY7QUFDQSxhQUFLLGdCQUFMLEdBQXlCLE9BQU8sZ0JBQVAsSUFBMkIsSUFBNUIsR0FBb0MsT0FBTyxnQkFBM0MsR0FBOEQsSUFBdEY7QUFDSDs7QUFFRDs7Ozs7NkJBd0RLLEksRUFBTTtBQUFBOztBQUNQLGlCQUFLLFdBQUwsR0FBbUIsRUFBbkI7QUFDQSxpQkFBSyxXQUFMLENBQWlCLE1BQWpCLEdBQTBCLEVBQTFCO0FBQ0EsaUJBQUssU0FBTCxHQUFpQixLQUFLLFNBQXRCO0FBQ0EsaUJBQUssT0FBTCxnQ0FBbUIsS0FBSyxPQUF4QixHQUpPLENBSTJCOztBQUVsQyxtQkFBTyxLQUFLLEtBQUwsQ0FBVyxJQUFYLEVBQWlCLElBQWpCLENBQXNCLFVBQUMsSUFBRCxFQUFVO0FBQ25DO0FBQ0EscUJBQUssSUFBSSxLQUFULElBQWtCLEtBQUssV0FBTCxDQUFpQixNQUFuQyxFQUEyQztBQUN2Qyx3QkFBSSxPQUFPLEtBQUssV0FBTCxDQUFpQixNQUFqQixDQUF3QixLQUF4QixDQUFYO0FBQ0Esd0JBQUksUUFBUSxLQUFLLFFBQWpCLEVBQTJCO0FBQ3ZCLDZCQUFLLFFBQUwsQ0FBYyxPQUFkLENBQXNCLG1CQUFXO0FBQzdCLDBDQUFJLGlCQUFKLENBQXNCLFFBQVEsUUFBOUIsRUFBd0MsaUJBQVM7QUFDN0M7QUFDQSxzQ0FBTSxDQUFOLElBQVcsQ0FBQyxNQUFNLENBQU4sQ0FBWjs7QUFFQTtBQUNBLG9DQUFJLE9BQUssU0FBVCxFQUFvQjtBQUNoQiwwQ0FBTSxDQUFOLElBQVcsS0FBSyxLQUFMLENBQVcsTUFBTSxDQUFOLEtBQVksSUFBSSxPQUFLLFNBQXJCLElBQW1DLGNBQUksVUFBSixHQUFpQixPQUFLLFNBQXRCLEdBQWdDLENBQTlFLENBQVg7QUFDQSwwQ0FBTSxDQUFOLElBQVcsS0FBSyxLQUFMLENBQVcsTUFBTSxDQUFOLEtBQVksSUFBSSxPQUFLLFNBQXJCLElBQW1DLGNBQUksVUFBSixHQUFpQixPQUFLLFNBQXRCLEdBQWdDLENBQTlFLENBQVg7QUFDSDtBQUNKLDZCQVREOztBQVdBO0FBQ0EsbUNBQUssb0JBQUwsQ0FBMEIsUUFBUSxRQUFsQztBQUNILHlCQWREO0FBZUg7QUFDSjs7QUFFRCxxQkFBSyxlQUFMLEdBQXVCLE9BQUssZUFBTCxJQUF3QixLQUEvQztBQUNBLHVCQUFPLElBQVA7QUFDSCxhQXpCTSxDQUFQO0FBMEJIOztBQUVEOzs7OzhCQUNNLEksRUFBTTtBQUNSLGtCQUFNLGlDQUF5QixPQUF6QixDQUFOO0FBQ0g7O0FBRUQ7Ozs7NkNBQ3NCLEksRUFBTTtBQUN4QixnQkFBSSxLQUFLLGVBQUwsSUFBd0IsSUFBNUIsRUFBa0M7QUFDOUIsb0JBQUksS0FBSyxJQUFMLEtBQWMsU0FBbEIsRUFBNkI7QUFDekIseUJBQUssZUFBTCxHQUF1QixjQUFJLFdBQUosQ0FBZ0IsS0FBSyxXQUFMLENBQWlCLENBQWpCLENBQWhCLENBQXZCO0FBQ0gsaUJBRkQsTUFHSyxJQUFJLEtBQUssSUFBTCxLQUFjLGNBQWxCLEVBQWtDO0FBQ25DLHlCQUFLLGVBQUwsR0FBdUIsY0FBSSxXQUFKLENBQWdCLEtBQUssV0FBTCxDQUFpQixDQUFqQixFQUFvQixDQUFwQixDQUFoQixDQUF2QjtBQUNIO0FBQ0o7QUFDRCxtQkFBTyxLQUFLLGVBQVo7QUFDSDs7QUFFRDs7OztxQ0FDYyxNLEVBQVEsVSxFQUFZO0FBQzlCO0FBQ0EsZ0JBQUksT0FBTyxDQUFQLEdBQVcsS0FBSyxnQkFBaEIsSUFBcUMsS0FBSyxnQkFBTCxJQUF5QixJQUF6QixJQUFpQyxhQUFhLEtBQUssZ0JBQTVGLEVBQStHO0FBQzNHLHVCQUFPLEtBQVA7QUFDSDs7QUFFRDtBQUNBLGlCQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxLQUFLLE9BQUwsQ0FBYSxNQUEvQixFQUF1QyxHQUF2QyxFQUE0QztBQUN4QyxvQkFBTSxjQUFjLEtBQUssT0FBTCxDQUFhLENBQWIsQ0FBcEI7QUFDQSxvQkFBSSxLQUFLLE9BQUwsQ0FBYSxXQUFiLEtBQ0EsS0FBSyxPQUFMLENBQWEsV0FBYixNQUE4QixJQUQ5QixJQUVBLENBQUMsS0FBSyxPQUFMLENBQWEsV0FBYixFQUEwQixZQUExQixDQUF1QyxNQUF2QyxFQUErQyxPQUFPLENBQXRELENBRkwsRUFFK0Q7QUFDM0QsMkJBQU8sS0FBUDtBQUNIO0FBQ0o7O0FBRUQsbUJBQU8sSUFBUDtBQUNIOztBQUVEOzs7OytCQS9IZSxNLEVBQVEsTyxFQUFTO0FBQzVCLGdCQUFJLFdBQVcsS0FBWCxDQUFpQixPQUFPLElBQXhCLENBQUosRUFBbUM7QUFDL0IsdUJBQU8sSUFBSSxXQUFXLEtBQVgsQ0FBaUIsT0FBTyxJQUF4QixDQUFKLENBQWtDLE1BQWxDLEVBQTBDLE9BQTFDLENBQVA7QUFDSDtBQUNKOztBQUVEOzs7O2dDQUNnQixNLEVBQVEsVyxFQUFhO0FBQ2pDLGdCQUFJLENBQUMsTUFBRCxJQUFXLENBQUMsV0FBaEIsRUFBNkI7QUFDekIsdUJBQU8sSUFBUDtBQUNIOztBQUVELGdCQUFJLE1BQU0sT0FBTyxNQUFQLENBQWMsRUFBZCxFQUFrQixPQUFPLE1BQXpCLEVBQWlDLEVBQUUsSUFBSSxJQUFOLEVBQWpDLENBQVYsQ0FMaUMsQ0FLeUI7QUFDMUQsZ0JBQUksT0FBTyxPQUFPLE1BQVAsQ0FBYyxFQUFkLEVBQWtCLFlBQVksTUFBOUIsRUFBc0MsRUFBRSxJQUFJLElBQU4sRUFBdEMsQ0FBWDs7QUFFQSxtQkFBTyxLQUFLLFNBQUwsQ0FBZSxHQUFmLE1BQXdCLEtBQUssU0FBTCxDQUFlLElBQWYsQ0FBL0I7QUFDSDs7QUFFRDs7OztvQ0FDb0IsTSxFQUFRO0FBQ3hCLGdCQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUosRUFBYjtBQUNBLGlCQUFLLElBQUksQ0FBVCxJQUFjLE9BQU8sTUFBckIsRUFBNkI7QUFDekIsb0JBQUksZUFBZSxPQUFPLE1BQVAsQ0FBYyxDQUFkLEVBQWlCLFFBQWpCLENBQTBCLE1BQTdDO0FBQ0EscUJBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLFlBQWxCLEVBQWdDLEdBQWhDLEVBQXFDO0FBQ2pDLHdCQUFJLFVBQVUsT0FBTyxNQUFQLENBQWMsQ0FBZCxFQUFpQixRQUFqQixDQUEwQixDQUExQixDQUFkO0FBQ0Esa0NBQUksaUJBQUosQ0FBc0IsUUFBUSxRQUE5QixFQUF3QyxpQkFBUztBQUFBLGtEQUNoQyxjQUFJLGNBQUosQ0FBbUIsS0FBbkIsQ0FEZ0M7QUFBQTtBQUFBLDRCQUN4QyxDQUR3QztBQUFBLDRCQUNyQyxDQURxQzs7QUFFN0MsOEJBQU0sQ0FBTixJQUFXLENBQVg7QUFDQSw4QkFBTSxDQUFOLElBQVcsQ0FBWDtBQUNILHFCQUpEO0FBS0g7QUFDSjs7QUFFRCxnQkFBSSxPQUFPLEtBQVAsS0FBaUIsU0FBckIsRUFBZ0M7QUFDNUIsdUJBQU8sS0FBUCxDQUFhLFVBQWIsR0FBMEIsQ0FBQyxJQUFJLElBQUosRUFBRCxHQUFjLEtBQXhDO0FBQ0g7QUFDSjs7QUFFRDs7Ozs7O2tDQUdrQixNLFFBQWlDO0FBQUEsZ0JBQWYsQ0FBZSxRQUF4QixNQUF3QixDQUFmLENBQWU7QUFBQSxnQkFBWCxHQUFXLFFBQVgsR0FBVztBQUFBLGdCQUFOLEdBQU0sUUFBTixHQUFNOztBQUMvQyxnQkFBSSxrQkFBa0IsY0FBSSxhQUFKLENBQWtCLENBQWxCLENBQXRCO0FBQ0EsaUJBQUssSUFBSSxDQUFULElBQWMsT0FBTyxNQUFyQixFQUE2QjtBQUN6QixvQkFBSSxlQUFlLE9BQU8sTUFBUCxDQUFjLENBQWQsRUFBaUIsUUFBakIsQ0FBMEIsTUFBN0M7QUFDQSxxQkFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksWUFBbEIsRUFBZ0MsR0FBaEMsRUFBcUM7QUFDakMsd0JBQUksVUFBVSxPQUFPLE1BQVAsQ0FBYyxDQUFkLEVBQWlCLFFBQWpCLENBQTBCLENBQTFCLENBQWQ7QUFDQSxrQ0FBSSxpQkFBSixDQUFzQixRQUFRLFFBQTlCLEVBQXdDLGlCQUFTO0FBQzdDLDhCQUFNLENBQU4sSUFBVyxDQUFDLE1BQU0sQ0FBTixJQUFXLElBQUksQ0FBaEIsSUFBcUIsZUFBaEM7QUFDQSw4QkFBTSxDQUFOLElBQVcsQ0FBQyxNQUFNLENBQU4sSUFBVyxJQUFJLENBQWhCLElBQXFCLGVBQXJCLEdBQXVDLENBQUMsQ0FBbkQsQ0FGNkMsQ0FFUztBQUN6RCxxQkFIRDtBQUlIO0FBQ0o7QUFDSjs7O2lDQTJFZSxVLEVBQVksUyxFQUFXO0FBQ25DLGdCQUFJLENBQUMsVUFBRCxJQUFlLENBQUMsU0FBcEIsRUFBK0I7QUFDM0I7QUFDSDs7QUFFRCx1QkFBVyxLQUFYLENBQWlCLFNBQWpCLElBQThCLFVBQTlCO0FBQ0g7Ozs7OztrQkE5S2dCLFU7OztBQWtMckIsV0FBVyxLQUFYLEdBQW1CLEVBQW5CLEMsQ0FBdUI7OztBQUd2Qjs7QUFFQSxJQUFJLHFCQUFxQixDQUF6QixDLENBQTRCOztJQUVmLGEsV0FBQSxhOzs7QUFFVCwyQkFBYSxNQUFiLEVBQXFCLE9BQXJCLEVBQThCO0FBQUE7O0FBQUEsbUlBQ3BCLE1BRG9CLEVBQ1osT0FEWTs7QUFFMUIsZUFBSyxHQUFMLEdBQVcsS0FBSyxjQUFMLENBQW9CLE9BQU8sR0FBM0IsRUFBZ0MsT0FBTyxVQUF2QyxDQUFYO0FBQ0EsZUFBSyxhQUFMLEdBQXFCLEVBQXJCLENBSDBCLENBR0Q7O0FBRXpCLFlBQUksT0FBSyxHQUFMLElBQVksSUFBaEIsRUFBc0I7QUFDbEIsa0JBQU0sTUFBTSxtREFBTixDQUFOO0FBQ0g7QUFQeUI7QUFRN0I7Ozs7OEJBRU0sSSxFQUFNO0FBQUE7O0FBQ1QsZ0JBQUksTUFBTSxLQUFLLFNBQUwsQ0FBZSxLQUFLLEdBQXBCLEVBQXlCLElBQXpCLENBQVY7O0FBRUEsZ0JBQUksY0FBYyxLQUFLLFdBQXZCO0FBQ0Esd0JBQVksR0FBWixHQUFrQixHQUFsQjtBQUNBLGlCQUFLLEtBQUwsR0FBYSxLQUFLLEtBQUwsSUFBYyxFQUEzQjtBQUNBLGlCQUFLLEtBQUwsQ0FBVyxPQUFYLEdBQXFCLENBQUMsSUFBSSxJQUFKLEVBQXRCOztBQUVBLG1CQUFPLElBQUksT0FBSixDQUFZLFVBQUMsT0FBRCxFQUFVLE1BQVYsRUFBcUI7QUFDcEMsNEJBQVksS0FBWixHQUFvQixJQUFwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBSSxhQUFjLG9CQUFELEdBQXlCLEdBQXpCLEdBQStCLEdBQWhEO0FBQ0Esb0JBQUksVUFBVSxnQkFBTSxFQUFOLENBQVMsR0FBVCxFQUFjLEtBQUssSUFBbkIsRUFBeUIsT0FBSyxhQUE5QixFQUE2QyxLQUE3QyxFQUFvRCxFQUFwRCxFQUF3RCxVQUF4RCxDQUFkO0FBQ0EsNEJBQVksVUFBWixHQUF5QixVQUF6Qjs7QUFFQSx3QkFBUSxJQUFSLENBQWEsVUFBQyxJQUFELEVBQVU7QUFDbkIseUJBQUssS0FBTCxDQUFXLGFBQVgsR0FBMkIsS0FBSyxNQUFMLElBQWUsS0FBSyxVQUEvQztBQUNBLHlCQUFLLEtBQUwsQ0FBVyxPQUFYLEdBQXFCLENBQUMsSUFBSSxJQUFKLEVBQUQsR0FBYyxLQUFLLEtBQUwsQ0FBVyxPQUE5QztBQUNBLHlCQUFLLEtBQUwsQ0FBVyxPQUFYLEdBQXFCLENBQUMsSUFBSSxJQUFKLEVBQXRCO0FBQ0EsMkJBQUssZUFBTCxDQUFxQixJQUFyQixFQUEyQixXQUEzQixFQUF3QyxJQUF4QztBQUNBLHlCQUFLLEtBQUwsQ0FBVyxPQUFYLEdBQXFCLENBQUMsSUFBSSxJQUFKLEVBQUQsR0FBYyxLQUFLLEtBQUwsQ0FBVyxPQUE5QztBQUNBLDRCQUFRLElBQVI7QUFDSCxpQkFQRCxFQU9HLEtBUEgsQ0FPUyxVQUFDLEtBQUQsRUFBVztBQUNoQixnQ0FBWSxLQUFaLEdBQW9CLE1BQU0sS0FBMUI7QUFDQSw0QkFBUSxJQUFSLEVBRmdCLENBRUQ7QUFDbEIsaUJBVkQ7QUFXSCxhQXhCTSxDQUFQO0FBeUJIOztBQUVEOzs7O2tDQUVXLFksRUFBYyxJLEVBQU07QUFDM0Isa0JBQU0saUNBQXlCLFdBQXpCLENBQU47QUFDSDs7O3dDQUVnQixJLEVBQU0sTSxFQUFRLE8sRUFBUztBQUNwQyxrQkFBTSxpQ0FBeUIsaUJBQXpCLENBQU47QUFDSDs7OztFQXZEOEIsVTs7QUEyRG5DOztJQUVhLGlCLFdBQUEsaUI7OztBQUVULCtCQUFhLE1BQWIsRUFBcUIsT0FBckIsRUFBOEI7QUFBQTs7QUFBQSwySUFDcEIsTUFEb0IsRUFDWixPQURZOztBQUcxQixlQUFLLEtBQUwsR0FBYSxJQUFiO0FBQ0EsZUFBSyxXQUFMLENBQWlCLE1BQWpCOztBQUVBO0FBQ0E7QUFDQSxlQUFLLHFCQUFMLEdBQTZCLEtBQTdCOztBQUVBLGVBQUssR0FBTCxHQUFZLE9BQU8sR0FBUCxLQUFlLElBQTNCLENBVjBCLENBVVE7QUFDbEMsZUFBSyxTQUFMLEdBQWlCLElBQWpCO0FBQ0EsWUFBSSxhQUFhLE9BQUssR0FBTCxDQUFTLEtBQVQsQ0FBZSxrQkFBZixDQUFqQjtBQUNBLFlBQUksY0FBYyxJQUFkLElBQXNCLFdBQVcsTUFBWCxHQUFvQixDQUE5QyxFQUFpRDtBQUM3QyxtQkFBSyxTQUFMLEdBQWlCLFdBQVcsQ0FBWCxFQUFjLEtBQWQsQ0FBb0IsR0FBcEIsQ0FBakI7QUFDQSxtQkFBSyxTQUFMLEdBQWlCLENBQWpCO0FBQ0g7QUFoQnlCO0FBaUI3Qjs7QUFFRDs7Ozs7b0NBQ2EsTSxFQUFRO0FBQ2pCLGdCQUFJLE1BQU0sT0FBTixDQUFjLE9BQU8sTUFBckIsS0FBZ0MsT0FBTyxNQUFQLENBQWMsTUFBZCxLQUF5QixDQUE3RCxFQUFnRTtBQUM1RCxxQkFBSyxNQUFMLEdBQWMsT0FBTyxNQUFyQjs7QUFENEQsNkNBRXpDLEtBQUssTUFGb0M7QUFBQSxvQkFFdkQsQ0FGdUQ7QUFBQSxvQkFFcEQsQ0FGb0Q7QUFBQSxvQkFFakQsQ0FGaUQ7QUFBQSxvQkFFOUMsQ0FGOEM7O0FBRzVELHFCQUFLLGFBQUwsR0FBcUI7QUFDakIseUJBQUssY0FBSSxjQUFKLENBQW1CLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBbkIsQ0FEWTtBQUVqQix5QkFBSyxjQUFJLGNBQUosQ0FBbUIsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFuQjtBQUZZLGlCQUFyQjtBQUlBLHFCQUFLLFlBQUwsR0FBb0IsRUFBRSxLQUFLLEVBQVAsRUFBVyxLQUFLLEVBQWhCLEVBQXBCLENBUDRELENBT2xCO0FBQzdDO0FBQ0o7O0FBRUQ7Ozs7b0NBQ2EsTSxFQUFRO0FBQ2pCO0FBQ0EsZ0JBQUksS0FBSyxNQUFULEVBQWlCO0FBQ2IseUJBQVMsY0FBSSxRQUFKLENBQWEsTUFBYixFQUFxQixFQUFFLEdBQUcsSUFBTCxFQUFyQixDQUFUOztBQUVBLG9CQUFJLE1BQU0sS0FBSyxZQUFMLENBQWtCLEdBQWxCLENBQXNCLE9BQU8sQ0FBN0IsQ0FBVjtBQUNBLG9CQUFJLENBQUMsR0FBTCxFQUFVO0FBQ04sMEJBQU0sS0FBSyxZQUFMLENBQWtCLEdBQWxCLENBQXNCLE9BQU8sQ0FBN0IsSUFBa0MsY0FBSSxhQUFKLENBQWtCLEtBQUssYUFBTCxDQUFtQixHQUFyQyxFQUEwQyxPQUFPLENBQWpELENBQXhDO0FBQ0g7O0FBRUQsb0JBQUksTUFBTSxLQUFLLFlBQUwsQ0FBa0IsR0FBbEIsQ0FBc0IsT0FBTyxDQUE3QixDQUFWO0FBQ0Esb0JBQUksQ0FBQyxHQUFMLEVBQVU7QUFDTiwwQkFBTSxLQUFLLFlBQUwsQ0FBa0IsR0FBbEIsQ0FBc0IsT0FBTyxDQUE3QixJQUFrQyxjQUFJLGFBQUosQ0FBa0IsS0FBSyxhQUFMLENBQW1CLEdBQXJDLEVBQTBDLE9BQU8sQ0FBakQsQ0FBeEM7QUFDSDs7QUFFRCxvQkFBSSxPQUFPLENBQVAsR0FBVyxJQUFJLENBQWYsSUFBb0IsT0FBTyxDQUFQLEdBQVcsSUFBSSxDQUFuQyxJQUNBLE9BQU8sQ0FBUCxHQUFXLElBQUksQ0FEZixJQUNvQixPQUFPLENBQVAsR0FBVyxJQUFJLENBRHZDLEVBQzBDO0FBQ3RDLDJCQUFPLEtBQVA7QUFDSDtBQUNKO0FBQ0QsbUJBQU8sSUFBUDtBQUNIOzs7cUNBRWEsTSxFQUFRLFUsRUFBWTtBQUM5QixnQkFBSSxvSUFBb0IsTUFBcEIsRUFBNEIsVUFBNUIsQ0FBSixFQUE2QztBQUN6Qyx1QkFBTyxLQUFQO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBSSxDQUFDLEtBQUssV0FBTCxDQUFpQixNQUFqQixDQUFMLEVBQStCO0FBQzNCLHVCQUFPLEtBQVA7QUFDSDtBQUNELG1CQUFPLElBQVA7QUFDSDs7O2tDQUVTLFksRUFBYyxJLEVBQU07QUFDMUIsZ0JBQUksU0FBUyxjQUFJLFFBQUosQ0FBYSxLQUFLLE1BQWxCLEVBQTBCLEVBQUUsR0FBRyxJQUFMLEVBQTFCLENBQWI7O0FBRUEsZ0JBQUksS0FBSyxHQUFULEVBQWM7QUFDVix1QkFBTyxDQUFQLEdBQVcsS0FBSyxHQUFMLENBQVMsQ0FBVCxFQUFZLE9BQU8sQ0FBbkIsSUFBd0IsQ0FBeEIsR0FBNEIsT0FBTyxDQUE5QyxDQURVLENBQ3VDO0FBQ3BEOztBQUVELGdCQUFJLE1BQU0sYUFBYSxPQUFiLENBQXFCLEtBQXJCLEVBQTRCLE9BQU8sQ0FBbkMsRUFBc0MsT0FBdEMsQ0FBOEMsS0FBOUMsRUFBcUQsT0FBTyxDQUE1RCxFQUErRCxPQUEvRCxDQUF1RSxLQUF2RSxFQUE4RSxPQUFPLENBQXJGLENBQVY7O0FBRUEsZ0JBQUksS0FBSyxTQUFMLElBQWtCLElBQXRCLEVBQTRCO0FBQ3hCLHNCQUFNLElBQUksT0FBSixDQUFZLGtCQUFaLEVBQWdDLEtBQUssU0FBTCxDQUFlLEtBQUssU0FBcEIsQ0FBaEMsQ0FBTjtBQUNBLHFCQUFLLFNBQUwsR0FBaUIsQ0FBQyxLQUFLLFNBQUwsR0FBaUIsQ0FBbEIsSUFBdUIsS0FBSyxTQUFMLENBQWUsTUFBdkQ7QUFDSDtBQUNELG1CQUFPLEdBQVA7QUFDSDs7QUFFRDs7OzswQ0FDa0IsRyxFQUFLO0FBQ25CLG1CQUFPLE9BQ0gsSUFBSSxNQUFKLENBQVcsS0FBWCxJQUFvQixDQUFDLENBRGxCLElBRUgsSUFBSSxNQUFKLENBQVcsS0FBWCxJQUFvQixDQUFDLENBRmxCLElBR0gsSUFBSSxNQUFKLENBQVcsS0FBWCxJQUFvQixDQUFDLENBSHpCO0FBSUg7Ozs7RUE1RmtDLGE7Ozs7Ozs7Ozs7Ozs7O0FDNVB2Qzs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFHQTs7Ozs7Ozs7Ozs7O0FBREE7OztBQUdBOzs7OztJQUthLGEsV0FBQSxhOzs7QUFFVCwyQkFBWSxNQUFaLEVBQW9CLE9BQXBCLEVBQTZCO0FBQUE7O0FBQUEsa0lBQ25CLE1BRG1CLEVBQ1gsT0FEVzs7QUFFekIsY0FBSyxTQUFMLEdBQWlCLElBQWpCO0FBQ0EsY0FBSyxZQUFMLEdBQW9CLEVBQXBCLENBSHlCLENBR0Q7QUFDeEIsY0FBSyxRQUFMLEdBQWdCLEtBQUssR0FBTCxDQUFTLE1BQUssUUFBTCxJQUFpQixDQUExQixFQUE2QixFQUE3QixDQUFoQixDQUp5QixDQUl5QjtBQUNsRCxjQUFLLFNBQUwsR0FBaUIsQ0FBakIsQ0FMeUIsQ0FLTDtBQUxLO0FBTTVCOzs7OzhCQUVLLEksRUFBTTtBQUFBOztBQUNSLGdCQUFJLENBQUMsS0FBSyxTQUFWLEVBQXFCO0FBQ2pCLHFCQUFLLFNBQUwsR0FBaUIsb0hBQVksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFWLEVBQWYsRUFBWixFQUE2QyxJQUE3QyxDQUFrRCxnQkFBUTtBQUN2RTtBQUNBLHdCQUFJLEtBQUssV0FBTCxDQUFpQixLQUFyQixFQUE0QjtBQUN4QiwyQ0FBSSxNQUFKLDhDQUFxRCxPQUFLLElBQTFELGtCQUF5RSxPQUFLLEdBQTlFLFlBQXVGLEtBQUssV0FBTCxDQUFpQixLQUF4RztBQUNIOztBQUVELHdCQUFJLFNBQVMsS0FBSyxXQUFMLENBQWlCLE1BQTlCO0FBQ0EseUJBQUssSUFBSSxVQUFULElBQXVCLE1BQXZCLEVBQStCO0FBQzNCLCtCQUFLLFlBQUwsQ0FBa0IsVUFBbEIsSUFBZ0MseUJBQVUsT0FBTyxVQUFQLENBQVYsRUFBOEI7QUFDMUQscUNBQVMsT0FBSyxRQUQ0QyxFQUNqQztBQUN6Qix1Q0FBVyxDQUYrQyxFQUU1QztBQUNkLG9DQUFRLGNBQUksVUFIOEMsRUFHbEM7QUFDeEIsb0NBQVEsTUFKa0QsQ0FJdkM7QUFKdUMseUJBQTlCLENBQWhDO0FBTUg7O0FBRUQsMkJBQUssTUFBTCxHQUFjLElBQWQ7QUFDQSwyQkFBTyxJQUFQO0FBQ0gsaUJBbEJnQixDQUFqQjtBQW1CSDs7QUFFRCxtQkFBTyxLQUFLLFNBQUwsQ0FBZSxJQUFmLENBQW9CLFlBQU07QUFDN0IscUJBQUssSUFBSSxVQUFULElBQXVCLE9BQUssWUFBNUIsRUFBMEM7QUFDdEMseUJBQUssV0FBTCxDQUFpQixNQUFqQixDQUF3QixVQUF4QixJQUFzQyxPQUFLLGVBQUwsQ0FBcUIsSUFBckIsRUFBMkIsVUFBM0IsQ0FBdEM7QUFDSDtBQUNELHVCQUFPLElBQVA7QUFDSCxhQUxNLENBQVA7QUFNSDs7O3dDQUVlLEksRUFBTSxVLEVBQVk7QUFDOUIsZ0JBQUksU0FBUyxjQUFJLFFBQUosQ0FBYSxLQUFLLE1BQWxCLEVBQTBCLEVBQUUsR0FBRyxJQUFMLEVBQTFCLENBQWI7O0FBRUE7QUFDQSxnQkFBSSxJQUFJLEtBQUssWUFBTCxDQUFrQixVQUFsQixFQUE4QixPQUE5QixDQUFzQyxPQUFPLENBQTdDLEVBQWdELE9BQU8sQ0FBdkQsRUFBMEQsT0FBTyxDQUFqRSxDQUFSOztBQUVBO0FBQ0EsZ0JBQUksbUJBQUo7QUFDQSxnQkFBSSxLQUFLLEVBQUUsUUFBWCxFQUFxQjtBQUNqQiw2QkFBYTtBQUNULDBCQUFNLG1CQURHO0FBRVQsOEJBQVU7QUFGRCxpQkFBYjs7QUFLQSxxQkFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksRUFBRSxRQUFGLENBQVcsTUFBN0IsRUFBcUMsR0FBckMsRUFBMEM7QUFDdEMsd0JBQU0sVUFBVSxFQUFFLFFBQUYsQ0FBVyxDQUFYLENBQWhCOztBQUVBO0FBQ0Esd0JBQUksSUFBSTtBQUNKLDhCQUFNLFNBREY7QUFFSixrQ0FBVSxFQUZOO0FBR0osb0NBQVksUUFBUTtBQUhoQixxQkFBUjs7QUFNQSx3QkFBSSxRQUFRLElBQVIsS0FBaUIsQ0FBckIsRUFBd0I7QUFDcEIsMEJBQUUsUUFBRixDQUFXLFdBQVgsR0FBeUIsUUFBUSxRQUFSLENBQWlCLEdBQWpCLENBQXFCO0FBQUEsbUNBQVMsQ0FBQyxNQUFNLENBQU4sQ0FBRCxFQUFXLE1BQU0sQ0FBTixDQUFYLENBQVQ7QUFBQSx5QkFBckIsQ0FBekI7QUFDQSwwQkFBRSxRQUFGLENBQVcsSUFBWCxHQUFrQixZQUFsQjtBQUNILHFCQUhELE1BSUssSUFBSSxRQUFRLElBQVIsS0FBaUIsQ0FBakIsSUFBc0IsUUFBUSxJQUFSLEtBQWlCLENBQTNDLEVBQThDO0FBQy9DLDBCQUFFLFFBQUYsQ0FBVyxXQUFYLEdBQXlCLFFBQVEsUUFBUixDQUFpQixHQUFqQixDQUFxQjtBQUFBLG1DQUMxQyxLQUFLLEdBQUwsQ0FBUztBQUFBLHVDQUFTLENBQUMsTUFBTSxDQUFOLENBQUQsRUFBVyxNQUFNLENBQU4sQ0FBWCxDQUFUO0FBQUEsNkJBQVQsQ0FEMEM7QUFBQSx5QkFBckIsQ0FBekI7O0FBSUEsNEJBQUksUUFBUSxJQUFSLEtBQWlCLENBQXJCLEVBQXdCO0FBQ3BCLDhCQUFFLFFBQUYsQ0FBVyxJQUFYLEdBQWtCLGlCQUFsQjtBQUNILHlCQUZELE1BR007QUFDRiw4QkFBRSxRQUFGLEdBQWEsNkJBQW1CLEVBQUUsUUFBckIsQ0FBYixDQURFLENBQzJDO0FBQzdDLGdDQUFJLEVBQUUsUUFBRixJQUFjLElBQWxCLEVBQXdCO0FBQUU7QUFDdEI7QUFDSDtBQUNKO0FBQ0oscUJBZEksTUFlQTtBQUNEO0FBQ0g7O0FBRUQsK0JBQVcsUUFBWCxDQUFvQixJQUFwQixDQUF5QixDQUF6QjtBQUNIO0FBQ0o7O0FBRUQsbUJBQU8sVUFBUDtBQUNIOzs7a0NBRVUsSSxFQUFNO0FBQ2IsbUJBQU8sS0FBSyxHQUFaO0FBQ0g7Ozt3Q0FFZ0IsSSxFQUFNLE0sRUFBUSxRLEVBQVU7QUFDckMsZ0JBQUksa0JBQWtCLEtBQUssS0FBTCxDQUFXLFFBQVgsQ0FBdEI7QUFDQSxnQkFBSSxTQUFTLEtBQUssU0FBTCxDQUFlLGVBQWYsQ0FBYjtBQUNBLG1CQUFPLE1BQVAsR0FBZ0IsS0FBSyxnQkFBTCxDQUFzQixNQUF0QixDQUFoQjtBQUNIOzs7eUNBRWlCLE0sRUFBTztBQUNyQixpQkFBSyxJQUFJLEdBQVQsSUFBZ0IsTUFBaEIsRUFBd0I7QUFDcEIsb0JBQUksUUFBUSxPQUFPLEdBQVAsQ0FBWjtBQUNBLHFCQUFLLGtCQUFMLENBQXdCLE1BQU0sUUFBOUI7QUFDSDs7QUFFRDtBQUNBLGdCQUFJLE9BQU8sS0FBSyxTQUFaLEtBQTBCLFVBQTlCLEVBQTBDO0FBQ3RDLG9CQUFJLE9BQU8sSUFBUCxDQUFZLE1BQVosRUFBb0IsTUFBcEIsS0FBK0IsQ0FBL0IsSUFBb0MsT0FBTyxRQUEvQyxFQUF5RDtBQUNyRCwyQkFBTyxRQUFQLEdBQWtCLEtBQUssU0FBTCxDQUFlLE9BQU8sUUFBdEIsRUFBZ0MsS0FBSyxVQUFyQyxDQUFsQixDQURxRCxDQUNlO0FBQ3ZFLGlCQUZELE1BR0s7QUFDRCw2QkFBUyxLQUFLLFNBQUwsQ0FBZSxNQUFmLEVBQXVCLEtBQUssVUFBNUIsQ0FBVCxDQURDLENBQ2lEO0FBQ3JEO0FBQ0o7O0FBRUQsbUJBQU8sTUFBUDtBQUNIOztBQUVEOzs7OzJDQUNvQixRLEVBQVU7QUFDMUI7QUFDQTtBQUNBLGdCQUFJLEtBQUssTUFBTCxDQUFZLHdCQUFoQixFQUF5QztBQUFBO0FBQ3JDLHdCQUFJLG9CQUFvQixFQUF4QjtBQUNBLHdCQUFJLHNCQUFzQixFQUFDLG1CQUFvQixJQUFyQixFQUExQjs7QUFFQSw2QkFBUyxPQUFULENBQWlCLG1CQUFXO0FBQ3hCLDRCQUFJLG9CQUFKO0FBQUEsNEJBQWlCLHlCQUFqQjtBQUNBLGdDQUFRLFFBQVEsUUFBUixDQUFpQixJQUF6QjtBQUNJLGlDQUFLLFNBQUw7QUFDSSw4Q0FBYyxRQUFRLFFBQVIsQ0FBaUIsV0FBL0I7QUFDQSxtREFBbUIsNkJBQTZCLFdBQTdCLEVBQTBDLFFBQVEsVUFBbEQsRUFBOEQsbUJBQTlELENBQW5CO0FBQ0Esa0RBQWtCLElBQWxCLENBQXVCLGdCQUF2QjtBQUNBO0FBQ0osaUNBQUssY0FBTDtBQUNJO0FBQ0EsOENBQWMsUUFBUSxRQUFSLENBQWlCLFdBQS9CO0FBQ0Esb0NBQUksV0FBVyxDQUFDLFFBQWhCO0FBQ0Esb0NBQUksaUJBQWlCLENBQXJCO0FBQ0EscUNBQUssSUFBSSxRQUFRLENBQWpCLEVBQW9CLFFBQVEsWUFBWSxNQUF4QyxFQUFnRCxPQUFoRCxFQUF5RDtBQUNyRCx3Q0FBSSxPQUFPLGNBQUksV0FBSixDQUFnQixZQUFZLEtBQVosQ0FBaEIsQ0FBWDtBQUNBLHdDQUFJLE9BQU8sUUFBWCxFQUFxQjtBQUNqQixtREFBVyxJQUFYO0FBQ0EseURBQWlCLEtBQWpCO0FBQ0g7QUFDSjtBQUNELG1EQUFtQiw2QkFBNkIsWUFBWSxjQUFaLENBQTdCLEVBQTBELFFBQVEsVUFBbEUsRUFBOEUsbUJBQTlFLENBQW5CO0FBQ0Esa0RBQWtCLElBQWxCLENBQXVCLGdCQUF2QjtBQUNBO0FBcEJSO0FBc0JILHFCQXhCRDs7QUEwQkE7QUFDQSwwQkFBTSxTQUFOLENBQWdCLElBQWhCLENBQXFCLEtBQXJCLENBQTJCLFFBQTNCLEVBQXFDLGlCQUFyQztBQS9CcUM7QUFnQ3hDOztBQUVELG1CQUFPLFFBQVA7QUFDSDs7QUFFRDs7OztrQ0FDVyxJLEVBQU07QUFDYixnQkFBSSxLQUFLLElBQUwsS0FBYyxTQUFsQixFQUE2QjtBQUN6Qix1QkFBTztBQUNILDhCQUFVO0FBQ04sOEJBQU0sbUJBREE7QUFFTixrQ0FBVSxDQUFDLElBQUQ7QUFGSjtBQURQLGlCQUFQO0FBTUgsYUFQRCxNQVFLLElBQUksS0FBSyxJQUFMLEtBQWMsbUJBQWxCLEVBQXVDO0FBQ3hDLHVCQUFPO0FBQ0gsOEJBQVU7QUFEUCxpQkFBUDtBQUdILGFBSkksTUFLQTtBQUNELHVCQUFPLElBQVA7QUFDSDtBQUNKOzs7Ozs7QUFJTDs7Ozs7O0lBSWEsaUIsV0FBQSxpQjs7O0FBRVQsK0JBQVksTUFBWixFQUFvQixPQUFwQixFQUE2QjtBQUFBOztBQUFBOztBQUd6QjtBQUh5QiwySUFDbkIsTUFEbUIsRUFDWCxPQURXOztBQUl6QixZQUFJLENBQUMsT0FBSyxpQkFBTCxDQUF1QixPQUFLLEdBQTVCLENBQUwsRUFBdUM7QUFDbkM7QUFDQSxnQkFBSSxPQUFPLElBQVAsS0FBZ0IsU0FBcEIsRUFBK0I7QUFBQTs7QUFDM0I7QUFDQSwrQkFBTyxJQUFJLGFBQUosQ0FBa0IsTUFBbEIsQ0FBUDtBQUNILGFBSEQsTUFJSztBQUFBOztBQUNEO0FBQ0EsK0JBQU8sSUFBUDtBQUNIO0FBQ0o7QUFDRDtBQUNIOzs7O3dDQUVnQixJLEVBQU0sTSxFQUFRLFEsRUFBVTtBQUNyQyxnQkFBSSxPQUFPLEtBQUssS0FBTCxDQUFXLFFBQVgsQ0FBWDtBQUNBLGlCQUFLLGNBQUwsQ0FBb0IsSUFBcEIsRUFBMEIsSUFBMUIsRUFBZ0MsTUFBaEM7QUFDSDs7O3VDQUVlLEksRUFBTSxJLEVBQU0sTSxFQUFRO0FBQ2hDO0FBQ0EsZ0JBQUksT0FBTyxLQUFLLFNBQVosS0FBMEIsVUFBOUIsRUFBMEM7QUFDdEMsdUJBQU8sS0FBSyxTQUFMLENBQWUsSUFBZixFQUFxQixLQUFLLFVBQTFCLENBQVA7QUFDSDs7QUFFRCxtQkFBTyxNQUFQLEdBQWdCLGNBQWMsU0FBZCxDQUF3QixTQUF4QixDQUFrQyxJQUFsQyxDQUFoQjs7QUFFQTtBQUNBLGdCQUFJLFNBQVM7QUFDVCx3QkFBUSxLQUFLLE1BREo7QUFFVCxxQkFBSyxjQUFJLGFBQUosQ0FBa0IsY0FBSSxRQUFKLENBQWEsS0FBSyxNQUFsQixFQUEwQixFQUFFLEdBQUcsSUFBTCxFQUExQixDQUFsQjtBQUZJLGFBQWI7O0FBS0Esa0NBQVcsV0FBWCxDQUF1QixNQUF2QixFQWRnQyxDQWNBO0FBQ2hDLGtDQUFXLFNBQVgsQ0FBcUIsTUFBckIsRUFBNkIsTUFBN0IsRUFmZ0MsQ0FlTTtBQUN6Qzs7Ozs7O0FBSUwsc0JBQVcsUUFBWCxDQUFvQixpQkFBcEIsRUFBdUMsU0FBdkMsRSxDQUF3RDs7QUFFeEQ7QUFDQSxTQUFTLDRCQUFULENBQXVDLFdBQXZDLEVBQW9ELFVBQXBELEVBQWdFLGFBQWhFLEVBQStFO0FBQzNFLFFBQUksV0FBVyxjQUFJLFFBQUosQ0FBYSxXQUFiLENBQWY7O0FBRUE7QUFDQSxRQUFJLHNCQUFzQixFQUExQjtBQUNBLFdBQU8sTUFBUCxDQUFjLG1CQUFkLEVBQW1DLFVBQW5DLEVBQStDLGFBQS9DOztBQUVBLFdBQU87QUFDSCxjQUFNLFNBREg7QUFFSCxvQkFBWSxtQkFGVDtBQUdILGtCQUFVO0FBQ04sa0JBQU0sT0FEQTtBQUVOLHlCQUFhO0FBRlA7QUFIUCxLQUFQO0FBUUg7Ozs7Ozs7Ozs7OztRQzdLZSxrQixHQUFBLGtCOztBQTlGaEI7Ozs7QUFDQTs7OztBQUVBOzs7O0FBQ0E7Ozs7Ozs7Ozs7QUFFQTs7OztJQUlhLFMsV0FBQSxTOzs7QUFFVCx1QkFBYSxNQUFiLEVBQXFCLE9BQXJCLEVBQThCO0FBQUE7O0FBQUEsMEhBQ3BCLE1BRG9CLEVBQ1osT0FEWTs7QUFFMUIsY0FBSyxhQUFMLEdBQXFCLGFBQXJCLENBRjBCLENBRVU7QUFGVjtBQUc3Qjs7Ozt3Q0FFZ0IsSSxFQUFNLE0sRUFBUSxRLEVBQVU7QUFDckM7QUFDQSxnQkFBSSxPQUFPLElBQUksVUFBSixDQUFlLFFBQWYsQ0FBWDtBQUNBLGdCQUFJLFNBQVMsa0JBQVEsSUFBUixDQUFiO0FBQ0EsbUJBQU8sSUFBUCxHQUFjLDJCQUFlLE1BQWYsQ0FBZDtBQUNBLG1CQUFPLE1BQVAsR0FBZ0IsS0FBSyxTQUFMLENBQWUsT0FBTyxJQUF0QixDQUFoQjs7QUFFQTtBQUNBLGdCQUFJLE9BQU8sS0FBSyxTQUFaLEtBQTBCLFVBQTlCLEVBQTBDO0FBQ3RDLHVCQUFPLE1BQVAsR0FBZ0IsS0FBSyxTQUFMLENBQWUsT0FBTyxNQUF0QixFQUE4QixLQUFLLFVBQW5DLENBQWhCO0FBQ0g7O0FBRUQsbUJBQU8sT0FBTyxJQUFkLENBWnFDLENBWWpCO0FBQ3ZCOztBQUVEO0FBQ0E7Ozs7a0NBQ1csSSxFQUFNO0FBQ2IsZ0JBQUksU0FBUyxFQUFiO0FBQ0EsaUJBQUssSUFBSSxDQUFULElBQWMsS0FBSyxNQUFuQixFQUEyQjtBQUN2QixvQkFBSSxRQUFRLEtBQUssTUFBTCxDQUFZLENBQVosQ0FBWjtBQUNBLG9CQUFJLFFBQVEsY0FBSSxVQUFKLEdBQWlCLE1BQU0sTUFBbkM7QUFDQSxvQkFBSSxnQkFBZ0I7QUFDaEIsMEJBQU0sbUJBRFU7QUFFaEIsOEJBQVU7QUFGTSxpQkFBcEI7O0FBS0EscUJBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLE1BQU0sTUFBeEIsRUFBZ0MsR0FBaEMsRUFBcUM7QUFDakMsd0JBQUksVUFBVSxNQUFNLE9BQU4sQ0FBYyxDQUFkLENBQWQ7QUFDQSx3QkFBSSxrQkFBa0I7QUFDbEIsOEJBQU0sU0FEWTtBQUVsQixrQ0FBVSxFQUZRO0FBR2xCLG9DQUFZLFFBQVE7QUFIRixxQkFBdEI7O0FBTUEsd0JBQUksV0FBVyxnQkFBZ0IsUUFBL0I7QUFDQSx3QkFBSSxjQUFjLFFBQVEsWUFBUixFQUFsQjtBQUNBLHlCQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxZQUFZLE1BQTlCLEVBQXNDLEdBQXRDLEVBQTJDO0FBQ3ZDLDRCQUFJLE9BQU8sWUFBWSxDQUFaLENBQVg7QUFDQSw2QkFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksS0FBSyxNQUF2QixFQUErQixHQUEvQixFQUFvQztBQUNoQyxpQ0FBSyxDQUFMLElBQVUsQ0FDTixLQUFLLENBQUwsRUFBUSxDQUFSLEdBQVksS0FETixFQUVOLEtBQUssQ0FBTCxFQUFRLENBQVIsR0FBWSxLQUZOLENBQVY7QUFJSDtBQUNKO0FBQ0QsNkJBQVMsV0FBVCxHQUF1QixXQUF2Qjs7QUFFQSx3QkFBSSw4QkFBa0IsS0FBbEIsQ0FBd0IsUUFBUSxJQUFoQyxNQUEwQyxPQUE5QyxFQUF1RDtBQUNuRCxpQ0FBUyxJQUFULEdBQWdCLE9BQWhCO0FBQ0EsaUNBQVMsV0FBVCxHQUF1QixTQUFTLFdBQVQsQ0FBcUIsQ0FBckIsRUFBd0IsQ0FBeEIsQ0FBdkI7QUFDSCxxQkFIRCxNQUlLLElBQUksOEJBQWtCLEtBQWxCLENBQXdCLFFBQVEsSUFBaEMsTUFBMEMsWUFBOUMsRUFBNEQ7QUFDN0QsNEJBQUksWUFBWSxNQUFaLEtBQXVCLENBQTNCLEVBQThCO0FBQzFCLHFDQUFTLElBQVQsR0FBZ0IsWUFBaEI7QUFDQSxxQ0FBUyxXQUFULEdBQXVCLFNBQVMsV0FBVCxDQUFxQixDQUFyQixDQUF2QjtBQUNILHlCQUhELE1BSUs7QUFDRCxxQ0FBUyxJQUFULEdBQWdCLGlCQUFoQjtBQUNIO0FBQ0oscUJBUkksTUFTQSxJQUFJLDhCQUFrQixLQUFsQixDQUF3QixRQUFRLElBQWhDLE1BQTBDLFNBQTlDLEVBQXlEO0FBQzFELG1DQUFXLG1CQUFtQixRQUFuQixDQUFYLENBRDBELENBQ2pCO0FBQzVDOztBQUVELGtDQUFjLFFBQWQsQ0FBdUIsSUFBdkIsQ0FBNEIsZUFBNUI7QUFDSDtBQUNELHVCQUFPLENBQVAsSUFBWSxhQUFaO0FBQ0g7QUFDRCxtQkFBTyxNQUFQO0FBQ0g7Ozs7OztBQUlMO0FBQ0E7QUFDQTs7O0FBQ08sU0FBUyxrQkFBVCxDQUE2QixJQUE3QixFQUFtQztBQUN0QyxRQUFJLFFBQVEsRUFBWjtBQUNBLFFBQUksT0FBTyxFQUFYO0FBQ0EsUUFBSSxzQkFBSjtBQUNBLFNBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLEtBQUssV0FBTCxDQUFpQixNQUFuQyxFQUEyQyxHQUEzQyxFQUFnRDtBQUM1QyxZQUFJLE9BQU8sS0FBSyxXQUFMLENBQWlCLENBQWpCLENBQVg7QUFDQSxZQUFJLFVBQVUsY0FBSSxXQUFKLENBQWdCLElBQWhCLENBQWQ7QUFDQSxZQUFJLFdBQVcsSUFBZixFQUFxQjtBQUNqQixxQkFEaUIsQ0FDUDtBQUNiOztBQUVELHdCQUFnQixpQkFBaUIsT0FBakMsQ0FQNEMsQ0FPRjs7QUFFMUMsWUFBSSxZQUFZLGFBQVosSUFBNkIsS0FBSyxNQUFMLEdBQWMsQ0FBL0MsRUFBa0Q7QUFDOUMsa0JBQU0sSUFBTixDQUFXLElBQVg7QUFDQSxtQkFBTyxFQUFQO0FBQ0g7QUFDRCxhQUFLLElBQUwsQ0FBVSxJQUFWO0FBQ0g7QUFDRCxRQUFJLEtBQUssTUFBTCxHQUFjLENBQWxCLEVBQXFCO0FBQ2pCLGNBQU0sSUFBTixDQUFXLElBQVg7QUFDSDs7QUFFRDtBQUNBLFFBQUksTUFBTSxNQUFOLEtBQWlCLENBQXJCLEVBQXdCO0FBQ3BCLGFBQUssSUFBTCxHQUFZLFNBQVo7QUFDQSxhQUFLLFdBQUwsR0FBbUIsTUFBTSxDQUFOLENBQW5CO0FBQ0gsS0FIRCxNQUlLLElBQUksTUFBTSxNQUFOLEdBQWUsQ0FBbkIsRUFBc0I7QUFDdkIsYUFBSyxJQUFMLEdBQVksY0FBWjtBQUNBLGFBQUssV0FBTCxHQUFtQixLQUFuQjtBQUNILEtBSEksTUFJQTtBQUNELGVBQU8sSUFBUDtBQUNIOztBQUVELFdBQU8sSUFBUDtBQUNIOztBQUVELHNCQUFXLFFBQVgsQ0FBb0IsU0FBcEIsRUFBK0IsS0FBL0I7Ozs7Ozs7Ozs7OztBQ3JJQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0lBRWEsZ0IsV0FBQSxnQjs7O0FBRVQsOEJBQVksTUFBWixFQUFvQixPQUFwQixFQUE2QjtBQUFBOztBQUFBLHdJQUNuQixNQURtQixFQUNYLE9BRFc7O0FBR3pCLFlBQUksTUFBSyxPQUFMLENBQWEsT0FBYixDQUFxQixNQUFLLElBQTFCLE1BQW9DLENBQUMsQ0FBekMsRUFBNEM7QUFDeEMsa0JBQUssT0FBTCxDQUFhLE9BQWIsQ0FBcUIsTUFBSyxJQUExQixFQUR3QyxDQUNQO0FBQ3BDO0FBQ0QsY0FBSyxTQUFMLEdBQWlCLE9BQU8sU0FBeEIsQ0FOeUIsQ0FNVTs7QUFFbkM7QUFDQTtBQUNBLGNBQUssUUFBTCxHQUFnQixFQUFoQjtBQVZ5QjtBQVc1Qjs7Ozs2QkFFSSxJLEVBQU07QUFDUCxpQkFBSyxXQUFMLEdBQW1CLEVBQW5CO0FBQ0EsaUJBQUssV0FBTCxDQUFpQixNQUFqQixHQUEwQixFQUExQjtBQUNBLGlCQUFLLFNBQUwsR0FBaUIsS0FBSyxTQUF0QjtBQUNBLGlCQUFLLE9BQUwsZ0NBQW1CLEtBQUssT0FBeEIsR0FKTyxDQUkyQjs7QUFFbEM7QUFDQSxnQkFBSSxRQUFRLGNBQUksVUFBaEI7QUFDQSxpQkFBSyxXQUFMLENBQWlCLE1BQWpCLEdBQTBCO0FBQ3RCLDBCQUFVO0FBQ04sMEJBQU0sbUJBREE7QUFFTiw4QkFBVSxDQUFDO0FBQ1Asa0NBQVU7QUFDTixrQ0FBTSxTQURBO0FBRU4seUNBQWEsQ0FBQyxDQUNWLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FEVSxFQUNGLENBQUMsS0FBRCxFQUFRLENBQVIsQ0FERSxFQUVWLENBQUMsS0FBRCxFQUFRLENBQUMsS0FBVCxDQUZVLEVBRU8sQ0FBQyxDQUFELEVBQUksQ0FBQyxLQUFMLENBRlAsRUFFb0IsQ0FBQyxDQUFELEVBQUksQ0FBSixDQUZwQixDQUFEO0FBRlAseUJBREg7QUFRUCxvQ0FBWTtBQVJMLHFCQUFEO0FBRko7QUFEWSxhQUExQjs7QUFnQkEsaUJBQUssZUFBTCxHQUF1QixJQUF2QjtBQUNBLG1CQUFPLFFBQVEsT0FBUixDQUFnQixJQUFoQixDQUFQO0FBQ0g7O0FBRUQ7Ozs7b0NBQ2EsSSxFQUFNO0FBQ2YsZ0JBQUksTUFBTSxLQUFLLE1BQUwsQ0FBWSxHQUF0QjtBQUNBLGdCQUFJLENBQUMsS0FBSyxRQUFMLENBQWMsR0FBZCxDQUFMLEVBQXlCO0FBQ3JCLG9CQUFJLFNBQVMsZUFBSyxxQkFBTCxDQUEyQixLQUFLLE1BQWhDLEVBQXdDLEtBQUssUUFBN0MsQ0FBYjtBQUNBLG9CQUFJLE1BQU0sS0FBSyxTQUFMLENBQWUsS0FBSyxHQUFwQixFQUF5QixFQUFFLGNBQUYsRUFBekIsQ0FBVjtBQUNBLHFCQUFLLFFBQUwsQ0FBYyxHQUFkLElBQXFCLEVBQUUsUUFBRixFQUFPLFdBQVcsS0FBSyxTQUF2QixFQUFrQyxjQUFsQyxFQUFyQjtBQUNIO0FBQ0QsbUJBQU8sS0FBSyxRQUFMLENBQWMsR0FBZCxDQUFQO0FBQ0g7Ozs7OztBQUlMLHNCQUFXLFFBQVgsQ0FBb0IsZ0JBQXBCLEVBQXNDLFFBQXRDOzs7Ozs7Ozs7Ozs7OztBQzVEQTs7OztBQUNBOztBQUVBOztJQUFZLFE7Ozs7Ozs7Ozs7OztBQUVaOzs7OztJQUthLGMsV0FBQSxjOzs7Ozs7Ozs7Ozt3Q0FFUSxJLEVBQU0sTSxFQUFRLFEsRUFBVTtBQUNyQyxnQkFBSSxPQUFPLEtBQUssS0FBTCxDQUFXLFFBQVgsQ0FBWDtBQUNBLG1CQUFPLEtBQUssU0FBTCxDQUFlLElBQWYsQ0FBUDs7QUFFQSxnQkFBSSxTQUFTLEtBQUssU0FBTCxDQUFlLElBQWYsQ0FBYjtBQUNBLDZJQUF1QixNQUF2QjtBQUNBLG1CQUFPLE1BQVAsR0FBZ0IsTUFBaEI7QUFDSDs7O2tDQUVVLEksRUFBTTtBQUNiO0FBQ0EsZ0JBQUksS0FBSyxPQUFMLElBQ0EsT0FBTyxJQUFQLENBQVksS0FBSyxPQUFqQixFQUEwQixNQUExQixLQUFxQyxDQUR6QyxFQUM0QztBQUN4QyxvQkFBSSxRQUFRLE9BQU8sSUFBUCxDQUFZLEtBQUssT0FBakIsRUFBMEIsQ0FBMUIsQ0FBWjtBQUNBLHVCQUFPLG1CQUFtQixJQUFuQixFQUF5QixLQUFLLE9BQUwsQ0FBYSxLQUFiLENBQXpCLENBQVA7QUFDSDtBQUNEO0FBTEEsaUJBTUs7QUFDRCx3QkFBSSxTQUFTLEVBQWI7QUFDQSx5QkFBSyxJQUFJLEdBQVQsSUFBZ0IsS0FBSyxPQUFyQixFQUE4QjtBQUMxQiwrQkFBTyxHQUFQLElBQWMsbUJBQW1CLElBQW5CLEVBQXlCLEtBQUssT0FBTCxDQUFhLEdBQWIsQ0FBekIsQ0FBZDtBQUNIO0FBQ0QsMkJBQU8sTUFBUDtBQUNIO0FBQ0QsbUJBQU8sSUFBUDtBQUNIOzs7Ozs7QUFJTCxTQUFTLGtCQUFULENBQTZCLFFBQTdCLEVBQXVDLE1BQXZDLEVBQStDO0FBQzNDLFFBQUksVUFBVSxTQUFTLE9BQVQsQ0FBaUIsUUFBakIsRUFBMkIsTUFBM0IsQ0FBZDs7QUFFQTtBQUNBLFFBQUksUUFBUSxJQUFSLEtBQWlCLFNBQXJCLEVBQWdDO0FBQzVCLGtCQUFVO0FBQ04sa0JBQU0sbUJBREE7QUFFTixzQkFBVSxDQUFDLE9BQUQ7QUFGSixTQUFWO0FBSUg7QUFDRCxXQUFPLE9BQVA7QUFDSDs7QUFHRDs7Ozs7SUFJYSxrQixXQUFBLGtCOzs7QUFFVCxnQ0FBWSxNQUFaLEVBQW9CLE9BQXBCLEVBQTZCO0FBQUE7O0FBR3pCO0FBSHlCLDZJQUNuQixNQURtQixFQUNYLE9BRFc7O0FBSXpCLFlBQUksQ0FBQyxPQUFLLGlCQUFMLENBQXVCLE9BQUssR0FBNUIsQ0FBTCxFQUF1QztBQUFBOztBQUNuQywwQkFBTyxJQUFJLGNBQUosQ0FBbUIsTUFBbkIsQ0FBUDtBQUNIO0FBTndCO0FBTzVCOzs7O3dDQUVnQixJLEVBQU0sTSxFQUFRLFEsRUFBVTtBQUNyQyxnQkFBSSxPQUFPLEtBQUssS0FBTCxDQUFXLFFBQVgsQ0FBWDtBQUNBLG1CQUFPLGVBQWUsU0FBZixDQUF5QixTQUF6QixDQUFtQyxJQUFuQyxDQUFQO0FBQ0EsaUJBQUssY0FBTCxDQUFvQixJQUFwQixFQUEwQixJQUExQixFQUFnQyxNQUFoQztBQUNIOzs7Ozs7QUFJTCxzQkFBVyxRQUFYLENBQW9CLGtCQUFwQixFQUF3QyxVQUF4QyxFLENBQTREOzs7Ozs7Ozs7OztRQ2lENUMsVyxHQUFBLFc7QUEvSGhCLFNBQVMsT0FBVCxDQUFpQixDQUFqQixFQUFxQjtBQUFFLFdBQU8sS0FBSyxJQUFaO0FBQW1CO0FBQzFDLFNBQVMsSUFBVCxDQUFjLENBQWQsRUFBcUI7QUFBRSxXQUFPLE1BQU0sQ0FBTixHQUFVLEdBQWpCO0FBQXNCOztBQUU3QyxTQUFTLFVBQVQsQ0FBb0IsS0FBcEIsRUFBMkI7QUFDdkIsUUFBSSxPQUFPLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDM0IsZUFBTyxNQUFNLEtBQU4sR0FBYyxHQUFyQjtBQUNIO0FBQ0QsV0FBTyxLQUFQO0FBQ0g7O0FBRUQsU0FBUyxNQUFULENBQWdCLEdBQWhCLEVBQXFCO0FBQ2pCLFFBQUksSUFBSSxDQUFKLE1BQVcsR0FBZixFQUFvQjtBQUNoQixlQUFPLGVBQWUsSUFBSSxTQUFKLENBQWMsQ0FBZCxDQUFmLEdBQWtDLEtBQXpDO0FBQ0g7QUFDRCxXQUFPLGtDQUFrQyxHQUFsQyxHQUF3QyxLQUEvQztBQUNIOztBQUVELFNBQVMsU0FBVCxDQUFtQixHQUFuQixFQUF3QixLQUF4QixFQUErQjtBQUMzQixXQUFPLFFBQVA7QUFDSDs7QUFFRCxTQUFTLGFBQVQsQ0FBdUIsR0FBdkIsRUFBNEIsS0FBNUIsRUFBbUM7QUFDL0IsV0FBTyxLQUFLLFdBQVcsS0FBWCxJQUFvQixPQUFwQixHQUE4QixPQUFPLEdBQVAsQ0FBbkMsQ0FBUDtBQUNIOztBQUVELFNBQVMsVUFBVCxDQUFvQixHQUFwQixFQUF5QixNQUF6QixFQUFpQztBQUM3QixXQUFPLEtBQUssT0FBTyxHQUFQLENBQVcsVUFBVSxDQUFWLEVBQWE7QUFBRSxlQUFPLGNBQWMsR0FBZCxFQUFtQixDQUFuQixDQUFQO0FBQStCLEtBQXpELEVBQTJELElBQTNELENBQWdFLE1BQWhFLENBQUwsQ0FBUDtBQUNIOztBQUVELFNBQVMsV0FBVCxDQUFxQixNQUFyQixFQUE2QixNQUE3QixFQUFxQztBQUNqQyxXQUFPLEtBQUssT0FBTyxNQUFQLENBQWMsT0FBZCxFQUF1QixHQUF2QixDQUEyQixVQUFVLENBQVYsRUFBYTtBQUNoRCxlQUFPLEtBQUssRUFBRSxJQUFGLENBQU8sTUFBUCxDQUFMLENBQVA7QUFDSCxLQUZXLEVBRVQsSUFGUyxDQUVKLE1BQU0sTUFBTixHQUFlLEdBRlgsQ0FBTCxDQUFQO0FBR0g7O0FBRUQsU0FBUyxHQUFULENBQWEsQ0FBYixFQUFnQixNQUFoQixFQUF3QixPQUF4QixFQUFpQztBQUM3QixXQUFRLFVBQVUsT0FBTyxNQUFQLEdBQWdCLENBQTNCLEdBQWdDLFlBQVksT0FBTyxHQUFQLENBQVcsVUFBUyxDQUFULEVBQVk7QUFBRSxlQUFPLFlBQVksQ0FBWixFQUFlLE9BQWYsQ0FBUDtBQUFpQyxLQUExRCxDQUFaLEVBQXlFLElBQXpFLENBQWhDLEdBQWlILE1BQXhIO0FBQ0g7O0FBRUQsU0FBUyxHQUFULENBQWEsQ0FBYixFQUFnQixNQUFoQixFQUF3QixPQUF4QixFQUFpQztBQUM3QixXQUFRLFVBQVUsT0FBTyxNQUFQLEdBQWdCLENBQTNCLEdBQWdDLFlBQVksT0FBTyxHQUFQLENBQVcsVUFBUyxDQUFULEVBQVk7QUFBRSxlQUFPLFlBQVksQ0FBWixFQUFlLE9BQWYsQ0FBUDtBQUFpQyxLQUExRCxDQUFaLEVBQXlFLElBQXpFLENBQWhDLEdBQWlILE1BQXhIO0FBQ0g7O0FBRUQsU0FBUyxHQUFULENBQWEsR0FBYixFQUFrQixLQUFsQixFQUF5QixPQUF6QixFQUFrQztBQUM5QixXQUFPLE1BQU0sS0FBSyxZQUFZLEtBQVosRUFBbUIsT0FBbkIsRUFBNEIsSUFBNUIsQ0FBaUMsTUFBakMsQ0FBTCxDQUFiO0FBQ0g7O0FBRUQsU0FBUyxJQUFULENBQWMsR0FBZCxFQUFtQixNQUFuQixFQUEyQixPQUEzQixFQUFvQztBQUNoQyxXQUFPLE1BQU0sS0FBSyxJQUFJLElBQUosRUFBVSxNQUFWLEVBQWtCLE9BQWxCLENBQUwsQ0FBYjtBQUNIOztBQUVELFNBQVMsc0JBQVQsQ0FBZ0MsR0FBaEMsRUFBcUMsS0FBckMsRUFBNEM7QUFDeEMsV0FBTyxLQUFLLE9BQU8sR0FBUCxLQUFlLFFBQVEsTUFBUixHQUFpQixNQUFoQyxJQUEyQyxNQUFoRCxDQUFQO0FBQ0g7O0FBRUQsU0FBUyxVQUFULENBQW9CLEdBQXBCLEVBQXlCLE1BQXpCLEVBQWlDLE9BQWpDLEVBQTBDO0FBQ3RDLFFBQUksY0FBYyxFQUFsQjtBQUNBLFFBQUksWUFBWSxXQUFZLE9BQU8sUUFBUSxjQUFmLEtBQWtDLFVBQTlDLElBQTZELFFBQVEsY0FBckY7O0FBRUEsUUFBSSxPQUFPLEdBQVgsRUFBZ0I7QUFDWixZQUFJLE1BQU0sWUFBWSxVQUFVLE9BQU8sR0FBakIsQ0FBWixHQUFvQyxPQUFPLEdBQXJEO0FBQ0Esb0JBQVksSUFBWixDQUFpQixLQUFLLE9BQU8sR0FBUCxDQUFMLEdBQW1CLEtBQW5CLEdBQTJCLEdBQTVDO0FBQ0g7O0FBRUQsUUFBSSxPQUFPLEdBQVgsRUFBZ0I7QUFDWixZQUFJLE1BQU0sWUFBWSxNQUFNLFVBQVUsT0FBTyxHQUFqQixDQUFsQixHQUEwQyxPQUFPLEdBQTNEO0FBQ0Esb0JBQVksSUFBWixDQUFpQixLQUFLLE9BQU8sR0FBUCxDQUFMLEdBQW1CLE1BQW5CLEdBQTRCLEdBQTdDO0FBQ0g7O0FBRUQsV0FBTyxLQUFLLFlBQVksSUFBWixDQUFpQixNQUFqQixDQUFMLENBQVA7QUFDSDs7QUFFRCxTQUFTLFdBQVQsQ0FBcUIsTUFBckIsRUFBNkIsT0FBN0IsRUFBc0M7QUFDbEMsUUFBSSxZQUFZLEVBQWhCOztBQUVBO0FBQ0EsUUFBSSxPQUFPLE1BQVAsS0FBa0IsVUFBdEIsRUFBa0M7QUFDOUIsZUFBTyxDQUFDLEtBQUssT0FBTyxRQUFQLEtBQW9CLFdBQXpCLENBQUQsQ0FBUDtBQUNIO0FBQ0Q7QUFIQSxTQUlLLElBQUksTUFBTSxPQUFOLENBQWMsTUFBZCxDQUFKLEVBQTJCO0FBQzVCLG1CQUFPLENBQUMsSUFBSSxJQUFKLEVBQVUsTUFBVixFQUFrQixPQUFsQixDQUFELENBQVA7QUFDSDtBQUNEO0FBSEssYUFJQSxJQUFJLFVBQVUsSUFBZCxFQUFvQjtBQUNyQix1QkFBTyxDQUFDLE1BQUQsQ0FBUDtBQUNIOztBQUVEO0FBQ0EsUUFBSSxPQUFPLE9BQU8sSUFBUCxDQUFZLE1BQVosQ0FBWDtBQUNBLFNBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLEtBQUssTUFBdkIsRUFBK0IsR0FBL0IsRUFBb0M7QUFDaEMsWUFBSSxNQUFNLEtBQUssQ0FBTCxDQUFWOztBQUVBLFlBQUksUUFBUSxPQUFPLEdBQVAsQ0FBWjtBQUFBLFlBQ0ksY0FBZSxLQUFmLHlDQUFlLEtBQWYsQ0FESjtBQUVBLFlBQUksU0FBUyxRQUFULElBQXFCLFNBQVMsUUFBbEMsRUFBNEM7QUFDeEMsc0JBQVUsSUFBVixDQUFlLGNBQWMsR0FBZCxFQUFtQixLQUFuQixDQUFmO0FBQ0gsU0FGRCxNQUVPLElBQUksU0FBUyxTQUFiLEVBQXdCO0FBQzNCLHNCQUFVLElBQVYsQ0FBZSx1QkFBdUIsR0FBdkIsRUFBNEIsS0FBNUIsQ0FBZjtBQUNILFNBRk0sTUFFQSxJQUFJLFFBQVEsS0FBWixFQUFtQjtBQUN0QixzQkFBVSxJQUFWLENBQWUsSUFBSSxHQUFKLEVBQVMsS0FBVCxFQUFnQixPQUFoQixDQUFmO0FBQ0gsU0FGTSxNQUVBLElBQUksUUFBUSxLQUFaLEVBQW1CO0FBQ3RCLHNCQUFVLElBQVYsQ0FBZSxJQUFJLEdBQUosRUFBUyxLQUFULEVBQWdCLE9BQWhCLENBQWY7QUFDSCxTQUZNLE1BRUEsSUFBSSxRQUFRLEtBQVosRUFBbUI7QUFDdEIsc0JBQVUsSUFBVixDQUFlLElBQUksR0FBSixFQUFTLEtBQVQsRUFBZ0IsT0FBaEIsQ0FBZjtBQUNILFNBRk0sTUFFQSxJQUFJLFFBQVEsTUFBWixFQUFvQjtBQUN2QixzQkFBVSxJQUFWLENBQWUsS0FBSyxHQUFMLEVBQVUsS0FBVixFQUFpQixPQUFqQixDQUFmO0FBQ0gsU0FGTSxNQUVBLElBQUksTUFBTSxPQUFOLENBQWMsS0FBZCxDQUFKLEVBQTBCO0FBQzdCLHNCQUFVLElBQVYsQ0FBZSxXQUFXLEdBQVgsRUFBZ0IsS0FBaEIsQ0FBZjtBQUNILFNBRk0sTUFFQSxJQUFJLFNBQVMsUUFBVCxJQUFxQixTQUFTLElBQWxDLEVBQXdDO0FBQzNDLGdCQUFJLE1BQU0sR0FBTixJQUFhLE1BQU0sR0FBdkIsRUFBNEI7QUFDeEIsMEJBQVUsSUFBVixDQUFlLFdBQVcsR0FBWCxFQUFnQixLQUFoQixFQUF1QixPQUF2QixDQUFmO0FBQ0g7QUFDSixTQUpNLE1BSUEsSUFBSSxTQUFTLElBQWIsRUFBbUI7QUFDdEIsc0JBQVUsSUFBVixDQUFlLFVBQVUsR0FBVixFQUFlLEtBQWYsQ0FBZjtBQUNILFNBRk0sTUFFQTtBQUNILGtCQUFNLElBQUksS0FBSixDQUFVLDJCQUEyQixLQUFyQyxDQUFOO0FBQ0g7QUFDSjs7QUFFRCxXQUFPLEtBQUssTUFBTCxLQUFnQixDQUFoQixHQUFvQixDQUFDLE1BQUQsQ0FBcEIsR0FBK0IsU0FBdEM7QUFDSDs7QUFFRCxTQUFTLGNBQVQsQ0FBd0IsU0FBeEIsRUFBbUM7QUFDL0IsV0FBTyxLQUFLLFVBQVUsSUFBVixDQUFlLE1BQWYsQ0FBTCxDQUFQO0FBQ0g7O0FBRU0sU0FBUyxXQUFULENBQXFCLE1BQXJCLEVBQTZCLE9BQTdCLEVBQXNDO0FBQ3pDLFFBQUksVUFBVSxJQUFkLEVBQW9CO0FBQUUsZUFBTyxZQUFZO0FBQUUsbUJBQU8sSUFBUDtBQUFjLFNBQW5DO0FBQXNDO0FBQzVEO0FBQ0EsV0FBTyxJQUFJLFFBQUosQ0FBYSxTQUFiLEVBQXdCLFlBQVksZUFBZSxZQUFZLE1BQVosRUFBb0IsT0FBcEIsQ0FBZixDQUFaLEdBQTJELEdBQW5GLENBQVA7QUFDSDs7Ozs7Ozs7Ozs7Ozs7OztRQzVHZSxVLEdBQUEsVTtRQTRVQSxVLEdBQUEsVTtRQWFBLGEsR0FBQSxhO1FBYUEsYyxHQUFBLGM7UUErQ0EsVyxHQUFBLFc7UUFhQSxZLEdBQUEsWTs7QUF6YmhCOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7Ozs7QUFFTyxJQUFNLGdDQUFZLENBQUMsUUFBRCxFQUFXLE1BQVgsRUFBbUIsU0FBbkIsRUFBOEIsTUFBOUIsQ0FBbEI7O0FBRUEsSUFBTSxvQ0FBYyxFQUFwQjs7QUFFUCxTQUFTLFFBQVQsQ0FBbUIsTUFBbkIsRUFBMkI7QUFDdkIsUUFBSSxPQUFPLE1BQVAsR0FBZ0IsQ0FBcEIsRUFBdUI7QUFDbkIsWUFBSSxJQUFJLE9BQU8sQ0FBUCxDQUFSO0FBQ0EsYUFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksT0FBTyxNQUF6QixFQUFpQyxHQUFqQyxFQUFzQztBQUNsQyxpQkFBSyxNQUFNLE9BQU8sQ0FBUCxDQUFYO0FBQ0g7O0FBRUQsZUFBTyxDQUFQO0FBQ0g7QUFDRCxXQUFPLE9BQU8sQ0FBUCxDQUFQO0FBQ0g7O0FBRUQ7QUFDTyxTQUFTLFVBQVQsQ0FBb0IsYUFBcEIsRUFBbUMsS0FBbkMsRUFBMEM7QUFDN0MsUUFBSSxjQUFKO0FBQUEsUUFBVyxZQUFZLENBQXZCOztBQUVBLFFBQUksT0FBTztBQUNQLGlCQUFTLElBREYsQ0FDTztBQURQLEtBQVg7O0FBSUE7QUFDQSxTQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxjQUFjLE1BQWhDLEVBQXdDLEdBQXhDLEVBQTZDO0FBQ3pDLFlBQUksY0FBYyxDQUFkLEVBQWlCLE1BQWpCLEdBQTBCLFNBQTlCLEVBQXlDO0FBQ3JDLHdCQUFZLGNBQWMsQ0FBZCxFQUFpQixNQUE3QjtBQUNIO0FBQ0o7O0FBRUQ7QUFDQSxRQUFJLGNBQWMsQ0FBbEIsRUFBcUI7QUFDakIsZUFBTyxJQUFQO0FBQ0g7O0FBRUQ7O0FBbkI2QywrQkFvQnBDLENBcEJvQztBQXFCekM7QUFDQSxnQkFBUSxjQUFjLEdBQWQsQ0FBa0I7QUFBQSxtQkFBUSxLQUFLLENBQUwsS0FBVyxLQUFLLENBQUwsRUFBUSxLQUFSLENBQW5CO0FBQUEsU0FBbEIsQ0FBUjtBQUNBLFlBQUksTUFBTSxNQUFOLEtBQWlCLENBQXJCLEVBQXdCO0FBQ3BCO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBLGNBQU0sSUFBTixDQUFXLFVBQUMsQ0FBRCxFQUFJLENBQUo7QUFBQSxtQkFBVSxDQUFDLEtBQUssRUFBRSxVQUFSLEtBQXVCLEtBQUssRUFBRSxVQUE5QixJQUE0QyxDQUE1QyxHQUFnRCxDQUFDLENBQTNEO0FBQUEsU0FBWDs7QUFFQTtBQUNBLDBDQUFhLElBQWIsNEJBQXNCLEtBQXRCOztBQUVBO0FBQ0E7QUFDQSxlQUFPLEtBQUssVUFBWjtBQXBDeUM7O0FBb0I3QyxTQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxTQUFsQixFQUE2QixHQUE3QixFQUFrQztBQUFBLHlCQUF6QixDQUF5Qjs7QUFBQSxpQ0FJMUI7QUFhUDs7QUFFRDtBQUNBLFFBQUksS0FBSyxPQUFMLEtBQWlCLEtBQXJCLEVBQTRCO0FBQ3hCLGVBQU8sSUFBUDtBQUNIOztBQUVELFdBQU8sSUFBUDtBQUNIOztBQUVELElBQU0sWUFBWSxDQUFDLEtBQUQsRUFBUSxLQUFSLEVBQWUsS0FBZixFQUFzQixNQUF0QixDQUFsQjs7SUFFTSxLO0FBRUYseUJBQTREO0FBQUEsWUFBOUMsS0FBOEMsUUFBOUMsS0FBOEM7QUFBQSxZQUF2QyxJQUF1QyxRQUF2QyxJQUF1QztBQUFBLFlBQWpDLE1BQWlDLFFBQWpDLE1BQWlDO0FBQUEsWUFBekIsSUFBeUIsUUFBekIsSUFBeUI7QUFBQSxZQUFuQixPQUFtQixRQUFuQixPQUFtQjtBQUFBLFlBQVYsTUFBVSxRQUFWLE1BQVU7O0FBQUE7O0FBQ3hELGFBQUssRUFBTCxHQUFVLE1BQU0sRUFBTixFQUFWO0FBQ0EsYUFBSyxNQUFMLEdBQWMsS0FBZDtBQUNBLGFBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxhQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsYUFBSyxTQUFMLEdBQWlCLEtBQUssTUFBTCxHQUFlLEtBQUssTUFBTCxDQUFZLFNBQVosR0FBd0IsR0FBeEIsR0FBOEIsS0FBSyxJQUFsRCxHQUEwRCxLQUFLLElBQWhGO0FBQ0EsYUFBSyxJQUFMLEdBQVksSUFBWjtBQUNBLGFBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxhQUFLLFFBQUwsR0FBZ0IsS0FBaEI7QUFDQSxhQUFLLE9BQUwsR0FBZSxZQUFZLFNBQVosR0FBd0IsT0FBeEIsR0FBbUMsS0FBSyxNQUFMLElBQWUsS0FBSyxNQUFMLENBQVksT0FBN0U7O0FBRUE7QUFDQSxZQUFJLEtBQUssSUFBVCxFQUFlO0FBQ1gsaUJBQUssSUFBSSxLQUFULElBQWtCLEtBQUssSUFBdkIsRUFBNkI7QUFDekIsb0JBQUksS0FBSyxJQUFMLENBQVUsS0FBVixLQUFvQixJQUFwQixJQUE0QixRQUFPLEtBQUssSUFBTCxDQUFVLEtBQVYsQ0FBUCxNQUE0QixRQUE1RCxFQUFzRTtBQUNsRTtBQUNBLHdCQUFJLHdCQUFxQixLQUFyQixxQkFBeUMsS0FBSyxTQUE5QyxxQ0FBSjtBQUNBLGdEQUEyQixLQUEzQixVQUFxQyxLQUFLLElBQUwsQ0FBVSxLQUFWLENBQXJDO0FBQ0EsdUNBQUksTUFBSixFQUFZLEdBQVosRUFKa0UsQ0FJaEQ7O0FBRWxCLDJCQUFPLEtBQUssSUFBTCxDQUFVLEtBQVYsQ0FBUDtBQUNILGlCQVBELE1BUUs7QUFDRCx5QkFBSyxJQUFMLENBQVUsS0FBVixFQUFpQixVQUFqQixHQUE4QixLQUFLLFNBQW5DO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7Ozs7Z0NBRVE7QUFDTCwrQkFBSSxPQUFKLHdCQUFnQyxLQUFLLFNBQXJDO0FBQ0EsaUJBQUssV0FBTDtBQUNBLGlCQUFLLFNBQUw7QUFDQSxpQkFBSyxRQUFMLEdBQWdCLElBQWhCO0FBQ0g7OztvQ0FFVztBQUNSLGlCQUFLLElBQUwsR0FBWSxnQkFBTSxrQkFBTixDQUF5QixLQUFLLElBQTlCLEVBQW9DLDBCQUFZLFlBQWhELENBQVo7QUFDQSxpQkFBSyxjQUFMLEdBQXNCLGNBQWMsSUFBZCxDQUF0QjtBQUNIOzs7c0NBRWE7QUFDVixpQkFBSyxlQUFMLEdBQXVCLEtBQUssTUFBNUI7QUFDQSxpQkFBSyxNQUFMLEdBQWMsZ0JBQU0sa0JBQU4sQ0FBeUIsS0FBSyxNQUE5QixFQUFzQywwQkFBWSxZQUFsRCxDQUFkOztBQUVBLGdCQUFJLGVBQWMsS0FBSyxNQUFuQixDQUFKO0FBQ0EsZ0JBQUksS0FBSyxNQUFMLElBQWUsSUFBZixJQUF1QixTQUFTLFFBQWhDLElBQTRDLFNBQVMsVUFBekQsRUFBcUU7QUFDakU7QUFDQSxvQkFBSSw0QkFBMEIsS0FBSyxTQUEvQiw4REFBSjtBQUNBLG9EQUFtQyxLQUFLLE1BQXhDO0FBQ0EsbUNBQUksTUFBSixFQUFZLEdBQVosRUFKaUUsQ0FJL0M7QUFDbEI7QUFDSDs7QUFFRCxnQkFBSTtBQUNBLHFCQUFLLFVBQUw7QUFDQSxxQkFBSyxnQkFBTDtBQUNBLG9CQUFJLEtBQUssTUFBTCxJQUFlLElBQWYsS0FBd0IsT0FBTyxLQUFLLE1BQVosS0FBdUIsVUFBdkIsSUFBcUMsT0FBTyxJQUFQLENBQVksS0FBSyxNQUFqQixFQUF5QixNQUF6QixHQUFrQyxDQUEvRixDQUFKLEVBQXVHO0FBQ25HLHlCQUFLLE1BQUwsR0FBYyx5QkFBWSxLQUFLLE1BQWpCLEVBQXlCLGFBQXpCLENBQWQ7QUFDSCxpQkFGRCxNQUdLO0FBQ0QseUJBQUssTUFBTCxHQUFjLElBQWQ7QUFDSDtBQUNKLGFBVEQsQ0FVQSxPQUFNLENBQU4sRUFBUztBQUNMO0FBQ0Esb0JBQUksNkJBQTBCLEtBQUssU0FBL0IsOEJBQWtFLEtBQUssU0FBTCxDQUFlLEtBQUssTUFBcEIsQ0FBbEUsT0FBSjtBQUNBLGlEQUE2QixFQUFFLE9BQS9CLHlCQUF5RCxFQUFFLEtBQTNEO0FBQ0EsbUNBQUksTUFBSixFQUFZLElBQVosRUFKSyxDQUlhO0FBQ3JCO0FBQ0o7O0FBRUQ7Ozs7cUNBQ2E7QUFDVCxnQkFBSSxPQUFPLEtBQUssTUFBTCxJQUFlLEtBQUssTUFBTCxDQUFZLEtBQXRDO0FBQ0EsZ0JBQUksZUFBZSxJQUFmLHlDQUFlLElBQWYsQ0FBSjtBQUNBLGdCQUFJLFFBQVEsSUFBUixJQUFnQixVQUFVLFVBQTlCLEVBQTBDO0FBQUU7QUFDeEMscUJBQUssS0FBTCxHQUFhLEVBQWI7O0FBRUEsb0JBQUksVUFBVSxRQUFkLEVBQXdCO0FBQ3BCLHlCQUFLLEtBQUwsQ0FBVyxJQUFYLElBQW1CLElBQW5CO0FBQ0gsaUJBRkQsTUFHSyxJQUFJLE1BQU0sT0FBTixDQUFjLElBQWQsQ0FBSixFQUF5QjtBQUMxQix5QkFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksS0FBSyxNQUF2QixFQUErQixHQUEvQixFQUFvQztBQUNoQyw2QkFBSyxLQUFMLENBQVcsS0FBSyxDQUFMLENBQVgsSUFBc0IsSUFBdEI7QUFDSDtBQUNKLGlCQUpJLE1BS0EsSUFBSSxVQUFVLFFBQVYsS0FBdUIsS0FBSyxHQUFMLElBQVksSUFBWixJQUFvQixLQUFLLEdBQUwsSUFBWSxJQUF2RCxDQUFKLEVBQWtFO0FBQ25FLHdCQUFJLE9BQU8sS0FBSyxHQUFMLElBQVksQ0FBdkI7QUFDQSx3QkFBSSxPQUFPLEtBQUssR0FBTCxJQUFZLEVBQXZCLENBRm1FLENBRXhDO0FBQzNCLHlCQUFLLElBQUksS0FBRSxJQUFYLEVBQWlCLEtBQUksSUFBckIsRUFBMkIsSUFBM0IsRUFBZ0M7QUFDNUIsNkJBQUssS0FBTCxDQUFXLEVBQVgsSUFBZ0IsSUFBaEI7QUFDSDtBQUNKOztBQUVELHVCQUFPLEtBQUssTUFBTCxDQUFZLEtBQW5CLENBbkJzQyxDQW1CWjtBQUM3QjtBQUNKOzs7MkNBRWtCO0FBQUE7O0FBQ2YsZ0JBQUksQ0FBQyxLQUFLLE1BQU4sSUFBZ0IsTUFBTSxPQUFOLENBQWMsS0FBSyxNQUFuQixDQUFoQixJQUE4QyxPQUFPLEtBQUssTUFBWixLQUF1QixVQUF6RSxFQUFxRjtBQUNqRjtBQUNIOztBQUVELG1CQUFPLElBQVAsQ0FBWSxLQUFLLE1BQWpCLEVBQXlCLE9BQXpCLENBQWlDLGVBQU87QUFDcEMsb0JBQUksVUFBVSxPQUFWLENBQWtCLEdBQWxCLE1BQTJCLENBQUMsQ0FBaEMsRUFBbUM7QUFDL0Isd0JBQUksTUFBTSxNQUFLLE1BQUwsQ0FBWSxHQUFaLENBQVY7QUFDQSx3QkFBSSxjQUFjLEdBQWQseUNBQWMsR0FBZCxDQUFKO0FBQ0Esd0JBQUksUUFBUSxNQUFNLE9BQU4sQ0FBYyxHQUFkLENBQVo7O0FBRUEsd0JBQUksRUFBRSxTQUFTLFNBQVMsUUFBbEIsSUFBOEIsU0FBUyxRQUF6QyxDQUFKLEVBQXdEO0FBQ3BEO0FBQ0g7O0FBRUQsd0JBQUksSUFBSSxDQUFKLE1BQVcsR0FBZixFQUFvQjtBQUNoQjtBQUNBLDhCQUFLLG9CQUFMLEdBQTRCLE1BQUssb0JBQUwsSUFBNkIsRUFBekQ7QUFDQSw4QkFBSyxvQkFBTCxDQUEwQixJQUExQixDQUErQixDQUFDLElBQUksU0FBSixDQUFjLENBQWQsQ0FBRCxFQUFtQixRQUFRLEdBQVIsR0FBYyxDQUFDLEdBQUQsQ0FBakMsQ0FBL0I7QUFDSCxxQkFKRCxNQUtLO0FBQ0Q7QUFDQSw4QkFBSyxvQkFBTCxHQUE0QixNQUFLLG9CQUFMLElBQTZCLEVBQXpEO0FBQ0EsOEJBQUssb0JBQUwsQ0FBMEIsSUFBMUIsQ0FBK0IsQ0FBQyxHQUFELEVBQU0sUUFBUSxHQUFSLEdBQWMsQ0FBQyxHQUFELENBQXBCLENBQS9CO0FBQ0g7O0FBRUQsMkJBQU8sTUFBSyxNQUFMLENBQVksR0FBWixDQUFQO0FBQ0g7QUFDSixhQXZCRDtBQXdCSDs7O3NDQUVjLE8sRUFBUztBQUNwQixnQkFBSSxLQUFLLG9CQUFULEVBQStCO0FBQzNCLHFCQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxLQUFLLG9CQUFMLENBQTBCLE1BQTVDLEVBQW9ELEdBQXBELEVBQXlEO0FBQ3JELHdCQUFJLFFBQVEsS0FBSyxvQkFBTCxDQUEwQixDQUExQixDQUFaO0FBQ0Esd0JBQUksTUFBTSxRQUFRLE9BQVIsQ0FBZ0IsVUFBaEIsQ0FBMkIsTUFBTSxDQUFOLENBQTNCLENBQVY7QUFDQSx3QkFBSSxPQUFPLElBQVAsSUFBZSxNQUFNLENBQU4sRUFBUyxPQUFULENBQWlCLEdBQWpCLE1BQTBCLENBQUMsQ0FBOUMsRUFBaUQ7QUFDN0MsK0JBQU8sS0FBUDtBQUNIO0FBQ0o7QUFDSjs7QUFFRCxnQkFBSSxLQUFLLG9CQUFULEVBQStCO0FBQzNCLHFCQUFLLElBQUksS0FBRSxDQUFYLEVBQWMsS0FBSSxLQUFLLG9CQUFMLENBQTBCLE1BQTVDLEVBQW9ELElBQXBELEVBQXlEO0FBQ3JELHdCQUFJLFNBQVEsS0FBSyxvQkFBTCxDQUEwQixFQUExQixDQUFaO0FBQ0Esd0JBQUksT0FBTSxRQUFRLE9BQU0sQ0FBTixDQUFSLENBQVY7QUFDQSx3QkFBSSxRQUFPLElBQVAsSUFBZSxPQUFNLENBQU4sRUFBUyxPQUFULENBQWlCLElBQWpCLE1BQTBCLENBQUMsQ0FBOUMsRUFBaUQ7QUFDN0MsK0JBQU8sS0FBUDtBQUNIO0FBQ0o7QUFDSjs7QUFFRCxtQkFBTyxJQUFQO0FBQ0g7OztrQ0FFVSxPLEVBQVM7QUFDaEIsZ0JBQUksQ0FBQyxLQUFLLFFBQVYsRUFBb0I7QUFDaEIscUJBQUssS0FBTDtBQUNIOztBQUVEO0FBQ0EsZ0JBQUksS0FBSyxLQUFMLElBQWMsSUFBZCxJQUFzQixDQUFDLEtBQUssS0FBTCxDQUFXLFFBQVEsSUFBbkIsQ0FBM0IsRUFBcUQ7QUFDakQsdUJBQU8sS0FBUDtBQUNIOztBQUVEO0FBQ0EsZ0JBQUksQ0FBQyxLQUFLLGFBQUwsQ0FBbUIsT0FBbkIsQ0FBTCxFQUFrQztBQUM5Qix1QkFBTyxLQUFQO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBSSxLQUFLLE1BQUwsWUFBdUIsUUFBM0IsRUFBb0M7QUFDaEMsb0JBQUk7QUFDQSwyQkFBTyxLQUFLLE1BQUwsQ0FBWSxPQUFaLENBQVA7QUFDSCxpQkFGRCxDQUdBLE9BQU8sS0FBUCxFQUFjO0FBQ1Y7QUFDQSx3QkFBSSwyQkFBeUIsS0FBSyxTQUE5QixtQkFBc0QsS0FBSyxlQUEzRCxPQUFKO0FBQ0Esb0RBQTZCLE1BQU0sT0FBbkMseUJBQTZELE1BQU0sS0FBbkU7QUFDQSx1Q0FBSSxPQUFKLEVBQWEsR0FBYixFQUFrQixRQUFRLE9BQTFCO0FBQ0g7QUFDSixhQVZELE1BV0s7QUFDRCx1QkFBTyxLQUFLLE1BQUwsSUFBZSxJQUF0QjtBQUNIO0FBQ0o7Ozs7OztBQUlMLE1BQU0sRUFBTixHQUFXLENBQVg7O0lBR2EsUyxXQUFBLFM7OztBQUNULHVCQUFhLE1BQWIsRUFBcUI7QUFBQTs7QUFBQSwySEFDWCxNQURXOztBQUVqQixlQUFLLE9BQUwsR0FBZSxJQUFmO0FBRmlCO0FBR3BCOzs7RUFKMEIsSzs7SUFRbEIsUyxXQUFBLFM7OztBQUNULHVCQUFhLE1BQWIsRUFBcUI7QUFBQTs7QUFBQSwySEFDWCxNQURXOztBQUVqQixlQUFLLE9BQUwsR0FBZSxJQUFmO0FBQ0EsZUFBSyxNQUFMLEdBQWMsT0FBTyxNQUFQLElBQWlCLEVBQS9CO0FBSGlCO0FBSXBCOzs7O2lDQUVTLEssRUFBTztBQUNiLGlCQUFLLE1BQUwsQ0FBWSxJQUFaLENBQWlCLEtBQWpCO0FBQ0g7Ozt3Q0FFZ0IsTyxFQUFTO0FBQ3RCLGdCQUFJLFNBQVMsRUFBYjtBQUFBLGdCQUFpQixZQUFZLEVBQTdCO0FBQ0EseUJBQWEsT0FBYixFQUFzQixDQUFDLElBQUQsQ0FBdEIsRUFBOEIsTUFBOUIsRUFBc0MsU0FBdEM7O0FBRUEsZ0JBQUksT0FBTyxNQUFQLEdBQWdCLENBQXBCLEVBQXVCO0FBQ25CLG9CQUFJLFlBQVksU0FBUyxTQUFULENBQWhCOztBQUVBO0FBQ0E7QUFDQSxvQkFBSSxZQUFZLFNBQVosTUFBMkIsU0FBL0IsRUFBMEM7QUFDdEM7QUFDQSx3QkFBSSxjQUFjLE9BQU8sR0FBUCxDQUFXO0FBQUEsK0JBQUssS0FBSyxFQUFFLE9BQUYsS0FBYyxLQUFuQixJQUE0QixFQUFFLGNBQW5DO0FBQUEscUJBQVgsQ0FBbEI7QUFDQSx3QkFBSSxZQUFZLEVBQWhCOztBQUVBLHlCQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxZQUFZLE1BQTlCLEVBQXNDLEdBQXRDLEVBQTJDO0FBQ3ZDLDRCQUFJLFFBQVEsWUFBWSxDQUFaLENBQVo7QUFDQSw0QkFBSSxDQUFDLEtBQUwsRUFBWTtBQUNSO0FBQ0g7QUFDRCw2QkFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksTUFBTSxNQUF4QixFQUFnQyxHQUFoQyxFQUFxQztBQUNqQyxnQ0FBSSxRQUFRLE1BQU0sQ0FBTixDQUFaO0FBQ0EsaUNBQUssSUFBSSxHQUFULElBQWdCLEtBQWhCLEVBQXVCO0FBQ25CLDBDQUFVLEdBQVYsSUFBaUIsSUFBakI7QUFDSDtBQUNKO0FBQ0o7O0FBRUQ7QUFDQSx5QkFBSyxJQUFJLFFBQVQsSUFBcUIsU0FBckIsRUFBZ0M7QUFDNUIsb0NBQVksU0FBWixJQUF5QixZQUFZLFNBQVosS0FBMEIsRUFBbkQ7QUFDQSxvQ0FBWSxTQUFaLEVBQXVCLFFBQXZCLElBQW1DLFdBQVcsV0FBWCxFQUF3QixRQUF4QixDQUFuQzs7QUFFQTtBQUNBLDRCQUFJLENBQUMsWUFBWSxTQUFaLEVBQXVCLFFBQXZCLENBQUwsRUFBdUM7QUFDbkMsbUNBQU8sWUFBWSxTQUFaLEVBQXVCLFFBQXZCLENBQVA7QUFDSCx5QkFGRCxNQUdLO0FBQ0Qsd0NBQVksU0FBWixFQUF1QixRQUF2QixFQUFpQyxHQUFqQyxHQUF1QyxZQUFZLEdBQVosR0FBa0IsUUFBekQ7QUFDQSx3Q0FBWSxTQUFaLEVBQXVCLFFBQXZCLEVBQWlDLE1BQWpDLEdBQTBDLE9BQU8sR0FBUCxDQUFXO0FBQUEsdUNBQUssS0FBSyxFQUFFLFNBQVo7QUFBQSw2QkFBWCxDQUExQztBQUNIO0FBQ0o7O0FBRUQ7QUFDQSx3QkFBSSxZQUFZLFNBQVosS0FBMEIsT0FBTyxJQUFQLENBQVksWUFBWSxTQUFaLENBQVosRUFBb0MsTUFBcEMsS0FBK0MsQ0FBN0UsRUFBZ0Y7QUFDNUUsb0NBQVksU0FBWixJQUF5QixJQUF6QjtBQUNIO0FBQ0o7QUFDRCx1QkFBTyxZQUFZLFNBQVosQ0FBUDtBQUNIO0FBQ0o7Ozs7RUE1RDBCLEs7O0FBZ0UvQixJQUFNLGdCQUFnQjtBQUNsQjtBQUNBLGtCQUZrQiwwQkFFSCxHQUZHLEVBRUU7QUFDaEIsWUFBSSxPQUFPLEdBQVAsS0FBZSxRQUFmLElBQTJCLElBQUksSUFBSixHQUFXLEtBQVgsQ0FBaUIsQ0FBQyxDQUFsQixNQUF5QixLQUF4RCxFQUErRDtBQUMzRCxtQkFBVSxXQUFXLEdBQVgsQ0FBVjtBQUNIO0FBQ0QsZUFBTyxHQUFQO0FBQ0g7QUFQaUIsQ0FBdEI7O0FBVUEsU0FBUyxhQUFULENBQXVCLEdBQXZCLEVBQTRCO0FBQ3hCLFdBQU8sVUFBVSxPQUFWLENBQWtCLEdBQWxCLElBQXlCLENBQUMsQ0FBakM7QUFDSDs7QUFFRCxTQUFTLE9BQVQsQ0FBaUIsR0FBakIsRUFBc0I7QUFDbEIsV0FBTyxPQUFPLElBQVAsQ0FBWSxHQUFaLEVBQWlCLE1BQWpCLEtBQTRCLENBQW5DO0FBQ0g7O0FBRU0sU0FBUyxVQUFULENBQW9CLEdBQXBCLEVBQXlCO0FBQzVCLFFBQUksY0FBYyxFQUFsQjtBQUFBLFFBQXNCLGlCQUFpQixFQUF2Qzs7QUFFQSxTQUFLLElBQUksR0FBVCxJQUFnQixHQUFoQixFQUFxQjtBQUNqQixZQUFJLGNBQWMsR0FBZCxDQUFKLEVBQXdCO0FBQ3BCLHdCQUFZLEdBQVosSUFBbUIsSUFBSSxHQUFKLENBQW5CO0FBQ0gsU0FGRCxNQUVPO0FBQ0gsMkJBQWUsR0FBZixJQUFzQixJQUFJLEdBQUosQ0FBdEI7QUFDSDtBQUNKO0FBQ0QsV0FBTyxDQUFDLFdBQUQsRUFBYyxjQUFkLENBQVA7QUFDSDs7QUFFTSxTQUFTLGFBQVQsQ0FBdUIsS0FBdkIsRUFBOEI7O0FBRWpDLFFBQUksT0FBUSxFQUFaOztBQUVBLFFBQUksTUFBTSxNQUFWLEVBQWtCO0FBQ2QsWUFBSSxLQUFLLE1BQU0sTUFBTixDQUFhLGNBQWIsSUFBK0IsRUFBeEM7QUFDQSxhQUFLLElBQUwsZ0NBQWEsRUFBYjtBQUNIOztBQUVELFNBQUssSUFBTCxDQUFVLE1BQU0sSUFBaEI7QUFDQSxXQUFPLElBQVA7QUFDSDs7QUFFTSxTQUFTLGNBQVQsQ0FBd0IsSUFBeEIsRUFBOEIsS0FBOUIsRUFBcUMsTUFBckMsRUFBNkMsTUFBN0MsRUFBcUQ7O0FBRXhELFFBQUksYUFBYSxFQUFFLFVBQUYsRUFBUSxZQUFSLEVBQWUsY0FBZixFQUFqQjs7QUFGd0Qsc0JBR3BCLFdBQVcsS0FBWCxDQUhvQjtBQUFBO0FBQUEsUUFHbkQsV0FIbUQ7QUFBQSxRQUd0QyxjQUhzQzs7QUFJeEQsUUFBSSxRQUFRLFFBQVEsY0FBUixDQUFaO0FBQ0EsUUFBSSxlQUFKOztBQUVBLFFBQUksU0FBUyxVQUFVLElBQXZCLEVBQTZCO0FBQ3pCLGlCQUFTLFNBQVQ7QUFDSCxLQUZELE1BRU87QUFDSCxpQkFBUyxTQUFUO0FBQ0g7O0FBRUQsUUFBSSxJQUFJLElBQUksTUFBSixDQUFXLE9BQU8sTUFBUCxDQUFjLFVBQWQsRUFBMEIsV0FBMUIsQ0FBWCxDQUFSOztBQUVBLFFBQUksTUFBSixFQUFZO0FBQ1IsZUFBTyxRQUFQLENBQWdCLENBQWhCO0FBQ0g7O0FBRUQsUUFBSSxDQUFDLEtBQUwsRUFBWTtBQUNSLGFBQUssSUFBSSxHQUFULElBQWdCLGNBQWhCLEVBQWdDO0FBQzVCLGdCQUFJLFdBQVcsZUFBZSxHQUFmLENBQWY7QUFDQSxnQkFBSSxRQUFPLFFBQVAseUNBQU8sUUFBUCxPQUFvQixRQUFwQixJQUFnQyxDQUFDLE1BQU0sT0FBTixDQUFjLFFBQWQsQ0FBckMsRUFBOEQ7QUFDMUQsK0JBQWUsR0FBZixFQUFvQixRQUFwQixFQUE4QixDQUE5QixFQUFpQyxNQUFqQztBQUNILGFBRkQsTUFFTztBQUNIO0FBQ0Esb0JBQUksZ0VBQTZELEdBQTdELFVBQXFFLEtBQUssU0FBTCxDQUFlLFFBQWYsQ0FBckUsT0FBSjtBQUNBLG1EQUFnQyxFQUFFLFNBQWxDOztBQUVBO0FBQ0Esb0JBQUksT0FBTyxFQUFFLElBQVQsQ0FBSixFQUFvQjtBQUNoQixtREFBNEIsRUFBRSxJQUE5QjtBQUNBLHdCQUFJLE1BQUosRUFBWTtBQUNSLDZDQUFrQixPQUFPLElBQXpCO0FBQ0g7QUFDRDtBQUNIO0FBQ0QsbUNBQUksTUFBSixFQUFZLEdBQVosRUFiRyxDQWFlO0FBQ3JCO0FBQ0o7QUFFSjs7QUFFRCxXQUFPLENBQVA7QUFDSDs7QUFHTSxTQUFTLFdBQVQsQ0FBc0IsTUFBdEIsRUFBOEIsTUFBOUIsRUFBc0M7QUFDekMsUUFBSSxjQUFjLEVBQWxCOztBQUVBLFNBQUssSUFBSSxHQUFULElBQWdCLE1BQWhCLEVBQXdCO0FBQ3BCLFlBQUksUUFBUSxPQUFPLEdBQVAsQ0FBWjtBQUNBLFlBQUksS0FBSixFQUFXO0FBQ1Asd0JBQVksR0FBWixJQUFtQixlQUFlLEdBQWYsRUFBb0IsS0FBcEIsRUFBMkIsSUFBM0IsRUFBaUMsTUFBakMsQ0FBbkI7QUFDSDtBQUNKOztBQUVELFdBQU8sV0FBUDtBQUNIOztBQUVNLFNBQVMsWUFBVCxDQUFzQixPQUF0QixFQUErQixNQUEvQixFQUF1QyxnQkFBdkMsRUFBeUQsb0JBQXpELEVBQStFO0FBQ2xGLFFBQUksVUFBVSxLQUFkO0FBQ0EsUUFBSSxlQUFlLEtBQW5COztBQUVBLFFBQUksT0FBTyxNQUFQLEtBQWtCLENBQXRCLEVBQXlCO0FBQUU7QUFBUzs7QUFFcEMsU0FBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksT0FBTyxNQUF6QixFQUFpQyxHQUFqQyxFQUFzQztBQUNsQyxZQUFJLFVBQVUsT0FBTyxDQUFQLENBQWQ7O0FBRUEsWUFBSSxRQUFRLE9BQVosRUFBcUI7QUFDakIsZ0JBQUksUUFBUSxTQUFSLENBQWtCLE9BQWxCLENBQUosRUFBZ0M7QUFDNUIsMEJBQVUsSUFBVjtBQUNBLGlDQUFpQixJQUFqQixDQUFzQixPQUF0QjtBQUNBLHFDQUFxQixJQUFyQixDQUEwQixRQUFRLEVBQWxDO0FBQ0g7QUFFSixTQVBELE1BT08sSUFBSSxRQUFRLE9BQVosRUFBcUI7QUFDeEIsZ0JBQUksUUFBUSxTQUFSLENBQWtCLE9BQWxCLENBQUosRUFBZ0M7QUFDNUIsMEJBQVUsSUFBVjs7QUFFQSwrQkFBZSxhQUNYLE9BRFcsRUFFWCxRQUFRLE1BRkcsRUFHWCxnQkFIVyxFQUlYLG9CQUpXLENBQWY7O0FBT0Esb0JBQUksQ0FBQyxZQUFMLEVBQW1CO0FBQ2YscUNBQWlCLElBQWpCLENBQXNCLE9BQXRCO0FBQ0EseUNBQXFCLElBQXJCLENBQTBCLFFBQVEsRUFBbEM7QUFDSDtBQUNKO0FBQ0o7QUFDSjs7QUFFRCxXQUFPLE9BQVA7QUFDSDs7Ozs7Ozs7a0JDOWN1QixlO0FBZnhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBTSxxQkFBcUIsQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXLEdBQVgsRUFBZ0IsR0FBaEIsQ0FBM0I7QUFDQSxJQUFNLDJCQUEyQixDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FBakM7O0FBRWUsU0FBUyxlQUFULENBQTBCLE9BQTFCLEVBQWlEO0FBQUEsUUFBZCxPQUFjLHVFQUFKLEVBQUk7O0FBQzVELFFBQU0sYUFBYSxRQUFRLFVBQVIsSUFBc0Isa0JBQXpDO0FBQ0EsUUFBTSxtQkFBbUIsUUFBUSxnQkFBUixJQUE0Qix3QkFBckQ7QUFDQSxRQUFNLFNBQVMsT0FBZjtBQUNBLFFBQU0sUUFBUSxRQUFRLEtBQVIsSUFBaUIsQ0FBL0I7O0FBRUE7QUFDQSxRQUFJLE9BQU8sTUFBUCxHQUFnQixDQUFoQixLQUFzQixDQUExQixFQUE2QjtBQUN6QixjQUFNLFNBQU4sQ0FBZ0IsSUFBaEIsQ0FBcUIsS0FBckIsQ0FBMkIsTUFBM0IsRUFBbUMsTUFBbkM7QUFDSDs7QUFFRCxRQUFJLE9BQU8sSUFBWDtBQUNBLFFBQUksU0FBUyxFQUFiO0FBQ0EsU0FBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksT0FBTyxNQUF6QixFQUFpQyxHQUFqQyxFQUFzQztBQUNsQyxZQUFJLFVBQVUsS0FBSyxLQUFMLENBQVcsT0FBTyxDQUFQLElBQVksS0FBdkIsQ0FBZDtBQUNBLGFBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLE9BQWxCLEVBQTJCLEdBQTNCLEVBQWdDO0FBQzVCLGtCQUFNLFNBQU4sQ0FBZ0IsSUFBaEIsQ0FBcUIsS0FBckIsQ0FBMkIsTUFBM0IsRUFBbUMsT0FBTyxVQUFQLEdBQW9CLGdCQUF2RDtBQUNIO0FBQ0QsZUFBTyxDQUFDLElBQVIsQ0FMa0MsQ0FLcEI7QUFDakI7O0FBRUQsYUFBUyxJQUFJLFVBQUosQ0FBZSxNQUFmLENBQVQsQ0FyQjRELENBcUIzQjtBQUNqQyxRQUFNLFNBQVMsT0FBTyxNQUFQLEdBQWdCLENBQS9CLENBdEI0RCxDQXNCMUI7O0FBRWxDLFdBQU8sRUFBRSxjQUFGLEVBQVUsY0FBVixFQUFQO0FBQ0g7Ozs7Ozs7Ozs7QUN0Q0Q7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBTnFDO0FBUTlCLElBQUksd0JBQVEsT0FBTyxNQUFQLGNBQVosQyxDQVpQOztBQWNBLE9BQU8sTUFBUCxDQUFjLEtBQWQsRUFBcUI7QUFDakIsVUFBTSxPQURXO0FBRWpCLGNBQVUsSUFGTztBQUdqQix5REFIaUI7QUFJakIsNkRBSmlCO0FBS2pCLGVBQVcsSUFMTSxFQUtBOztBQUVqQixRQVBpQixrQkFPVjtBQUNILHFCQUFNLElBQU4sQ0FBVyxLQUFYLENBQWlCLElBQWpCLEVBQXVCLFNBQXZCOztBQUVBO0FBQ0EsWUFBSSxVQUFVLENBQ1YsRUFBRSxNQUFNLFlBQVIsRUFBc0IsTUFBTSxDQUE1QixFQUErQixNQUFNLG9CQUFHLEtBQXhDLEVBQStDLFlBQVksS0FBM0QsRUFEVSxFQUVWLEVBQUUsTUFBTSxXQUFSLEVBQXFCLE1BQU0sQ0FBM0IsRUFBOEIsTUFBTSxvQkFBRyxLQUF2QyxFQUE4QyxZQUFZLEtBQTFELEVBRlUsRUFHVixFQUFFLE1BQU0sU0FBUixFQUFtQixNQUFNLENBQXpCLEVBQTRCLE1BQU0sb0JBQUcsYUFBckMsRUFBb0QsWUFBWSxJQUFoRSxFQUhVLENBQWQ7O0FBTUE7QUFDQSxhQUFLLE9BQUwsQ0FBYSxtQkFBYixHQUFtQyxJQUFuQztBQUNBLGFBQUssT0FBTCxDQUFhLHFCQUFiLEdBQXFDLElBQXJDOztBQUVBO0FBQ0EsWUFBSSxLQUFLLFNBQVQsRUFBb0I7QUFDaEIsb0JBQVEsSUFBUixDQUFhLEVBQUUsTUFBTSxtQkFBUixFQUE2QixNQUFNLENBQW5DLEVBQXNDLE1BQU0sb0JBQUcsYUFBL0MsRUFBOEQsWUFBWSxJQUExRSxFQUFiO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBLFlBQUksS0FBSyxPQUFMLElBQWdCLEtBQUssSUFBekIsRUFBK0I7QUFDM0IsaUJBQUssU0FBTCxHQUFpQixJQUFqQjtBQUNIOztBQUVEO0FBQ0EsWUFBSSxLQUFLLFNBQVQsRUFBb0I7QUFDaEIsaUJBQUssT0FBTCxDQUFhLHNCQUFiLEdBQXNDLElBQXRDOztBQUVBO0FBQ0EsaUJBQUssT0FBTCxDQUFhLGtCQUFiLEdBQWtDLENBQWxDO0FBQ0EsaUJBQUssT0FBTCxDQUFhLHNCQUFiLEdBQXNDLGNBQUksVUFBSixHQUFpQixLQUFLLE9BQUwsQ0FBYSxrQkFBcEU7O0FBRUE7QUFDQSxvQkFBUSxJQUFSLENBQWEsRUFBRSxNQUFNLFlBQVIsRUFBc0IsTUFBTSxDQUE1QixFQUErQixNQUFNLG9CQUFHLGNBQXhDLEVBQXdELFlBQVksSUFBcEUsRUFBYjtBQUNIOztBQUVELGFBQUssYUFBTCxHQUFxQiw0QkFBaUIsT0FBakIsQ0FBckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBSyxxQkFBTCxHQUE2QixFQUE3QjtBQUNBLGFBQUssb0JBQUwsR0FBNEIsS0FBSyxhQUFqQyxDQTNDRyxDQTJDNkM7QUFDbkQsS0FuRGdCOzs7QUFxRGpCO0FBQ0EsZ0JBdERpQiwwQkFzREQ7QUFDWixZQUFJLENBQUMsS0FBSyxhQUFWLEVBQXlCO0FBQ3JCLGlCQUFLLGdCQUFMO0FBQ0g7QUFDRCxlQUFPLGFBQU0sWUFBTixDQUFtQixLQUFuQixDQUF5QixJQUF6QixFQUErQixTQUEvQixDQUFQO0FBQ0gsS0EzRGdCOzs7QUE2RGpCO0FBQ0Esb0JBOURpQiw4QkE4REc7QUFBQTs7QUFDaEI7QUFDQSxZQUFJLEtBQUssSUFBVCxFQUFlO0FBQ1g7QUFDQSxnQkFBSSxLQUFLLHFCQUFULEVBQWdDO0FBQzVCLHFCQUFLLHFCQUFMLEdBQTZCLDBCQUFZLFVBQVosQ0FBdUIsS0FBSyxxQkFBNUIsQ0FBN0I7QUFDQSxxQkFBSyxPQUFMLENBQWEsNkJBQWIsYUFDWSxLQUFLLHFCQUFMLENBQTJCLEtBQTNCLENBQWlDLENBQWpDLEVBQW9DLENBQXBDLEVBQXVDLElBQXZDLENBQTRDLElBQTVDLENBRFo7QUFFSDs7QUFFRDtBQUNBLGlCQUFLLE9BQUwsQ0FBYSxrQkFBYixHQUFrQyxFQUFsQztBQUNBLGlCQUFLLE9BQUwsQ0FBYSxzQkFBYixHQUFzQyxjQUFJLFVBQUosR0FBaUIsS0FBSyxPQUFMLENBQWEsa0JBQXBFOztBQUVBO0FBQ0EsZ0JBQU0sT0FBTyx5QkFBZ0IsS0FBSyxJQUFyQixFQUEyQixFQUFFLE9BQU8sS0FBSyxPQUFMLENBQWEsa0JBQXRCLEVBQTNCLENBQWI7QUFDQSxpQkFBSyxPQUFMLEdBQWUsTUFBTSxLQUFLLElBQVgsR0FBa0IsWUFBakM7QUFDQSw4QkFBUSxNQUFSLENBQWUsS0FBSyxFQUFwQixFQUF3QixLQUFLLE9BQTdCLEVBQXNDO0FBQ2xDLHNCQUFNLEtBQUssTUFEdUI7QUFFbEMsd0JBQVEsS0FBSyxNQUZxQjtBQUdsQyx1QkFBTyxDQUgyQjtBQUlsQywyQkFBVztBQUp1QixhQUF0QztBQU1IOztBQUVEO0FBQ0EsWUFBSSxLQUFLLE9BQVQsRUFBa0I7QUFDZCxpQkFBSyxPQUFMLENBQWEsb0JBQWIsR0FBb0MsSUFBcEM7QUFDQSxpQkFBSyxPQUFMLENBQWEsa0JBQWIsR0FBa0MsR0FBbEMsQ0FGYyxDQUV5QjtBQUN2QyxpQkFBSyxPQUFMLENBQWEsUUFBYixHQUF3QixLQUFLLE9BQUwsQ0FBYSxRQUFiLElBQXlCLEVBQWpEO0FBQ0EsaUJBQUssT0FBTCxDQUFhLFFBQWIsQ0FBc0IsU0FBdEIsR0FBa0MsS0FBSyxPQUF2QztBQUNBLGlCQUFLLE9BQUwsQ0FBYSxRQUFiLENBQXNCLGVBQXRCLEdBQXdDLENBQXhDOztBQUVBO0FBQ0EsOEJBQVEsT0FBUixDQUFnQixLQUFLLE9BQXJCLEVBQThCLElBQTlCLENBQW1DLG1CQUFXO0FBQzFDLG9CQUFJLE9BQUosRUFBYTtBQUNULDBCQUFLLE9BQUwsQ0FBYSxRQUFiLENBQXNCLGVBQXRCLEdBQXdDLFFBQVEsTUFBUixHQUFpQixRQUFRLEtBQWpFO0FBQ0g7QUFDSixhQUpEO0FBS0g7QUFDSixLQXRHZ0I7OztBQXdHakI7QUFDQSxhQXpHaUIscUJBeUdOLEtBekdNLEVBeUdDLE9BekdELEVBeUdVO0FBQ3ZCLGVBQVEsU0FBUywwQkFBWSwwQkFBWixDQUF1QyxLQUF2QyxFQUE4QyxPQUE5QyxDQUFWLElBQXFFLENBQTVFO0FBQ0gsS0EzR2dCOzs7QUE2R2pCO0FBQ0EscUJBOUdpQiw2QkE4R0UsS0E5R0YsRUE4R1MsT0E5R1QsRUE4R2tCO0FBQy9CLGdCQUFRLElBQVI7QUFDQSxZQUFJLE1BQU0sS0FBSyxTQUFMLENBQWUsS0FBZixFQUFzQixPQUF0QixDQUFWO0FBQ0EsZ0JBQVEsSUFBUjtBQUNBLGVBQU8sR0FBUDtBQUNILEtBbkhnQjtBQXFIakIsaUJBckhpQix5QkFxSEYsT0FySEUsRUFxSE8sSUFySFAsRUFxSGEsT0FySGIsRUFxSHNCO0FBQ25DLFlBQUksUUFBUSxLQUFLLGFBQWpCOztBQUVBO0FBQ0EsWUFBSSxRQUFRLEtBQUssU0FBTCxDQUFlLEtBQUssS0FBcEIsRUFBMkIsT0FBM0IsQ0FBWjtBQUNBLFlBQUksUUFBUSxDQUFaLEVBQWU7QUFDWCxtQkFEVyxDQUNIO0FBQ1g7QUFDRCxZQUFJLGFBQWEsS0FBSyxpQkFBTCxDQUF1QixLQUFLLFVBQTVCLEVBQXdDLE9BQXhDLENBQWpCOztBQUVBLFlBQUssVUFBVSxDQUFWLElBQWUsZUFBZSxDQUEvQixJQUFxQyxhQUFhLENBQXRELEVBQXlEO0FBQ3JELG1CQURxRCxDQUM3QztBQUNYOztBQUVEO0FBQ0E7QUFDQSxjQUFNLEtBQU4sR0FBYyxRQUFRLFFBQVEsd0JBQTlCO0FBQ0EsY0FBTSxVQUFOLEdBQW9CLGFBQWEsQ0FBZCxHQUFtQixLQUF0QztBQUNBLGNBQU0sVUFBTixJQUFvQixRQUFRLHdCQUE1QjtBQUNBLGNBQU0sVUFBTixJQUFvQixDQUFwQixDQW5CbUMsQ0FtQlo7O0FBRXZCLGNBQU0sS0FBTixHQUFjLEtBQUssVUFBTCxDQUFnQixLQUFLLEtBQXJCLEVBQTRCLE9BQTVCLENBQWQ7QUFDQSxZQUFJLENBQUMsTUFBTSxLQUFYLEVBQWtCO0FBQ2Q7QUFDSDs7QUFFRDtBQUNBLGNBQU0sQ0FBTixHQUFXLEtBQUssQ0FBTCxJQUFVLDBCQUFZLDBCQUFaLENBQXVDLEtBQUssQ0FBTCxJQUFVLENBQWpELEVBQW9ELE9BQXBELENBQVgsSUFBNEUsMEJBQVksUUFBWixDQUFxQixDQUEzRztBQUNBLGNBQU0sTUFBTixHQUFlLFFBQVEsVUFBUixDQUFtQixNQUFuQixJQUE2QiwwQkFBWSxRQUFaLENBQXFCLE1BQWpFO0FBQ0EsY0FBTSxPQUFOLEdBQWdCLDBCQUFZLFlBQVosQ0FBeUIsS0FBSyxPQUE5QixFQUF1QyxPQUF2QyxDQUFoQjtBQUNBLFlBQUksTUFBTSxPQUFWLEVBQW1CO0FBQ2YsZ0JBQUksT0FBTyxNQUFNLE9BQWIsS0FBeUIsUUFBN0IsRUFBdUM7QUFDbkMsc0JBQU0sTUFBTixHQUFlLE1BQU0sT0FBckI7QUFDSCxhQUZELE1BR0ssSUFBSSxNQUFNLE9BQU4sQ0FBYyxNQUFNLE9BQXBCLENBQUosRUFBa0M7QUFDbkMsc0JBQU0sTUFBTixHQUFlLE1BQU0sT0FBTixDQUFjLENBQWQsQ0FBZjtBQUNIO0FBQ0o7O0FBRUQ7QUFDQSxZQUFJLE1BQU0sT0FBTixJQUFpQixNQUFNLE1BQTNCLEVBQW1DO0FBQy9CLGtCQUFNLENBQU4sSUFBVyxNQUFNLE1BQWpCO0FBQ0g7O0FBRUQsY0FBTSxDQUFOLElBQVcsY0FBSSxZQUFmLENBNUNtQyxDQTRDQztBQUNwQyxjQUFNLE1BQU4sSUFBZ0IsY0FBSSxZQUFwQjs7QUFFQSxjQUFNLEdBQU4sR0FBWSxLQUFLLEdBQWpCO0FBQ0EsY0FBTSxJQUFOLEdBQWEsS0FBSyxJQUFsQjtBQUNBLGNBQU0sV0FBTixHQUFvQixLQUFLLFdBQXpCO0FBQ0EsY0FBTSxVQUFOLEdBQW1CLEtBQUssVUFBeEIsQ0FsRG1DLENBa0RDOztBQUVwQztBQUNBO0FBQ0EsY0FBTSxPQUFOLEdBQWdCLE1BQU0sT0FBTixJQUFpQixFQUFFLE9BQU8sRUFBVCxFQUFhLFlBQVksRUFBekIsRUFBNkIsY0FBYyxJQUEzQyxFQUFqQzs7QUFFQSxZQUFJLEtBQUssT0FBTCxJQUFnQixLQUFLLE9BQUwsQ0FBYSxPQUFiLEtBQXlCLEtBQXpDLElBQWtELEtBQUssT0FBTCxDQUFhLEtBQS9ELElBQXdFLEtBQUssT0FBTCxDQUFhLEtBQXpGLEVBQWdHO0FBQzVGO0FBQ0E7QUFDQSxnQkFBSSxnQkFBZ0IsS0FBSyxTQUFMLENBQWUsS0FBSyxPQUFMLENBQWEsS0FBNUIsRUFBbUMsT0FBbkMsSUFBOEMsQ0FBbEU7QUFDQSxnQkFBSSxxQkFBcUIsS0FBSyxpQkFBTCxDQUF1QixLQUFLLE9BQUwsQ0FBYSxVQUFwQyxFQUFnRCxPQUFoRCxJQUEyRCxDQUFwRjs7QUFFQSxnQkFBSyxrQkFBa0IsQ0FBbEIsSUFBdUIsdUJBQXVCLENBQS9DLElBQXFELGdCQUFnQixDQUFyRSxJQUEwRSxxQkFBcUIsQ0FBbkcsRUFBc0c7QUFDbEc7QUFDQSxzQkFBTSxPQUFOLENBQWMsS0FBZCxDQUFvQixLQUFwQixHQUE0QixJQUE1QjtBQUNBLHNCQUFNLE9BQU4sQ0FBYyxVQUFkLENBQXlCLEtBQXpCLEdBQWlDLElBQWpDO0FBQ0Esc0JBQU0sT0FBTixDQUFjLEtBQWQsR0FBc0IsSUFBdEI7QUFDSCxhQUxELE1BTUs7QUFDRDtBQUNBLHNCQUFNLE9BQU4sQ0FBYyxLQUFkLENBQW9CLEtBQXBCLEdBQTRCLGdCQUFnQixLQUE1QztBQUNBLHNCQUFNLE9BQU4sQ0FBYyxVQUFkLENBQXlCLEtBQXpCLEdBQWlDLHFCQUFxQixVQUF0RDs7QUFFQSxzQkFBTSxPQUFOLENBQWMsS0FBZCxHQUFzQixLQUFLLE9BQUwsQ0FBYSxLQUFuQztBQUNBLHNCQUFNLE9BQU4sQ0FBYyxHQUFkLEdBQW9CLEtBQUssT0FBTCxDQUFhLEdBQWIsSUFBb0IsS0FBSyxHQUE3QztBQUNBLHNCQUFNLE9BQU4sQ0FBYyxJQUFkLEdBQXFCLEtBQUssT0FBTCxDQUFhLElBQWIsSUFBcUIsS0FBSyxJQUEvQztBQUNBLHNCQUFNLE9BQU4sQ0FBYyxXQUFkLEdBQTRCLEtBQUssT0FBTCxDQUFhLFdBQWIsSUFBNEIsS0FBSyxXQUE3RDtBQUNBLHNCQUFNLE9BQU4sQ0FBYyxLQUFkLEdBQXNCLEtBQUssT0FBTCxDQUFhLEtBQWIsSUFBc0IsS0FBSyxJQUFqRDs7QUFFQTtBQUNBLG9CQUFJLEtBQUssT0FBTCxDQUFhLEtBQWpCLEVBQXdCO0FBQ3BCLDBCQUFNLE9BQU4sQ0FBYyxLQUFkLEdBQXNCLEtBQUssVUFBTCxDQUFnQixLQUFLLE9BQUwsQ0FBYSxLQUE3QixFQUFvQyxPQUFwQyxDQUF0QjtBQUNILGlCQUZELE1BR0s7QUFDRCwwQkFBTSxPQUFOLENBQWMsS0FBZCxHQUFzQixNQUFNLEtBQTVCO0FBQ0g7O0FBRUQ7QUFDQSxvQkFBSSxNQUFNLE9BQU4sQ0FBYyxLQUFkLEdBQXNCLE1BQU0sS0FBaEMsRUFBdUM7QUFDbkMsMEJBQU0sT0FBTixDQUFjLEtBQWQsR0FBc0IsTUFBTSxLQUE1QjtBQUNIOztBQUVEO0FBQ0Esc0JBQU0sT0FBTixDQUFjLEtBQWQsSUFBdUIsR0FBdkI7QUFDSDtBQUNKLFNBdkNELE1Bd0NLO0FBQ0Qsa0JBQU0sT0FBTixDQUFjLEtBQWQsQ0FBb0IsS0FBcEIsR0FBNEIsSUFBNUI7QUFDQSxrQkFBTSxPQUFOLENBQWMsVUFBZCxDQUF5QixLQUF6QixHQUFpQyxJQUFqQztBQUNBLGtCQUFNLE9BQU4sQ0FBYyxLQUFkLEdBQXNCLElBQXRCO0FBQ0g7O0FBRUQsZUFBTyxLQUFQO0FBQ0gsS0E1TmdCO0FBOE5qQixlQTlOaUIsdUJBOE5KLElBOU5JLEVBOE5FO0FBQ2YsYUFBSyxLQUFMLEdBQWEsMEJBQVksd0JBQVosQ0FBcUMsS0FBSyxLQUExQyxDQUFiO0FBQ0EsYUFBSyxLQUFMLEdBQWEsMEJBQVksbUJBQVosQ0FBZ0MsS0FBSyxLQUFyQyxFQUE0QywwQkFBWSxVQUF4RCxDQUFiO0FBQ0EsYUFBSyxVQUFMLEdBQWtCLDBCQUFZLG1CQUFaLENBQWdDLEtBQUssS0FBckMsRUFBNEMsMEJBQVksVUFBeEQsQ0FBbEIsQ0FIZSxDQUd3RTtBQUN2RixhQUFLLENBQUwsR0FBUywwQkFBWSxtQkFBWixDQUFnQyxLQUFLLENBQXJDLEVBQXdDLDBCQUFZLFVBQXBELENBQVQ7O0FBRUEsWUFBSSxLQUFLLE9BQVQsRUFBa0I7QUFDZCxpQkFBSyxPQUFMLENBQWEsS0FBYixHQUFxQiwwQkFBWSx3QkFBWixDQUFxQyxLQUFLLE9BQUwsQ0FBYSxLQUFsRCxDQUFyQjtBQUNBLGlCQUFLLE9BQUwsQ0FBYSxLQUFiLEdBQXFCLDBCQUFZLG1CQUFaLENBQWdDLEtBQUssT0FBTCxDQUFhLEtBQTdDLEVBQW9ELDBCQUFZLFVBQWhFLENBQXJCO0FBQ0EsaUJBQUssT0FBTCxDQUFhLFVBQWIsR0FBMEIsMEJBQVksbUJBQVosQ0FBZ0MsS0FBSyxPQUFMLENBQWEsS0FBN0MsRUFBb0QsMEJBQVksVUFBaEUsQ0FBMUIsQ0FIYyxDQUd5RjtBQUMxRztBQUNELGVBQU8sSUFBUDtBQUNILEtBMU9nQjs7O0FBNE9qQjs7OztBQUlBLHNCQWhQaUIsOEJBZ1BFLEtBaFBGLEVBZ1BTO0FBQ3RCLFlBQUksSUFBSSxDQUFSOztBQUVBO0FBQ0EsYUFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLENBQTVCO0FBQ0EsYUFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLENBQTVCO0FBQ0EsYUFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLE1BQU0sQ0FBTixJQUFXLENBQXZDOztBQUVBO0FBQ0EsYUFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLEtBQUssVUFBTCxDQUFnQixNQUFNLEtBQXRCLENBQTVCOztBQUVBO0FBQ0EsYUFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLENBQTVCO0FBQ0EsYUFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLENBQTVCO0FBQ0EsYUFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLENBQTVCOztBQUVBO0FBQ0EsYUFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLE1BQU0sVUFBbEM7O0FBRUE7QUFDQSxhQUFLLGVBQUwsQ0FBcUIsR0FBckIsSUFBNEIsTUFBTSxLQUFOLENBQVksQ0FBWixJQUFpQixHQUE3QztBQUNBLGFBQUssZUFBTCxDQUFxQixHQUFyQixJQUE0QixNQUFNLEtBQU4sQ0FBWSxDQUFaLElBQWlCLEdBQTdDO0FBQ0EsYUFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLE1BQU0sS0FBTixDQUFZLENBQVosSUFBaUIsR0FBN0M7QUFDQSxhQUFLLGVBQUwsQ0FBcUIsR0FBckIsSUFBNEIsTUFBTSxLQUFOLENBQVksQ0FBWixJQUFpQixHQUE3Qzs7QUFFQTtBQUNBLFlBQUksS0FBSyxTQUFULEVBQW9CO0FBQ2hCLGlCQUFLLGVBQUwsQ0FBcUIsR0FBckIsSUFBNEIsTUFBTSxlQUFOLENBQXNCLENBQXRCLElBQTJCLEdBQXZEO0FBQ0EsaUJBQUssZUFBTCxDQUFxQixHQUFyQixJQUE0QixNQUFNLGVBQU4sQ0FBc0IsQ0FBdEIsSUFBMkIsR0FBdkQ7QUFDQSxpQkFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLE1BQU0sZUFBTixDQUFzQixDQUF0QixJQUEyQixHQUF2RDtBQUNBLGlCQUFLLGVBQUwsQ0FBcUIsR0FBckIsSUFBNEIsTUFBTSxlQUFOLENBQXNCLENBQXRCLElBQTJCLEdBQXZEO0FBQ0g7O0FBRUQ7QUFDQSxZQUFJLEtBQUssU0FBVCxFQUFvQjtBQUNoQixpQkFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLENBQTVCO0FBQ0EsaUJBQUssZUFBTCxDQUFxQixHQUFyQixJQUE0QixDQUE1QjtBQUNIOztBQUVELGVBQU8sS0FBSyxlQUFaO0FBQ0gsS0F4UmdCO0FBMFJqQixjQTFSaUIsc0JBMFJOLEtBMVJNLEVBMFJDLEtBMVJELEVBMFJRLFdBMVJSLEVBMFJxQixPQTFSckIsRUEwUjhCLE9BMVI5QixFQTBSdUM7QUFDcEQ7QUFDQSxhQUFLLGFBQUwsR0FBcUIsS0FBSyxxQkFBMUIsQ0FGb0QsQ0FFSDtBQUNqRCxZQUFJLE1BQU0sT0FBTixJQUFpQixNQUFNLE9BQU4sQ0FBYyxLQUFkLElBQXVCLElBQXhDLElBQWdELE1BQU0sT0FBTixDQUFjLEtBQWQsQ0FBb0IsS0FBcEIsSUFBNkIsSUFBakYsRUFBdUY7QUFDbkYsZ0JBQUksZ0JBQWdCLEtBQUssTUFBTCxDQUFZLE1BQU0sT0FBTixDQUFjLEtBQTFCLENBQXBCO0FBQ0EsZ0JBQUksYUFBSixFQUFtQjtBQUNmLDhCQUFjLFVBQWQsQ0FBeUIsUUFBUSxPQUFqQyxFQUEwQyxNQUFNLE9BQWhELEVBQXlELE9BQXpEO0FBQ0g7QUFDSjs7QUFFRDtBQUNBLGFBQUssYUFBTCxHQUFxQixLQUFLLG9CQUExQixDQVhvRCxDQVdKO0FBQ2hELFlBQUksa0JBQWtCLEtBQUssa0JBQUwsQ0FBd0IsS0FBeEIsQ0FBdEI7QUFDQSx1Q0FDSSxLQURKLEVBRUksTUFBTSxLQUZWLEVBR0ksV0FISixFQUlJLGVBSkosRUFLSTtBQUNJLGlCQUFLLE1BQU0sR0FEZjtBQUVJLGtCQUFNLE1BQU0sSUFGaEI7QUFHSSx5QkFBYSxNQUFNLFdBSHZCO0FBSUksMkJBQWUsS0FBSyxhQUFMLENBQW1CLEtBQW5CLENBQXlCLFNBSjVDO0FBS0ksK0JBQW1CLEdBTHZCLEVBSzRCO0FBQ3hCLDRCQUFnQixLQUFLLGFBQUwsQ0FBbUIsS0FBbkIsQ0FBeUIsVUFON0M7QUFPSSw0QkFBZ0IsQ0FBQyxNQUFNLEtBQU4sSUFBZSxNQUFNLFVBQXRCLElBQW9DLFFBQVEsSUFBUixDQUFhLFNBUHJFLEVBT2dGO0FBQzVFLGdDQUFvQixLQVJ4QixFQVErQjtBQUMzQiw0QkFBZ0IsV0FBVyxRQUFRLGNBVHZDO0FBVUksK0JBQW1CLENBQUMsTUFBTSxVQUFQLElBQXFCLE9BQXJCLElBQWdDLFFBQVEsaUJBVi9EO0FBV0ksaUNBQXFCLGNBQUksVUFBSixHQUFpQixRQUFRLElBQVIsQ0FBYSxTQUE5QixHQUEwQztBQVhuRSxTQUxKO0FBbUJILEtBMVRnQjtBQTRUakIsaUJBNVRpQix5QkE0VEgsUUE1VEcsRUE0VE8sS0E1VFAsRUE0VGMsV0E1VGQsRUE0VDJCLE9BNVQzQixFQTRUb0M7QUFDakQ7QUFDQSxhQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxTQUFTLE1BQTNCLEVBQW1DLEdBQW5DLEVBQXdDO0FBQ3BDLGlCQUFLLFVBQUwsQ0FBZ0IsU0FBUyxDQUFULENBQWhCLEVBQTZCLEtBQTdCLEVBQW9DLFdBQXBDLEVBQWlELE9BQWpELEVBQTBELEVBQUUsZ0JBQWdCLElBQWxCLEVBQXdCLG1CQUFtQixJQUEzQyxFQUExRDtBQUNIO0FBQ0o7QUFqVWdCLENBQXJCOzs7Ozs7Ozs7O3lwQkNkQTs7QUFLcUM7OztBQUhyQzs7OztBQUNBOztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUEsSUFBSSxLQUFLLFFBQVEsSUFBUixDQUFUO0FBQ0EsSUFBTSx5QkFBeUIsR0FBRyxZQUFILENBQWdCLFlBQVkscUJBQTVCLEVBQW1ELE1BQW5ELENBQS9CO0FBQ0EsSUFBTSwyQkFBMkIsR0FBRyxZQUFILENBQWdCLFlBQVksdUJBQTVCLEVBQXFELE1BQXJELENBQWpDOztBQUVBLElBQU0sWUFBWSxzQkFBVyxTQUE3Qjs7QUFFTyxJQUFJLDBCQUFTLE9BQU8sTUFBUCxjQUFiOztBQUVQO0FBQ0EsT0FBTyxNQUFQLENBQWMsTUFBZDs7QUFFQSxPQUFPLE1BQVAsQ0FBYyxNQUFkLEVBQXNCO0FBQ2xCLFVBQU0sUUFEWTtBQUVsQixjQUFVLElBRlE7QUFHbEIsZUFBVyxJQUhPLEVBR0E7QUFDbEIsV0FBTyxTQUpXLEVBSUE7O0FBRWxCLFFBTmtCLGtCQU1DO0FBQUEsWUFBZCxPQUFjLHVFQUFKLEVBQUk7O0FBQ2YscUJBQU0sSUFBTixDQUFXLEtBQVgsQ0FBaUIsSUFBakIsRUFBdUIsU0FBdkI7O0FBRUE7QUFDQSxhQUFLLGlCQUFMLEdBQXlCLHNCQUF6QjtBQUNBLGFBQUssbUJBQUwsR0FBMkIsd0JBQTNCOztBQUVBLFlBQUksVUFBVSxDQUNWLEVBQUUsTUFBTSxZQUFSLEVBQXNCLE1BQU0sQ0FBNUIsRUFBK0IsTUFBTSxvQkFBRyxLQUF4QyxFQUErQyxZQUFZLEtBQTNELEVBRFUsRUFFVixFQUFFLE1BQU0sU0FBUixFQUFtQixNQUFNLENBQXpCLEVBQTRCLE1BQU0sb0JBQUcsS0FBckMsRUFBNEMsWUFBWSxLQUF4RCxFQUZVLEVBR1YsRUFBRSxNQUFNLFlBQVIsRUFBc0IsTUFBTSxDQUE1QixFQUErQixNQUFNLG9CQUFHLGNBQXhDLEVBQXdELFlBQVksSUFBcEUsRUFIVSxFQUlWLEVBQUUsTUFBTSxVQUFSLEVBQW9CLE1BQU0sQ0FBMUIsRUFBNkIsTUFBTSxvQkFBRyxLQUF0QyxFQUE2QyxZQUFZLEtBQXpELEVBSlUsRUFLVixFQUFFLE1BQU0sU0FBUixFQUFtQixNQUFNLENBQXpCLEVBQTRCLE1BQU0sb0JBQUcsYUFBckMsRUFBb0QsWUFBWSxJQUFoRSxFQUxVLENBQWQ7O0FBUUE7QUFDQSxhQUFLLFNBQUwsR0FBaUIsSUFBakI7QUFDQSxnQkFBUSxJQUFSLENBQWEsRUFBRSxNQUFNLG1CQUFSLEVBQTZCLE1BQU0sQ0FBbkMsRUFBc0MsTUFBTSxvQkFBRyxhQUEvQyxFQUE4RCxZQUFZLElBQTFFLEVBQWI7O0FBRUEsYUFBSyxhQUFMLEdBQXFCLDRCQUFpQixPQUFqQixDQUFyQjs7QUFFQTtBQUNBLFlBQUksS0FBSyxLQUFMLEtBQWUsU0FBbkIsRUFBOEI7QUFDMUIsaUJBQUssT0FBTCxDQUFhLG1CQUFiLEdBQW1DLElBQW5DO0FBQ0g7O0FBRUQ7QUFDQSxhQUFLLE9BQUwsQ0FBYSxRQUFiLEdBQXdCLEtBQUssT0FBTCxDQUFhLFFBQWIsSUFBeUIsRUFBakQ7QUFDQSxhQUFLLE9BQUwsQ0FBYSxRQUFiLENBQXNCLGVBQXRCLEdBQXdDLGtCQUFRLE9BQWhEOztBQUVBLFlBQUksS0FBSyxPQUFULEVBQWtCO0FBQ2QsaUJBQUssT0FBTCxDQUFhLHFCQUFiLEdBQXFDLElBQXJDO0FBQ0EsaUJBQUssT0FBTCxDQUFhLFFBQWIsQ0FBc0IsU0FBdEIsR0FBa0MsS0FBSyxPQUF2QztBQUNIOztBQUVEO0FBQ0EsYUFBSyxPQUFMLENBQWEscUJBQWIsR0FBcUMsSUFBckM7O0FBRUE7QUFDQSxhQUFLLE9BQUwsQ0FBYSx3QkFBYixHQUF3QyxJQUF4QztBQUNBLGFBQUssT0FBTCxDQUFhLDZCQUFiLEdBQTZDLENBQTdDLENBeENlLENBd0NpQzs7QUFFaEQ7QUFDQSxZQUFJLHlCQUFjLHNCQUFkLEtBQXlDLElBQTdDLEVBQW1EO0FBQy9DLGlCQUFLLFlBQUwsR0FBb0IsQ0FBcEI7QUFDQSxpQkFBSyxPQUFMLENBQWEsb0JBQWIsR0FBb0MsSUFBcEM7QUFDSCxTQUhELE1BSUs7QUFDRCxpQkFBSyxZQUFMLEdBQW9CLElBQXBCLENBREMsQ0FDeUI7QUFDMUIsaUJBQUssT0FBTCxDQUFhLG9CQUFiLEdBQW9DLElBQUksS0FBSyxZQUE3QztBQUNIOztBQUVEO0FBQ0EsWUFBSSx5QkFBYyw2QkFBZCxLQUFnRCxJQUFwRCxFQUEwRDtBQUN0RCxpQkFBSyxPQUFMLENBQWEsMEJBQWIsR0FBMEMsNEJBQTFDLENBRHNELENBQ1k7QUFDckU7O0FBRUQsYUFBSyxzQkFBTCxHQUE4QixLQUFLLElBQUwsR0FBVSxTQUF4QztBQUNBLGFBQUssb0JBQUwsR0FBNEIsS0FBSyxJQUFMLEdBQVUsT0FBdEM7O0FBRUEsYUFBSyxLQUFMO0FBQ0gsS0FuRWlCO0FBcUVsQixTQXJFa0IsbUJBcUVUO0FBQ0wsYUFBSyxNQUFMLEdBQWMsRUFBZDtBQUNBLGFBQUssU0FBTDtBQUNBLGFBQUssdUJBQUwsR0FBK0IsRUFBL0IsQ0FISyxDQUc4QjtBQUN0QyxLQXpFaUI7OztBQTJFbEI7QUFDQSxjQTVFa0Isc0JBNEVOLE9BNUVNLEVBNEVHLElBNUVILEVBNEVTLE9BNUVULEVBNEVrQjtBQUNoQyxZQUFJLE9BQU8sUUFBUSxJQUFuQjtBQUNBLFlBQUksS0FBSyxVQUFMLEtBQW9CLEtBQUssVUFBN0IsRUFBeUM7QUFDckM7QUFDSDs7QUFFRDtBQUNBO0FBQ0EsZUFBTyxLQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBUDtBQUNBLFlBQUksQ0FBQyxJQUFMLEVBQVc7QUFDUDtBQUNIOztBQUVELFlBQUksUUFBUSxFQUFaO0FBQ0EsY0FBTSxLQUFOLEdBQWMsS0FBSyxVQUFMLENBQWdCLEtBQUssS0FBckIsRUFBNEIsT0FBNUIsQ0FBZDs7QUFFQTs7QUFFQTtBQUNBLFlBQUksQ0FBQyxNQUFNLEtBQVAsSUFBZ0IsQ0FBQyxLQUFLLE9BQTFCLEVBQW1DO0FBQy9CO0FBQ0g7O0FBRUQ7QUFDQSxZQUFJLG9CQUFKO0FBQ0EsWUFBSSxLQUFLLFVBQUwsRUFBSixFQUF1QjtBQUNuQiwwQkFBYyxLQUFLLFdBQUwsQ0FBaUIsSUFBakIsRUFBdUIsT0FBdkIsQ0FBZDtBQUNBLGdCQUFJLFdBQUosRUFBaUI7QUFDYixzQkFBTSxTQUFOLEdBQWtCLFlBQVksU0FBOUI7QUFDSCxhQUZELE1BR0s7QUFDRDtBQUNIO0FBQ0o7O0FBRUQ7QUFDQSxjQUFNLElBQU4sR0FBYSxLQUFLLElBQWxCO0FBQ0EsWUFBSSxDQUFDLE1BQU0sSUFBWCxFQUFpQjtBQUNiLGdCQUFJLFdBQUosRUFBaUI7QUFDYixzQkFBTSxJQUFOLEdBQWEsWUFBWSxJQUF6QjtBQUNILGFBRkQsTUFHSztBQUNELHNCQUFNLElBQU4sR0FBYSxDQUFDLEVBQUQsRUFBSyxFQUFMLENBQWI7QUFDSDtBQUNKLFNBUEQsTUFRSztBQUNELGtCQUFNLElBQU4sR0FBYSwwQkFBWSxrQkFBWixDQUErQixNQUFNLElBQXJDLEVBQTJDLE9BQTNDLENBQWI7QUFDSDs7QUFFRDtBQUNBLGNBQU0sSUFBTixHQUFhLENBQ1QsS0FBSyxHQUFMLENBQVMsTUFBTSxJQUFOLENBQVcsQ0FBWCxLQUFpQixJQUFqQixHQUF3QixNQUFNLElBQU4sQ0FBVyxDQUFYLENBQXhCLEdBQXdDLE1BQU0sSUFBdkQsRUFBNkQsR0FBN0QsQ0FEUyxFQUVULEtBQUssR0FBTCxDQUFTLE1BQU0sSUFBTixDQUFXLENBQVgsS0FBaUIsSUFBakIsR0FBd0IsTUFBTSxJQUFOLENBQVcsQ0FBWCxDQUF4QixHQUF3QyxNQUFNLElBQXZELEVBQTZELEdBQTdELENBRlMsQ0FBYjs7QUFLQTtBQUNBLGNBQU0sU0FBTixHQUFrQixLQUFLLFNBQXZCO0FBQ0EsY0FBTSwwQkFBTixHQUFtQywwQkFBWSxrQkFBWixDQUErQixLQUFLLDBCQUFwQyxFQUFnRSxPQUFoRSxDQUFuQzs7QUFFQTtBQUNBLFlBQUksTUFBTSxTQUFOLEtBQW9CLFVBQVUsTUFBOUIsSUFBd0MsS0FBSyxpQkFBakQsRUFBb0U7QUFDaEUsa0JBQU0saUJBQU4sR0FBMEIsMEJBQVksa0JBQVosQ0FBK0IsS0FBSyxpQkFBcEMsRUFBdUQsT0FBdkQsQ0FBMUI7QUFDSDs7QUFFRDtBQUNBLGNBQU0sS0FBTixHQUFjLDBCQUFZLFlBQVosQ0FBeUIsS0FBSyxLQUE5QixFQUFxQyxPQUFyQyxDQUFkOztBQUVBO0FBQ0EsY0FBTSxDQUFOLEdBQVcsS0FBSyxDQUFMLElBQVUsMEJBQVksMEJBQVosQ0FBdUMsS0FBSyxDQUE1QyxFQUErQyxPQUEvQyxDQUFYLElBQXVFLDBCQUFZLFFBQVosQ0FBcUIsQ0FBdEc7O0FBRUEsY0FBTSxVQUFOLEdBQW1CLEtBQUssVUFBeEIsQ0F0RWdDLENBc0VJOztBQUVwQyxjQUFNLE9BQU4sR0FBZ0IsQ0FBaEIsQ0F4RWdDLENBd0ViOztBQUVuQixhQUFLLGFBQUwsQ0FBbUIsS0FBbkIsRUFBMEIsT0FBMUIsRUFBbUMsSUFBbkMsRUFBeUMsT0FBekMsRUFBa0QsSUFBbEQ7O0FBRUE7QUFDQSxZQUFJLEtBQ0EsS0FBSyxJQUFMLElBQ0EsS0FBSyxJQUFMLENBQVUsT0FBVixLQUFzQixLQUR0QixJQUMrQjtBQUMvQixhQUFLLGdCQUFMLENBQXNCLE9BQXRCLEVBQStCLEtBQUssSUFBcEMsRUFBMEMsT0FBMUMsRUFBbUQsSUFBbkQsQ0FISjs7QUFLQSxZQUFJLEVBQUosRUFBUTtBQUNKLGVBQUcsTUFBSCxDQUFVLE1BQVYsR0FBbUIsS0FBbkIsQ0FESSxDQUNzQjs7QUFFMUI7QUFDQTtBQUNBLGVBQUcsTUFBSCxDQUFVLFFBQVYsR0FBcUIsS0FBSyxJQUFMLENBQVUsUUFBVixHQUFxQixLQUFLLEdBQUwsQ0FBUyxHQUFHLE1BQUgsQ0FBVSxRQUFuQixFQUE2QixNQUFNLFFBQU4sR0FBaUIsR0FBOUMsQ0FBckIsR0FBMkUsTUFBTSxRQUFOLEdBQWlCLEdBQWpIOztBQUVBO0FBQ0E7QUFDQSxlQUFHLE1BQUgsQ0FBVSxjQUFWLEdBQTJCLEtBQTNCOztBQUVBLGdDQUFVLFFBQVYsQ0FBbUIsS0FBSyxvQkFBeEIsRUFBOEMsS0FBSyxHQUFuRDtBQUNIOztBQUVEO0FBQ0EsWUFBSSxDQUFDLEtBQUssU0FBTCxDQUFlLEtBQUssR0FBcEIsQ0FBTCxFQUErQjtBQUMzQixpQkFBSyxTQUFMLENBQWUsSUFBZjtBQUNIOztBQUVELGFBQUssTUFBTCxDQUFZLEtBQUssR0FBakIsRUFBc0IsSUFBdEIsQ0FBMkI7QUFDdkIsNEJBRHVCLEVBQ2QsVUFEYyxFQUNSLGdCQURRLEVBQ0MsWUFERDtBQUV2QiwwQkFBYztBQUZTLFNBQTNCOztBQUtBO0FBQ0EsNEJBQVUsUUFBVixDQUFtQixLQUFLLHNCQUF4QixFQUFnRCxLQUFLLEdBQXJEO0FBQ0gsS0F4TGlCO0FBMExsQixjQTFMa0Isd0JBMExMO0FBQ1QsZUFBTyxLQUFLLE9BQUwsSUFBZ0Isa0JBQVEsUUFBUixDQUFpQixLQUFLLE9BQXRCLENBQWhCLElBQWtELGtCQUFRLFFBQVIsQ0FBaUIsS0FBSyxPQUF0QixFQUErQixPQUF4RjtBQUNILEtBNUxpQjtBQThMbEIsaUJBOUxrQix5QkE4TEgsTUE5TEcsRUE4TEs7QUFDbkIsWUFBSSxPQUFPLGtCQUFRLFFBQVIsQ0FBaUIsS0FBSyxPQUF0QixFQUErQixPQUEvQixDQUF1QyxNQUF2QyxLQUFrRCxrQkFBUSxhQUFSLENBQXNCLEtBQUssT0FBM0IsRUFBb0MsTUFBcEMsQ0FBN0Q7QUFDQSxZQUFJLFVBQVUsQ0FBQyxJQUFmLEVBQXFCO0FBQ2pCLGdCQUFJLENBQUMsS0FBSyx1QkFBTCxDQUE2QixNQUE3QixDQUFMLEVBQTJDO0FBQUU7QUFDekMsbUNBQUksT0FBSix5QkFBaUMsS0FBSyxJQUF0QyxvQ0FBdUUsTUFBdkUseUJBQStGLEtBQUssT0FBcEc7QUFDQSxxQkFBSyx1QkFBTCxDQUE2QixNQUE3QixJQUF1QyxJQUF2QztBQUNIO0FBQ0o7QUFDRCxlQUFPLElBQVA7QUFDSCxLQXZNaUI7QUF5TWxCLGVBek1rQix1QkF5TUwsSUF6TUssRUF5TUMsT0F6TUQsRUF5TVU7QUFDeEIsWUFBSSxTQUFTLDBCQUFZLFlBQVosQ0FBeUIsS0FBSyxNQUE5QixFQUFzQyxPQUF0QyxDQUFiO0FBQ0EsWUFBSSxjQUFjLEtBQUssYUFBTCxDQUFtQixNQUFuQixLQUE4QixLQUFLLGFBQUwsQ0FBbUIsS0FBSyxjQUF4QixDQUFoRDtBQUNBLGVBQU8sV0FBUDtBQUNILEtBN01pQjs7O0FBK01sQjtBQUNBLGFBaE5rQixxQkFnTlAsSUFoTk8sRUFnTkQ7QUFDYixhQUFLLE1BQUwsQ0FBWSxLQUFLLEdBQWpCLElBQXdCLEVBQXhCO0FBQ0EsZUFBTyxhQUFNLFNBQU4sQ0FBZ0IsSUFBaEIsQ0FBcUIsSUFBckIsRUFBMkIsSUFBM0IsQ0FBUDtBQUNILEtBbk5pQjs7O0FBcU5sQjtBQUNBLFdBdE5rQixtQkFzTlQsSUF0TlMsRUFzTkg7QUFBQTs7QUFDWCxZQUFJLEtBQUssUUFBVCxFQUFtQjtBQUNmLCtCQUFJLE9BQUosYUFBc0IsS0FBSyxJQUEzQixxREFBK0UsS0FBSyxHQUFwRjtBQUNBO0FBQ0g7O0FBRUQsWUFBSSxRQUFRLEtBQUssTUFBTCxDQUFZLEtBQUssR0FBakIsQ0FBWjtBQUNBLGFBQUssTUFBTCxDQUFZLEtBQUssR0FBakIsSUFBd0IsRUFBeEI7O0FBRUE7QUFDQSxZQUFJLFlBQVksRUFBaEI7QUFDQSxZQUFJLGFBQWEsRUFBakI7O0FBRUEsY0FBTSxPQUFOLENBQWMsYUFBSztBQUNmLGdCQUFJLFFBQVEsRUFBRSxLQUFkO0FBQ0EsZ0JBQUksVUFBVSxFQUFFLE9BQWhCO0FBQ0EsZ0JBQUksV0FBVyxRQUFRLFFBQXZCOztBQUVBLGdCQUFJLGlCQUFpQixNQUFLLFdBQUwsQ0FBaUIsTUFBTSxJQUF2QixFQUE2QixRQUE3QixFQUF1QyxLQUF2QyxDQUFyQjtBQUNBLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksZUFBZSxNQUFuQyxFQUEyQyxHQUEzQyxFQUFnRDtBQUM1QyxvQkFBSSxRQUFRLGVBQWUsQ0FBZixDQUFaO0FBQ0Esb0JBQUksWUFBWTtBQUNaLG9DQURZO0FBRVosMEJBQU0sRUFBRSxJQUZJO0FBR1osNkJBQVMsRUFBRSxPQUhDO0FBSVosZ0NBSlk7QUFLWjtBQUxZLGlCQUFoQjtBQU9BLDJCQUFXLElBQVgsQ0FBZ0IsU0FBaEI7O0FBRUEsb0JBQUksRUFBRSxZQUFOLEVBQW9CO0FBQ2hCLHdCQUFJLFdBQVc7QUFDWCx3Q0FEVztBQUVYLDhCQUFNLEVBQUUsWUFBRixDQUFlLElBRlY7QUFHWCxpQ0FBUyxFQUFFLE9BSEE7QUFJWCw4QkFBTSxFQUFFLFlBQUYsQ0FBZSxJQUpWO0FBS1gsMkNBQW1CLEVBQUUsWUFBRixDQUFlLGlCQUx2QjtBQU1YLGdDQUFRLEVBQUUsWUFBRixDQUFlLE1BTlo7QUFPWCxxQ0FBYSxLQVBGO0FBUVgsZ0NBQVEsU0FSRyxDQVFTO0FBUlQscUJBQWY7QUFVQSw4QkFBVSxJQUFWLENBQWUsUUFBZjs7QUFFQTtBQUNBO0FBQ0Esd0JBQUksQ0FBQyxFQUFFLElBQUYsQ0FBTyxJQUFQLENBQVksUUFBakIsRUFBMkI7QUFDdkIsa0NBQVUsTUFBVixHQUFtQixRQUFuQixDQUR1QixDQUNNO0FBQ2hDO0FBQ0o7QUFDSjtBQUNKLFNBckNEOztBQXVDQTtBQUNBLGVBQU8sUUFDSCxHQURHLENBQ0M7QUFDQTtBQUNBLDRCQUFVLE9BQVYsQ0FBa0IsVUFBbEIsRUFBOEIsS0FBSyxzQkFBbkMsRUFBMkQsS0FBSyxHQUFoRSxFQUFxRSxJQUFyRSxDQUEwRSxzQkFBYztBQUNwRix1QkFBVyxPQUFYLENBQW1CLGFBQUs7QUFDcEIsc0JBQUssYUFBTCxHQUFxQixFQUFFLEtBQXZCO0FBQ0Esc0JBQUssYUFBTCxDQUFtQixLQUFuQixHQUEyQixFQUFFLEtBQTdCO0FBQ0EsNkJBQU0sVUFBTixDQUFpQixJQUFqQixRQUE0QixFQUFFLE9BQTlCLEVBQXVDLEVBQUUsSUFBekMsRUFBK0MsRUFBRSxPQUFqRDtBQUNILGFBSkQ7QUFLSCxTQU5ELENBRkE7QUFTQTtBQUNBLGFBQUssaUJBQUwsQ0FBdUIsSUFBdkIsRUFBNkIsS0FBSyxvQkFBbEMsRUFBd0QsU0FBeEQsRUFDSSxJQURKLENBQ1M7QUFBQSxtQkFBVSxNQUFLLDBCQUFMLENBQWdDLElBQWhDLEVBQXNDLE1BQUssb0JBQTNDLEVBQWlFLE1BQWpFLENBQVY7QUFBQSxTQURULENBVkEsQ0FERCxFQWFBLElBYkEsQ0FhSyxnQkFBb0M7QUFBQTtBQUFBO0FBQUEsZ0JBQTlCLE1BQThCLFVBQTlCLE1BQThCO0FBQUEsZ0JBQXRCLEtBQXNCLFVBQXRCLEtBQXNCO0FBQUEsZ0JBQWYsT0FBZSxVQUFmLE9BQWU7O0FBQ3hDO0FBQ0EsZ0JBQUksVUFBVSxLQUFkLEVBQXFCO0FBQ2pCO0FBQ0EsdUJBQU8sT0FBUCxDQUFlLGFBQUs7QUFDaEIsd0JBQUksb0JBQW9CLEVBQUUsaUJBQTFCO0FBQ0Esd0JBQUksWUFBWSxNQUFNLGlCQUFOLEtBQTRCLE1BQU0saUJBQU4sRUFBeUIsRUFBRSxJQUEzQixDQUE1Qzs7QUFFQTtBQUNBLHdCQUFJLFFBQVEsTUFBSyxhQUFqQjtBQUNBLDBCQUFNLEtBQU4sR0FBYyxFQUFFLEtBQWhCO0FBQ0EsMEJBQU0sSUFBTixHQUFhLFVBQVUsSUFBVixDQUFlLFlBQTVCO0FBQ0EsMEJBQU0sU0FBTixHQUFrQixVQUFVLEtBQVYsQ0FBZ0IsRUFBRSxLQUFGLENBQVEsS0FBeEIsRUFBK0IsU0FBakQ7QUFDQSwwQkFBTSxLQUFOLEdBQWMsRUFBRSxLQUFGLENBQVEsS0FBUixJQUFpQixDQUEvQjtBQUNBLDBCQUFNLE9BQU4sR0FBZ0IsQ0FBaEIsQ0FWZ0IsQ0FVRzs7QUFFbkIsaUNBQU0sVUFBTixDQUFpQixJQUFqQixRQUE0QixFQUFFLE9BQTlCLEVBQXVDLEVBQUUsSUFBekMsRUFBK0MsRUFBRSxPQUFqRDtBQUNILGlCQWJEO0FBY0g7QUFDRCxrQkFBSyxRQUFMLENBQWMsSUFBZDs7QUFFQTtBQUNBLG1CQUFPLGFBQU0sT0FBTixDQUFjLElBQWQsUUFBeUIsSUFBekIsRUFBK0IsSUFBL0IsQ0FBb0MscUJBQWE7QUFDcEQ7QUFDQSxvQkFBSSxXQUFXLFNBQWYsRUFBMEI7QUFDdEIsOEJBQVUsUUFBVixHQUFxQixVQUFVLFFBQVYsSUFBc0IsRUFBM0M7QUFDQSw4QkFBVSxRQUFWLEdBQXFCLFVBQVUsUUFBVixJQUFzQixFQUEzQzs7QUFFQSw4QkFBVSxRQUFWLENBQW1CLGVBQW5CLEdBQXFDLE9BQXJDO0FBQ0EsOEJBQVUsUUFBVixDQUFtQixJQUFuQixDQUF3QixPQUF4QixFQUxzQixDQUtZO0FBQ3JDO0FBQ0QsdUJBQU8sU0FBUDtBQUNILGFBVk0sQ0FBUDtBQVdILFNBOUNFLENBQVA7QUErQ0gsS0ExVGlCO0FBNFRsQixlQTVUa0IsdUJBNFRMLElBNVRLLEVBNFRDO0FBQ2YsYUFBSyxLQUFMLEdBQWEsMEJBQVksd0JBQVosQ0FBcUMsS0FBSyxLQUExQyxDQUFiO0FBQ0EsYUFBSyxDQUFMLEdBQVMsMEJBQVksbUJBQVosQ0FBZ0MsS0FBSyxDQUFyQyxFQUF3QywwQkFBWSxVQUFwRCxDQUFUOztBQUVBO0FBQ0EsYUFBSyxJQUFMLEdBQVksMEJBQVksbUJBQVosQ0FBZ0MsS0FBSyxJQUFyQyxFQUEyQztBQUFBLG1CQUFLLE1BQU0sT0FBTixDQUFjLENBQWQsSUFBbUIsRUFBRSxHQUFGLENBQU0sVUFBTixDQUFuQixHQUF1QyxXQUFXLENBQVgsQ0FBNUM7QUFBQSxTQUEzQyxDQUFaOztBQUVBO0FBQ0EsYUFBSyxNQUFMLEdBQWMsMEJBQVksbUJBQVosQ0FBZ0MsS0FBSyxNQUFyQyxFQUE2QztBQUFBLG1CQUFNLE1BQU0sT0FBTixDQUFjLENBQWQsS0FBb0IsRUFBRSxHQUFGLENBQU0sVUFBTixDQUFyQixJQUEyQyxDQUFoRDtBQUFBLFNBQTdDLENBQWQ7O0FBRUE7QUFDQSxhQUFLLE1BQUwsR0FBYywwQkFBWSxtQkFBWixDQUFnQyxLQUFLLE1BQXJDLEVBQTZDO0FBQUEsbUJBQUssQ0FBQyxNQUFNLE9BQU4sQ0FBYyxDQUFkLElBQW1CLENBQW5CLEdBQXVCLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBeEIsRUFBZ0MsR0FBaEMsQ0FBb0MsVUFBcEMsS0FBbUQsQ0FBeEQ7QUFBQSxTQUE3QyxDQUFkOztBQUVBO0FBQ0EsYUFBSyxlQUFMLEdBQXVCLDBCQUFZLG1CQUFaLENBQWdDLEtBQUssZUFBckMsRUFBc0QsVUFBdEQsQ0FBdkI7O0FBRUE7QUFDQSxhQUFLLFNBQUwsR0FBaUIsVUFBVSxLQUFLLFNBQUwsSUFBa0IsS0FBSyxTQUFMLENBQWUsV0FBZixFQUE1QixDQUFqQjtBQUNBLFlBQUksS0FBSyxTQUFMLElBQWtCLElBQXRCLEVBQTRCO0FBQ3hCLGlCQUFLLFNBQUwsR0FBaUIsVUFBVSxNQUEzQjtBQUNIOztBQUVELGFBQUssaUJBQUwsR0FBeUIsS0FBSyxpQkFBTCxJQUEwQixJQUExQixHQUFpQyxLQUFLLGlCQUF0QyxHQUEwRCxFQUFuRixDQXRCZSxDQXNCd0U7QUFDdkYsYUFBSyxpQkFBTCxHQUF5QiwwQkFBWSxtQkFBWixDQUFnQyxLQUFLLGlCQUFyQyxFQUF3RCxVQUF4RCxDQUF6Qjs7QUFFQSxhQUFLLDBCQUFMLEdBQWtDLEtBQUssMEJBQUwsSUFBbUMsSUFBbkMsR0FBMEMsS0FBSywwQkFBL0MsR0FBNEUsQ0FBOUc7QUFDQSxhQUFLLDBCQUFMLEdBQWtDLDBCQUFZLG1CQUFaLENBQWdDLEtBQUssMEJBQXJDLEVBQWlFLFVBQWpFLENBQWxDOztBQUVBLFlBQUksT0FBTyxLQUFLLEtBQVosS0FBc0IsUUFBMUIsRUFBb0M7QUFDaEMsaUJBQUssS0FBTCxHQUFhLEtBQUssS0FBTCxHQUFhLEtBQUssRUFBbEIsR0FBdUIsR0FBcEM7QUFDSCxTQUZELE1BR0s7QUFDRCxpQkFBSyxLQUFMLEdBQWEsS0FBSyxLQUFMLElBQWMsQ0FBM0IsQ0FEQyxDQUM2QjtBQUNqQzs7QUFFRDtBQUNBLGFBQUssSUFBTCxHQUFZLEtBQUssY0FBTCxDQUFvQixLQUFLLElBQXpCLENBQVosQ0FwQ2UsQ0FvQzZCO0FBQzVDLFlBQUksS0FBSyxJQUFULEVBQWU7QUFDWCxpQkFBSyxJQUFMLENBQVUsR0FBVixHQUFnQixLQUFLLEdBQXJCLENBRFcsQ0FDZTtBQUMxQixpQkFBSyxJQUFMLENBQVUsWUFBVixHQUF5QixLQUFLLElBQUwsQ0FBVSxZQUFWLElBQTBCLEtBQUssWUFBeEQsQ0FGVyxDQUUyRDtBQUN0RSxpQkFBSyxJQUFMLENBQVUsTUFBVixHQUFtQixLQUFLLElBQUwsQ0FBVSxNQUFWLElBQW9CLEtBQUssY0FBNUM7QUFDQSxpQkFBSyxJQUFMLENBQVUsUUFBVixHQUFzQixPQUFPLEtBQUssSUFBTCxDQUFVLFFBQWpCLEtBQThCLFNBQS9CLEdBQTRDLEtBQUssSUFBTCxDQUFVLFFBQXRELEdBQWlFLEtBQXRGLENBSlcsQ0FJa0Y7QUFDaEc7O0FBRUQsZUFBTyxJQUFQO0FBQ0gsS0F6V2lCOzs7QUEyV2xCO0FBQ0Esb0JBQWdCLENBQUMsUUFBRCxFQUFXLEtBQVgsRUFBa0IsT0FBbEIsRUFBMkIsTUFBM0IsQ0E1V0U7O0FBOFdsQjtBQUNBLGlCQS9Xa0IseUJBK1dILE1BL1dHLEVBK1dLLE9BL1dMLEVBK1djLElBL1dkLEVBK1dvQixPQS9XcEIsRUErVzZCLElBL1c3QixFQStXbUM7QUFDakQsWUFBSSxTQUFTLFVBQVUsRUFBdkI7QUFDQSxlQUFPLEVBQVAsR0FBWSxPQUFaO0FBQ0EsZUFBTyxlQUFQLEdBQXlCLEtBQUssZUFBTCxJQUF3QixDQUFqRDs7QUFFQTtBQUNBLGVBQU8sT0FBUCxHQUFrQixLQUFLLE9BQUwsS0FBaUIsS0FBbEIsR0FBMkIsS0FBM0IsR0FBbUMsSUFBcEQ7O0FBRUE7QUFDQSxlQUFPLGNBQVAsR0FBeUIsS0FBSyxjQUFMLElBQXVCLElBQXhCLEdBQWdDLEtBQUssY0FBckMsR0FBc0QsS0FBOUU7O0FBRUE7QUFDQSxlQUFPLGNBQVAsR0FBd0IsS0FBeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBTyxNQUFQLEdBQWdCLEtBQUssTUFBckI7O0FBRUE7QUFDQSxlQUFPLE1BQVAsR0FBZ0IsMEJBQVksa0JBQVosQ0FBK0IsS0FBSyxNQUFwQyxFQUE0QyxPQUE1QyxLQUF3RCwwQkFBWSxRQUFwRjtBQUNBLGVBQU8sTUFBUCxHQUFnQiwwQkFBWSxrQkFBWixDQUErQixLQUFLLE1BQXBDLEVBQTRDLE9BQTVDLEtBQXdELDBCQUFZLFFBQXBGOztBQUVBO0FBQ0EsZUFBTyxlQUFQLEdBQXlCLDBCQUFZLGtCQUFaLENBQStCLEtBQUssZUFBcEMsRUFBcUQsT0FBckQsQ0FBekI7QUFDQSxZQUFJLE9BQU8sZUFBWCxFQUE0QjtBQUN4QixtQkFBTyxlQUFQLElBQTBCLE9BQU8sZUFBakM7O0FBRUEsZ0JBQUksT0FBTyxLQUFLLFlBQVosS0FBNkIsVUFBakMsRUFBNkM7QUFDekMsdUJBQU8sWUFBUCxHQUFzQixLQUFLLFlBQUwsQ0FBa0IsT0FBbEIsQ0FBdEI7QUFDSCxhQUZELE1BR0ssSUFBSSxPQUFPLEtBQUssWUFBWixLQUE2QixRQUFqQyxFQUEyQztBQUM1Qyx1QkFBTyxZQUFQLEdBQXNCLEtBQUssWUFBM0I7QUFDSCxhQUZJLE1BR0E7QUFDRCx1QkFBTyxZQUFQLEdBQXNCLEtBQUssR0FBM0IsQ0FEQyxDQUMrQjtBQUNuQztBQUNKOztBQUVEO0FBQ0EsWUFBSSxXQUFXLEtBQUssUUFBcEI7QUFDQSxZQUFJLFlBQVksSUFBaEIsRUFBc0I7QUFDbEIsZ0JBQUksT0FBTyxRQUFQLEtBQW9CLFVBQXhCLEVBQW9DO0FBQ2hDLDJCQUFXLFNBQVMsT0FBVCxDQUFYO0FBQ0g7QUFDSixTQUpELE1BS0s7QUFDRCx1QkFBVyxDQUFDLENBQUQsS0FBTyxDQUFsQixDQURDLENBQ29CO0FBQ3hCO0FBQ0QsZUFBTyxRQUFQLEdBQWtCLFFBQWxCOztBQUVBLGVBQU8sTUFBUDtBQUNILEtBbmFpQjs7O0FBcWFsQjtBQUNBLG1CQXRha0IsMkJBc2FELFFBdGFDLEVBc2FTLGFBdGFULEVBc2F3QjtBQUN0QyxZQUFJLFNBQVMsRUFBYjtBQUNBLGFBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLGNBQWMsTUFBaEMsRUFBd0MsR0FBeEMsRUFBNkM7QUFDekMsZ0JBQUksS0FBSyxjQUFjLENBQWQsQ0FBVDtBQUNBLGdCQUFJLFlBQVksS0FBSyxLQUFMLENBQVcsUUFBWCxFQUFxQixHQUFHLGlCQUF4QixFQUEyQyxHQUFHLElBQTlDLENBQWhCO0FBQ0EsZ0JBQUksT0FBTyxVQUFVLElBQVYsQ0FBZSxjQUExQjtBQUNBLGVBQUcsS0FBSCxHQUFXLDBCQUFlLEdBQUcsV0FBSCxDQUFlLFFBQTlCLEVBQXdDLElBQXhDLEVBQThDLEdBQUcsTUFBakQsQ0FBWDtBQUNBLG1CQUFPLElBQVAsQ0FBWSxFQUFaO0FBQ0g7QUFDRCxlQUFPLE1BQVA7QUFDSCxLQWhiaUI7OztBQWtibEI7QUFDQSxlQW5ia0IsdUJBbWJMLElBbmJLLEVBbWJDLFFBbmJELEVBbWJXLE9BbmJYLEVBbWJvQjtBQUNsQyxZQUFJLFNBQVMsRUFBYjs7QUFFQSxZQUFJLFNBQVMsSUFBVCxLQUFrQixPQUF0QixFQUErQjtBQUMzQixtQkFBTyxJQUFQLENBQVksMEJBQWUsU0FBUyxXQUF4QixFQUFxQyxJQUFyQyxFQUEyQyxPQUEzQyxDQUFaO0FBQ0gsU0FGRCxNQUdLLElBQUksU0FBUyxJQUFULEtBQWtCLFlBQXRCLEVBQW9DO0FBQ3JDLGdCQUFJLFNBQVMsU0FBUyxXQUF0QjtBQUNBLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksT0FBTyxNQUEzQixFQUFtQyxFQUFFLENBQXJDLEVBQXdDO0FBQ3BDLG9CQUFJLFFBQVEsT0FBTyxDQUFQLENBQVo7QUFDQSx1QkFBTyxJQUFQLENBQVksMEJBQWUsS0FBZixFQUFzQixJQUF0QixFQUE0QixPQUE1QixDQUFaO0FBQ0g7QUFDSixTQU5JLE1BT0EsSUFBSSxTQUFTLElBQVQsS0FBa0IsWUFBdEIsRUFBb0M7QUFDckMsZ0JBQUksT0FBTyxTQUFTLFdBQXBCO0FBQ0EsZ0JBQUksZUFBZSwrQkFBa0IsSUFBbEIsRUFBd0IsSUFBeEIsRUFBOEIsT0FBOUIsQ0FBbkI7QUFDQSxpQkFBSyxJQUFJLEtBQUksQ0FBYixFQUFnQixLQUFJLGFBQWEsTUFBakMsRUFBeUMsRUFBRSxFQUEzQyxFQUE4QztBQUMxQyx1QkFBTyxJQUFQLENBQVksYUFBYSxFQUFiLENBQVo7QUFDSDtBQUNKLFNBTkksTUFPQSxJQUFJLFNBQVMsSUFBVCxLQUFrQixpQkFBdEIsRUFBeUM7QUFDMUMsZ0JBQUksUUFBUSxTQUFTLFdBQXJCO0FBQ0EsaUJBQUssSUFBSSxLQUFLLENBQWQsRUFBaUIsS0FBSyxNQUFNLE1BQTVCLEVBQW9DLElBQXBDLEVBQTBDO0FBQ3RDLG9CQUFJLFFBQU8sTUFBTSxFQUFOLENBQVg7QUFDQSxvQkFBSSxnQkFBZSwrQkFBa0IsS0FBbEIsRUFBd0IsSUFBeEIsRUFBOEIsT0FBOUIsQ0FBbkI7QUFDQSxxQkFBSyxJQUFJLE1BQUksQ0FBYixFQUFnQixNQUFJLGNBQWEsTUFBakMsRUFBeUMsRUFBRSxHQUEzQyxFQUE4QztBQUMxQywyQkFBTyxJQUFQLENBQVksY0FBYSxHQUFiLENBQVo7QUFDSDtBQUNKO0FBQ0osU0FUSSxNQVVBLElBQUksU0FBUyxJQUFULEtBQWtCLFNBQXRCLEVBQWlDO0FBQ2xDO0FBQ0EsZ0JBQUksUUFBUSxTQUFSLEtBQXNCLFVBQVUsUUFBcEMsRUFBOEM7QUFDMUMsb0JBQUksV0FBVyxjQUFJLFFBQUosQ0FBYSxTQUFTLFdBQXRCLENBQWY7QUFDQSx1QkFBTyxJQUFQLENBQVksMEJBQWUsUUFBZixFQUF5QixJQUF6QixFQUErQixPQUEvQixDQUFaO0FBQ0g7QUFDRDtBQUpBLGlCQUtLO0FBQ0Qsd0JBQUksUUFBUSxTQUFTLFdBQXJCO0FBQ0EseUJBQUssSUFBSSxNQUFLLENBQWQsRUFBaUIsTUFBSyxNQUFNLE1BQTVCLEVBQW9DLEtBQXBDLEVBQTBDO0FBQ3RDLDRCQUFJLGlCQUFlLCtCQUFrQixNQUFNLEdBQU4sQ0FBbEIsRUFBNkIsSUFBN0IsRUFBbUMsT0FBbkMsQ0FBbkI7QUFDQSw2QkFBSyxJQUFJLE1BQUksQ0FBYixFQUFnQixNQUFJLGVBQWEsTUFBakMsRUFBeUMsRUFBRSxHQUEzQyxFQUE4QztBQUMxQyxtQ0FBTyxJQUFQLENBQVksZUFBYSxHQUFiLENBQVo7QUFDSDtBQUNKO0FBQ0o7QUFDSixTQWhCSSxNQWlCQSxJQUFJLFNBQVMsSUFBVCxLQUFrQixjQUF0QixFQUFzQztBQUN2QyxnQkFBSSxRQUFRLFNBQVIsS0FBc0IsVUFBVSxRQUFwQyxFQUE4QztBQUMxQyxvQkFBSSxZQUFXLGNBQUksYUFBSixDQUFrQixTQUFTLFdBQTNCLENBQWY7QUFDQSx1QkFBTyxJQUFQLENBQVksMEJBQWUsU0FBZixFQUF5QixJQUF6QixFQUErQixPQUEvQixDQUFaO0FBQ0gsYUFIRCxNQUlLO0FBQ0Qsb0JBQUksUUFBUSxTQUFTLFdBQXJCO0FBQ0EscUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxNQUFNLE1BQTFCLEVBQWtDLEdBQWxDLEVBQXVDO0FBQ25DLHdCQUFJLFNBQVEsTUFBTSxDQUFOLENBQVo7QUFDQSx5QkFBSyxJQUFJLE9BQUssQ0FBZCxFQUFpQixPQUFLLE9BQU0sTUFBNUIsRUFBb0MsTUFBcEMsRUFBMEM7QUFDdEMsNEJBQUksaUJBQWUsK0JBQWtCLE9BQU0sSUFBTixDQUFsQixFQUE2QixJQUE3QixFQUFtQyxPQUFuQyxDQUFuQjtBQUNBLDZCQUFLLElBQUksTUFBSSxDQUFiLEVBQWdCLE1BQUksZUFBYSxNQUFqQyxFQUF5QyxFQUFFLEdBQTNDLEVBQThDO0FBQzFDLG1DQUFPLElBQVAsQ0FBWSxlQUFhLEdBQWIsQ0FBWjtBQUNIO0FBQ0o7QUFDSjtBQUNKO0FBQ0o7O0FBRUQsZUFBTyxNQUFQO0FBQ0gsS0F0ZmlCOzs7QUF3ZmxCOzs7O0FBSUEsc0JBNWZrQiw4QkE0ZkMsS0E1ZkQsRUE0ZlE7QUFDdEIsWUFBSSxRQUFRLE1BQU0sS0FBTixJQUFlLDBCQUFZLFFBQVosQ0FBcUIsS0FBaEQ7O0FBRUE7QUFDQSxhQUFLLGtCQUFMLENBQXdCLFlBQXhCLEVBQXNDLENBQXRDLEVBQXlDLEVBQUUsTUFBTSxDQUFSLEVBQXpDO0FBQ0EsYUFBSyxrQkFBTCxDQUF3QixZQUF4QixFQUFzQyxNQUFNLENBQU4sSUFBVyxDQUFqRCxFQUFvRCxFQUFFLE1BQU0sQ0FBUixFQUFXLFFBQVEsQ0FBbkIsRUFBcEQ7QUFDQTtBQUNBLGFBQUssa0JBQUwsQ0FBd0IsWUFBeEIsRUFBc0MsS0FBSyxVQUFMLENBQWdCLE1BQU0sS0FBdEIsQ0FBdEMsRUFBb0UsRUFBRSxNQUFNLENBQVIsRUFBVyxRQUFRLENBQW5CLEVBQXBFOztBQUVBO0FBQ0EsYUFBSyxrQkFBTCxDQUF3QixTQUF4QixFQUFtQyxDQUFuQyxFQUFzQyxFQUFFLE1BQU0sQ0FBUixFQUF0Qzs7QUFFQTtBQUNBLGFBQUssa0JBQUwsQ0FBd0IsWUFBeEIsRUFBc0MsQ0FBdEMsRUFBeUMsRUFBRSxNQUFNLENBQVIsRUFBekM7O0FBRUE7QUFDQSxhQUFLLGtCQUFMLENBQXdCLFVBQXhCLEVBQW9DLENBQXBDLEVBQXVDLEVBQUUsTUFBTSxDQUFSLEVBQXZDOztBQUVBO0FBQ0EsYUFBSyxrQkFBTCxDQUF3QixTQUF4QixFQUFtQyxpQkFBTyxJQUFQLENBQVksS0FBWixFQUFtQixHQUFuQixDQUFuQyxFQUE0RCxFQUFFLE1BQU0sQ0FBUixFQUE1RDs7QUFFQTtBQUNBLFlBQUksS0FBSyxTQUFULEVBQW9CO0FBQ2hCLGlCQUFLLGtCQUFMLENBQXdCLG1CQUF4QixFQUE2QyxpQkFBTyxJQUFQLENBQVksTUFBTSxlQUFsQixFQUFtQyxHQUFuQyxDQUE3QyxFQUFzRixFQUFFLE1BQU0sQ0FBUixFQUF0RjtBQUNIOztBQUVELGVBQU8sS0FBSyxlQUFaO0FBQ0gsS0F2aEJpQjtBQXloQmxCLGFBemhCa0IscUJBeWhCUixNQXpoQlEsRUF5aEJBLElBemhCQSxFQXloQk0sS0F6aEJOLEVBeWhCYSxPQXpoQmIsRUF5aEJzQixNQXpoQnRCLEVBeWhCOEIsY0F6aEI5QixFQXloQjhDLFdBemhCOUMsRUF5aEIyRCxlQXpoQjNELEVBeWhCNEU7QUFDMUYseUNBQ0ksTUFESixFQUVJLFdBRkosRUFHSSxlQUhKLEVBSUk7QUFDSSw0QkFBZ0IsS0FBSyxhQUFMLENBQW1CLEtBQW5CLENBQXlCLFVBRDdDO0FBRUksNEJBQWdCLEtBQUssYUFBTCxDQUFtQixLQUFuQixDQUF5QixVQUY3QztBQUdJLHlCQUFhLEtBQUssYUFBTCxDQUFtQixLQUFuQixDQUF5QixPQUgxQztBQUlJLDBCQUFjLEtBQUssYUFBTCxDQUFtQixLQUFuQixDQUF5QjtBQUozQyxTQUpKLEVBVUk7QUFDSSxrQkFBTSxJQURWO0FBRUksNEJBQWdCLEdBRnBCLEVBRTRCO0FBQ3hCLDBCQUhKO0FBSUksbUJBQU8sUUFBUSxJQUpuQixFQUk0QjtBQUN4QixxQkFBUyxPQUxiO0FBTUksMENBTko7QUFPSSxnQ0FBb0I7QUFQeEIsU0FWSjtBQW9CSCxLQTlpQmlCOzs7QUFnakJsQjtBQUNBLFNBampCa0IsaUJBaWpCWCxLQWpqQlcsRUFpakJKLFdBampCSSxFQWlqQlM7QUFDdkIsWUFBSSxRQUFRLE1BQU0sS0FBbEI7QUFDQSxZQUFJLE1BQU0sWUFBVixFQUF3QjtBQUNwQixpQkFBSyxxQkFBTCxDQUEyQixLQUEzQixFQUFrQyxLQUFsQyxFQUF5QyxXQUF6QztBQUNILFNBRkQsTUFHSztBQUNELGlCQUFLLFVBQUwsQ0FBZ0IsS0FBaEIsRUFBdUIsS0FBdkIsRUFBOEIsV0FBOUI7QUFDSDtBQUNKLEtBempCaUI7QUEyakJsQixjQTNqQmtCLHNCQTJqQk4sS0EzakJNLEVBMmpCQyxLQTNqQkQsRUEyakJRLFdBM2pCUixFQTJqQnFCO0FBQ25DLFlBQUksa0JBQWtCLEtBQUssa0JBQUwsQ0FBd0IsS0FBeEIsQ0FBdEI7QUFDQSxZQUFJLFFBQVEsTUFBTSxLQUFOLElBQWUsTUFBTSxLQUFqQzs7QUFFQSxhQUFLLFNBQUwsQ0FDSSxDQUFDLE1BQU0sUUFBUCxDQURKLEVBQ29DO0FBQ2hDLGNBQU0sSUFGVixFQUVvQztBQUNoQyxhQUhKLEVBR29DO0FBQ2hDLGNBQU0sT0FKVixFQUlvQztBQUNoQyxjQUFNLE1BTFYsRUFLb0M7QUFDaEMsY0FBTSxTQU5WLEVBTW9DO0FBQ2hDLG1CQVBKLEVBT2lCLGVBUGpCLENBT29DO0FBUHBDO0FBU0gsS0F4a0JpQjtBQTBrQmxCLHlCQTFrQmtCLGlDQTBrQkssS0Exa0JMLEVBMGtCWSxLQTFrQlosRUEwa0JtQixXQTFrQm5CLEVBMGtCZ0M7QUFDOUMsWUFBSSxrQkFBa0IsS0FBSyxrQkFBTCxDQUF3QixLQUF4QixDQUF0Qjs7QUFFQSxhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksTUFBTSxZQUExQixFQUF3QyxHQUF4QyxFQUE0QztBQUN4QyxnQkFBSSxRQUFRLE1BQU0sS0FBTixDQUFZLENBQVosQ0FBWjtBQUNBLGdCQUFJLE9BQU8sTUFBTSxJQUFOLENBQVcsQ0FBWCxDQUFYO0FBQ0EsZ0JBQUksU0FBUyxNQUFNLE9BQU4sQ0FBYyxDQUFkLENBQWI7QUFDQSxnQkFBSSxXQUFXLE1BQU0sU0FBTixDQUFnQixDQUFoQixDQUFmOztBQUVBLGlCQUFLLFNBQUwsQ0FDSSxDQUFDLE1BQU0sUUFBUCxDQURKLEVBQ29DO0FBQ2hDLGdCQUZKLEVBRW9DO0FBQ2hDLGlCQUhKLEVBR29DO0FBQ2hDLGtCQUFNLE9BSlYsRUFJb0M7QUFDaEMsa0JBTEosRUFLb0M7QUFDaEMsb0JBTkosRUFNb0M7QUFDaEMsdUJBUEosRUFPaUIsZUFQakIsQ0FPb0M7QUFQcEM7QUFTSDtBQUNKLEtBN2xCaUI7OztBQStsQmxCO0FBQ0EsY0FobUJrQixzQkFnbUJOLEtBaG1CTSxFQWdtQkMsS0FobUJELEVBZ21CUSxXQWhtQlIsRUFnbUJxQixPQWhtQnJCLEVBZ21COEI7QUFDNUMsYUFBSyxLQUFMLENBQVcsS0FBWCxFQUFrQixXQUFsQjtBQUNILEtBbG1CaUI7QUFvbUJsQixlQXBtQmtCLHVCQW9tQkwsTUFwbUJLLEVBb21CRyxLQXBtQkgsRUFvbUJVLFdBcG1CVixFQW9tQnVCLE9BcG1CdkIsRUFvbUJnQztBQUM5QyxhQUFLLEtBQUwsQ0FBVyxLQUFYLEVBQWtCLFdBQWxCO0FBQ0gsS0F0bUJpQjtBQXdtQmxCLGlCQXhtQmtCLHlCQXdtQkgsTUF4bUJHLEVBd21CSyxLQXhtQkwsRUF3bUJZLFdBeG1CWixFQXdtQnlCLE9BeG1CekIsRUF3bUJrQztBQUNoRCxhQUFLLEtBQUwsQ0FBVyxLQUFYLEVBQWtCLFdBQWxCO0FBQ0gsS0ExbUJpQjtBQTRtQmxCLFlBNW1Ca0Isb0JBNG1CUixXQTVtQlEsRUE0bUJLLGVBNW1CTCxFQTRtQm9DO0FBQUEsWUFBZCxPQUFjLHVFQUFKLEVBQUk7O0FBQ2xEO0FBQ0Esa0JBQVUsT0FBTyxNQUFQLENBQWMsRUFBZCxFQUFrQixPQUFsQixFQUEyQixFQUFFLGNBQWMsS0FBSyxZQUFyQixFQUEzQixDQUFWO0FBQ0EsZUFBTyxhQUFNLFFBQU4sQ0FBZSxJQUFmLENBQW9CLElBQXBCLEVBQTBCLFdBQTFCLEVBQXVDLGVBQXZDLEVBQXdELE9BQXhELENBQVA7QUFDSDtBQWhuQmlCLENBQXRCOzs7Ozs7Ozs7O0FDM0JBOztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7Ozs7O0FBUEE7O0FBU0EsSUFBSSxLQUFLLFFBQVEsSUFBUixDQUFULEMsQ0FMcUM7O0FBTXJDLElBQU0sMkJBQTJCLEdBQUcsWUFBSCxDQUFnQixZQUFZLHVCQUE1QixFQUFxRCxNQUFyRCxDQUFqQztBQUNBLElBQU0sNkJBQTZCLEdBQUcsWUFBSCxDQUFnQixZQUFZLHlCQUE1QixFQUF1RCxNQUF2RCxDQUFuQzs7QUFFTyxJQUFJLDhCQUFXLE9BQU8sTUFBUCxjQUFmOztBQUVQO1FBRUksd0IsR0FBQSx3QjtRQUNBLDBCLEdBQUEsMEI7OztBQUdKLE9BQU8sTUFBUCxDQUFjLFFBQWQsRUFBd0I7QUFDcEIsVUFBTSxVQURjO0FBRXBCLGNBQVUsSUFGVTtBQUdwQix1QkFBbUIsd0JBSEM7QUFJcEIseUJBQXFCLDBCQUpEOztBQU1wQixRQU5vQixrQkFNYjtBQUNILHFCQUFNLElBQU4sQ0FBVyxLQUFYLENBQWlCLElBQWpCLEVBQXVCLFNBQXZCOztBQUVBO0FBQ0EsWUFBSSxVQUFVLENBQ1YsRUFBRSxNQUFNLFlBQVIsRUFBc0IsTUFBTSxDQUE1QixFQUErQixNQUFNLG9CQUFHLEtBQXhDLEVBQStDLFlBQVksS0FBM0QsRUFEVSxFQUVWLEVBQUUsTUFBTSxVQUFSLEVBQW9CLE1BQU0sQ0FBMUIsRUFBNkIsTUFBTSxvQkFBRyxJQUF0QyxFQUE0QyxZQUFZLElBQXhELEVBRlUsRUFFc0Q7QUFDaEUsVUFBRSxNQUFNLFNBQVIsRUFBbUIsTUFBTSxDQUF6QixFQUE0QixNQUFNLG9CQUFHLGFBQXJDLEVBQW9ELFlBQVksSUFBaEUsRUFIVSxDQUFkOztBQU1BO0FBQ0EsYUFBSyxPQUFMLENBQWEsd0JBQWIsR0FBd0MsSUFBeEM7QUFDQSxhQUFLLE9BQUwsQ0FBYSxtQkFBYixHQUFtQyxJQUFuQzs7QUFFQTtBQUNBLGFBQUssU0FBTCxHQUFpQixJQUFqQjtBQUNBLGdCQUFRLElBQVIsQ0FBYSxFQUFFLE1BQU0sbUJBQVIsRUFBNkIsTUFBTSxDQUFuQyxFQUFzQyxNQUFNLG9CQUFHLGFBQS9DLEVBQThELFlBQVksSUFBMUUsRUFBYjs7QUFFQTtBQUNBLFlBQUksS0FBSyxTQUFULEVBQW9CO0FBQ2hCLGlCQUFLLE9BQUwsQ0FBYSxzQkFBYixHQUFzQyxJQUF0Qzs7QUFFQTtBQUNBLG9CQUFRLElBQVIsQ0FBYSxFQUFFLE1BQU0sWUFBUixFQUFzQixNQUFNLENBQTVCLEVBQStCLE1BQU0sb0JBQUcsY0FBeEMsRUFBd0QsWUFBWSxJQUFwRSxFQUFiO0FBQ0g7O0FBRUQsYUFBSyxhQUFMLEdBQXFCLDRCQUFpQixPQUFqQixDQUFyQjtBQUNILEtBakNtQjtBQW1DcEIsaUJBbkNvQix5QkFtQ0wsT0FuQ0ssRUFtQ0ksSUFuQ0osRUFtQ1UsT0FuQ1YsRUFtQ21CO0FBQ25DLFlBQUksUUFBUSxLQUFLLGFBQWpCOztBQUVBLGNBQU0sS0FBTixHQUFjLEtBQUssVUFBTCxDQUFnQixLQUFLLEtBQXJCLEVBQTRCLE9BQTVCLENBQWQ7QUFDQSxZQUFJLENBQUMsTUFBTSxLQUFYLEVBQWtCO0FBQ2QsbUJBQU8sSUFBUDtBQUNIOztBQUVELGNBQU0sQ0FBTixHQUFXLEtBQUssQ0FBTCxJQUFVLDBCQUFZLDBCQUFaLENBQXVDLEtBQUssQ0FBNUMsRUFBK0MsT0FBL0MsQ0FBWCxJQUF1RSwwQkFBWSxRQUFaLENBQXFCLENBQXRHO0FBQ0EsY0FBTSxDQUFOLElBQVcsY0FBSSxZQUFmLENBVG1DLENBU047O0FBRTdCLGNBQU0sT0FBTixHQUFnQiwwQkFBWSxZQUFaLENBQXlCLEtBQUssT0FBOUIsRUFBdUMsT0FBdkMsQ0FBaEI7QUFDQSxZQUFJLE1BQU0sT0FBVixFQUFtQjtBQUNmO0FBQ0EsZ0JBQUksTUFBTSxPQUFOLEtBQWtCLElBQXRCLEVBQTRCO0FBQ3hCLHNCQUFNLE1BQU4sR0FBZSxRQUFRLFVBQVIsQ0FBbUIsTUFBbkIsSUFBNkIsMEJBQVksUUFBWixDQUFxQixNQUFqRTtBQUNBLHNCQUFNLFVBQU4sR0FBbUIsUUFBUSxVQUFSLENBQW1CLFVBQW5CLElBQWlDLDBCQUFZLFFBQVosQ0FBcUIsVUFBekU7QUFFSDtBQUNEO0FBTEEsaUJBTUssSUFBSSxPQUFPLE1BQU0sT0FBYixLQUF5QixRQUE3QixFQUF1QztBQUN4QywwQkFBTSxNQUFOLEdBQWUsTUFBTSxPQUFyQjtBQUNBLDBCQUFNLFVBQU4sR0FBbUIsQ0FBbkI7QUFDSDtBQUNEO0FBSksscUJBS0EsSUFBSSxNQUFNLE9BQU4sQ0FBYyxNQUFNLE9BQXBCLENBQUosRUFBa0M7QUFDbkMsOEJBQU0sVUFBTixHQUFtQixNQUFNLE9BQU4sQ0FBYyxDQUFkLENBQW5CO0FBQ0EsOEJBQU0sTUFBTixHQUFlLE1BQU0sT0FBTixDQUFjLENBQWQsQ0FBZjtBQUNIOztBQUVELGtCQUFNLE1BQU4sSUFBZ0IsY0FBSSxZQUFwQixDQWxCZSxDQWtCeUI7QUFDeEMsa0JBQU0sVUFBTixJQUFvQixjQUFJLFlBQXhCO0FBQ0g7O0FBRUQsY0FBTSxVQUFOLEdBQW1CLEtBQUssVUFBeEIsQ0FsQ21DLENBa0NDOztBQUVwQyxlQUFPLEtBQVA7QUFDSCxLQXhFbUI7QUEwRXBCLGVBMUVvQix1QkEwRVAsSUExRU8sRUEwRUQ7QUFDZixhQUFLLEtBQUwsR0FBYSwwQkFBWSx3QkFBWixDQUFxQyxLQUFLLEtBQTFDLENBQWI7QUFDQSxhQUFLLENBQUwsR0FBUywwQkFBWSxtQkFBWixDQUFnQyxLQUFLLENBQXJDLEVBQXdDLDBCQUFZLFVBQXBELENBQVQ7QUFDQSxlQUFPLElBQVA7QUFDSCxLQTlFbUI7OztBQWdGcEI7Ozs7QUFJQSxzQkFwRm9CLDhCQW9GRCxLQXBGQyxFQW9GTTtBQUN0QixZQUFJLElBQUksQ0FBUjs7QUFFQTtBQUNBLGFBQUssZUFBTCxDQUFxQixHQUFyQixJQUE0QixDQUE1QjtBQUNBLGFBQUssZUFBTCxDQUFxQixHQUFyQixJQUE0QixDQUE1QjtBQUNBLGFBQUssZUFBTCxDQUFxQixHQUFyQixJQUE0QixNQUFNLENBQU4sSUFBVyxDQUF2Qzs7QUFFQTtBQUNBLGFBQUssZUFBTCxDQUFxQixHQUFyQixJQUE0QixLQUFLLFVBQUwsQ0FBZ0IsTUFBTSxLQUF0QixDQUE1Qjs7QUFFQTtBQUNBLGFBQUssZUFBTCxDQUFxQixHQUFyQixJQUE0QixDQUE1QjtBQUNBLGFBQUssZUFBTCxDQUFxQixHQUFyQixJQUE0QixDQUE1QjtBQUNBLGFBQUssZUFBTCxDQUFxQixHQUFyQixJQUE0QixJQUFJLEdBQWhDOztBQUVBO0FBQ0EsYUFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLE1BQU0sS0FBTixDQUFZLENBQVosSUFBaUIsR0FBN0M7QUFDQSxhQUFLLGVBQUwsQ0FBcUIsR0FBckIsSUFBNEIsTUFBTSxLQUFOLENBQVksQ0FBWixJQUFpQixHQUE3QztBQUNBLGFBQUssZUFBTCxDQUFxQixHQUFyQixJQUE0QixNQUFNLEtBQU4sQ0FBWSxDQUFaLElBQWlCLEdBQTdDO0FBQ0EsYUFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLE1BQU0sS0FBTixDQUFZLENBQVosSUFBaUIsR0FBN0M7O0FBRUE7QUFDQSxZQUFJLEtBQUssU0FBVCxFQUFvQjtBQUNoQixpQkFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLE1BQU0sZUFBTixDQUFzQixDQUF0QixJQUEyQixHQUF2RDtBQUNBLGlCQUFLLGVBQUwsQ0FBcUIsR0FBckIsSUFBNEIsTUFBTSxlQUFOLENBQXNCLENBQXRCLElBQTJCLEdBQXZEO0FBQ0EsaUJBQUssZUFBTCxDQUFxQixHQUFyQixJQUE0QixNQUFNLGVBQU4sQ0FBc0IsQ0FBdEIsSUFBMkIsR0FBdkQ7QUFDQSxpQkFBSyxlQUFMLENBQXFCLEdBQXJCLElBQTRCLE1BQU0sZUFBTixDQUFzQixDQUF0QixJQUEyQixHQUF2RDtBQUNIOztBQUVEO0FBQ0EsWUFBSSxLQUFLLFNBQVQsRUFBb0I7QUFDaEIsaUJBQUssZUFBTCxDQUFxQixHQUFyQixJQUE0QixDQUE1QjtBQUNBLGlCQUFLLGVBQUwsQ0FBcUIsR0FBckIsSUFBNEIsQ0FBNUI7QUFDSDs7QUFFRCxlQUFPLEtBQUssZUFBWjtBQUNILEtBekhtQjtBQTJIcEIsaUJBM0hvQix5QkEySE4sUUEzSE0sRUEySEksS0EzSEosRUEySFcsV0EzSFgsRUEySHdCLE9BM0h4QixFQTJIaUM7QUFDakQsWUFBSSxrQkFBa0IsS0FBSyxrQkFBTCxDQUF3QixLQUF4QixDQUF0QjtBQUNBLFlBQUksVUFBVTtBQUNWLDRCQUFnQixLQUFLLGFBQUwsQ0FBbUIsS0FBbkIsQ0FBeUIsVUFEL0I7QUFFVixnQ0FBb0IsS0FGVixFQUVpQjtBQUMzQiwrQkFBbUIsQ0FBQyxNQUFNLFVBSGhCO0FBSVYsaUNBQXFCLGNBQUksVUFBSixHQUFpQixRQUFRLElBQVIsQ0FBYSxTQUE5QixHQUEwQyxDQUpyRDtBQUtWLHFCQUFTLFFBQVE7QUFMUCxTQUFkOztBQVFBO0FBQ0EsWUFBSSxNQUFNLE9BQU4sSUFBaUIsTUFBTSxNQUEzQixFQUFtQztBQUMvQixpREFDSSxRQURKLEVBRUksTUFBTSxDQUZWLEVBRWEsTUFBTSxNQUZuQixFQUUyQixNQUFNLFVBRmpDLEVBR0ksV0FISixFQUdpQixlQUhqQixFQUlJLEtBQUssYUFBTCxDQUFtQixLQUFuQixDQUF5QixRQUo3QixFQUtJLEdBTEosRUFLUztBQUNMLG1CQU5KO0FBUUg7QUFDRDtBQVZBLGFBV0s7QUFDRCw2Q0FDSSxRQURKLEVBRUksV0FGSixFQUVpQixlQUZqQixFQUdJLE9BSEo7QUFLSDtBQUNKO0FBeEptQixDQUF4Qjs7Ozs7Ozs7OztBQ25CQTs7QUFDQTs7QUFIQTs7QUFLTyxJQUFJLG9DQUFjLE9BQU8sTUFBUCxvQkFBbEI7O0FBRVAsT0FBTyxNQUFQLENBQWMsV0FBZCxFQUEyQjtBQUN2QixVQUFNLFFBRGlCO0FBRXZCLDZCQUZ1QjtBQUd2QixjQUFVLElBSGE7O0FBS3ZCLFFBTHVCLGtCQUtoQjtBQUNIO0FBQ0EsYUFBSyxNQUFMLEdBQWMsS0FBSyxNQUFMLElBQWUsT0FBN0I7O0FBRUEsYUFBSyxLQUFMLENBQVcsSUFBWCxDQUFnQixLQUFoQixDQUFzQixJQUF0QixFQUE0QixTQUE1Qjs7QUFFQSxhQUFLLFNBQUwsR0FBaUIsS0FBakIsQ0FORyxDQU1xQjtBQUMzQixLQVpzQjtBQWN2QixlQWR1Qix1QkFjVixJQWRVLEVBY0o7QUFDZjtBQUNBLGFBQUssS0FBTCxHQUFhLEtBQUssS0FBTCxJQUFjLDBCQUFZLFFBQVosQ0FBcUIsS0FBaEQ7QUFDQSxlQUFPLEtBQUssS0FBTCxDQUFXLFdBQVgsQ0FBdUIsS0FBdkIsQ0FBNkIsSUFBN0IsRUFBbUMsU0FBbkMsQ0FBUDtBQUNIO0FBbEJzQixDQUEzQjs7Ozs7Ozs7Ozt5cEJDUEE7O0FBRUE7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUFFQSxJQUFJLEtBQUssUUFBUSxJQUFSLENBQVQ7QUFDQSxJQUFNLDhCQUE4QixHQUFHLFlBQUgsQ0FBZ0IsWUFBWSx3Q0FBNUIsRUFBc0UsTUFBdEUsQ0FBcEM7QUFDQSxJQUFNLG9CQUFvQixHQUFHLFlBQUgsQ0FBZ0IsWUFBWSw2QkFBNUIsRUFBMkQsTUFBM0QsQ0FBMUI7O0FBRUE7O0FBRU8sSUFBSSx3QkFBUTtBQUNmLFFBRGUsa0JBQ2lEO0FBQUEsdUZBQUosRUFBSTtBQUFBLFlBQXhELFVBQXdELFFBQXhELFVBQXdEO0FBQUEsWUFBNUMsTUFBNEMsUUFBNUMsTUFBNEM7QUFBQSxnQ0FBcEMsT0FBb0M7QUFBQSxZQUFwQyxPQUFvQyxnQ0FBMUIsRUFBMEI7QUFBQSxZQUF0QixhQUFzQixRQUF0QixhQUFzQjs7QUFDNUQsYUFBSyxVQUFMLEdBQWtCLFVBQWxCLENBRDRELENBQ2hCO0FBQzVDLGFBQUssTUFBTCxHQUFjLE1BQWQsQ0FGNEQsQ0FFaEI7QUFDNUMsYUFBSyxPQUFMLEdBQWUsT0FBZixDQUg0RCxDQUdoQjtBQUM1QyxhQUFLLE9BQUwsR0FBZ0IsS0FBSyxjQUFMLENBQW9CLFNBQXBCLEtBQWtDLEtBQUssT0FBeEMsSUFBb0QsRUFBbkUsQ0FKNEQsQ0FJVztBQUN2RSxhQUFLLE9BQUwsR0FBZ0IsS0FBSyxjQUFMLENBQW9CLFNBQXBCLEtBQWtDLEtBQUssT0FBeEMsSUFBb0QsRUFBbkUsQ0FMNEQsQ0FLVztBQUN2RSxhQUFLLGFBQUwsR0FBcUIsaUJBQWlCLEtBQXRDO0FBQ0EsYUFBSyxTQUFMLEdBQWlCLEtBQUssU0FBTCxJQUFrQixLQUFLLGFBQXZCLElBQXdDLEtBQXpELENBUDRELENBT007QUFDbEUsYUFBSyxhQUFMLEdBQXFCLEtBQXJCLENBUjRELENBUWhCO0FBQzVDLGFBQUssT0FBTCxHQUFlLElBQWYsQ0FUNEQsQ0FTaEI7QUFDNUMsYUFBSyxpQkFBTCxHQUF5QixJQUF6QixDQVY0RCxDQVVoQjtBQUM1QyxhQUFLLGFBQUwsR0FBcUIsRUFBckIsQ0FYNEQsQ0FXaEI7QUFDNUMsYUFBSyxlQUFMLEdBQXVCLEVBQXZCLENBWjRELENBWWhCO0FBQzVDLGFBQUssU0FBTCxHQUFpQixFQUFqQjs7QUFFQTtBQUNBLGFBQUssa0JBQUwsR0FBMEIsQ0FBQyxPQUFELEVBQVUsS0FBSyxJQUFmLEVBQXFCLEtBQUssVUFBMUIsRUFBc0MsSUFBdEMsQ0FBMkMsR0FBM0MsQ0FBMUI7QUFDQSxZQUFJLGlCQUFPLE9BQVgsRUFBb0I7QUFDaEIsb0NBQWEsU0FBYixDQUF1QixLQUFLLGtCQUE1QixFQUFnRCxJQUFoRDtBQUNIOztBQUVEO0FBQ0EsYUFBSyxPQUFMLENBQWEsMkJBQWIsR0FBMkMsTUFBM0M7O0FBRUE7QUFDQSxhQUFLLEtBQUwsR0FBYSxLQUFLLEtBQUwsSUFBYyxRQUEzQixDQXpCNEQsQ0F5QmhCO0FBQzVDLGFBQUssT0FBTCxvQkFBOEIsS0FBSyxLQUFMLENBQVcsV0FBWCxFQUE5QixJQUE0RCxJQUE1RDtBQUNBLFlBQUksS0FBSyxXQUFMLElBQW9CLElBQXhCLEVBQThCO0FBQUU7QUFDNUIsaUJBQUssV0FBTCxHQUFtQixDQUFDLENBQXBCLENBRDBCLENBQ0g7QUFDMUI7O0FBRUQsYUFBSyxpQkFBTCxDQUF1QixPQUF2QixFQS9CNEQsQ0ErQjNCOztBQUVqQztBQUNBLFlBQUksRUFBRSxLQUFLLFFBQUwsOEJBQUYsQ0FBSixFQUEwQztBQUN0QyxnQkFBSSxDQUFDLG1CQUFTLE9BQVQsQ0FBaUIsS0FBSyxRQUF0QixDQUFMLEVBQXNDO0FBQ2xDLHFCQUFLLFFBQUwsR0FBZ0IsMEJBQVksUUFBWixDQUFxQixRQUFyQztBQUNIO0FBQ0QsaUJBQUssUUFBTCxHQUFnQix1QkFBYSxLQUFLLFFBQWxCLENBQWhCO0FBQ0g7QUFDRCxhQUFLLFFBQUwsQ0FBYyxNQUFkLENBQXFCLElBQXJCOztBQUVBO0FBQ0Esd0JBQU0sT0FBTixDQUFjLEtBQUssUUFBbkIsRUFBNkIsSUFBN0I7O0FBRUE7QUFDQSxhQUFLLFlBQUw7O0FBRUEsYUFBSyxXQUFMLEdBQW1CLElBQW5CO0FBQ0gsS0FsRGM7QUFvRGYsV0FwRGUscUJBb0RKO0FBQ1AsWUFBSSxLQUFLLE9BQVQsRUFBa0I7QUFDZCxpQkFBSyxPQUFMLENBQWEsT0FBYjtBQUNBLGlCQUFLLE9BQUwsR0FBZSxJQUFmO0FBQ0g7O0FBRUQsWUFBSSxLQUFLLGlCQUFULEVBQTRCO0FBQ3hCLGlCQUFLLGlCQUFMLENBQXVCLE9BQXZCO0FBQ0EsaUJBQUssaUJBQUwsR0FBeUIsSUFBekI7QUFDSDs7QUFFRCxhQUFLLEVBQUwsR0FBVSxJQUFWO0FBQ0EsYUFBSyxXQUFMLEdBQW1CLEtBQW5CO0FBQ0gsS0FqRWM7QUFtRWYsU0FuRWUsbUJBbUVOLENBQ1IsQ0FwRWM7QUFzRWYsYUF0RWUsdUJBc0VGO0FBQ1QsZUFBTyxLQUFLLElBQUwsSUFBYSxLQUFLLElBQXpCO0FBQ0gsS0F4RWM7QUEwRWYsc0JBMUVlLDhCQTBFSSxTQTFFSixFQTBFZSxLQTFFZixTQTBFd0M7QUFBQSxZQUFoQixJQUFnQixTQUFoQixJQUFnQjtBQUFBLFlBQVYsTUFBVSxTQUFWLE1BQVU7O0FBQ25ELGlCQUFVLFdBQVcsU0FBWixHQUF5QixDQUF6QixHQUE2QixNQUF0Qzs7QUFFQSxZQUFJLFFBQVEsS0FBSyxhQUFMLENBQW1CLEtBQW5CLENBQXlCLFNBQXpCLENBQVo7QUFDQSxZQUFJLFVBQVUsU0FBZCxFQUF5QjtBQUNyQiwrQkFBSSxNQUFKLHlCQUFnQyxLQUFLLElBQXJDLDREQUE4RixTQUE5RjtBQUNBO0FBQ0g7O0FBRUQsYUFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLElBQXBCLEVBQTBCLEVBQUUsQ0FBNUIsRUFBK0I7QUFDM0IsZ0JBQUksSUFBSSxNQUFNLE1BQU4sR0FBZSxDQUFmLEdBQW1CLE1BQU0sQ0FBTixDQUFuQixHQUE4QixLQUF0QztBQUNBLGlCQUFLLGVBQUwsQ0FBcUIsUUFBUSxDQUFSLEdBQVksTUFBakMsSUFBMkMsQ0FBM0M7QUFDSDtBQUNKLEtBdkZjOzs7QUF5RmY7O0FBRUE7QUFDQSxhQTVGZSxxQkE0RkosSUE1RkksRUE0RkU7QUFDYixhQUFLLFNBQUwsQ0FBZSxLQUFLLEdBQXBCLElBQTJCO0FBQ3ZCLHlCQUFhLElBRFU7QUFFdkIsc0JBQVUsRUFGYTtBQUd2QixzQkFBVTtBQUhhLFNBQTNCO0FBS0EsZUFBTyxLQUFLLFNBQUwsQ0FBZSxLQUFLLEdBQXBCLENBQVA7QUFDSCxLQW5HYzs7O0FBcUdmO0FBQ0EsV0F0R2UsbUJBc0dOLElBdEdNLEVBc0dBO0FBQ1gsWUFBSSxZQUFZLEtBQUssU0FBTCxDQUFlLEtBQUssR0FBcEIsQ0FBaEI7QUFDQSxhQUFLLFNBQUwsQ0FBZSxLQUFLLEdBQXBCLElBQTJCLElBQTNCOztBQUVBLFlBQUksYUFBYSxVQUFVLFdBQXZCLElBQXNDLFVBQVUsV0FBVixDQUFzQixZQUF0QixHQUFxQyxDQUEvRSxFQUFrRjtBQUM5RTtBQUNBLHNCQUFVLFdBQVYsQ0FBc0IsR0FBdEI7QUFDQSxzQkFBVSxlQUFWLEdBQTRCLFVBQVUsV0FBVixDQUFzQixjQUFsRDtBQUNBLHNCQUFVLFdBQVYsR0FBd0IsVUFBVSxXQUFWLENBQXNCLGFBQTlDLENBSjhFLENBSWpCOztBQUU3RDtBQUNBO0FBQ0EsbUJBQU8sS0FBSyxtQkFBTCxDQUF5QixJQUF6QixFQUErQixTQUEvQixFQUEwQyxJQUExQyxDQUErQztBQUFBLHVCQUFNLFNBQU47QUFBQSxhQUEvQyxDQUFQO0FBQ0gsU0FURCxNQVVLO0FBQ0QsbUJBQU8sUUFBUSxPQUFSLENBQWdCLElBQWhCLENBQVAsQ0FEQyxDQUM2QjtBQUNqQztBQUNKLEtBdkhjOzs7QUF5SGY7QUFDQSxrQkExSGUsMEJBMEhDLFFBMUhELEVBMEhXO0FBQ3RCLGVBQU8sS0FBSyxTQUFMLENBQWUsUUFBZixLQUE0QixJQUFuQztBQUNILEtBNUhjO0FBOEhmLGNBOUhlLHNCQThISCxPQTlIRyxFQThITSxJQTlITixFQThIWSxPQTlIWixFQThIcUI7QUFDaEMsWUFBSSxPQUFPLFFBQVEsSUFBbkI7QUFDQSxZQUFJLEtBQUssVUFBTCxLQUFvQixLQUFLLFVBQTdCLEVBQXlDO0FBQ3JDO0FBQ0g7O0FBRUQsWUFBSSxDQUFDLEtBQUssU0FBTCxDQUFlLEtBQUssR0FBcEIsQ0FBTCxFQUErQjtBQUMzQixpQkFBSyxTQUFMLENBQWUsSUFBZjtBQUNIOztBQUVELFlBQUksUUFBUSxLQUFLLFlBQUwsQ0FBa0IsT0FBbEIsRUFBMkIsSUFBM0IsRUFBaUMsT0FBakMsQ0FBWjs7QUFFQTtBQUNBLFlBQUksQ0FBQyxLQUFMLEVBQVk7QUFDUjtBQUNIOztBQUVEO0FBQ0EsWUFBSSxDQUFDLEtBQUssU0FBTCxDQUFlLEtBQUssR0FBcEIsRUFBeUIsV0FBOUIsRUFBMkM7QUFDdkMsaUJBQUssU0FBTCxDQUFlLEtBQUssR0FBcEIsRUFBeUIsV0FBekIsR0FBdUMsS0FBSyxhQUFMLENBQW1CLGdCQUFuQixFQUF2QztBQUNIOztBQUVELGFBQUssYUFBTCxDQUFtQixRQUFRLFFBQTNCLEVBQXFDLEtBQXJDLEVBQTRDLEtBQUssU0FBTCxDQUFlLEtBQUssR0FBcEIsRUFBeUIsV0FBckUsRUFBa0YsT0FBbEY7QUFDSCxLQXJKYztBQXVKZixpQkF2SmUseUJBdUpBLFFBdkpBLEVBdUpVLEtBdkpWLEVBdUppQixXQXZKakIsRUF1SjhCLE9Bdko5QixFQXVKdUM7QUFDbEQsWUFBSSxTQUFTLElBQVQsS0FBa0IsU0FBdEIsRUFBaUM7QUFDN0IsaUJBQUssYUFBTCxDQUFtQixDQUFDLFNBQVMsV0FBVixDQUFuQixFQUEyQyxLQUEzQyxFQUFrRCxXQUFsRCxFQUErRCxPQUEvRDtBQUNILFNBRkQsTUFHSyxJQUFJLFNBQVMsSUFBVCxLQUFrQixjQUF0QixFQUFzQztBQUN2QyxpQkFBSyxhQUFMLENBQW1CLFNBQVMsV0FBNUIsRUFBeUMsS0FBekMsRUFBZ0QsV0FBaEQsRUFBNkQsT0FBN0Q7QUFDSCxTQUZJLE1BR0EsSUFBSSxTQUFTLElBQVQsS0FBa0IsWUFBdEIsRUFBb0M7QUFDckMsaUJBQUssVUFBTCxDQUFnQixDQUFDLFNBQVMsV0FBVixDQUFoQixFQUF3QyxLQUF4QyxFQUErQyxXQUEvQyxFQUE0RCxPQUE1RDtBQUNILFNBRkksTUFHQSxJQUFJLFNBQVMsSUFBVCxLQUFrQixpQkFBdEIsRUFBeUM7QUFDMUMsaUJBQUssVUFBTCxDQUFnQixTQUFTLFdBQXpCLEVBQXNDLEtBQXRDLEVBQTZDLFdBQTdDLEVBQTBELE9BQTFEO0FBQ0gsU0FGSSxNQUdBLElBQUksU0FBUyxJQUFULEtBQWtCLE9BQXRCLEVBQStCO0FBQ2hDLGlCQUFLLFdBQUwsQ0FBaUIsQ0FBQyxTQUFTLFdBQVYsQ0FBakIsRUFBeUMsS0FBekMsRUFBZ0QsV0FBaEQsRUFBNkQsT0FBN0Q7QUFDSCxTQUZJLE1BR0EsSUFBSSxTQUFTLElBQVQsS0FBa0IsWUFBdEIsRUFBb0M7QUFDckMsaUJBQUssV0FBTCxDQUFpQixTQUFTLFdBQTFCLEVBQXVDLEtBQXZDLEVBQThDLFdBQTlDLEVBQTJELE9BQTNEO0FBQ0g7QUFDSixLQTFLYztBQTRLZixnQkE1S2Usd0JBNEtELE9BNUtDLEVBNEtRLElBNUtSLEVBNEtjLE9BNUtkLEVBNEt1QjtBQUNsQyxZQUFJO0FBQ0EsZ0JBQUksUUFBUSxLQUFLLGFBQWpCOztBQUVBLG1CQUFPLEtBQUssVUFBTCxDQUFnQixJQUFoQixDQUFQO0FBQ0EsZ0JBQUksQ0FBQyxJQUFMLEVBQVc7QUFDUDtBQUNIOztBQUVEO0FBQ0Esa0JBQU0sS0FBTixHQUFjLEtBQUssVUFBTCxDQUFnQixLQUFLLEtBQXJCLEVBQTRCLE9BQTVCLENBQWQ7O0FBRUE7QUFDQSxnQkFBSSxhQUFhLEtBQWpCO0FBQ0Esa0JBQU0sV0FBTixHQUFvQixLQUFLLGFBQUwsSUFBc0IsS0FBSyxXQUEvQztBQUNBLGdCQUFJLEtBQUssU0FBVCxFQUFvQjtBQUNoQiw2QkFBYSwwQkFBWSxZQUFaLENBQXlCLE1BQU0sV0FBL0IsRUFBNEMsT0FBNUMsQ0FBYjtBQUNIOztBQUVEO0FBQ0EsZ0JBQUksVUFBSixFQUFnQjtBQUNaLHNCQUFNLGVBQU4sR0FBd0Isb0JBQWlCLFNBQWpCLENBQTJCLE9BQTNCLEVBQW9DLFFBQVEsSUFBNUMsRUFBa0QsT0FBbEQsQ0FBeEI7QUFDSCxhQUZELE1BR0s7QUFDRCxzQkFBTSxlQUFOLEdBQXdCLG9CQUFpQixZQUF6QztBQUNIOztBQUVEO0FBQ0Esb0JBQVEsS0FBSyxhQUFMLENBQW1CLE9BQW5CLEVBQTRCLElBQTVCLEVBQWtDLE9BQWxDLENBQVI7O0FBRUEsbUJBQU8sS0FBUDtBQUNILFNBOUJELENBK0JBLE9BQU0sS0FBTixFQUFhO0FBQ1QsK0JBQUksT0FBSixFQUFhLHlDQUFiLEVBQXdELE9BQXhELEVBQWlFLEtBQWpFLEVBQXdFLEtBQXhFO0FBQ0g7QUFDSixLQS9NYztBQWlOZixpQkFqTmUseUJBaU5BLE9Bak5BLEVBaU5TLElBak5ULEVBaU5lLE9Bak5mLEVBaU53QjtBQUNuQyxlQUFPLEtBQUssYUFBWjtBQUNILEtBbk5jO0FBcU5mLGNBck5lLHNCQXFOSCxJQXJORyxFQXFORztBQUNkO0FBQ0EsWUFBSSxDQUFDLEtBQUssWUFBVixFQUF3QjtBQUNwQixtQkFBTyxLQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBUCxDQURvQixDQUNXO0FBQy9CLGdCQUFJLENBQUMsSUFBTCxFQUFXO0FBQ1A7QUFDSDtBQUNELGlCQUFLLFlBQUwsR0FBb0IsSUFBcEI7QUFDSDtBQUNELGVBQU8sSUFBUDtBQUNILEtBL05jOzs7QUFpT2Y7QUFDQSxlQWxPZSx1QkFrT0YsSUFsT0UsRUFrT0k7QUFDZixlQUFPLElBQVA7QUFDSCxLQXBPYzs7O0FBc09mO0FBQ0EsY0F2T2Usc0JBdU9ILEtBdk9HLEVBdU9JLE9Bdk9KLEVBdU9hO0FBQ3hCO0FBQ0EsWUFBSSxPQUFPLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDM0IsbUJBQU8sMEJBQVksY0FBWixDQUEyQixLQUEzQixFQUFrQyxPQUFsQyxDQUFQO0FBQ0g7QUFDRCxlQUFPLEtBQVA7QUFDSCxLQTdPYzs7O0FBK09mO0FBQ0EsY0FoUGUsc0JBZ1BILEtBaFBHLEVBZ1BJO0FBQ2YsZUFBTyxRQUFRLENBQWY7QUFDSCxLQWxQYzs7O0FBb1BmO0FBQ0EsY0FyUGUsc0JBcVBKLEtBclBJLEVBcVBHLE9BclBILEVBcVBZO0FBQ3ZCO0FBQ0EsWUFBSSxLQUFKLEVBQVc7QUFDUCxtQkFBTywwQkFBWSx1QkFBWixDQUFvQyxLQUFwQyxFQUEyQyxPQUEzQyxDQUFQO0FBQ0gsU0FGRCxNQUdLLElBQUksS0FBSyxPQUFMLENBQWEsTUFBYixDQUFvQixLQUFwQixJQUE2QixLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLE1BQXJELEVBQTZEO0FBQzlELG1CQUFPLDBCQUFZLFFBQVosQ0FBcUIsS0FBNUI7QUFDSDtBQUNKLEtBN1BjOzs7QUErUGY7QUFDQSxpQkFoUWUsMkJBZ1FFLENBQUUsQ0FoUUo7QUFpUWYsY0FqUWUsd0JBaVFELENBQUUsQ0FqUUQ7QUFrUWYsZUFsUWUseUJBa1FBLENBQUUsQ0FsUUY7OztBQXFRZjs7QUFFQSxTQXZRZSxpQkF1UVIsRUF2UVEsRUF1UUo7QUFDUCxhQUFLLEVBQUwsR0FBVSxFQUFWO0FBQ0EsYUFBSyxnQkFBTCxHQUF3QixrQkFBUSxpQkFBUixDQUEwQixLQUFLLEVBQS9CLENBQXhCO0FBQ0gsS0ExUWM7QUE0UWYsWUE1UWUsb0JBNFFMLFdBNVFLLEVBNFFRLGVBNVFSLEVBNFF1QztBQUFBLFlBQWQsT0FBYyx1RUFBSixFQUFJOztBQUNsRCxlQUFPLHVCQUFZLEtBQUssRUFBakIsRUFBcUIsV0FBckIsRUFBa0MsZUFBbEMsRUFBbUQsS0FBSyxhQUF4RCxFQUF1RSxPQUF2RSxDQUFQO0FBQ0gsS0E5UWM7QUFnUmYsVUFoUmUsa0JBZ1JQLElBaFJPLEVBZ1JEO0FBQ1YsZUFBTyxLQUFLLE1BQUwsRUFBUDtBQUNILEtBbFJjOzs7QUFvUmY7QUFDQSxjQXJSZSx3QkFxUmM7QUFBQSxZQUFqQixHQUFpQix1RUFBWCxTQUFXOztBQUN6QixhQUFLLFlBQUw7O0FBRUEsWUFBTSxVQUFVLEtBQUssR0FBTCxDQUFoQjtBQUNBLFlBQUksQ0FBQyxPQUFELElBQVksUUFBUSxLQUF4QixFQUErQjtBQUMzQjtBQUNIOztBQUVELFlBQUksQ0FBQyxRQUFRLFFBQWIsRUFBdUI7QUFDbkIsK0JBQUksT0FBSix5QkFBaUMsS0FBSyxJQUF0QywwQkFBNkQsR0FBN0Q7QUFDQSxvQkFBUSxPQUFSO0FBQ0g7QUFDRCxlQUFPLE9BQVA7QUFDSCxLQWxTYzs7O0FBb1NmO0FBQ0EsZ0JBclNlLDBCQXFTQztBQUNaLFlBQUksS0FBSyxhQUFULEVBQXdCO0FBQ3BCO0FBQ0g7O0FBRUQsWUFBSSxDQUFDLEtBQUssRUFBVixFQUFjO0FBQ1Ysa0JBQU0sSUFBSSxLQUFKLG9DQUEyQyxLQUFLLElBQWhELDRCQUFOO0FBQ0g7O0FBRUQ7QUFDQSxZQUFJLFVBQVUsS0FBSyxlQUFMLEVBQWQ7QUFDQSxZQUFJLEtBQUssU0FBVCxFQUFvQjtBQUNoQixnQkFBSSxvQkFBb0IsT0FBTyxNQUFQLENBQWMsRUFBZCxFQUFrQixPQUFsQixDQUF4QjtBQUNBLDhCQUFrQix5QkFBbEIsR0FBOEMsSUFBOUM7QUFDSDs7QUFFRDtBQUNBLFlBQUksU0FBVSxLQUFLLE9BQUwsSUFBZ0IsS0FBSyxPQUFMLENBQWEsTUFBM0M7QUFDQSxZQUFJLGVBQWdCLEtBQUssT0FBTCxJQUFnQixLQUFLLE9BQUwsQ0FBYSxZQUFqRDtBQUNBLFlBQUksV0FBVyxPQUFPLE1BQVAsQ0FBYyxFQUFkLEVBQWtCLEtBQUssT0FBTCxJQUFnQixLQUFLLE9BQUwsQ0FBYSxRQUEvQyxDQUFmOztBQUVBO0FBQ0EsWUFBSSxhQUFjLEtBQUssT0FBTCxJQUFnQixLQUFLLE9BQUwsQ0FBYSxVQUEvQztBQUNBLFlBQUksT0FBTyxVQUFQLEtBQXNCLFFBQTFCLEVBQW9DO0FBQ2hDLHlCQUFhLENBQUMsVUFBRCxDQUFiO0FBQ0g7O0FBRUQ7QUFDQSxhQUFLLE9BQUwsR0FBZSw2QkFDWCxLQUFLLEVBRE0sRUFFWCxLQUFLLGlCQUZNLEVBR1gsS0FBSyxtQkFITSxFQUlYO0FBQ0ksa0JBQU0sS0FBSyxJQURmO0FBRUksNEJBRko7QUFHSSw4QkFISjtBQUlJLDBCQUpKO0FBS0ksc0NBTEo7QUFNSTtBQU5KLFNBSlcsQ0FBZjs7QUFjQSxZQUFJLEtBQUssU0FBVCxFQUFvQjtBQUNoQixpQkFBSyxpQkFBTCxHQUF5Qiw2QkFDckIsS0FBSyxFQURnQixFQUVyQixLQUFLLGlCQUZnQixFQUdyQiwyQkFIcUIsRUFJckI7QUFDSSxzQkFBTyxLQUFLLElBQUwsR0FBWSxjQUR2QjtBQUVJLHlCQUFTLGlCQUZiO0FBR0ksa0NBSEo7QUFJSSw4QkFKSjtBQUtJLDBDQUxKO0FBTUk7QUFOSixhQUpxQixDQUF6QjtBQWFILFNBZEQsTUFlSztBQUNELGlCQUFLLGlCQUFMLEdBQXlCLElBQXpCO0FBQ0g7O0FBRUQsYUFBSyxhQUFMLEdBQXFCLElBQXJCO0FBQ0gsS0FuV2M7OztBQXFXZjtBQUNBLGtCQXRXZSwwQkFzV0MsR0F0V0QsRUFzV00sS0F0V04sRUFzVzJCO0FBQUEsWUFBZCxLQUFjLHVFQUFOLElBQU07O0FBQ3RDLGFBQUssT0FBTCxDQUFhLE1BQWIsR0FBc0IsS0FBSyxPQUFMLENBQWEsTUFBYixJQUF1QixFQUE3QztBQUNBLGFBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsR0FBcEIsSUFBMkIsS0FBSyxPQUFMLENBQWEsTUFBYixDQUFvQixHQUFwQixLQUE0QixFQUF2RDtBQUNBLGFBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsR0FBcEIsRUFBeUIsSUFBekIsQ0FBOEIsS0FBOUI7O0FBRUEsYUFBSyxPQUFMLENBQWEsWUFBYixHQUE0QixLQUFLLE9BQUwsQ0FBYSxZQUFiLElBQTZCLEVBQXpEO0FBQ0EsYUFBSyxPQUFMLENBQWEsWUFBYixDQUEwQixHQUExQixJQUFpQyxLQUFLLE9BQUwsQ0FBYSxZQUFiLENBQTBCLEdBQTFCLEtBQWtDLEVBQW5FO0FBQ0EsYUFBSyxPQUFMLENBQWEsWUFBYixDQUEwQixHQUExQixFQUErQixJQUEvQixDQUFvQyxLQUFwQztBQUNILEtBOVdjOzs7QUFnWGY7QUFDQSxxQkFqWGUsNkJBaVhJLEdBalhKLEVBaVhTO0FBQ3BCLFlBQUksS0FBSyxPQUFMLENBQWEsTUFBakIsRUFBeUI7QUFDckIsaUJBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsR0FBcEIsSUFBMkIsSUFBM0I7QUFDSDtBQUNKLEtBclhjO0FBdVhmLHNCQXZYZSw4QkF1WEssR0F2WEwsRUF1WFUsS0F2WFYsRUF1WCtCO0FBQUEsWUFBZCxLQUFjLHVFQUFOLElBQU07O0FBQzFDLGFBQUssaUJBQUwsQ0FBdUIsR0FBdkI7QUFDQSxhQUFLLGNBQUwsQ0FBb0IsR0FBcEIsRUFBeUIsS0FBekIsRUFBZ0MsS0FBaEM7QUFDSCxLQTFYYzs7O0FBNFhmOzs7QUFHQSxtQkEvWGUsNkJBK1hJO0FBQ2Y7QUFDQSxZQUFJLFVBQVUsRUFBZCxDQUZlLENBRUc7QUFDbEIsWUFBSSxLQUFLLE9BQUwsSUFBZ0IsSUFBcEIsRUFBMEI7QUFDdEIsaUJBQUssSUFBSSxDQUFULElBQWMsS0FBSyxPQUFuQixFQUE0QjtBQUN4Qix3QkFBUSxDQUFSLElBQWEsS0FBSyxPQUFMLENBQWEsQ0FBYixDQUFiO0FBQ0g7QUFDSjtBQUNELFlBQUksS0FBSyxPQUFMLElBQWdCLElBQWhCLElBQXdCLEtBQUssT0FBTCxDQUFhLE9BQWIsSUFBd0IsSUFBcEQsRUFBMEQ7QUFDdEQsaUJBQUssQ0FBTCxJQUFVLEtBQUssT0FBTCxDQUFhLE9BQXZCLEVBQWdDO0FBQzVCLHdCQUFRLENBQVIsSUFBYSxLQUFLLE9BQUwsQ0FBYSxPQUFiLENBQXFCLENBQXJCLENBQWI7QUFDSDtBQUNKO0FBQ0QsZUFBTyxPQUFQO0FBRUgsS0E5WWM7OztBQWdaZjtBQUNBLGNBalplLHdCQWlaRDtBQUNWLGVBQVEsQ0FBQyxPQUFELEVBQVUsUUFBVixFQUFvQixRQUFwQixFQUE4QixPQUE5QixDQUFzQyxLQUFLLE1BQTNDLElBQXFELENBQUMsQ0FBOUQ7QUFDSCxLQW5aYzs7O0FBcVpmO0FBQ0EsZ0JBdFplLDBCQXNaQztBQUFBOztBQUNaLFlBQUksQ0FBQyxLQUFLLFVBQUwsRUFBTCxFQUF3QjtBQUNwQjtBQUNIOztBQUVEO0FBQ0EsWUFBSSxLQUFLLE1BQUwsS0FBZ0IsT0FBcEIsRUFBNkI7QUFDekIsaUJBQUssT0FBTCxDQUFhLDRCQUFiLEdBQTRDLElBQTVDO0FBQ0gsU0FGRCxNQUdLLElBQUksS0FBSyxNQUFMLEtBQWdCLFFBQXBCLEVBQThCO0FBQy9CLGlCQUFLLE9BQUwsQ0FBYSw2QkFBYixHQUE2QyxJQUE3QztBQUNIO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFJLHFCQUNBLE9BQU8sSUFBUCxDQUFZLEtBQUssT0FBakIsRUFDQyxNQURELENBQ1E7QUFBQSxtQkFBSyxNQUFLLE9BQUwsQ0FBYSxDQUFiLHFDQUFMO0FBQUEsU0FEUixFQUVDLE1BSEw7O0FBS0EsYUFBSyxPQUFMLENBQWEsMEJBQWIsWUFBaUQsa0JBQWpEO0FBQ0EsWUFBSSxxQkFBcUIsQ0FBekIsRUFBNEI7QUFDeEI7QUFDQSxpQkFBSyxPQUFMLENBQWEsd0NBQWIsR0FBd0QsSUFBeEQ7O0FBRUE7QUFDQSxpQkFBSyxrQkFBTCxDQUF3QixRQUF4QixFQUFrQyxpQkFBbEMsRUFBcUQsUUFBckQ7QUFDSDtBQUNKLEtBeGJjOzs7QUEwYmY7QUFDQSx1QkEzYmUsK0JBMmJNLElBM2JOLEVBMmJZLFNBM2JaLEVBMmJ1QjtBQUFBOztBQUNsQyxZQUFJLENBQUMsS0FBSyxVQUFMLEVBQUwsRUFBd0I7QUFDcEIsbUJBQU8sUUFBUSxPQUFSLENBQWdCLFNBQWhCLENBQVA7QUFDSDs7QUFFRCxZQUFJLFVBQVUsRUFBZCxDQUxrQyxDQUtoQjtBQUNsQixZQUFJLFFBQVEsRUFBWixDQU5rQyxDQU1oQjs7QUFFbEI7QUFDQSxhQUFLLE9BQUwsQ0FBYSxHQUFiLENBQWlCO0FBQUEsbUJBQUssT0FBSyxPQUFMLENBQWEsQ0FBYixDQUFMO0FBQUEsU0FBakIsRUFBdUMsTUFBdkMsQ0FBOEM7QUFBQSxtQkFBSyxDQUFMO0FBQUEsU0FBOUMsRUFBc0QsT0FBdEQsQ0FBOEQsVUFBQyxNQUFELEVBQVMsQ0FBVCxFQUFlO0FBQ3pFLGdCQUFJLDBDQUFKLEVBQXdDO0FBQ3BDLG9CQUFJLFNBQVMsT0FBTyxXQUFQLENBQW1CLElBQW5CLENBQWI7QUFDQSx3QkFBUSxPQUFPLEdBQWYsSUFBc0IsTUFBdEI7QUFDQSxzQkFBTSxPQUFPLEdBQWIsSUFBb0IsQ0FBcEI7QUFDSDtBQUNKLFNBTkQ7O0FBUUEsWUFBSSxPQUFPLElBQVAsQ0FBWSxPQUFaLEVBQXFCLE1BQXJCLEtBQWdDLENBQXBDLEVBQXVDO0FBQ25DLG1CQUFPLFFBQVEsT0FBUixDQUFnQixTQUFoQixDQUFQO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsZUFBTyx3QkFBYSxXQUFiLENBQXlCLEtBQUssa0JBQUwsR0FBd0IsZUFBakQsRUFBa0UsT0FBbEUsRUFDRixJQURFLENBQ0csb0JBQVk7QUFDZCxnQkFBSSxDQUFDLFFBQUQsSUFBYSxTQUFTLE1BQVQsR0FBa0IsQ0FBbkMsRUFBc0M7QUFDbEM7QUFDQSx1QkFBTyxTQUFQO0FBQ0g7O0FBRUQ7QUFDQSxzQkFBVSxRQUFWLEdBQXFCLFVBQVUsUUFBVixJQUFzQixFQUEzQztBQUNBLHNCQUFVLFFBQVYsR0FBcUIsVUFBVSxRQUFWLElBQXNCLEVBQTNDOztBQUVBLGdCQUFJLGFBQWEsVUFBVSxRQUFWLENBQW1CLFdBQW5CLElBQWtDLEVBQW5EO0FBQ0EsZ0JBQUksVUFBVSxVQUFVLFFBQVYsQ0FBbUIsZ0JBQW5CLElBQXVDLEVBQXJEO0FBQ0EsZ0JBQUksWUFBWSxVQUFVLFFBQVYsQ0FBbUIsa0JBQW5CLElBQXlDLEVBQXpEOztBQUVBLHFCQUFTLE9BQVQsQ0FBaUIsaUJBQThCO0FBQUE7QUFBQSxvQkFBNUIsS0FBNEI7QUFBQSxvQkFBckIsTUFBcUI7QUFBQSxvQkFBYixPQUFhOztBQUMzQyxvQkFBSSxJQUFJLE1BQU0sS0FBTixDQUFSO0FBQ0Esb0JBQUksZ0JBQWdCLFFBQVEsS0FBUixFQUFlLE1BQW5DLENBRjJDLENBRUE7O0FBRTNDLDJCQUFXLENBQVgsSUFBZ0IsS0FBaEI7QUFDQSwwQkFBVSxRQUFWLENBQW1CLElBQW5CLENBQXdCLEtBQXhCOztBQUVBLHdCQUFRLENBQVIsSUFBYSxDQUFDLE1BQUQsRUFBUyxPQUFULENBQWI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBSSxLQUFLLE1BQUwsQ0FBWSxDQUFaLEdBQWdCLGNBQWMsQ0FBbEMsRUFBcUM7QUFDakMsd0JBQUksS0FBSyxLQUFLLE1BQUwsQ0FBWSxDQUFaLEdBQWdCLGNBQWMsQ0FBdkMsQ0FEaUMsQ0FDUztBQUMxQyx3QkFBSSxNQUFNLEtBQUssR0FBTCxDQUFTLENBQVQsRUFBWSxFQUFaLENBQVY7QUFDQSw4QkFBVSxDQUFWLElBQWUsQ0FDVixLQUFLLE1BQUwsQ0FBWSxDQUFaLEdBQWdCLEdBQWpCLEdBQXdCLEdBRGIsRUFFWCxDQUFDLE1BQU0sQ0FBTixHQUFXLEtBQUssTUFBTCxDQUFZLENBQVosR0FBZ0IsR0FBNUIsSUFBb0MsR0FGekIsRUFFOEI7QUFDekMsd0JBQUksR0FITyxDQUFmO0FBS0gsaUJBUkQsTUFTSztBQUNELDhCQUFVLENBQVYsSUFBZSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxDQUFmO0FBQ0g7QUFDSixhQXpCRDs7QUEyQkEsbUJBQU8sU0FBUDtBQUNILFNBM0NFLENBQVA7QUE2Q0gsS0FoZ0JjOzs7QUFrZ0JmO0FBQ0EsZ0JBbmdCZSx3QkFtZ0JELFFBbmdCQyxFQW1nQlM7QUFDcEI7QUFDQSxlQUFPLGtCQUFRLGdCQUFSLENBQXlCLEtBQUssRUFBOUIsRUFBa0MsUUFBbEMsRUFDRixJQURFLENBQ0csWUFBTTtBQUNSLG1CQUFPLFFBQVEsR0FBUixDQUFZLE9BQU8sSUFBUCxDQUFZLFFBQVosRUFBc0IsR0FBdEIsQ0FBMEIsYUFBSztBQUM5Qyx1QkFBTyxrQkFBUSxRQUFSLENBQWlCLENBQWpCLEtBQXVCLGtCQUFRLFFBQVIsQ0FBaUIsQ0FBakIsRUFBb0IsSUFBcEIsRUFBOUI7QUFDSCxhQUZrQixFQUVoQixNQUZnQixDQUVUO0FBQUEsdUJBQUssQ0FBTDtBQUFBLGFBRlMsQ0FBWixDQUFQO0FBR0gsU0FMRSxFQU1GLElBTkUsQ0FNRyxvQkFBWTtBQUNkLHFCQUFTLE9BQVQsQ0FBaUI7QUFBQSx1QkFBSyxFQUFFLE1BQUYsRUFBTDtBQUFBLGFBQWpCO0FBQ0EsbUJBQU8sU0FBUyxHQUFULENBQWE7QUFBQSx1QkFBSyxDQUFDLEVBQUUsSUFBSCxFQUFTLEVBQUUsS0FBWCxFQUFrQixFQUFFLE1BQXBCLENBQUw7QUFBQSxhQUFiLENBQVA7QUFDSCxTQVRFLENBQVA7QUFVSCxLQS9nQmM7OztBQWloQmY7QUFDQSxTQWxoQmUsbUJBa2hCTjtBQUNMLGFBQUssV0FBTDtBQUNBLGFBQUssUUFBTCxDQUFjLFlBQWQsQ0FBMkIseUJBQWMsT0FBekM7QUFDSCxLQXJoQmM7OztBQXVoQmY7QUFDQSxlQXhoQmUseUJBd2hCQTtBQUNYLFlBQUksVUFBVSx5QkFBYyxPQUE1QjtBQUNBLFlBQUksQ0FBQyxPQUFMLEVBQWM7QUFDVjtBQUNIOztBQUVELGdCQUFRLFdBQVIsQ0FBb0IsS0FBSyxPQUFMLElBQWdCLEtBQUssT0FBTCxDQUFhLFFBQWpELEVBQTJELElBQTNELEVBTlcsQ0FNdUQ7QUFDckUsS0EvaEJjOzs7QUFpaUJmO0FBQ0EsbUJBQWU7QUFDWCxnQkFBUSxFQUFFLFlBQVksSUFBZCxFQUFvQixhQUFhLElBQWpDLEVBREc7QUFFWCxhQUFLLEVBQUUsWUFBWSxJQUFkLEVBQW9CLGFBQWEsS0FBakMsRUFGTTtBQUdYLGtCQUFVLEVBQUUsWUFBWSxJQUFkLEVBQW9CLGFBQWEsS0FBakMsRUFIQztBQUlYLGVBQU8sRUFBRSxZQUFZLElBQWQsRUFBb0IsYUFBYSxLQUFqQyxFQUpJO0FBS1gsaUJBQVMsRUFBRSxZQUFZLEtBQWQsRUFBcUIsYUFBYSxLQUFsQztBQUxFLEtBbGlCQTs7QUEwaUJmO0FBQ0EsMEJBQXNCO0FBQ2xCLGdCQUFRLENBRFU7QUFFbEIsYUFBSyxDQUZhO0FBR2xCLGtCQUFVLENBSFE7QUFJbEIsZUFBTyxDQUpXO0FBS2xCLGlCQUFTO0FBTFMsS0EzaUJQOztBQW1qQmY7QUFDQSxrQkFwakJlLDBCQW9qQkMsQ0FwakJELEVBb2pCSSxDQXBqQkosRUFvakJPO0FBQ2xCO0FBQ0EsWUFBSSxFQUFFLEtBQUYsS0FBWSxRQUFaLElBQXdCLEVBQUUsS0FBRixLQUFZLFFBQXhDLEVBQWtEO0FBQzlDLGdCQUFJLEVBQUUsS0FBRixLQUFZLFFBQVosSUFBd0IsRUFBRSxLQUFGLEtBQVksUUFBeEMsRUFBa0Q7QUFBRTtBQUNoRCx1QkFBTyxFQUFFLElBQUYsR0FBUyxFQUFFLElBQVgsR0FBa0IsQ0FBQyxDQUFuQixHQUF1QixDQUE5QixDQUQ4QyxDQUNiO0FBQ3BDLGFBRkQsTUFHSyxJQUFJLEVBQUUsS0FBRixLQUFZLFFBQWhCLEVBQTBCO0FBQzNCLHVCQUFPLENBQUMsQ0FBUixDQUQyQixDQUNoQjtBQUNkLGFBRkksTUFHQTtBQUNELHVCQUFPLENBQVAsQ0FEQyxDQUNTO0FBQ2I7QUFDSjs7QUFFRDtBQUNBLFlBQUksRUFBRSxXQUFGLEdBQWdCLEVBQUUsV0FBdEIsRUFBbUM7QUFDL0IsbUJBQU8sQ0FBQyxDQUFSO0FBQ0gsU0FGRCxNQUdLLElBQUksRUFBRSxXQUFGLEdBQWdCLEVBQUUsV0FBdEIsRUFBbUM7QUFDcEMsbUJBQU8sQ0FBUDtBQUNIOztBQUVEO0FBQ0EsWUFBSSxNQUFNLG9CQUFOLENBQTJCLEVBQUUsS0FBN0IsSUFBc0MsTUFBTSxvQkFBTixDQUEyQixFQUFFLEtBQTdCLENBQTFDLEVBQStFO0FBQzNFLG1CQUFPLENBQUMsQ0FBUjtBQUNILFNBRkQsTUFHSyxJQUFJLE1BQU0sb0JBQU4sQ0FBMkIsRUFBRSxLQUE3QixJQUFzQyxNQUFNLG9CQUFOLENBQTJCLEVBQUUsS0FBN0IsQ0FBMUMsRUFBK0U7QUFDaEYsbUJBQU8sQ0FBUDtBQUNIOztBQUVELGVBQU8sRUFBRSxJQUFGLEdBQVMsRUFBRSxJQUFYLEdBQWtCLENBQUMsQ0FBbkIsR0FBdUIsQ0FBOUIsQ0E5QmtCLENBOEJlO0FBQ3BDO0FBbmxCYyxDQUFaOzs7Ozs7Ozs7O3FqQkNwQlA7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7O0FBRUEsSUFBSSxLQUFLLFFBQVEsSUFBUixDQUFUO0FBQ0EsSUFBTSxzQkFBc0IsR0FBRyxZQUFILENBQWdCLFlBQVksK0JBQTVCLEVBQTZELE1BQTdELENBQTVCO0FBQ0EsSUFBTSx1QkFBdUIsR0FBRyxZQUFILENBQWdCLFlBQVksaUNBQTVCLEVBQStELE1BQS9ELENBQTdCO0FBQ0EsSUFBTSw2QkFBNkIsR0FBRyxZQUFILENBQWdCLFlBQVksdUNBQTVCLEVBQXFFLE1BQXJFLENBQW5DO0FBQ0EsSUFBTSw0QkFBNEIsR0FBRyxZQUFILENBQWdCLFlBQVksc0NBQTVCLEVBQW9FLE1BQXBFLENBQWxDOztJQUVhLFksV0FBQSxZO0FBRVQsNEJBQWU7QUFBQTs7QUFDWCxhQUFLLE1BQUwsR0FBYyxFQUFkO0FBQ0EsYUFBSyxXQUFMLEdBQW1CLEVBQW5COztBQUVBO0FBQ0EsYUFBSyxRQUFMLENBQWMsT0FBTyxNQUFQLG9CQUFkO0FBQ0EsYUFBSyxRQUFMLENBQWMsT0FBTyxNQUFQLGNBQWQ7QUFDQSxhQUFLLFFBQUwsQ0FBYyxPQUFPLE1BQVAsZ0JBQWQ7QUFDQSxhQUFLLFFBQUwsQ0FBYyxPQUFPLE1BQVAsaUJBQWQ7QUFDQSxhQUFLLFFBQUwsQ0FBYyxPQUFPLE1BQVAscUJBQWQ7QUFDSDs7QUFFRDs7Ozs7K0JBQ1E7QUFDSixxQ0FBYyxXQUFkLENBQTBCLFFBQTFCO0FBQ0EscUNBQWMsV0FBZCxDQUEwQixPQUExQjs7QUFFQTtBQUNBLHFDQUFjLFFBQWQsQ0FBdUIsUUFBdkIsRUFBaUMsbUJBQWpDOztBQUVBO0FBQ0EscUNBQWMsUUFBZCxDQUF1QixRQUF2QixFQUFpQyxvQkFBakM7O0FBRUE7QUFDQSxxQ0FBYyxRQUFkLENBQXVCLFFBQXZCLEVBQWlDLDBCQUFqQzs7QUFFQTtBQUNBLHFDQUFjLFlBQWQsQ0FBMkIsT0FBM0IsRUFBb0MseUJBQXBDOztBQUVBO0FBQ0EscUNBQWMsT0FBZCxDQUFzQixlQUF0QixHQUF3QyxPQUF4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBYyxPQUFkLENBQXNCLG1CQUF0QixHQUE0QyxLQUFLLEtBQUssRUFBVixDQUE1Qzs7QUFFQTtBQUNBLHFDQUFjLE9BQWQsQ0FBc0Isa0JBQXRCLGFBQ1ksY0FBSSxVQURoQixXQUNnQyxjQUFJLFVBRHBDLGdDQUN5RSxjQUFJLFNBRDdFOztBQUdBO0FBQ0EscUNBQWMsT0FBZCxDQUFzQixvQkFBdEIsR0FBNkMsY0FBSSxZQUFqRDtBQUNIOztBQUVEOzs7O2dDQUNTLEUsRUFBSTtBQUFBOztBQUNULG1CQUFPLElBQVAsQ0FBWSxLQUFLLE1BQWpCLEVBQXlCLE9BQXpCLENBQWlDLFVBQUMsS0FBRCxFQUFXO0FBQ3hDLG9CQUFJLFFBQVEsTUFBSyxNQUFMLENBQVksS0FBWixDQUFaO0FBQ0Esb0JBQUksTUFBTSxFQUFOLEtBQWEsRUFBakIsRUFBcUI7QUFDakIsdUNBQUksT0FBSixxREFBOEQsTUFBTSxJQUFwRTs7QUFFQSx3QkFBSSxNQUFNLElBQVYsRUFBZ0I7QUFDWiw4QkFBSyxNQUFMLENBQVksTUFBTSxJQUFsQjtBQUNIO0FBQ0QsMEJBQU0sT0FBTjtBQUNIO0FBQ0osYUFWRDtBQVdIOztBQUVEOzs7O2lDQUNVLEssRUFBTztBQUNiLGlCQUFLLE1BQUwsQ0FBWSxNQUFNLElBQWxCLElBQTBCLEtBQTFCO0FBQ0EsaUJBQUssV0FBTCxDQUFpQixNQUFNLElBQXZCLElBQStCLEtBQS9CO0FBQ0g7O0FBRUQ7Ozs7K0JBQ1EsSSxFQUFNO0FBQ1YsbUJBQU8sS0FBSyxNQUFMLENBQVksSUFBWixDQUFQO0FBQ0g7Ozs0QkFFSSxLLEVBQU8sTSxFQUFRO0FBQ2hCO0FBQ0EsZ0JBQUksTUFBTSxLQUFWLEVBQWlCO0FBQ2IsdUJBQU8sS0FBUDtBQUNIO0FBQ0Qsa0JBQU0sS0FBTixHQUFjLEVBQWQ7O0FBRUE7QUFDQSxnQkFBSSxVQUFVLEVBQWQ7QUFDQSxnQkFBSSxNQUFNLEdBQVYsRUFBZTtBQUNYLG9CQUFJLE1BQU0sT0FBTixDQUFjLE1BQU0sR0FBcEIsQ0FBSixFQUE4QjtBQUFBOztBQUMxQix5Q0FBUSxJQUFSLG9DQUFnQixNQUFNLEdBQXRCO0FBQ0gsaUJBRkQsTUFHSztBQUNELDRCQUFRLElBQVIsQ0FBYSxNQUFNLEdBQW5CO0FBQ0g7QUFDRCwwQkFBVSxRQUFRLEdBQVIsQ0FBWTtBQUFBLDJCQUFLLE9BQU8sQ0FBUCxDQUFMO0FBQUEsaUJBQVosRUFBNEIsTUFBNUIsQ0FBbUM7QUFBQSwyQkFBSyxLQUFLLE1BQU0sS0FBaEI7QUFBQSxpQkFBbkMsQ0FBVixDQVBXLENBTzBEOztBQUVyRTtBQUNBLHdCQUFRLE9BQVIsQ0FBZ0I7QUFBQSwyQkFBSyxNQUFNLEtBQU4sQ0FBWSxFQUFFLElBQWQsSUFBc0IsSUFBM0I7QUFBQSxpQkFBaEI7QUFDSDtBQUNELG9CQUFRLElBQVIsQ0FBYSxLQUFiOztBQUVBO0FBQ0Esa0JBQU0sUUFBTixHQUFpQixRQUFRLElBQVIsQ0FBYTtBQUFBLHVCQUFLLEtBQUssRUFBRSxRQUFaO0FBQUEsYUFBYixDQUFqQjtBQUNBLGtCQUFNLFNBQU4sR0FBa0IsUUFBUSxJQUFSLENBQWE7QUFBQSx1QkFBSyxLQUFLLEVBQUUsU0FBWjtBQUFBLGFBQWIsQ0FBbEI7O0FBRUE7QUFDQSxrQkFBTSxJQUFOLEdBQWEsUUFBUSxHQUFSLENBQVk7QUFBQSx1QkFBSyxFQUFFLElBQVA7QUFBQSxhQUFaLEVBQXlCLE1BQXpCLENBQWdDO0FBQUEsdUJBQUssQ0FBTDtBQUFBLGFBQWhDLEVBQXdDLEdBQXhDLEVBQWI7QUFDQSxrQkFBTSxRQUFOLEdBQWlCLFFBQVEsR0FBUixDQUFZO0FBQUEsdUJBQUssRUFBRSxRQUFQO0FBQUEsYUFBWixFQUE2QixNQUE3QixDQUFvQztBQUFBLHVCQUFLLEtBQUssSUFBVjtBQUFBLGFBQXBDLEVBQW9ELEdBQXBELEVBQWpCO0FBQ0Esa0JBQU0sT0FBTixHQUFnQixRQUFRLEdBQVIsQ0FBWTtBQUFBLHVCQUFLLEVBQUUsT0FBUDtBQUFBLGFBQVosRUFBNEIsTUFBNUIsQ0FBbUM7QUFBQSx1QkFBSyxDQUFMO0FBQUEsYUFBbkMsRUFBMkMsR0FBM0MsRUFBaEI7QUFDQSxrQkFBTSxNQUFOLEdBQWUsUUFBUSxHQUFSLENBQVk7QUFBQSx1QkFBSyxFQUFFLE1BQVA7QUFBQSxhQUFaLEVBQTJCLE1BQTNCLENBQWtDO0FBQUEsdUJBQUssS0FBSyxJQUFWO0FBQUEsYUFBbEMsRUFBa0QsR0FBbEQsRUFBZjtBQUNBLGtCQUFNLElBQU4sR0FBYSxRQUFRLEdBQVIsQ0FBWTtBQUFBLHVCQUFLLEVBQUUsSUFBUDtBQUFBLGFBQVosRUFBeUIsTUFBekIsQ0FBZ0M7QUFBQSx1QkFBSyxLQUFLLElBQVY7QUFBQSxhQUFoQyxFQUFnRCxHQUFoRCxFQUFiO0FBQ0Esa0JBQU0scUJBQU4sR0FBOEIsUUFBUSxHQUFSLENBQVk7QUFBQSx1QkFBSyxFQUFFLHFCQUFQO0FBQUEsYUFBWixFQUEwQyxNQUExQyxDQUFpRDtBQUFBLHVCQUFLLEtBQUssSUFBVjtBQUFBLGFBQWpELEVBQWlFLEdBQWpFLEVBQTlCO0FBQ0EsZ0JBQUksUUFBUSxJQUFSLENBQWE7QUFBQSx1QkFBSyxFQUFFLGNBQUYsQ0FBaUIsT0FBakIsS0FBNkIsRUFBRSxLQUFwQztBQUFBLGFBQWIsQ0FBSixFQUE2RDtBQUN6RDtBQUNBO0FBQ0Esc0JBQU0sS0FBTixHQUFjLFFBQVEsR0FBUixDQUFZO0FBQUEsMkJBQUssRUFBRSxjQUFGLENBQWlCLE9BQWpCLEtBQTZCLEVBQUUsS0FBcEM7QUFBQSxpQkFBWixFQUF1RCxNQUF2RCxDQUE4RDtBQUFBLDJCQUFLLENBQUw7QUFBQSxpQkFBOUQsRUFBc0UsR0FBdEUsRUFBZDtBQUNIO0FBQ0Qsa0JBQU0sV0FBTixHQUFvQixRQUFRLEdBQVIsQ0FBWTtBQUFBLHVCQUFLLEVBQUUsV0FBUDtBQUFBLGFBQVosRUFBZ0MsTUFBaEMsQ0FBdUM7QUFBQSx1QkFBSyxLQUFLLElBQVY7QUFBQSxhQUF2QyxFQUF1RCxHQUF2RCxFQUFwQjs7QUFFQTtBQUNBLGtCQUFNLE9BQU4sR0FBZ0IsT0FBTyxNQUFQLGdCQUFjLEVBQWQsNEJBQXFCLFFBQVEsR0FBUixDQUFZO0FBQUEsdUJBQUssRUFBRSxPQUFQO0FBQUEsYUFBWixFQUE0QixNQUE1QixDQUFtQztBQUFBLHVCQUFLLENBQUw7QUFBQSxhQUFuQyxDQUFyQixHQUFoQixDQTFDZ0IsQ0EwQ2tFO0FBQ2xGLGtCQUFNLFFBQU4sR0FBaUIsT0FBTyxNQUFQLGdCQUFjLEVBQWQsNEJBQXFCLFFBQVEsR0FBUixDQUFZO0FBQUEsdUJBQUssRUFBRSxRQUFQO0FBQUEsYUFBWixFQUE2QixNQUE3QixDQUFvQztBQUFBLHVCQUFLLENBQUw7QUFBQSxhQUFwQyxDQUFyQixHQUFqQjs7QUFFQTtBQUNBLGlCQUFLLFVBQUwsQ0FBZ0IsS0FBaEIsRUFBdUIsTUFBdkIsRUFBK0IsT0FBL0I7QUFDQSxtQkFBTyxLQUFQO0FBQ0g7O0FBRUQ7Ozs7bUNBQ1ksSyxFQUFPLE0sRUFBUSxPLEVBQVM7QUFDaEMsZ0JBQUksVUFBVSxFQUFkLENBRGdDLENBQ2Q7QUFDbEIsZ0JBQUksZ0JBQWdCLFFBQVEsR0FBUixDQUFZO0FBQUEsdUJBQUssRUFBRSxPQUFQO0FBQUEsYUFBWixFQUE0QixNQUE1QixDQUFtQztBQUFBLHVCQUFLLENBQUw7QUFBQSxhQUFuQyxDQUFwQixDQUZnQyxDQUVnQzs7QUFFaEU7QUFDQSxvQkFBUSxPQUFSLEdBQWtCLE9BQU8sTUFBUCxnQkFBYyxFQUFkLDRCQUFxQixjQUFjLEdBQWQsQ0FBa0I7QUFBQSx1QkFBSyxFQUFFLE9BQVA7QUFBQSxhQUFsQixFQUFrQyxNQUFsQyxDQUF5QztBQUFBLHVCQUFLLENBQUw7QUFBQSxhQUF6QyxDQUFyQixHQUFsQjs7QUFFQTtBQUNBLG9CQUFRLFFBQVIsR0FBbUIsRUFBbkIsQ0FSZ0MsQ0FRUjtBQUN4QixvQkFBUSxTQUFSLEdBQXFCLE1BQU0sT0FBTixJQUFpQixNQUFNLE9BQU4sQ0FBYyxRQUFoQyxJQUE2QyxFQUFqRSxDQVRnQyxDQVNxQztBQUNyRSxvQkFBUSxlQUFSLEdBQTBCLEVBQTFCLENBVmdDLENBVUY7O0FBRTlCO0FBQ0Esb0JBQ0ssTUFETCxDQUNZO0FBQUEsdUJBQUssRUFBRSxPQUFGLElBQWEsRUFBRSxPQUFGLENBQVUsUUFBNUI7QUFBQSxhQURaLEVBRUssT0FGTCxDQUVhLGFBQUs7QUFBQSwyQ0FDRCxDQURDO0FBRU4sNEJBQVEsZUFBUixDQUF3QixDQUF4QixJQUE2QixFQUFFLElBQS9COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQU8sY0FBUCxDQUFzQixRQUFRLFFBQTlCLEVBQXdDLENBQXhDLEVBQTJDO0FBQ3ZDLG9DQUFZLElBRDJCO0FBRXZDLHNDQUFjLElBRnlCO0FBR3ZDLDZCQUFLLGVBQVk7QUFDYjtBQUNBLGdDQUFJLFFBQVEsU0FBUixDQUFrQixDQUFsQixNQUF5QixTQUE3QixFQUF3QztBQUNwQyx1Q0FBTyxRQUFRLFNBQVIsQ0FBa0IsQ0FBbEIsQ0FBUDtBQUNIO0FBQ0Q7QUFDQTtBQUNBO0FBTEEsaUNBTUssSUFBSSxPQUFPLFFBQVEsZUFBUixDQUF3QixDQUF4QixDQUFQLEVBQW1DLE9BQW5DLENBQTJDLFFBQTNDLEtBQXdELFFBQVEsUUFBcEUsRUFBOEU7QUFDL0UsMkNBQU8sT0FBTyxRQUFRLGVBQVIsQ0FBd0IsQ0FBeEIsQ0FBUCxFQUFtQyxPQUFuQyxDQUEyQyxRQUEzQyxDQUFvRCxDQUFwRCxDQUFQO0FBQ0g7QUFDSix5QkFkc0M7QUFldkMsNkJBQUssYUFBVSxDQUFWLEVBQWE7QUFDZCxvQ0FBUSxTQUFSLENBQWtCLENBQWxCLElBQXVCLENBQXZCO0FBQ0g7QUFqQnNDLHFCQUEzQztBQVJNOztBQUNWLHFCQUFLLElBQUksQ0FBVCxJQUFjLEVBQUUsT0FBRixDQUFVLFFBQXhCLEVBQWtDO0FBQUEsMEJBQXpCLENBQXlCO0FBMEJqQztBQUNKLGFBOUJMOztBQWdDQTtBQUNBLG9CQUFRLFVBQVIsR0FBcUIsT0FBTyxJQUFQLENBQVksY0FDNUIsR0FENEIsQ0FDeEI7QUFBQSx1QkFBSyxFQUFFLFVBQVA7QUFBQSxhQUR3QixFQUU1QixNQUY0QixDQUVyQjtBQUFBLHVCQUFLLENBQUw7QUFBQSxhQUZxQixFQUc1QixNQUg0QixDQUdyQixVQUFDLElBQUQsRUFBTyxHQUFQLEVBQWU7QUFDbkI7QUFDQSxvQkFBSSxPQUFPLEdBQVAsS0FBZSxRQUFuQixFQUE2QjtBQUN6Qix5QkFBSyxHQUFMLElBQVksSUFBWjtBQUNIO0FBQ0Q7QUFIQSxxQkFJSztBQUNELDRCQUFJLE9BQUosQ0FBWTtBQUFBLG1DQUFLLEtBQUssQ0FBTCxJQUFVLElBQWY7QUFBQSx5QkFBWjtBQUNIO0FBQ0QsdUJBQU8sSUFBUDtBQUNILGFBYjRCLEVBYTFCLEVBYjBCLEtBYW5CLEVBYk8sQ0FBckI7O0FBZ0JBO0FBQ0E7QUFDQSxnQkFBSSxNQUFNLE9BQU4sSUFBaUIsTUFBTSxPQUFOLENBQWMsTUFBbkMsRUFBMkM7QUFDdkMsc0JBQU0sT0FBTixDQUFjLFlBQWQsR0FBNkIsTUFBTSxPQUFOLENBQWMsWUFBZCxJQUE4QixFQUEzRDtBQUNBLHFCQUFLLElBQUksQ0FBVCxJQUFjLE1BQU0sT0FBTixDQUFjLE1BQTVCLEVBQW9DO0FBQ2hDLHdCQUFJLFFBQVEsTUFBTSxPQUFOLENBQWMsTUFBZCxDQUFxQixDQUFyQixDQUFaO0FBQ0EsMEJBQU0sT0FBTixDQUFjLFlBQWQsQ0FBMkIsQ0FBM0IsSUFBZ0MsTUFBTSxPQUFOLENBQWMsWUFBZCxDQUEyQixDQUEzQixLQUFpQyxFQUFqRTtBQUNBLHdCQUFJLE1BQU0sT0FBTixDQUFjLEtBQWQsQ0FBSixFQUEwQjtBQUFBOztBQUN0Qix1REFBTSxPQUFOLENBQWMsWUFBZCxDQUEyQixDQUEzQixHQUE4QixJQUE5QixpREFBc0MsTUFBTSxHQUFOLENBQVU7QUFBQSxtQ0FBTSxNQUFNLElBQVo7QUFBQSx5QkFBVixDQUF0QztBQUNILHFCQUZELE1BR0s7QUFDRCw4QkFBTSxPQUFOLENBQWMsWUFBZCxDQUEyQixDQUEzQixFQUE4QixJQUE5QixDQUFtQyxNQUFNLElBQXpDO0FBQ0g7QUFDSjtBQUNKOztBQUVEO0FBQ0EsZ0JBQUksUUFBUSxFQUFaLENBL0VnQyxDQStFaEI7QUFDaEIsMEJBQWMsT0FBZCxDQUFzQixrQkFBVTtBQUM1QixvQkFBSSxDQUFDLE9BQU8sTUFBWixFQUFvQjtBQUNoQjtBQUNIOztBQUVELHdCQUFRLE1BQVIsR0FBaUIsUUFBUSxNQUFSLElBQWtCLEVBQW5DO0FBQ0Esd0JBQVEsWUFBUixHQUF1QixRQUFRLFlBQVIsSUFBd0IsRUFBL0M7QUFDQSxvQkFBSSxlQUFlLEVBQW5CLENBUDRCLENBT0w7O0FBRXZCLHFCQUFLLElBQUksQ0FBVCxJQUFjLE9BQU8sTUFBckIsRUFBNkI7QUFDekIsd0JBQUksU0FBUSxPQUFPLE1BQVAsQ0FBYyxDQUFkLENBQVo7QUFDQSx3QkFBSSxjQUFjLE9BQU8sWUFBUCxDQUFvQixDQUFwQixDQUFsQjs7QUFFQSw0QkFBUSxNQUFSLENBQWUsQ0FBZixJQUFvQixRQUFRLE1BQVIsQ0FBZSxDQUFmLEtBQXFCLEVBQXpDO0FBQ0EsNEJBQVEsWUFBUixDQUFxQixDQUFyQixJQUEwQixRQUFRLFlBQVIsQ0FBcUIsQ0FBckIsS0FBMkIsRUFBckQ7O0FBRUE7QUFDQSw2QkFBUSxNQUFNLE9BQU4sQ0FBYyxNQUFkLElBQXVCLE1BQXZCLEdBQStCLENBQUMsTUFBRCxDQUF2QztBQUNBLGtDQUFjLE1BQU0sT0FBTixDQUFjLFdBQWQsSUFBNkIsV0FBN0IsR0FBMkMsQ0FBQyxXQUFELENBQXpEOztBQUVBLHlCQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxPQUFNLE1BQXhCLEVBQWdDLEdBQWhDLEVBQXFDO0FBQ2pDO0FBQ0E7QUFDQSw0QkFBSSxNQUFNLFlBQVksQ0FBWixDQUFOLENBQUosRUFBMkI7QUFDdkI7QUFDSDtBQUNELHFDQUFhLFlBQVksQ0FBWixDQUFiLElBQStCLElBQS9COztBQUVBLGdDQUFRLE1BQVIsQ0FBZSxDQUFmLEVBQWtCLElBQWxCLENBQXVCLE9BQU0sQ0FBTixDQUF2QjtBQUNBLGdDQUFRLFlBQVIsQ0FBcUIsQ0FBckIsRUFBd0IsSUFBeEIsQ0FBNkIsWUFBWSxDQUFaLENBQTdCO0FBQ0g7QUFDSjs7QUFFRDtBQUNBO0FBQ0EsdUJBQU8sTUFBUCxDQUFjLEtBQWQsRUFBcUIsWUFBckI7QUFDSCxhQXBDRDs7QUFzQ0EsbUJBQU8sTUFBUCxDQUFjLE1BQU0sS0FBcEIsRUFBMkIsS0FBM0IsRUF0SGdDLENBc0hHOztBQUVuQyxrQkFBTSxPQUFOLEdBQWdCLE9BQWhCLENBeEhnQyxDQXdIUDtBQUN6QixtQkFBTyxLQUFQO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7Ozs7K0JBQ1EsSSxFQUFNLE0sRUFBcUI7QUFBQSxnQkFBYixNQUFhLHVFQUFKLEVBQUk7O0FBQy9CLGdCQUFJLFFBQVEscUJBQWEsRUFBYixFQUFpQixNQUFqQixDQUFaLENBRCtCLENBQ087QUFDdEMsa0JBQU0sSUFBTixHQUFhLElBQWI7O0FBRUE7QUFDQSxvQkFBUSxLQUFLLEdBQUwsQ0FBUyxLQUFULEVBQWdCLE1BQWhCLENBQVI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQUksTUFBTSxJQUFOLElBQWMsS0FBSyxXQUFMLENBQWlCLE1BQU0sSUFBdkIsQ0FBbEIsRUFBZ0Q7QUFDNUMscUJBQUssTUFBTCxDQUFZLElBQVosSUFBb0IsUUFBUSxPQUFPLE1BQVAsQ0FBYyxPQUFPLE1BQVAsQ0FBYyxLQUFLLFdBQUwsQ0FBaUIsTUFBTSxJQUF2QixDQUFkLENBQWQsRUFBMkQsS0FBM0QsQ0FBNUI7QUFDSCxhQUZELE1BR0s7QUFDRCxzQkFBTSxJQUFOLEdBQWEsSUFBYixDQURDLENBQ2tCO0FBQ3RCOztBQUVELG1CQUFPLEtBQVA7QUFDSDs7QUFFRDs7Ozs4QkFDTyxNLEVBQVE7QUFBQTs7QUFDWDtBQUNBLGdCQUFJLGFBQWEsT0FBTyxJQUFQLENBQVksTUFBWixFQUFvQixJQUFwQixDQUNiLFVBQUMsQ0FBRCxFQUFJLENBQUo7QUFBQSx1QkFBVSxPQUFLLGdCQUFMLENBQXNCLENBQXRCLEVBQXlCLE1BQXpCLElBQW1DLE9BQUssZ0JBQUwsQ0FBc0IsQ0FBdEIsRUFBeUIsTUFBekIsQ0FBN0M7QUFBQSxhQURhLENBQWpCOztBQUlBO0FBQ0EsaUJBQUssSUFBSSxLQUFULElBQWtCLEtBQUssTUFBdkIsRUFBK0I7QUFDM0Isb0JBQUksQ0FBQyxLQUFLLFdBQUwsQ0FBaUIsS0FBakIsQ0FBTCxFQUE4QjtBQUMxQiwyQkFBTyxLQUFLLE1BQUwsQ0FBWSxLQUFaLENBQVA7QUFDSCxpQkFGRCxNQUdLO0FBQ0QseUJBQUssTUFBTCxDQUFZLEtBQVosRUFBbUIsS0FBbkI7QUFDSDtBQUNKOztBQUVEO0FBQ0EsZ0JBQUksS0FBSyxFQUFUO0FBQ0EsdUJBQVcsT0FBWCxDQUFtQixpQkFBUztBQUN4QixtQkFBRyxLQUFILElBQVksT0FBSyxNQUFMLENBQVksS0FBWixFQUFtQixPQUFPLEtBQVAsQ0FBbkIsRUFBa0MsRUFBbEMsQ0FBWjtBQUNILGFBRkQ7O0FBSUEsbUJBQU8sS0FBSyxNQUFaO0FBQ0g7O0FBRUQ7Ozs7cUNBQ3dCO0FBQUEsZ0JBQVosS0FBWSx1RUFBSixFQUFJOztBQUNwQjtBQUNBLGlCQUFLLElBQUksS0FBVCxJQUFrQixLQUFLLE1BQXZCLEVBQStCO0FBQzNCLHFCQUFLLE1BQUwsQ0FBWSxLQUFaLEVBQW1CLElBQW5CLENBQXdCLEtBQXhCO0FBQ0g7QUFDSjs7QUFFRDs7Ozt5Q0FDa0IsRyxFQUFLLE0sRUFBUTtBQUFBOztBQUMzQixnQkFBSSxVQUFVLENBQWQ7O0FBRUEsbUJBQU0sSUFBTixFQUFZO0FBQ1Isb0JBQUksUUFBUSxPQUFPLEdBQVAsQ0FBWjtBQUNBLG9CQUFJLENBQUMsS0FBTCxFQUFZO0FBQ1I7QUFDQTtBQUNIOztBQUVEO0FBQ0Esb0JBQUksQ0FBQyxNQUFNLEdBQVgsRUFBZ0I7QUFDWjtBQUNIOztBQUVEO0FBQ0E7O0FBRUEsb0JBQUksTUFBTSxPQUFOLENBQWMsTUFBTSxHQUFwQixDQUFKLEVBQThCO0FBQzFCO0FBQ0EsK0JBQVcsS0FBSyxHQUFMLGdDQUFZLE1BQU0sR0FBTixDQUFVLEdBQVYsQ0FBYyxhQUFLO0FBQ3RDO0FBQ0EsNEJBQUksUUFBUSxDQUFaLEVBQWU7QUFDWDtBQUNIOztBQUVELCtCQUFPLE9BQUssZ0JBQUwsQ0FBc0IsQ0FBdEIsRUFBeUIsTUFBekIsQ0FBUDtBQUNILHFCQVBzQixDQUFaLEVBQVg7QUFRQTtBQUNILGlCQVhELE1BWUs7QUFDRDtBQUNBLHdCQUFJLFFBQVEsTUFBTSxHQUFsQixFQUF1QjtBQUNuQjtBQUNIOztBQUVEO0FBQ0EsMEJBQU0sTUFBTSxHQUFaO0FBQ0g7QUFDSjtBQUNELG1CQUFPLE9BQVA7QUFDSDs7Ozs7Ozs7Ozs7Ozs7QUM5V0w7Ozs7QUFDQTs7OztBQUVBOzs7Ozs7QUFFTyxJQUFJLG9DQUFjLEVBQWxCOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksWUFBWixHQUEyQixVQUFVLElBQVYsRUFBZ0I7QUFDdkMsUUFBSSxtVEFReUIsSUFSekIsK0pBQUo7QUFnQkEsV0FBTyxDQUFQO0FBQ0gsQ0FsQkQ7O0FBcUJBOztBQUVBLFlBQVksUUFBWixHQUF1QixPQUFPLE1BQVAsQ0FBYyxDQUFDLENBQUQsRUFBSSxDQUFKLENBQWQsQ0FBdkIsQyxDQUE4Qzs7QUFFOUM7QUFDQSxZQUFZLFFBQVosR0FBdUI7QUFDbkIsV0FBTyxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FEWTtBQUVuQixXQUFPLENBRlk7QUFHbkIsVUFBTSxDQUhhO0FBSW5CLGFBQVMsS0FKVTtBQUtuQixZQUFRLEVBTFc7QUFNbkIsZ0JBQVksQ0FOTztBQU9uQixXQUFPLENBUFk7QUFRbkIsT0FBRyxDQVJnQjtBQVNuQixjQUFVO0FBQ04saUJBQVMsQ0FESDtBQUVOLGlCQUFTO0FBRkg7QUFUUyxDQUF2Qjs7QUFlQTtBQUNBLFlBQVksTUFBWixHQUFxQjtBQUNqQjtBQUNBLHFDQUFpQyx1Q0FBVztBQUN4QyxlQUFPLENBQ0gsT0FBTyxTQUFTLFFBQVEsRUFBakIsRUFBcUIsRUFBckIsSUFBMkIsR0FBM0IsR0FBaUMsQ0FBeEMsQ0FERyxFQUM2QztBQUNoRCxlQUFPLFNBQVMsUUFBUSxFQUFqQixFQUFxQixFQUFyQixJQUEyQixLQUEzQixHQUFtQyxDQUExQyxDQUZHLEVBRTZDO0FBQ2hELGVBQU8sU0FBUyxRQUFRLEVBQWpCLEVBQXFCLEVBQXJCLElBQTJCLE9BQTNCLEdBQXFDLENBQTVDLENBSEcsRUFHNkM7QUFDaEQsU0FKRyxDQUFQO0FBTUgsS0FUZ0I7O0FBV2pCO0FBQ0EsK0JBQTJCLGlDQUFXO0FBQ2xDLGVBQU8sQ0FBQyxNQUFNLEtBQUssTUFBTCxFQUFQLEVBQXNCLE1BQU0sS0FBSyxNQUFMLEVBQTVCLEVBQTJDLE1BQU0sS0FBSyxNQUFMLEVBQWpELEVBQWdFLENBQWhFLENBQVA7QUFDSDtBQWRnQixDQUFyQjs7QUFpQkE7QUFDQSxZQUFZLHNCQUFaLEdBQXFDLFVBQVUsT0FBVixFQUFtQixJQUFuQixFQUF5QixNQUF6QixFQUFpQztBQUNsRSxXQUFPO0FBQ0gsd0JBREc7QUFFSCxrQkFGRztBQUdILHNCQUhHO0FBSUgsY0FBTSxLQUFLLFVBSlI7QUFLSCxrQkFBVSxjQUFJLFlBQUosQ0FBaUIsUUFBUSxRQUFSLENBQWlCLElBQWxDLENBTFA7QUFNSCwwQkFBa0IsS0FBSyxnQkFOcEI7QUFPSCw2QkFBcUIsS0FBSyxtQkFQdkI7QUFRSCxrQ0FBMEIsS0FBSztBQVI1QixLQUFQO0FBVUgsQ0FYRDs7QUFhQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLG1CQUFaLEdBQWtDLFVBQVUsR0FBVixFQUFpQztBQUFBLFFBQWxCLFNBQWtCLHVFQUFOLElBQU07O0FBQy9ELFFBQUksT0FBTyxJQUFYLEVBQWlCO0FBQ2I7QUFDSDs7QUFFRCxRQUFJLElBQUksS0FBUixFQUFlO0FBQ1gsZUFBTyxFQUFFLE9BQU8sSUFBSSxLQUFiLEVBQW9CLE1BQU8sSUFBSSxJQUFKLEdBQVcsRUFBWCxHQUFnQixJQUEzQyxFQUFQLENBRFcsQ0FDZ0Q7QUFDOUQ7O0FBRUQsUUFBSSxJQUFJLEVBQUUsT0FBTyxHQUFULEVBQVI7O0FBRUE7QUFDQSxRQUFJLE1BQU0sT0FBTixDQUFjLEVBQUUsS0FBaEIsS0FBMEIsTUFBTSxPQUFOLENBQWMsRUFBRSxLQUFGLENBQVEsQ0FBUixDQUFkLENBQTlCLEVBQXlEO0FBQ3JELFVBQUUsSUFBRixHQUFTLEVBQVQsQ0FEcUQsQ0FDeEM7QUFDaEI7O0FBRUQ7QUFDQSxRQUFJLE9BQU8sU0FBUCxLQUFxQixVQUF6QixFQUFxQztBQUNqQyxZQUFJLEVBQUUsSUFBTixFQUFZO0FBQUU7QUFDVixjQUFFLEtBQUYsR0FBVSxFQUFFLEtBQUYsQ0FBUSxHQUFSLENBQVk7QUFBQSx1QkFBSyxDQUFDLEVBQUUsQ0FBRixDQUFELEVBQU8sVUFBVSxFQUFFLENBQUYsQ0FBVixDQUFQLENBQUw7QUFBQSxhQUFaLENBQVY7QUFDSCxTQUZELE1BR0ssSUFBSSxPQUFPLEVBQUUsS0FBVCxLQUFtQixVQUF2QixFQUFtQztBQUFFO0FBQ3RDLGNBQUUsS0FBRixHQUFVLFVBQVUsRUFBRSxLQUFaLENBQVYsQ0FEb0MsQ0FDTjtBQUNqQztBQUNKOztBQUVELFdBQU8sQ0FBUDtBQUNILENBM0JEOztBQTZCQTtBQUNBO0FBQ0EsWUFBWSx3QkFBWixHQUF1QyxVQUFVLEdBQVYsRUFBZTtBQUNsRCxXQUFPLFlBQVksbUJBQVosQ0FBZ0MsR0FBaEMsRUFBcUMsYUFBSztBQUM3QyxZQUFJLE1BQU0sK0JBQVYsRUFBMkM7QUFDdkMsbUJBQU8sZ0JBQU0sZ0JBQU4sQ0FBdUIsWUFBWSxZQUFaLENBQXlCLFlBQVksTUFBWixDQUFtQiwrQkFBbkIsQ0FBekIsQ0FBdkIsQ0FBUDtBQUNILFNBRkQsTUFHSyxJQUFJLE1BQU0seUJBQVYsRUFBcUM7QUFDdEMsbUJBQU8sWUFBWSxNQUFaLENBQW1CLHlCQUFuQixDQUFQO0FBQ0g7O0FBRUQsZUFBTyxDQUFQO0FBQ0gsS0FUTSxDQUFQO0FBVUgsQ0FYRDs7QUFhQTtBQUNBO0FBQ0EsWUFBWSxrQkFBWixHQUFpQyxVQUFTLEdBQVQsRUFBYyxPQUFkLEVBQXVCO0FBQ3BELFFBQUksT0FBTyxJQUFYLEVBQWlCO0FBQ2I7QUFDSCxLQUZELE1BR0ssSUFBSSxJQUFJLE9BQVIsRUFBaUI7QUFBRTtBQUNwQixZQUFJLElBQUksSUFBSSxPQUFKLENBQVksT0FBWixDQUFSO0FBQ0EsZUFBTyxDQUFQO0FBQ0gsS0FISSxNQUlBLElBQUksSUFBSSxNQUFSLEVBQWdCO0FBQUU7QUFDbkIsZUFBTyxJQUFJLE1BQVg7QUFDSCxLQUZJLE1BR0EsSUFBSSxJQUFJLElBQUosSUFBWSxJQUFJLElBQUosQ0FBUyxRQUFRLElBQWpCLENBQWhCLEVBQXdDO0FBQUU7QUFDM0MsZUFBTyxJQUFJLElBQUosQ0FBUyxRQUFRLElBQWpCLENBQVA7QUFDSCxLQUZJLE1BR0E7QUFBRTtBQUNIO0FBQ0EsWUFBSSxPQUFPLElBQUksS0FBWCxLQUFxQixVQUF6QixFQUFxQztBQUNqQyxnQkFBSSxPQUFKLEdBQWMsSUFBSSxLQUFsQjtBQUNBLGdCQUFJLEtBQUksSUFBSSxPQUFKLENBQVksT0FBWixDQUFSO0FBQ0EsbUJBQU8sRUFBUDtBQUNIO0FBQ0Q7QUFMQSxhQU1LLElBQUksTUFBTSxPQUFOLENBQWMsSUFBSSxLQUFsQixLQUE0QixNQUFNLE9BQU4sQ0FBYyxJQUFJLEtBQUosQ0FBVSxDQUFWLENBQWQsQ0FBaEMsRUFBNkQ7QUFDOUQ7QUFDQSxvQkFBSSxJQUFKLEdBQVcsSUFBSSxJQUFKLElBQVksRUFBdkI7QUFDQSxvQkFBSSxJQUFKLEdBQVcsRUFBWDtBQUNBLG9CQUFJLElBQUosQ0FBUyxRQUFRLElBQWpCLElBQXlCLGdCQUFNLFdBQU4sQ0FBa0IsUUFBUSxJQUExQixFQUFnQyxJQUFJLEtBQXBDLENBQXpCO0FBQ0EsdUJBQU8sSUFBSSxJQUFKLENBQVMsUUFBUSxJQUFqQixDQUFQO0FBQ0g7QUFDRDtBQVBLLGlCQVFBO0FBQ0Qsd0JBQUksTUFBSixHQUFhLElBQUksS0FBakI7QUFDQSwyQkFBTyxJQUFJLE1BQVg7QUFDSDtBQUNKO0FBQ0osQ0FuQ0Q7O0FBcUNBLFlBQVksWUFBWixHQUEyQixVQUFTLEdBQVQsRUFBYyxPQUFkLEVBQXVCO0FBQzlDO0FBQ0EsUUFBSSxJQUFJLEdBQUosSUFBVyxJQUFmLEVBQXFCO0FBQ2pCLFlBQUksSUFBSSxLQUFKLEtBQWMsSUFBbEIsRUFBd0I7QUFBRTtBQUN0QixtQkFBTyxJQUFJLEdBQUosR0FBVSxjQUFJLGNBQUosQ0FBbUIsUUFBUSxJQUEzQixDQUFqQjtBQUNIO0FBQ0QsZUFBTyxJQUFJLEdBQVg7QUFDSDtBQUNEO0FBTkEsU0FPSyxJQUFJLE9BQU8sR0FBUCxLQUFlLFFBQW5CLEVBQTZCO0FBQzlCLGdCQUFJLFFBQVEsSUFBSSxLQUFKLENBQVUsb0JBQVYsQ0FBWjtBQUNBLGdCQUFJLFNBQVMsTUFBTSxNQUFOLEtBQWlCLENBQTlCLEVBQWlDO0FBQzdCLHNCQUFNLFdBQVcsTUFBTSxDQUFOLENBQVgsQ0FBTjtBQUNBLHdCQUFRLE1BQU0sQ0FBTixDQUFSO0FBQ0g7O0FBRUQsZ0JBQUksVUFBVSxJQUFkLEVBQW9CO0FBQUU7QUFDbEIsdUJBQU8sY0FBSSxjQUFKLENBQW1CLFFBQVEsSUFBM0IsQ0FBUDtBQUNIO0FBQ0o7QUFDRDtBQVhLLGFBWUEsSUFBSSxNQUFNLE9BQU4sQ0FBYyxHQUFkLENBQUosRUFBd0I7QUFDekI7QUFDQSxvQkFBSSxNQUFNLE9BQU4sQ0FBYyxJQUFJLENBQUosQ0FBZCxDQUFKLEVBQTJCO0FBQ3ZCLDJCQUFPLElBQUksR0FBSixDQUFRO0FBQUEsK0JBQUssQ0FBQyxFQUFFLENBQUYsQ0FBRCxFQUFPLFlBQVksWUFBWixDQUF5QixFQUFFLENBQUYsQ0FBekIsRUFBK0IsT0FBL0IsQ0FBUCxDQUFMO0FBQUEscUJBQVIsQ0FBUDtBQUNIO0FBQ0Q7QUFIQSxxQkFJSztBQUNELCtCQUFPLElBQUksR0FBSixDQUFRO0FBQUEsbUNBQUssWUFBWSxZQUFaLENBQXlCLENBQXpCLEVBQTRCLE9BQTVCLENBQUw7QUFBQSx5QkFBUixDQUFQO0FBQ0g7QUFDSjtBQUNELFdBQU8sR0FBUDtBQUNILENBaENEOztBQWtDQTtBQUNBLFlBQVksVUFBWixHQUF5QixVQUFVLEdBQVYsRUFBZTtBQUNwQyxRQUFJLE1BQU0sRUFBRSxLQUFLLFdBQVcsR0FBWCxDQUFQLEVBQVY7QUFDQSxRQUFJLElBQUksR0FBSixLQUFZLENBQVosSUFBaUIsT0FBTyxHQUFQLEtBQWUsUUFBaEMsSUFBNEMsSUFBSSxJQUFKLEdBQVcsS0FBWCxDQUFpQixDQUFDLENBQWxCLE1BQXlCLElBQXpFLEVBQStFO0FBQzNFLFlBQUksS0FBSixHQUFZLElBQVo7QUFDSDtBQUNELFdBQU8sR0FBUDtBQUNILENBTkQ7O0FBUUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSwwQkFBWixHQUF5QyxVQUFTLEdBQVQsRUFBYyxPQUFkLEVBQXVCO0FBQzVELFFBQUksSUFBSSxPQUFSLEVBQWlCO0FBQ2IsWUFBSSxJQUFJLElBQUksT0FBSixDQUFZLE9BQVosQ0FBUjtBQUNBLGVBQU8sQ0FBUDtBQUNILEtBSEQsTUFJSyxJQUFJLElBQUksSUFBSixJQUFZLElBQUksSUFBSixDQUFTLFFBQVEsSUFBakIsQ0FBaEIsRUFBd0M7QUFDekMsZUFBTyxJQUFJLElBQUosQ0FBUyxRQUFRLElBQWpCLENBQVA7QUFDSCxLQUZJLE1BR0E7QUFDRDtBQUNBLFlBQUksT0FBTyxJQUFJLEtBQVgsS0FBcUIsVUFBekIsRUFBcUM7QUFDakMsZ0JBQUksT0FBSixHQUFjLElBQUksS0FBbEI7QUFDQSxnQkFBSSxNQUFJLElBQUksT0FBSixDQUFZLE9BQVosQ0FBUjtBQUNBLG1CQUFPLEdBQVA7QUFDSDtBQUNEO0FBTEEsYUFNSyxJQUFJLElBQUksSUFBUixFQUFjO0FBQ2Y7QUFDQTtBQUNBLG9CQUFJLElBQUosQ0FBUyxRQUFRLElBQWpCLElBQXlCLGdCQUFNLFdBQU4sQ0FBa0IsUUFBUSxJQUExQixFQUFnQyxJQUFJLEtBQXBDLEVBQ3JCO0FBQUEsMkJBQUssWUFBWSxZQUFaLENBQXlCLENBQXpCLEVBQTRCLE9BQTVCLENBQUw7QUFBQSxpQkFEcUIsQ0FBekI7O0FBR0EsdUJBQU8sSUFBSSxJQUFKLENBQVMsUUFBUSxJQUFqQixDQUFQO0FBQ0gsYUFQSSxNQVFBO0FBQ0QsdUJBQU8sWUFBWSxZQUFaLENBQXlCLElBQUksS0FBN0IsRUFBb0MsT0FBcEMsQ0FBUDtBQUNIO0FBQ0o7QUFDSixDQTVCRDs7QUE4QkE7QUFDQSxZQUFZLGFBQVosR0FBNEIsRUFBNUI7QUFDQSxZQUFZLGNBQVosR0FBNkIsVUFBUyxNQUFULEVBQWlCO0FBQzFDO0FBQ0EsUUFBSSxZQUFZLGFBQVosQ0FBMEIsTUFBMUIsQ0FBSixFQUF1QztBQUNuQyxlQUFPLFlBQVksYUFBWixDQUEwQixNQUExQixDQUFQO0FBQ0g7O0FBRUQ7QUFDQSxRQUFJLFFBQVEseUJBQWMsYUFBZCxDQUE0QixNQUE1QixDQUFaO0FBQ0EsUUFBSSxTQUFTLE1BQU0sTUFBTixLQUFpQixDQUE5QixFQUFpQztBQUM3QixjQUFNLENBQU4sS0FBWSxHQUFaO0FBQ0EsY0FBTSxDQUFOLEtBQVksR0FBWjtBQUNBLGNBQU0sQ0FBTixLQUFZLEdBQVo7QUFDSCxLQUpELE1BS0s7QUFDRCxnQkFBUSxZQUFZLFFBQVosQ0FBcUIsS0FBN0I7QUFDSDtBQUNELGdCQUFZLGFBQVosQ0FBMEIsTUFBMUIsSUFBb0MsS0FBcEM7QUFDQSxXQUFPLEtBQVA7QUFDSCxDQWxCRDs7QUFvQkE7QUFDQTtBQUNBO0FBQ0EsWUFBWSx1QkFBWixHQUFzQyxVQUFTLEdBQVQsRUFBNEI7QUFBQSxRQUFkLE9BQWMsdUVBQUosRUFBSTs7QUFDOUQsUUFBSSxJQUFJLE9BQVIsRUFBaUI7QUFDYixZQUFJLElBQUksSUFBSSxPQUFKLENBQVksT0FBWixDQUFSOztBQUVBLFlBQUksT0FBTyxDQUFQLEtBQWEsUUFBakIsRUFBMkI7QUFDdkIsZ0JBQUksWUFBWSxjQUFaLENBQTJCLENBQTNCLENBQUo7QUFDSDs7QUFFRCxZQUFJLEtBQUssRUFBRSxDQUFGLEtBQVEsSUFBakIsRUFBdUI7QUFDbkIsY0FBRSxDQUFGLElBQU8sQ0FBUCxDQURtQixDQUNUO0FBQ2I7QUFDRCxlQUFPLENBQVA7QUFDSCxLQVhELE1BWUssSUFBSSxJQUFJLE1BQVIsRUFBZ0I7QUFDakIsZUFBTyxJQUFJLE1BQVg7QUFDSCxLQUZJLE1BR0EsSUFBSSxJQUFJLElBQUosSUFBWSxJQUFJLElBQUosQ0FBUyxRQUFRLElBQWpCLENBQWhCLEVBQXdDO0FBQ3pDLGVBQU8sSUFBSSxJQUFKLENBQVMsUUFBUSxJQUFqQixDQUFQO0FBQ0gsS0FGSSxNQUdBO0FBQ0Q7QUFDQSxZQUFJLE9BQU8sSUFBSSxLQUFYLEtBQXFCLFVBQXpCLEVBQXFDO0FBQ2pDLGdCQUFJLE9BQUosR0FBYyxJQUFJLEtBQWxCO0FBQ0EsZ0JBQUksTUFBSSxJQUFJLE9BQUosQ0FBWSxPQUFaLENBQVI7O0FBRUEsZ0JBQUksT0FBTyxHQUFQLEtBQWEsUUFBakIsRUFBMkI7QUFDdkIsc0JBQUksWUFBWSxjQUFaLENBQTJCLEdBQTNCLENBQUo7QUFDSDs7QUFFRCxnQkFBSSxPQUFLLElBQUUsQ0FBRixLQUFRLElBQWpCLEVBQXVCO0FBQ25CLG9CQUFFLENBQUYsSUFBTyxDQUFQLENBRG1CLENBQ1Q7QUFDYjtBQUNELG1CQUFPLEdBQVA7QUFDSDtBQUNEO0FBYkEsYUFjSyxJQUFJLE9BQU8sSUFBSSxLQUFYLEtBQXFCLFFBQXpCLEVBQW1DO0FBQ3BDLG9CQUFJLE1BQUosR0FBYSxZQUFZLGNBQVosQ0FBMkIsSUFBSSxLQUEvQixDQUFiO0FBQ0EsdUJBQU8sSUFBSSxNQUFYO0FBQ0g7QUFDRDtBQUpLLGlCQUtBLElBQUksSUFBSSxJQUFSLEVBQWM7QUFDZjtBQUNBLHdCQUFJLENBQUMsSUFBSSxpQkFBVCxFQUE0QjtBQUN4Qiw2QkFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksSUFBSSxLQUFKLENBQVUsTUFBNUIsRUFBb0MsR0FBcEMsRUFBeUM7QUFDckMsZ0NBQUksTUFBSSxJQUFJLEtBQUosQ0FBVSxDQUFWLENBQVI7QUFDQSxnQ0FBSSxPQUFLLE9BQU8sSUFBRSxDQUFGLENBQVAsS0FBZ0IsUUFBekIsRUFBbUM7QUFDL0Isb0NBQUUsQ0FBRixJQUFPLFlBQVksY0FBWixDQUEyQixJQUFFLENBQUYsQ0FBM0IsQ0FBUDtBQUNIO0FBQ0o7QUFDRCw0QkFBSSxpQkFBSixHQUF3QixJQUF4QjtBQUNIOztBQUVEO0FBQ0Esd0JBQUksSUFBSixDQUFTLFFBQVEsSUFBakIsSUFBeUIsZ0JBQU0sV0FBTixDQUFrQixRQUFRLElBQTFCLEVBQWdDLElBQUksS0FBcEMsQ0FBekI7QUFDQSx3QkFBSSxJQUFKLENBQVMsUUFBUSxJQUFqQixFQUF1QixDQUF2QixJQUE0QixJQUFJLElBQUosQ0FBUyxRQUFRLElBQWpCLEVBQXVCLENBQXZCLEtBQTZCLENBQXpELENBZGUsQ0FjNkM7QUFDNUQsMkJBQU8sSUFBSSxJQUFKLENBQVMsUUFBUSxJQUFqQixDQUFQO0FBQ0g7QUFDRDtBQWpCSyxxQkFrQkE7QUFDRCw0QkFBSSxNQUFKLEdBQWEsSUFBSSxLQUFqQjtBQUNBLDRCQUFJLElBQUksTUFBSixJQUFjLElBQUksTUFBSixDQUFXLENBQVgsS0FBaUIsSUFBbkMsRUFBeUM7QUFDckMsZ0NBQUksTUFBSixDQUFXLENBQVgsSUFBZ0IsQ0FBaEIsQ0FEcUMsQ0FDbEI7QUFDdEI7QUFDRCwrQkFBTyxJQUFJLE1BQVg7QUFDSDtBQUNKO0FBQ0osQ0FsRUQ7O0FBb0VBLFlBQVksVUFBWixHQUF5QixVQUFTLEdBQVQsRUFBNEI7QUFBQSxRQUFkLE9BQWMsdUVBQUosRUFBSTs7QUFDakQsUUFBSSxPQUFPLEdBQVAsS0FBZSxVQUFuQixFQUErQjtBQUMzQixjQUFNLElBQUksT0FBSixDQUFOO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBLFFBQUksT0FBTyxHQUFQLEtBQWUsUUFBbkIsRUFBNkI7QUFDekIsY0FBTSxZQUFZLGNBQVosQ0FBMkIsR0FBM0IsQ0FBTjtBQUNILEtBRkQsTUFHSyxJQUFJLE1BQU0sT0FBTixDQUFjLEdBQWQsS0FBc0IsTUFBTSxPQUFOLENBQWMsSUFBSSxDQUFKLENBQWQsQ0FBMUIsRUFBaUQ7QUFDbEQ7QUFDQSxhQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxJQUFJLE1BQXRCLEVBQThCLEdBQTlCLEVBQW1DO0FBQy9CLGdCQUFJLElBQUksSUFBSSxDQUFKLENBQVI7QUFDQSxnQkFBSSxPQUFPLEVBQUUsQ0FBRixDQUFQLEtBQWdCLFFBQXBCLEVBQThCO0FBQzFCLGtCQUFFLENBQUYsSUFBTyxZQUFZLGNBQVosQ0FBMkIsRUFBRSxDQUFGLENBQTNCLENBQVA7QUFDSDtBQUNKOztBQUVELFlBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2Qsa0JBQU0sZ0JBQU0sV0FBTixDQUFrQixRQUFRLElBQTFCLEVBQWdDLEdBQWhDLENBQU47QUFDSDtBQUNKOztBQUVEO0FBQ0EsUUFBSSxHQUFKLEVBQVM7QUFDTDtBQUNBLFlBQUksSUFBSSxDQUFKLEtBQVUsSUFBZCxFQUFvQjtBQUNoQixnQkFBSSxDQUFKLElBQVMsQ0FBVDtBQUNIO0FBQ0osS0FMRCxNQU1LO0FBQ0QsY0FBTSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsQ0FBTjtBQUNIOztBQUVELFdBQU8sR0FBUDtBQUNILENBcENEOztBQXNDQSxZQUFZLGNBQVosR0FBNkIsVUFBUyxLQUFULEVBQWdCLE9BQWhCLEVBQXlCO0FBQ2xEO0FBQ0EsUUFBSSxPQUFPLEtBQVAsS0FBaUIsVUFBckIsRUFBaUM7QUFDN0IsZ0JBQVEsTUFBTSxPQUFOLENBQVI7QUFDSCxLQUZELE1BR0ssSUFBSSxPQUFPLEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDaEM7QUFDQSxZQUFJLFFBQVEsT0FBUixDQUFnQixVQUFoQixDQUEyQixLQUEzQixDQUFKLEVBQXVDO0FBQ25DLG9CQUFRLFFBQVEsT0FBUixDQUFnQixVQUFoQixDQUEyQixLQUEzQixDQUFSO0FBQ0g7QUFDRDtBQUhBLGFBSUs7QUFDRCx3QkFBUSxXQUFXLEtBQVgsQ0FBUjtBQUNIO0FBQ0o7O0FBRUQsV0FBTyxLQUFQO0FBQ0gsQ0FqQkQ7O0FBbUJBO0FBQ0EsWUFBWSxZQUFaLEdBQTJCLFVBQVMsSUFBVCxFQUFlLE9BQWYsRUFBd0I7QUFDL0MsUUFBSSxPQUFPLElBQVAsS0FBZ0IsVUFBcEIsRUFBZ0M7QUFDNUIsZUFBTyxLQUFLLE9BQUwsQ0FBUDtBQUNIO0FBQ0QsV0FBTyxJQUFQO0FBQ0gsQ0FMRDs7Ozs7Ozs7Ozs7OztBQy9ZQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7SUFFcUIsVTtBQUVqQiwwQkFBZTtBQUFBOztBQUNYLGFBQUssTUFBTCxHQUFjLFNBQVMsYUFBVCxDQUF1QixRQUF2QixDQUFkO0FBQ0EsYUFBSyxNQUFMLENBQVksS0FBWixDQUFrQixlQUFsQixHQUFvQyxhQUFwQyxDQUZXLENBRXdDO0FBQ25ELGFBQUssT0FBTCxHQUFlLEtBQUssTUFBTCxDQUFZLFVBQVosQ0FBdUIsSUFBdkIsQ0FBZjtBQUNBLGFBQUssb0JBQUwsR0FBNEIsQ0FBNUIsQ0FKVyxDQUlvQjtBQUMvQixhQUFLLHNCQUFMLEdBQThCLENBQTlCLENBTFcsQ0FLc0I7QUFDcEM7Ozs7K0JBRU8sSyxFQUFPLE0sRUFBUTtBQUNuQixpQkFBSyxNQUFMLENBQVksS0FBWixHQUFvQixLQUFwQjtBQUNBLGlCQUFLLE1BQUwsQ0FBWSxNQUFaLEdBQXFCLE1BQXJCO0FBQ0EsaUJBQUssT0FBTCxDQUFhLFNBQWIsQ0FBdUIsQ0FBdkIsRUFBMEIsQ0FBMUIsRUFBNkIsS0FBN0IsRUFBb0MsTUFBcEM7QUFDSDs7QUFFRDs7OztzQ0FDeUU7QUFBQSxnQkFBOUQsUUFBOEQsUUFBOUQsUUFBOEQ7QUFBQSxnQkFBcEQsSUFBb0QsUUFBcEQsSUFBb0Q7QUFBQSxnQkFBOUMsTUFBOEMsUUFBOUMsTUFBOEM7QUFBQSxnQkFBdEMsWUFBc0MsUUFBdEMsWUFBc0M7QUFBQSxnQkFBeEIsT0FBd0IsUUFBeEIsT0FBd0I7QUFBQSxnQkFBZixXQUFlLFFBQWYsV0FBZTs7QUFDckUsaUJBQUssT0FBTCxHQUFlLE9BQWY7QUFDQSxnQkFBSSxNQUFNLEtBQUssT0FBZjtBQUNBLGdCQUFJLE1BQU0sZ0JBQU0sa0JBQU4sR0FBMkIsV0FBckM7O0FBRUEsZ0JBQUksVUFBVSxlQUFlLENBQTdCLEVBQWdDO0FBQzVCLG9CQUFJLFdBQUosR0FBa0IsTUFBbEI7QUFDQSxvQkFBSSxTQUFKLEdBQWdCLGVBQWUsR0FBL0I7QUFDSDtBQUNELGdCQUFJLFNBQUosR0FBZ0IsSUFBaEI7O0FBRUEsZ0JBQUksSUFBSixHQUFXLFFBQVg7QUFDQSxnQkFBSSxVQUFKLEdBQWlCLENBQWpCO0FBQ0g7OztrQ0FFVSxLLEVBQU87QUFBQTs7QUFDZCxnQkFBSSxZQUFKO0FBQ0EsbUJBQU8sdUJBQVksU0FBWixHQUF3QixJQUF4QixDQUE2QixZQUFNO0FBQ3RDLHFCQUFLLElBQUksS0FBVCxJQUFrQixLQUFsQixFQUF5QjtBQUNyQiwrQkFBVyxVQUFYLENBQXNCLEtBQXRCLElBQStCLFdBQVcsVUFBWCxDQUFzQixLQUF0QixLQUFnQyxFQUEvRDs7QUFFQSx3QkFBSSxhQUFhLE1BQU0sS0FBTixDQUFqQjtBQUNBLHdCQUFJLFFBQVEsSUFBWjtBQUNBLHdCQUFJLG9CQUFKOztBQUVBLHlCQUFLLElBQUksSUFBVCxJQUFpQixVQUFqQixFQUE2QjtBQUN6Qiw0QkFBSSxZQUFZLFdBQVcsSUFBWCxDQUFoQjtBQUNBLDRCQUFJLGdCQUFnQixVQUFVLGFBQTlCOztBQUVBLDRCQUFJLEtBQUosRUFBVztBQUNQLGtDQUFLLE9BQUwsQ0FBYSxhQUFiO0FBQ0Esa0NBQU0sZ0JBQU0sa0JBQU4sR0FBMkIsY0FBYyxXQUEvQztBQUNBLDBDQUFjLE1BQUssT0FBTCxDQUFhLFdBQWIsQ0FBeUIsR0FBekIsRUFBOEIsS0FBOUIsR0FBc0MsR0FBcEQ7QUFDQSxvQ0FBUSxLQUFSO0FBQ0g7O0FBRUQsa0NBQVUsV0FBVixHQUF3QixXQUF4Qjs7QUFFQSw0QkFBSSxjQUFjLGNBQWxCLEVBQWlDO0FBQzdCLGdDQUFJLFdBQVcsZUFBZSxJQUFmLENBQWY7O0FBRUEsc0NBQVUsUUFBVixHQUFxQixRQUFyQjtBQUNBLHNDQUFVLElBQVYsR0FBaUIsRUFBakI7O0FBRUEsaUNBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxTQUFTLE1BQTdCLEVBQXFDLEdBQXJDLEVBQXlDO0FBQ3JDLG9DQUFJLFVBQVUsU0FBUyxDQUFULENBQWQ7QUFDQSxvQ0FBSSxDQUFDLFdBQVcsVUFBWCxDQUFzQixLQUF0QixFQUE2QixPQUE3QixDQUFMLEVBQTRDO0FBQ3hDLCtDQUFXLFVBQVgsQ0FBc0IsS0FBdEIsRUFBNkIsT0FBN0IsSUFBd0MsTUFBSyxRQUFMLENBQWMsT0FBZCxFQUF1QixhQUF2QixDQUF4QztBQUNBLCtDQUFXLFdBQVgsQ0FBdUIsTUFBdkI7QUFDSCxpQ0FIRCxNQUlLO0FBQ0QsK0NBQVcsV0FBWCxDQUF1QixJQUF2QjtBQUNIO0FBQ0QsMENBQVUsSUFBVixDQUFlLElBQWYsQ0FBb0IsV0FBVyxVQUFYLENBQXNCLEtBQXRCLEVBQTZCLE9BQTdCLEVBQXNDLElBQTFEO0FBQ0g7QUFDSix5QkFqQkQsTUFrQks7QUFDRCxnQ0FBSSxDQUFDLFdBQVcsVUFBWCxDQUFzQixLQUF0QixFQUE2QixJQUE3QixDQUFMLEVBQXlDO0FBQ3JDLDJDQUFXLFVBQVgsQ0FBc0IsS0FBdEIsRUFBNkIsSUFBN0IsSUFBcUMsTUFBSyxRQUFMLENBQWMsSUFBZCxFQUFvQixhQUFwQixDQUFyQztBQUNBLDJDQUFXLFdBQVgsQ0FBdUIsTUFBdkI7QUFDSCw2QkFIRCxNQUlLO0FBQ0QsMkNBQVcsV0FBWCxDQUF1QixJQUF2QjtBQUNIO0FBQ0Q7QUFDQTtBQUNBLHNDQUFVLElBQVYsR0FBaUIsV0FBVyxVQUFYLENBQXNCLEtBQXRCLEVBQTZCLElBQTdCLEVBQW1DLElBQXBEO0FBQ0g7QUFDSjtBQUNKOztBQUVELHVCQUFPLEtBQVA7QUFDSCxhQXZETSxDQUFQO0FBd0RIOztBQUVEO0FBQ0E7Ozs7aUNBQ1UsSSxTQUF3RTtBQUFBLGdCQUFqRSxTQUFpRSxTQUFqRSxTQUFpRTtBQUFBLGdCQUF0RCxTQUFzRCxTQUF0RCxTQUFzRDtBQUFBLGdCQUEzQyxTQUEyQyxTQUEzQyxTQUEyQztBQUFBLDJDQUFoQyxZQUFnQztBQUFBLGdCQUFoQyxZQUFnQyxzQ0FBakIsQ0FBaUI7QUFBQSxnQkFBZCxXQUFjLFNBQWQsV0FBYzs7QUFDOUUsZ0JBQUksTUFBTSxnQkFBTSxrQkFBTixHQUEyQixXQUFyQztBQUNBLGdCQUFJLE1BQU0sS0FBSyxrQkFBTCxDQUF3QixJQUF4QixFQUE4QixTQUE5QixDQUFWO0FBQ0EsZ0JBQUksTUFBTSxLQUFLLE9BQWY7QUFDQSxnQkFBSSxrQkFBa0IsS0FBSyxvQkFBTCxHQUE0QixHQUFsRDtBQUNBLGdCQUFJLG9CQUFvQixPQUFPLGVBQWUsS0FBSyxzQkFBM0IsQ0FBeEI7QUFDQSxnQkFBSSxVQUFVLElBQUksR0FBbEIsQ0FOOEUsQ0FNdkQ7QUFDdkIsZ0JBQUksY0FBYyxLQUFLLE9BQUwsR0FBZSxPQUFqQyxDQVA4RSxDQU9wQzs7QUFFMUM7QUFDQSxnQkFBSSxZQUFZLFVBQVUsS0FBVixDQUFnQixHQUFoQixFQUFxQixTQUFyQixFQUFnQyxTQUFoQyxFQUEyQyxXQUEzQyxFQUF3RCxHQUF4RCxDQUFoQjs7QUFFQTtBQUNBLGdCQUFJLFNBQVMsVUFBVSxNQUF2QjtBQUNBLGdCQUFJLFFBQVEsVUFBVSxLQUF0QjtBQUNBLGdCQUFJLFFBQVEsVUFBVSxLQUF0Qjs7QUFFQSxnQkFBSSxpQkFBaUIsQ0FDakIsUUFBUSxHQURTLEVBRWpCLFNBQVMsR0FGUSxDQUFyQjs7QUFLQSxnQkFBSSxlQUFlLENBQ2YsUUFBUSxJQUFJLGlCQURHLEVBRWYsU0FBUyxJQUFJLGVBRkUsQ0FBbkI7O0FBS0EsZ0JBQUksZUFBZSxDQUNmLGFBQWEsQ0FBYixJQUFrQixHQURILEVBRWYsYUFBYSxDQUFiLElBQWtCLEdBRkgsQ0FBbkI7O0FBS0E7QUFDQSxtQkFBTztBQUNILDRCQURHO0FBRUgsc0JBQU0sRUFBRSw4QkFBRixFQUFrQiwwQkFBbEIsRUFBZ0MsMEJBQWhDLEVBQThDLHdCQUE5QztBQUZILGFBQVA7QUFJSDs7QUFFRDs7OzswQ0FDbUIsSyxTQUFlLEksU0FBbUU7QUFBQTtBQUFBLGdCQUExRSxDQUEwRTtBQUFBLGdCQUF2RSxDQUF1RTs7QUFBQSxnQkFBM0QsTUFBMkQsU0FBM0QsTUFBMkQ7QUFBQSwyQ0FBbkQsWUFBbUQ7QUFBQSxnQkFBbkQsWUFBbUQsc0NBQXBDLENBQW9DO0FBQUEsZ0JBQWpDLFNBQWlDLFNBQWpDLFNBQWlDO0FBQUEsZ0JBQXRCLEtBQXNCLFNBQXRCLEtBQXNCO0FBQUEsZ0JBQWYsV0FBZSxTQUFmLFdBQWU7O0FBQ2pHLGdCQUFJLGNBQWMsS0FBSyxXQUF2QjtBQUNBLGdCQUFJLFNBQVMsQ0FBYjtBQUNBLGlCQUFLLElBQUksV0FBUyxDQUFsQixFQUFxQixXQUFXLE1BQU0sTUFBdEMsRUFBOEMsVUFBOUMsRUFBMEQ7QUFDdEQsb0JBQUksT0FBTyxNQUFNLFFBQU4sQ0FBWDtBQUNBLHFCQUFLLFlBQUwsQ0FBa0IsSUFBbEIsRUFBd0IsQ0FBQyxDQUFELEVBQUksTUFBSixDQUF4QixFQUFxQyxJQUFyQyxFQUEyQyxFQUFFLGNBQUYsRUFBVSwwQkFBVixFQUF3QixvQkFBeEIsRUFBbUMsWUFBbkMsRUFBMEMsd0JBQTFDLEVBQTNDO0FBQ0EsMEJBQVUsV0FBVjtBQUNIOztBQUVEO0FBQ0EsZ0JBQUkseUJBQWMsMEJBQWxCLEVBQThDO0FBQzFDLHFCQUFLLE9BQUwsQ0FBYSxJQUFiOztBQUVBLG9CQUFJLE1BQU0sZ0JBQU0sa0JBQU4sR0FBMkIsV0FBckM7QUFDQSxvQkFBSSxvQkFBb0IsT0FBTyxLQUFLLHNCQUFMLEdBQThCLFlBQXJDLENBQXhCO0FBQ0Esb0JBQUksa0JBQWtCLE1BQU0sS0FBSyxvQkFBakM7QUFDQSxvQkFBSSxpQkFBaUIsS0FBSyxjQUExQjtBQUNBLG9CQUFJLFlBQVksQ0FBaEI7O0FBRUEscUJBQUssT0FBTCxDQUFhLFdBQWIsR0FBMkIsTUFBM0I7QUFDQSxxQkFBSyxPQUFMLENBQWEsU0FBYixHQUF5QixTQUF6QjtBQUNBLHFCQUFLLE9BQUwsQ0FBYSxVQUFiLENBQXdCLElBQUksaUJBQTVCLEVBQStDLElBQUksZUFBbkQsRUFBb0UsTUFBTSxlQUFlLENBQWYsQ0FBMUUsRUFBNkYsTUFBTSxlQUFlLENBQWYsQ0FBbkc7O0FBRUEscUJBQUssT0FBTCxDQUFhLE9BQWI7QUFDSDs7QUFFRCxnQkFBSSx5QkFBYyx3QkFBbEIsRUFBNEM7QUFDeEMscUJBQUssT0FBTCxDQUFhLElBQWI7O0FBRUEsb0JBQUksZUFBZSxLQUFLLFlBQXhCO0FBQ0Esb0JBQUksYUFBWSxDQUFoQjs7QUFFQSxxQkFBSyxPQUFMLENBQWEsV0FBYixHQUEyQixPQUEzQjtBQUNBLHFCQUFLLE9BQUwsQ0FBYSxTQUFiLEdBQXlCLFVBQXpCO0FBQ0E7QUFDQSxxQkFBSyxPQUFMLENBQWEsVUFBYixDQUF3QixJQUFJLFVBQTVCLEVBQXVDLElBQUksVUFBM0MsRUFBc0QsYUFBYSxDQUFiLElBQWtCLElBQUksVUFBNUUsRUFBdUYsYUFBYSxDQUFiLElBQWtCLElBQUksVUFBN0c7O0FBRUEscUJBQUssT0FBTCxDQUFhLE9BQWI7QUFDSDtBQUNKOztBQUVEOzs7O3FDQUNjLEksU0FBYyxJLFNBQW1FO0FBQUE7QUFBQSxnQkFBMUUsQ0FBMEU7QUFBQSxnQkFBdkUsQ0FBdUU7O0FBQUEsZ0JBQTNELE1BQTJELFNBQTNELE1BQTJEO0FBQUEsMkNBQW5ELFlBQW1EO0FBQUEsZ0JBQW5ELFlBQW1ELHNDQUFwQyxDQUFvQztBQUFBLGdCQUFqQyxTQUFpQyxTQUFqQyxTQUFpQztBQUFBLGdCQUF0QixLQUFzQixTQUF0QixLQUFzQjtBQUFBLGdCQUFmLFdBQWUsU0FBZixXQUFlOztBQUMzRixnQkFBSSxNQUFNLGdCQUFNLGtCQUFOLEdBQTJCLFdBQXJDO0FBQ0Esb0JBQVEsU0FBUyxRQUFqQjs7QUFFQSxnQkFBSSxrQkFBa0IsS0FBSyxvQkFBTCxHQUE0QixHQUFsRDtBQUNBLGdCQUFJLGVBQWUsS0FBSyxZQUF4QjtBQUNBLGdCQUFJLGNBQWMsS0FBSyxXQUF2QjtBQUNBLGdCQUFJLG9CQUFvQixPQUFPLGVBQWUsS0FBSyxzQkFBM0IsQ0FBeEI7O0FBRUEsZ0JBQUksTUFBTSxLQUFLLGtCQUFMLENBQXdCLEtBQUssSUFBN0IsRUFBbUMsU0FBbkMsQ0FBVjs7QUFFQTtBQUNBLGdCQUFJLFdBQUo7QUFDQSxnQkFBSSxVQUFVLE1BQWQsRUFBc0I7QUFDbEIscUJBQUssSUFBSSxpQkFBVDtBQUNILGFBRkQsTUFHSyxJQUFJLFVBQVUsUUFBZCxFQUF3QjtBQUN6QixxQkFBSyxJQUFJLGFBQWEsQ0FBYixJQUFnQixDQUFwQixHQUF3QixLQUFLLEtBQUwsR0FBVyxDQUF4QztBQUNILGFBRkksTUFHQSxJQUFJLFVBQVUsT0FBZCxFQUF1QjtBQUN4QixxQkFBSyxJQUFJLGFBQWEsQ0FBYixDQUFKLEdBQXNCLEtBQUssS0FBM0IsR0FBbUMsaUJBQXhDO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBLGdCQUFJLEtBQUssSUFBSSxrQkFBa0IsSUFBdEIsR0FBNkIsV0FBdEM7O0FBRUEsZ0JBQUksVUFBVSxlQUFlLENBQTdCLEVBQWdDO0FBQzVCLHFCQUFLLE9BQUwsQ0FBYSxVQUFiLENBQXdCLEdBQXhCLEVBQTZCLEVBQTdCLEVBQWlDLEVBQWpDO0FBQ0g7QUFDRCxpQkFBSyxPQUFMLENBQWEsUUFBYixDQUFzQixHQUF0QixFQUEyQixFQUEzQixFQUErQixFQUEvQjtBQUNIOzs7a0NBRVUsSyxFQUFPLFksRUFBYyxRLEVBQVU7QUFDdEMsaUJBQUssSUFBSSxLQUFULElBQWtCLEtBQWxCLEVBQXlCO0FBQ3JCLG9CQUFJLGFBQWEsTUFBTSxLQUFOLENBQWpCO0FBQ0Esb0JBQUksUUFBUSxJQUFaOztBQUVBLHFCQUFLLElBQUksSUFBVCxJQUFpQixVQUFqQixFQUE2QjtBQUN6Qix3QkFBSSxZQUFZLFdBQVcsSUFBWCxDQUFoQjtBQUNBLHdCQUFJLGdCQUFnQixVQUFVLGFBQTlCOztBQUVBO0FBQ0Esd0JBQUksS0FBSixFQUFXO0FBQ1AsNkJBQUssT0FBTCxDQUFhLGFBQWI7QUFDQSxnQ0FBUSxLQUFSO0FBQ0g7O0FBRUQsd0JBQUksY0FBYyxjQUFsQixFQUFpQztBQUM3Qiw0QkFBSSxRQUFRLFVBQVUsUUFBdEI7QUFDQSxrQ0FBVSxTQUFWLEdBQXNCLEVBQXRCOztBQUVBLDZCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksTUFBTSxNQUExQixFQUFrQyxHQUFsQyxFQUFzQztBQUNsQyxnQ0FBSSxPQUFPLE1BQU0sQ0FBTixDQUFYO0FBQ0EsZ0NBQUksaUJBQUo7O0FBRUEsZ0NBQUksV0FBVyxjQUFYLENBQTBCLFFBQTFCLEVBQW9DLEtBQXBDLEVBQTJDLElBQTNDLEVBQWlELFFBQXJELEVBQThEO0FBQzFELDJDQUFXLFdBQVcsY0FBWCxDQUEwQixRQUExQixFQUFvQyxLQUFwQyxFQUEyQyxJQUEzQyxFQUFpRCxRQUE1RDtBQUNILDZCQUZELE1BR0s7QUFDRCxvQ0FBSSxtQkFBbUIsV0FBVyxjQUFYLENBQTBCLFFBQTFCLEVBQW9DLEtBQXBDLEVBQTJDLElBQTNDLEVBQWlELGdCQUF4RTtBQUNBLG9DQUFJLE9BQU8sV0FBVyxVQUFYLENBQXNCLEtBQXRCLEVBQTZCLElBQTdCLEVBQW1DLElBQTlDO0FBQ0Esb0NBQUksT0FBTyxXQUFXLFVBQVgsQ0FBc0IsS0FBdEIsRUFBNkIsSUFBN0IsRUFBbUMsS0FBOUM7O0FBRUEscUNBQUssaUJBQUwsQ0FBdUIsSUFBdkIsRUFBNkIsZ0JBQTdCLEVBQStDLElBQS9DLEVBQXFELGFBQXJEOztBQUVBLDJDQUFXLGtCQUFRLHFCQUFSLENBQ1AsZ0JBRE8sRUFFUCxLQUFLLFlBRkUsRUFHUCxZQUhPLENBQVg7O0FBTUEsMkNBQVcsY0FBWCxDQUEwQixRQUExQixFQUFvQyxLQUFwQyxFQUEyQyxJQUEzQyxFQUFpRCxRQUFqRCxHQUE0RCxRQUE1RDtBQUNIOztBQUVELHNDQUFVLFNBQVYsQ0FBb0IsSUFBcEIsQ0FBeUIsUUFBekI7QUFDSDtBQUNKLHFCQTdCRCxNQThCSztBQUNELDRCQUFJLFFBQVEsV0FBVyxVQUFYLENBQXNCLEtBQXRCLEVBQTZCLElBQTdCLEVBQW1DLEtBQS9DLENBREMsQ0FDcUQ7QUFDdEQsNkJBQUssSUFBSSxLQUFULElBQWtCLFVBQVUsS0FBNUIsRUFBbUM7QUFDL0IsaUNBQUssaUJBQUwsQ0FBdUIsS0FBdkIsRUFBOEIsVUFBVSxLQUFWLENBQWdCLEtBQWhCLEVBQXVCLGdCQUFyRCxFQUF1RSxVQUFVLElBQWpGLEVBQXVGO0FBQ25GLHdDQUFRLGNBQWMsTUFENkQ7QUFFbkYsOENBQWMsY0FBYyxZQUZ1RDtBQUduRiwyQ0FBVyxjQUFjLFNBSDBEO0FBSW5GLDZDQUFhLGNBQWMsV0FKd0Q7QUFLbkYsdUNBQU87QUFMNEUsNkJBQXZGOztBQVFBLHNDQUFVLEtBQVYsQ0FBZ0IsS0FBaEIsRUFBdUIsU0FBdkIsR0FBbUMsa0JBQVEscUJBQVIsQ0FDL0IsVUFBVSxLQUFWLENBQWdCLEtBQWhCLEVBQXVCLGdCQURRLEVBRS9CLFVBQVUsSUFBVixDQUFlLFlBRmdCLEVBRy9CLFlBSCtCLENBQW5DO0FBS0g7QUFDSjtBQUNKO0FBQ0o7QUFDSjs7QUFFRDs7OztnREFDeUIsSyxFQUFPLGdCLEVBQWtCLFEsRUFBVTtBQUN4RCxnQkFBSSxDQUFDLFdBQVcsY0FBWCxDQUEwQixRQUExQixDQUFMLEVBQTBDO0FBQ3RDLDJCQUFXLGNBQVgsQ0FBMEIsUUFBMUIsSUFBc0MsRUFBdEM7QUFDSDs7QUFFRDtBQUNBLGdCQUFJLGVBQWUsQ0FBbkI7O0FBRUE7QUFDQSxnQkFBSSxLQUFLLENBQVQ7QUFBQSxnQkFBWSxLQUFLLENBQWpCLENBVHdELENBU3BDO0FBQ3BCLGdCQUFJLFNBQVMsQ0FBYixDQVZ3RCxDQVVwQztBQUNwQixpQkFBSyxJQUFJLEtBQVQsSUFBa0IsS0FBbEIsRUFBeUI7QUFDckIsb0JBQUksQ0FBQyxXQUFXLGNBQVgsQ0FBMEIsUUFBMUIsRUFBb0MsS0FBcEMsQ0FBTCxFQUFpRDtBQUM5QywrQkFBVyxjQUFYLENBQTBCLFFBQTFCLEVBQW9DLEtBQXBDLElBQTZDLEVBQTdDO0FBQ0Y7O0FBRUQsb0JBQUksYUFBYSxNQUFNLEtBQU4sQ0FBakI7O0FBRUEscUJBQUssSUFBSSxJQUFULElBQWlCLFVBQWpCLEVBQTZCO0FBQ3pCLHdCQUFJLFlBQVksV0FBVyxJQUFYLENBQWhCOztBQUVBLHdCQUFJLFVBQVUsYUFBVixDQUF3QixjQUE1QixFQUEyQztBQUN2Qyw0QkFBSSx5QkFBSjtBQUNBLDZCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksVUFBVSxJQUFWLENBQWUsTUFBbkMsRUFBMkMsR0FBM0MsRUFBZ0Q7QUFDNUMsZ0NBQUksT0FBTyxVQUFVLFFBQVYsQ0FBbUIsQ0FBbkIsQ0FBWDs7QUFFQSxnQ0FBSSxDQUFDLFdBQVcsY0FBWCxDQUEwQixRQUExQixFQUFvQyxLQUFwQyxFQUEyQyxJQUEzQyxDQUFMLEVBQXVEO0FBQ25ELG9DQUFJLE9BQU8sVUFBVSxJQUFWLENBQWUsQ0FBZixFQUFrQixZQUE3QjtBQUNBLG9DQUFJLEtBQUssQ0FBTCxJQUFVLFlBQWQsRUFBNEI7QUFDeEIsbURBQWUsS0FBSyxDQUFMLENBQWY7QUFDSDtBQUNELG9DQUFJLEtBQUssS0FBSyxDQUFMLENBQUwsR0FBZSxnQkFBbkIsRUFBcUM7QUFDakMsdURBQW1CLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FBbkI7O0FBRUEsMENBQU0sS0FBSyxDQUFMLENBQU47QUFDQSx3Q0FBSSxLQUFLLE1BQVQsRUFBaUI7QUFDYixpREFBUyxFQUFUO0FBQ0g7QUFDSixpQ0FQRCxNQVFLO0FBQUU7QUFDSCwwQ0FBTSxZQUFOO0FBQ0EsbURBQWUsQ0FBZjtBQUNBLHlDQUFLLENBQUw7QUFDQSx1REFBbUIsQ0FBQyxFQUFELEVBQUssRUFBTCxDQUFuQjtBQUNIOztBQUVELDJDQUFXLGNBQVgsQ0FBMEIsUUFBMUIsRUFBb0MsS0FBcEMsRUFBMkMsSUFBM0MsSUFBbUQ7QUFDL0Msc0RBQWtCO0FBRDZCLGlDQUFuRDtBQUdIO0FBQ0o7QUFDSixxQkE5QkQsTUErQks7QUFDRDtBQUNBLDRCQUFJLFFBQU8sVUFBVSxJQUFWLENBQWUsWUFBMUI7QUFDQSw0QkFBSSxNQUFLLENBQUwsSUFBVSxZQUFkLEVBQTRCO0FBQ3hCLDJDQUFlLE1BQUssQ0FBTCxDQUFmO0FBQ0g7O0FBRUQ7QUFDQSw2QkFBSyxJQUFJLEtBQVQsSUFBa0IsVUFBVSxLQUE1QixFQUFtQztBQUMvQixnQ0FBSSxLQUFLLE1BQUssQ0FBTCxDQUFMLEdBQWUsZ0JBQW5CLEVBQXFDO0FBQ2pDLDBDQUFVLEtBQVYsQ0FBZ0IsS0FBaEIsRUFBdUIsZ0JBQXZCLEdBQTBDLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FBMUMsQ0FEaUMsQ0FDbUI7QUFDcEQsc0NBQU0sTUFBSyxDQUFMLENBQU47QUFDQSxvQ0FBSSxLQUFLLE1BQVQsRUFBaUI7QUFDYiw2Q0FBUyxFQUFUO0FBQ0g7QUFDSiw2QkFORCxNQU9LO0FBQUU7QUFDSCxzQ0FBTSxZQUFOO0FBQ0EsK0NBQWUsQ0FBZjtBQUNBLHFDQUFLLENBQUw7QUFDQSwwQ0FBVSxLQUFWLENBQWdCLEtBQWhCLEVBQXVCLGdCQUF2QixHQUEwQyxDQUFDLEVBQUQsRUFBSyxFQUFMLENBQTFDO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7QUFDSjs7QUFFRCxtQkFBTyxDQUFDLEtBQUssWUFBTixFQUFvQixNQUFwQixDQUFQLENBL0V3RCxDQStFcEI7QUFDdkM7O0FBRUQ7Ozs7MkNBQ29CLEksRUFBTSxTLEVBQVc7QUFDakMsZ0JBQUksY0FBYyxZQUFsQixFQUFnQztBQUM1Qix1QkFBTyxLQUFLLE9BQUwsQ0FBYSxRQUFiLEVBQXVCLFVBQVUsR0FBVixFQUFlO0FBQ3pDLDJCQUFPLElBQUksTUFBSixDQUFXLENBQVgsRUFBYyxXQUFkLEtBQThCLElBQUksTUFBSixDQUFXLENBQVgsQ0FBckM7QUFDSCxpQkFGTSxDQUFQO0FBR0gsYUFKRCxNQUtLLElBQUksY0FBYyxXQUFsQixFQUErQjtBQUNoQyx1QkFBTyxLQUFLLFdBQUwsRUFBUDtBQUNILGFBRkksTUFHQSxJQUFJLGNBQWMsV0FBbEIsRUFBK0I7QUFDaEMsdUJBQU8sS0FBSyxXQUFMLEVBQVA7QUFDSDtBQUNELG1CQUFPLElBQVA7QUFDSDs7QUFFRDtBQUNBOzs7OzJDQXVCb0IsUSxFQUFVO0FBQzFCLHVCQUFXLGNBQVgsQ0FBMEIsUUFBMUIsSUFBc0MsRUFBdEM7QUFDSDs7O3NDQXhCcUIsSSxFQUFNO0FBQ3hCLGdCQUFJLFFBQVEsSUFBWixFQUFrQjtBQUNkO0FBQ0g7QUFDRCxtQkFBUSxPQUFPLElBQVAsS0FBZ0IsUUFBakIsR0FBNkIsSUFBN0IsR0FBb0MsT0FBTyxJQUFQLENBQTNDLENBSndCLENBSWlDOztBQUpqQyx3QkFNQyxLQUFLLEtBQUwsQ0FBVyxXQUFXLFlBQXRCLEtBQXVDLEVBTnhDO0FBQUE7QUFBQSxnQkFNakIsT0FOaUI7QUFBQSxnQkFNUixLQU5ROztBQU94QixvQkFBUSxTQUFTLElBQWpCOztBQUVBLGdCQUFJLFVBQVUsSUFBZCxFQUFvQjtBQUNoQiwyQkFBVyxFQUFYO0FBQ0gsYUFGRCxNQUVPLElBQUksVUFBVSxJQUFkLEVBQW9CO0FBQ3ZCLDJCQUFXLElBQVg7QUFDSCxhQUZNLE1BRUEsSUFBSSxVQUFVLEdBQWQsRUFBbUI7QUFDdEIsMkJBQVcsSUFBWDtBQUNIOztBQUVELHNCQUFVLFdBQVcsT0FBWCxDQUFWO0FBQ0EsdUJBQVcsZ0JBQU0sa0JBQWpCO0FBQ0EsbUJBQU8sT0FBUDtBQUNIOzs7Ozs7QUFRTDs7O2tCQXJacUIsVTtBQXNackIsV0FBVyxZQUFYLEdBQTBCLHVDQUExQjs7QUFFQTtBQUNBLFdBQVcsVUFBWCxHQUF3QixFQUF4QixDLENBQTRCO0FBQzVCLFdBQVcsV0FBWCxHQUF5QixFQUFFLE1BQU0sQ0FBUixFQUFXLFFBQVEsQ0FBbkIsRUFBekI7QUFDQSxXQUFXLGNBQVgsR0FBNEIsRUFBNUI7O0FBRUE7QUFDQTtBQUNBLElBQUksV0FBVyw0SEFBZjtBQUNBLFNBQVMsS0FBVCxDQUFlLENBQWYsRUFBaUI7QUFDYixXQUFPLFNBQVMsSUFBVCxDQUFjLENBQWQsQ0FBUDtBQUNIOztBQUVELFNBQVMsZUFBVCxDQUF5QixLQUF6QixFQUFnQztBQUM1QixRQUFJLFlBQVksRUFBaEI7QUFDQSxRQUFJLFlBQVksRUFBaEI7O0FBRUE7QUFDQSxTQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksTUFBTSxNQUExQixFQUFrQyxHQUFsQyxFQUFzQztBQUNsQyxZQUFJLE1BQU0sTUFBTSxDQUFOLENBQVY7QUFDQSxZQUFJLE1BQU0sTUFBTSxHQUFOLENBQVY7QUFDQSxZQUFJLEdBQUosRUFBUTtBQUNKLHNCQUFVLElBQVYsQ0FBZSxHQUFmO0FBQ0gsU0FGRCxNQUdLO0FBQ0QsbUJBQU8sVUFBVSxNQUFWLEdBQW1CLENBQTFCLEVBQTRCO0FBQ3hCLDBCQUFVLElBQVYsQ0FBZSxVQUFVLEdBQVYsRUFBZjtBQUNIO0FBQ0Qsc0JBQVUsSUFBVixDQUFlLEdBQWY7QUFDSDtBQUNKOztBQUVELFdBQU8sVUFBVSxNQUFWLEdBQW1CLENBQTFCLEVBQTRCO0FBQ3hCLGtCQUFVLElBQVYsQ0FBZSxVQUFVLEdBQVYsRUFBZjtBQUNIOztBQUVELFdBQU8sU0FBUDtBQUNIOztBQUVEO0FBQ0EsU0FBUyxjQUFULENBQXdCLElBQXhCLEVBQTZCO0FBQ3pCLFFBQUksUUFBUSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQVo7QUFDQSxXQUFPLGdCQUFnQixLQUFoQixDQUFQO0FBQ0g7O0FBRUQ7QUFDQTs7SUFDTSxTO0FBQ0YsdUJBQWEsT0FBYixFQUFrRTtBQUFBLFlBQTVDLFNBQTRDLHVFQUFoQyxRQUFnQztBQUFBLFlBQXRCLFNBQXNCLHVFQUFWLFFBQVU7O0FBQUE7O0FBQzlELGFBQUssS0FBTCxHQUFhLENBQWI7QUFDQSxhQUFLLE1BQUwsR0FBYyxDQUFkO0FBQ0EsYUFBSyxLQUFMLEdBQWEsRUFBYjs7QUFFQSxhQUFLLFFBQUwsR0FBZ0IsS0FBaEI7QUFDQSxhQUFLLGNBQUwsR0FBc0IsS0FBSyxJQUFMLENBQVUsUUFBUSxXQUFSLENBQW9CLEtBQUssUUFBekIsRUFBbUMsS0FBN0MsQ0FBdEI7O0FBRUEsYUFBSyxTQUFMLEdBQWlCLFNBQWpCO0FBQ0EsYUFBSyxTQUFMLEdBQWlCLFNBQWpCO0FBQ0EsYUFBSyxPQUFMLEdBQWUsT0FBZjtBQUNIOzs7O21DQUVXLFcsRUFBWTtBQUNwQixnQkFBSSxLQUFLLEtBQUwsQ0FBVyxNQUFYLEdBQW9CLEtBQUssU0FBN0IsRUFBdUM7QUFDbkMsdUJBQU8sSUFBSSxJQUFKLENBQVMsV0FBVCxFQUFzQixLQUFLLFNBQTNCLENBQVA7QUFDSCxhQUZELE1BR0s7QUFDRCx1QkFBTyxLQUFQO0FBQ0g7QUFDSjs7OzZCQUVLLEksRUFBSztBQUNQLGdCQUFJLEtBQUssS0FBTCxDQUFXLE1BQVgsR0FBb0IsS0FBSyxTQUE3QixFQUF1QztBQUNuQztBQUNBLG9CQUFJLGFBQWEsS0FBSyxPQUFMLENBQWEsV0FBYixDQUF5QixLQUFLLElBQTlCLEVBQW9DLEtBQXJEO0FBQ0EscUJBQUssS0FBTCxHQUFhLFVBQWI7O0FBRUEsb0JBQUksYUFBYSxLQUFLLEtBQXRCLEVBQTRCO0FBQ3hCLHlCQUFLLEtBQUwsR0FBYSxLQUFLLElBQUwsQ0FBVSxVQUFWLENBQWI7QUFDSDs7QUFFRDtBQUNBLHFCQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLElBQWhCO0FBQ0EscUJBQUssTUFBTCxJQUFlLEtBQUssTUFBcEI7QUFDQSx1QkFBTyxJQUFQO0FBQ0gsYUFiRCxNQWNLO0FBQ0QscUJBQUssV0FBTDtBQUNBLHVCQUFPLEtBQVA7QUFDSDtBQUNKOztBQUVEOzs7O2dDQUNTLEksRUFBTSxXLEVBQWE7QUFDeEIsZ0JBQUksV0FBVyxLQUFLLElBQUwsQ0FBVSxJQUFWLENBQWY7QUFDQSxnQkFBSSxRQUFKLEVBQWE7QUFDVCx1QkFBTyxLQUFLLFVBQUwsQ0FBZ0IsV0FBaEIsQ0FBUDtBQUNILGFBRkQsTUFHSztBQUNELHVCQUFPLEtBQVA7QUFDSDtBQUNKOzs7c0NBRWE7QUFDVixnQkFBSSxZQUFZLEtBQUssS0FBTCxDQUFXLEtBQUssS0FBTCxDQUFXLE1BQVgsR0FBb0IsQ0FBL0IsQ0FBaEI7O0FBRUEsc0JBQVUsTUFBVixDQUFpQixLQUFLLFFBQXRCO0FBQ0Esc0JBQVUsS0FBVixJQUFtQixLQUFLLGNBQXhCOztBQUVBLGdCQUFJLFVBQVUsS0FBVixHQUFrQixLQUFLLEtBQTNCLEVBQWtDO0FBQzlCLHFCQUFLLEtBQUwsR0FBYSxVQUFVLEtBQXZCO0FBQ0g7QUFDSjs7OytCQUVPLEksRUFBSztBQUNULGdCQUFJLElBQUosRUFBUztBQUNMLHFCQUFLLElBQUwsQ0FBVSxJQUFWO0FBQ0gsYUFGRCxNQUdLO0FBQ0QscUJBQUssV0FBTDtBQUNIO0FBQ0o7Ozs4QkFFYSxHLEVBQUssUyxFQUFXLFMsRUFBVyxXLEVBQWEsRyxFQUFLO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQUksY0FBSjtBQUNBLGdCQUFJLE9BQU8sU0FBUCxLQUFxQixRQUF6QixFQUFtQztBQUMvQix3QkFBUSxJQUFJLEtBQUosQ0FBVSxHQUFWLENBQVIsQ0FEK0IsQ0FDUDtBQUMzQixhQUZELE1BR0s7QUFDRCx3QkFBUSxDQUFDLEdBQUQsQ0FBUixDQURDLENBQ2M7QUFDbEI7O0FBRUQsZ0JBQUksWUFBWSxJQUFJLFNBQUosQ0FBYyxHQUFkLEVBQW1CLFNBQW5CLEVBQThCLFNBQTlCLENBQWhCO0FBQ0EsZ0JBQUksT0FBTyxVQUFVLFVBQVYsQ0FBcUIsV0FBckIsQ0FBWDs7QUFFQTtBQUNBLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksTUFBTSxNQUExQixFQUFrQyxHQUFsQyxFQUF1QztBQUNuQyxvQkFBSSxTQUFTLE1BQU0sQ0FBTixFQUFTLEtBQVQsQ0FBZSxJQUFmLENBQWIsQ0FEbUMsQ0FDQTtBQUNuQyxvQkFBSSxXQUFZLE1BQU0sQ0FBUCxHQUFZLElBQVosR0FBbUIsS0FBbEM7O0FBRUEscUJBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLE9BQU8sTUFBekIsRUFBaUMsR0FBakMsRUFBc0M7QUFDbEMsd0JBQUksQ0FBQyxJQUFMLEVBQVU7QUFDTjtBQUNIOztBQUVELHdCQUFJLE9BQU8sT0FBTyxDQUFQLEVBQVUsSUFBVixFQUFYOztBQUVBLHdCQUFJLENBQUMsSUFBTCxFQUFXO0FBQ1A7QUFDSDs7QUFFRCx3QkFBSSxjQUFlLFFBQUQsR0FBYSxJQUFiLEdBQW9CLE1BQU0sSUFBNUM7O0FBRUE7QUFDQTtBQUNBLHdCQUFJLGFBQWEsSUFBSSxDQUFqQixJQUFzQixLQUFLLGVBQUwsQ0FBcUIsV0FBckIsQ0FBMUIsRUFBNkQ7QUFDekQsK0JBQU8sVUFBVSxPQUFWLENBQWtCLElBQWxCLEVBQXdCLFdBQXhCLENBQVA7QUFDQSw0QkFBSSxDQUFDLElBQUwsRUFBVTtBQUNOO0FBQ0g7QUFDRCw2QkFBSyxNQUFMLENBQVksSUFBWjtBQUNBLG1DQUFXLElBQVg7QUFDSCxxQkFQRCxNQVFLO0FBQ0QsNkJBQUssTUFBTCxDQUFZLFdBQVo7QUFDSDs7QUFFRDtBQUNBLHdCQUFJLElBQUksT0FBTyxNQUFQLEdBQWdCLENBQXhCLEVBQTJCO0FBQ3ZCLCtCQUFPLFVBQVUsT0FBVixDQUFrQixJQUFsQixFQUF3QixXQUF4QixDQUFQO0FBQ0EsbUNBQVcsSUFBWDtBQUNIO0FBQ0o7O0FBRUQsb0JBQUksTUFBTSxNQUFNLE1BQU4sR0FBZSxDQUF6QixFQUEyQjtBQUN2Qiw4QkFBVSxNQUFWLENBQWlCLElBQWpCO0FBQ0g7QUFDSjtBQUNELG1CQUFPLFNBQVA7QUFDSDs7Ozs7O0FBR0w7QUFDQTs7O0lBQ00sSTtBQUNGLG9CQUF1QztBQUFBLFlBQTFCLE1BQTBCLHVFQUFqQixDQUFpQjtBQUFBLFlBQWQsU0FBYyx1RUFBRixDQUFFOztBQUFBOztBQUNuQyxhQUFLLEtBQUwsR0FBYSxDQUFiO0FBQ0EsYUFBSyxJQUFMLEdBQVksRUFBWjs7QUFFQSxhQUFLLE1BQUwsR0FBYyxLQUFLLElBQUwsQ0FBVSxNQUFWLENBQWQ7QUFDQSxhQUFLLFNBQUwsR0FBaUIsU0FBakI7QUFDSDs7OzsrQkFFTyxJLEVBQUs7QUFDVCxpQkFBSyxLQUFMLElBQWMsS0FBSyxNQUFuQjtBQUNBLGlCQUFLLElBQUwsSUFBYSxJQUFiO0FBQ0g7Ozt3Q0FFZ0IsSSxFQUFLO0FBQ2xCLG1CQUFPLEtBQUssTUFBTCxHQUFjLEtBQUssS0FBbkIsR0FBMkIsS0FBSyxTQUF2QztBQUNIOzs7Ozs7Ozs7Ozs7OzhRQ3ZtQkw7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTSxjQUFjOztBQUVoQjtBQUNBLGtCQUFjLFFBQVEsT0FBUixFQUhFLEVBR2lCOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBVGdCLHFCQVNMLEtBVEssRUFTRTtBQUFBOztBQUNkLFlBQUksS0FBSixFQUFXO0FBQUE7QUFDUCxvQkFBSSxRQUFRLEVBQVo7O0FBRE8sMkNBRUUsTUFGRjtBQUdILHdCQUFJLE1BQU0sT0FBTixDQUFjLE1BQU0sTUFBTixDQUFkLENBQUosRUFBa0M7QUFDOUIsOEJBQU0sTUFBTixFQUFjLE9BQWQsQ0FBc0I7QUFBQSxtQ0FBUSxNQUFNLElBQU4sQ0FBVyxNQUFLLFlBQUwsQ0FBa0IsTUFBbEIsRUFBMEIsSUFBMUIsQ0FBWCxDQUFSO0FBQUEseUJBQXRCO0FBQ0gscUJBRkQsTUFHSztBQUNELDhCQUFNLElBQU4sQ0FBVyxNQUFLLFlBQUwsQ0FBa0IsTUFBbEIsRUFBMEIsTUFBTSxNQUFOLENBQTFCLENBQVg7QUFDSDtBQVJFOztBQUVQLHFCQUFLLElBQUksTUFBVCxJQUFtQixLQUFuQixFQUEwQjtBQUFBLDBCQUFqQixNQUFpQjtBQU96Qjs7QUFFRCxzQkFBSyxZQUFMLEdBQW9CLFFBQVEsR0FBUixDQUFZLE1BQU0sTUFBTixDQUFhO0FBQUEsMkJBQUssQ0FBTDtBQUFBLGlCQUFiLENBQVosQ0FBcEI7QUFYTztBQVlWO0FBQ0QsZUFBTyxLQUFLLFlBQVo7QUFDSCxLQXhCZTs7O0FBMEJoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFoQ2dCLHdCQWdDRixNQWhDRSxFQWdDTSxJQWhDTixFQWdDWTtBQUN4QixZQUFJLFFBQVEsSUFBUixJQUFpQixRQUFPLElBQVAseUNBQU8sSUFBUCxPQUFnQixRQUFoQixJQUE0QixTQUFTLFVBQTFELEVBQXVFO0FBQ25FO0FBQ0g7O0FBRUQsWUFBSSxVQUFVLEVBQUUsY0FBRixFQUFkO0FBQ0EsWUFBSSxTQUFTLFFBQVEsT0FBUixFQUFiOztBQUVBLFlBQUksUUFBTyxJQUFQLHlDQUFPLElBQVAsT0FBZ0IsUUFBcEIsRUFBOEI7QUFDMUIsbUJBQU8sTUFBUCxDQUFjLE9BQWQsRUFBdUIsSUFBdkI7O0FBRUE7QUFDQSxnQkFBSSxPQUFPLEtBQUssR0FBWixLQUFvQixRQUF4QixFQUFrQztBQUM5Qix5QkFBUyxLQUFLLGNBQUwsQ0FBb0IsT0FBcEIsQ0FBVDtBQUNIO0FBQ0o7O0FBRUQ7QUFDQSxZQUFJLFdBQVcsK0JBQXFCLE1BQXJCLEVBQTZCLE9BQTdCLENBQWY7QUFDQSxlQUFPLE9BQU8sSUFBUCxDQUFZO0FBQUEsbUJBQU0sU0FBUyxJQUFULEVBQU47QUFBQSxTQUFaLEVBQW1DLElBQW5DLENBQ0gsWUFBTTtBQUNGO0FBQ0EsK0JBQUksT0FBSixtQkFBMkIsTUFBM0Isc0JBQW1ELE9BQW5EO0FBQ0gsU0FKRSxFQUtILFlBQU07QUFDRjtBQUNBLCtCQUFJLE9BQUosbUJBQTJCLE1BQTNCLDBCQUF1RCxPQUF2RDtBQUNILFNBUkUsQ0FBUDtBQVVILEtBN0RlOzs7QUErRGhCO0FBQ0E7QUFDQSxrQkFqRWdCLGdDQWlFZ0M7QUFBQTs7QUFBQSxZQUE5QixNQUE4QixRQUE5QixNQUE4QjtBQUFBLFlBQXRCLEdBQXNCLFFBQXRCLEdBQXNCO0FBQUEsWUFBakIsTUFBaUIsUUFBakIsTUFBaUI7QUFBQSxZQUFULEtBQVMsUUFBVCxLQUFTOztBQUM1QyxZQUFJLEtBQUssNEJBQUwsS0FBc0MsU0FBMUMsRUFBcUQ7QUFDakQsaUJBQUssNEJBQUwsR0FBcUMsT0FBTyxRQUFQLEtBQW9CLFNBQXpEO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQUksYUFBYSxRQUFRLE9BQVIsQ0FBZ0IsR0FBaEIsQ0FBakI7QUFDQSxZQUFJLElBQUksS0FBSixDQUFVLENBQVYsRUFBYSxDQUFiLE1BQW9CLE9BQXhCLEVBQWlDO0FBQzdCLHlCQUFhLGdCQUFNLEVBQU4sQ0FBUyxHQUFULEVBQWMsS0FBZCxFQUFxQixhQUFyQixFQUFvQyxJQUFwQyxDQUF5QyxnQkFBUTtBQUMxRCxvQkFBSSxRQUFRLElBQUksVUFBSixDQUFlLElBQWYsQ0FBWjtBQUNBLG9CQUFJLE9BQUssNEJBQVQsRUFBdUM7QUFDbkMsMkJBQU8sS0FBUCxDQURtQyxDQUNyQjtBQUNqQixpQkFGRCxNQUdLO0FBQ0Qsd0JBQUksTUFBTSxFQUFWO0FBQ0EseUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxNQUFNLE1BQTFCLEVBQWtDLEdBQWxDLEVBQXVDO0FBQ25DLCtCQUFPLE9BQU8sWUFBUCxDQUFvQixNQUFNLENBQU4sQ0FBcEIsQ0FBUDtBQUNIO0FBQ0QsMkJBQU8sK0JBQStCLEtBQUssR0FBTCxDQUF0QyxDQUxDLENBS2dEO0FBQ3BEO0FBQ0osYUFaWSxDQUFiO0FBYUg7O0FBRUQsZUFBTyxXQUFXLElBQVgsQ0FBZ0IsZ0JBQVE7QUFDM0IsZ0JBQUksT0FBSyw0QkFBVCxFQUF1QztBQUNuQztBQUNBLG9CQUFJLGFBQUo7QUFDQSxvQkFBSSxPQUFPLElBQVAsS0FBZ0IsUUFBcEIsRUFBOEI7QUFBRTtBQUM1QiwyQkFBTyxJQUFJLFFBQUosQ0FBYSxNQUFiLFdBQTRCLFVBQVUsSUFBVixDQUE1QixRQUFnRCxFQUFFLGNBQUYsRUFBVSxZQUFWLEVBQWhELENBQVA7QUFDSCxpQkFGRCxNQUdLLElBQUksZ0JBQWdCLFVBQXBCLEVBQWdDO0FBQUU7QUFDbkMsMkJBQU8sSUFBSSxRQUFKLENBQWEsTUFBYixFQUFxQixJQUFyQixFQUEyQixFQUFFLGNBQUYsRUFBVSxZQUFWLEVBQTNCLENBQVA7QUFDSDtBQUNELHlCQUFTLEtBQVQsQ0FBZSxHQUFmLENBQW1CLElBQW5CO0FBQ0EsbUNBQUksT0FBSixFQUFhLG9DQUFiLEVBQW1ELElBQW5EO0FBQ0gsYUFYRCxNQVlLO0FBQ0Q7QUFDQSxvQkFBSSxzRkFFb0IsTUFGcEIsbURBR21CLFVBQVUsUUFIN0IsaURBSWtCLFNBQVMsUUFKM0IsNkNBS2UsVUFBVSxJQUFWLENBTGYsZ0RBQUo7O0FBU0Esb0JBQUksV0FBVyxTQUFTLGFBQVQsQ0FBdUIsT0FBdkIsQ0FBZjtBQUNBLHlCQUFTLFdBQVQsQ0FBcUIsU0FBUyxjQUFULENBQXdCLEVBQXhCLENBQXJCO0FBQ0EseUJBQVMsSUFBVCxDQUFjLFdBQWQsQ0FBMEIsUUFBMUI7QUFDQSx5QkFBUyxLQUFULENBQWUsVUFBZixDQUEwQixHQUExQixFQUErQixDQUEvQjtBQUNBLG1DQUFJLE9BQUosRUFBYSwwQkFBYixFQUF5QyxHQUF6QztBQUNIO0FBQ0osU0E5Qk0sQ0FBUDtBQStCSDtBQWpJZSxDQUFwQjs7a0JBcUllLFc7Ozs7Ozs7Ozs7QUN4SWY7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQVBBOztBQVNPLElBQUksZ0NBQVksT0FBTyxNQUFQLGdCQUFoQjs7QUFFUCxPQUFPLE1BQVAsQ0FBYyxTQUFkLEVBQXlCO0FBQ3JCLFVBQU0sTUFEZTtBQUVyQix5QkFGcUI7QUFHckIsY0FBVSxJQUhXOztBQUtyQixRQUxxQixrQkFLZDtBQUNILGFBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsS0FBaEIsQ0FBc0IsSUFBdEIsRUFBNEIsU0FBNUI7O0FBRUE7QUFDQTtBQUNBLGFBQUssT0FBTCxDQUFhLHFCQUFiLEdBQXFDLElBQXJDOztBQUVBO0FBQ0EsYUFBSyxPQUFMLENBQWEscUJBQWIsR0FBcUMsS0FBckM7O0FBRUE7QUFDQSxhQUFLLE9BQUwsQ0FBYSx3QkFBYixHQUF3QyxJQUF4Qzs7QUFFQTtBQUNBLGFBQUssT0FBTCxDQUFhLHdCQUFiLEdBQXdDLElBQXhDO0FBQ0EsYUFBSyxPQUFMLENBQWEsNkJBQWIsR0FBNkMsQ0FBN0MsQ0FmRyxDQWU2Qzs7QUFFaEQsYUFBSyxLQUFMO0FBQ0gsS0F2Qm9CO0FBeUJyQixTQXpCcUIsbUJBeUJiO0FBQ0osYUFBSyxNQUFMLEdBQWMsRUFBZDtBQUNBLGFBQUssU0FBTDtBQUNILEtBNUJvQjs7O0FBOEJyQjtBQUNBLGNBL0JxQixzQkErQlQsT0EvQlMsRUErQkEsSUEvQkEsRUErQk0sT0EvQk4sRUErQmU7QUFDaEMsWUFBSSxPQUFPLFFBQVEsSUFBbkI7QUFDQSxZQUFJLEtBQUssVUFBTCxLQUFvQixLQUFLLFVBQTdCLEVBQXlDO0FBQ3JDO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBLGVBQU8sS0FBSyxVQUFMLENBQWdCLElBQWhCLENBQVA7QUFDQSxZQUFJLENBQUMsSUFBTCxFQUFXO0FBQ1A7QUFDSDs7QUFFRCxZQUFJLE9BQU8sUUFBUSxRQUFSLENBQWlCLElBQTVCO0FBQ0EsYUFBSyxjQUFMLEdBQXVCLFNBQVMsWUFBVCxJQUF5QixTQUFTLGlCQUF6RDs7QUFFQTtBQUNBLGFBQUssZ0JBQUwsR0FBeUIsU0FBUyxZQUFULElBQXlCLFNBQVMsaUJBQTNEOztBQUVBLFlBQUksSUFBSSxLQUFLLGdCQUFMLENBQXNCLE9BQXRCLEVBQStCLElBQS9CLEVBQXFDLE9BQXJDLEVBQThDLElBQTlDLENBQVI7QUFDQSxZQUFJLENBQUMsQ0FBTCxFQUFRO0FBQ0o7QUFDSDs7QUFFRCxVQUFFLE9BQUYsR0FBWSxPQUFaO0FBQ0EsVUFBRSxPQUFGLEdBQVksT0FBWjtBQUNBLFVBQUUsTUFBRixDQUFTLE1BQVQsR0FBa0IsS0FBbEIsQ0ExQmdDLENBMEJQOztBQUV6QjtBQUNBLFlBQUksQ0FBQyxLQUFLLFNBQUwsQ0FBZSxLQUFLLEdBQXBCLENBQUwsRUFBK0I7QUFDM0IsaUJBQUssU0FBTCxDQUFlLElBQWY7QUFDSDtBQUNELGFBQUssTUFBTCxDQUFZLEtBQUssR0FBakIsRUFBc0IsSUFBdEIsQ0FBMkIsQ0FBM0I7O0FBRUE7QUFDQSw0QkFBVSxRQUFWLENBQW1CLEtBQUssSUFBeEIsRUFBOEIsS0FBSyxHQUFuQztBQUNILEtBbkVvQjs7O0FBcUVyQjtBQUNBLGFBdEVxQixxQkFzRVYsSUF0RVUsRUFzRUo7QUFDYixhQUFLLE1BQUwsQ0FBWSxLQUFLLEdBQWpCLElBQXdCLEVBQXhCO0FBQ0EsZUFBTyxhQUFNLFNBQU4sQ0FBZ0IsSUFBaEIsQ0FBcUIsSUFBckIsRUFBMkIsSUFBM0IsQ0FBUDtBQUNILEtBekVvQjs7O0FBMkVyQjtBQUNBLFdBNUVxQixtQkE0RVosSUE1RVksRUE0RU47QUFBQTs7QUFDWCxlQUFPLEtBQUssaUJBQUwsQ0FBdUIsSUFBdkIsRUFBNkIsS0FBSyxJQUFsQyxFQUF3QyxLQUFLLE1BQUwsQ0FBWSxLQUFLLEdBQWpCLENBQXhDLEVBQ0gsSUFERyxDQUNFO0FBQUEsbUJBQVUsTUFBSywwQkFBTCxDQUFnQyxJQUFoQyxFQUFzQyxNQUFLLElBQTNDLEVBQWlELE1BQWpELENBQVY7QUFBQSxTQURGLEVBRUgsSUFGRyxDQUVFLGdCQUFnQztBQUFBLGdCQUE3QixNQUE2QixRQUE3QixNQUE2QjtBQUFBLGdCQUFyQixLQUFxQixRQUFyQixLQUFxQjtBQUFBLGdCQUFkLE9BQWMsUUFBZCxPQUFjOztBQUNqQyxnQkFBSSxLQUFKLEVBQVc7QUFDUCxzQkFBSyxLQUFMLENBQVcsS0FBSyxHQUFoQixJQUF1QixLQUF2Qjs7QUFFQTtBQUNBLHVCQUFPLE9BQVAsQ0FBZSxhQUFLO0FBQ2hCLHdCQUFJLG9CQUFvQixFQUFFLGlCQUExQjtBQUNBLHdCQUFJLFlBQ0EsTUFBSyxLQUFMLENBQVcsS0FBSyxHQUFoQixFQUFxQixpQkFBckIsS0FDQSxNQUFLLEtBQUwsQ0FBVyxLQUFLLEdBQWhCLEVBQXFCLGlCQUFyQixFQUF3QyxFQUFFLElBQTFDLENBRko7O0FBSUE7QUFDQSx3QkFBSSxRQUFRLE1BQUssYUFBakI7QUFDQSwwQkFBTSxLQUFOLEdBQWMsRUFBRSxLQUFoQjs7QUFFQSx3QkFBSSxVQUFVLGFBQVYsQ0FBd0IsY0FBNUIsRUFBMkM7QUFDdkM7QUFDQSw4QkFBTSxJQUFOLEdBQWEsVUFBVSxJQUFWLENBQWUsR0FBZixDQUFtQixVQUFTLElBQVQsRUFBYztBQUFFLG1DQUFPLEtBQUssWUFBWjtBQUEyQix5QkFBOUQsQ0FBYjtBQUNBLDhCQUFNLFNBQU4sR0FBa0IsVUFBVSxTQUE1QjtBQUNILHFCQUpELE1BS0s7QUFDRCw4QkFBTSxJQUFOLEdBQWEsVUFBVSxJQUFWLENBQWUsWUFBNUI7QUFDQSw4QkFBTSxLQUFOLEdBQWMsRUFBRSxLQUFGLENBQVEsS0FBUixJQUFpQixDQUEvQjtBQUNBLDhCQUFNLFNBQU4sR0FBa0IsVUFBVSxLQUFWLENBQWdCLEVBQUUsS0FBRixDQUFRLEtBQXhCLEVBQStCLFNBQWpEO0FBQ0g7O0FBRUQsaUNBQU0sVUFBTixDQUFpQixJQUFqQixRQUE0QixFQUFFLE9BQTlCLEVBQXVDLEVBQUUsSUFBekMsRUFBK0MsRUFBRSxPQUFqRDtBQUNILGlCQXRCRDtBQXVCSDtBQUNELGtCQUFLLFFBQUwsQ0FBYyxJQUFkOztBQUVBO0FBQ0EsbUJBQU8sYUFBTSxPQUFOLENBQWMsSUFBZCxRQUF5QixJQUF6QixFQUErQixJQUEvQixDQUFvQyxxQkFBYTtBQUNwRDtBQUNBLG9CQUFJLFdBQVcsU0FBZixFQUEwQjtBQUN0Qiw4QkFBVSxRQUFWLENBQW1CLFNBQW5CLEdBQStCLE9BQS9CO0FBQ0EsOEJBQVUsUUFBVixDQUFtQixJQUFuQixDQUF3QixPQUF4QixFQUZzQixDQUVZO0FBQ2xDLDJCQUFPLFNBQVA7QUFDSDtBQUNKLGFBUE0sQ0FBUDtBQVFILFNBMUNFLENBQVA7QUEyQ0gsS0F4SG9COzs7QUEwSHJCO0FBQ0EsZUEzSHFCLHVCQTJIUixJQTNIUSxFQTJIRjtBQUNmLGVBQU8sS0FBSyxjQUFMLENBQW9CLElBQXBCLENBQVA7QUFDSCxLQTdIb0I7OztBQStIckI7QUFDQSxtQkFoSXFCLDJCQWdJSixRQWhJSSxFQWdJTSxhQWhJTixFQWdJcUI7QUFDdEMsWUFBSSxTQUFTLEVBQWI7QUFDQSxhQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxjQUFjLE1BQWhDLEVBQXdDLEdBQXhDLEVBQTZDO0FBQ3pDLGdCQUFJLEtBQUssY0FBYyxDQUFkLENBQVQ7QUFDQSxnQkFBSSxZQUFZLEtBQUssS0FBTCxDQUFXLFFBQVgsRUFBcUIsR0FBRyxpQkFBeEIsRUFBMkMsR0FBRyxJQUE5QyxDQUFoQjtBQUNBLGdCQUFJLHVCQUFKO0FBQ0EsZ0JBQUksVUFBVSxhQUFWLENBQXdCLGNBQTVCLEVBQTJDO0FBQ3ZDLG9CQUFJLFFBQVEsVUFBVSxJQUFWLENBQWUsR0FBZixDQUFtQixVQUFTLElBQVQsRUFBYztBQUFFLDJCQUFPLEtBQUssY0FBWjtBQUE2QixpQkFBaEUsQ0FBWjtBQUNBLG1CQUFHLE1BQUgsQ0FBVSxXQUFWLEdBQXdCLFVBQVUsV0FBbEM7QUFDQSxpQ0FBaUIsS0FBSyxXQUFMLENBQWlCLEtBQWpCLEVBQXdCLEdBQUcsT0FBSCxDQUFXLFFBQW5DLEVBQTZDLEdBQUcsTUFBaEQsQ0FBakI7QUFDSCxhQUpELE1BS0s7QUFDRCxpQ0FBaUIsS0FBSyxXQUFMLENBQWlCLFVBQVUsSUFBVixDQUFlLGNBQWhDLEVBQWdELEdBQUcsT0FBSCxDQUFXLFFBQTNELEVBQXFFLEdBQUcsTUFBeEUsQ0FBakI7QUFDSDtBQUNELGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksZUFBZSxNQUFuQyxFQUEyQyxHQUEzQyxFQUFnRDtBQUM1QyxvQkFBSSxNQUFNLE9BQU8sTUFBUCxDQUFjLEVBQWQsQ0FBVjtBQUNBLG9CQUFJLEtBQUosR0FBWSxlQUFlLENBQWYsQ0FBWjtBQUNBLHVCQUFPLElBQVAsQ0FBWSxHQUFaO0FBQ0g7QUFDSjtBQUNELGVBQU8sTUFBUDtBQUNILEtBckpvQjs7O0FBdUpyQjtBQUNBLGVBeEpxQix1QkF3SlIsSUF4SlEsRUF3SkYsUUF4SkUsRUF3SlEsTUF4SlIsRUF3SmdCO0FBQ2pDLFlBQUksU0FBUyxFQUFiOztBQUVBLFlBQUksU0FBUyxJQUFULEtBQWtCLFlBQXRCLEVBQW9DO0FBQ2hDLGlCQUFLLGVBQUwsQ0FBcUIsU0FBUyxXQUE5QixFQUEyQyxJQUEzQyxFQUFpRCxNQUFqRCxFQUF5RCxNQUF6RDtBQUNILFNBRkQsTUFFTyxJQUFJLFNBQVMsSUFBVCxLQUFrQixpQkFBdEIsRUFBeUM7QUFDNUMsZ0JBQUksUUFBUSxTQUFTLFdBQXJCO0FBQ0EsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxNQUFNLE1BQTFCLEVBQWtDLEVBQUUsQ0FBcEMsRUFBdUM7QUFDbkMscUJBQUssZUFBTCxDQUFxQixNQUFNLENBQU4sQ0FBckIsRUFBK0IsSUFBL0IsRUFBcUMsTUFBckMsRUFBNkMsTUFBN0M7QUFDSDtBQUNKLFNBTE0sTUFLQSxJQUFJLFNBQVMsSUFBVCxLQUFrQixPQUF0QixFQUErQjtBQUNsQyxtQkFBTyxJQUFQLENBQVksMEJBQWUsU0FBUyxXQUF4QixFQUFxQyxJQUFyQyxFQUEyQyxNQUEzQyxDQUFaO0FBQ0gsU0FGTSxNQUVBLElBQUksU0FBUyxJQUFULEtBQWtCLFlBQXRCLEVBQW9DO0FBQ3ZDLGdCQUFJLFNBQVMsU0FBUyxXQUF0QjtBQUNBLGlCQUFLLElBQUksS0FBSSxDQUFiLEVBQWdCLEtBQUksT0FBTyxNQUEzQixFQUFtQyxFQUFFLEVBQXJDLEVBQXdDO0FBQ3BDLHVCQUFPLElBQVAsQ0FBWSwwQkFBZSxPQUFPLEVBQVAsQ0FBZixFQUEwQixJQUExQixFQUFnQyxNQUFoQyxDQUFaO0FBQ0g7QUFDSixTQUxNLE1BS0EsSUFBSSxTQUFTLElBQVQsS0FBa0IsU0FBdEIsRUFBaUM7QUFDcEMsZ0JBQUksV0FBVyxjQUFJLFFBQUosQ0FBYSxTQUFTLFdBQXRCLENBQWY7QUFDQSxtQkFBTyxJQUFQLENBQVksMEJBQWUsUUFBZixFQUF5QixJQUF6QixFQUErQixNQUEvQixDQUFaO0FBQ0gsU0FITSxNQUdBLElBQUksU0FBUyxJQUFULEtBQWtCLGNBQXRCLEVBQXNDO0FBQ3pDLGdCQUFJLFlBQVcsY0FBSSxhQUFKLENBQWtCLFNBQVMsV0FBM0IsQ0FBZjtBQUNBLG1CQUFPLElBQVAsQ0FBWSwwQkFBZSxTQUFmLEVBQXlCLElBQXpCLEVBQStCLE1BQS9CLENBQVo7QUFDSDs7QUFFRCxlQUFPLE1BQVA7QUFDSCxLQWxMb0I7OztBQW9MckI7QUFDQSxtQkFyTHFCLDJCQXFMSixJQXJMSSxFQXFMRSxJQXJMRixFQXFMUSxNQXJMUixFQXFMZ0IsTUFyTGhCLEVBcUx3QjtBQUN6QyxZQUFJLFNBQVMsS0FBSyxHQUFMLENBQVMsT0FBTyxNQUFoQixFQUF3QixLQUFLLE1BQUwsR0FBYyxDQUF0QyxDQUFiO0FBQ0EsWUFBSSxTQUFTLENBQWIsRUFBZ0I7QUFDWjtBQUNBO0FBQ0EsZ0JBQUksY0FBYyxDQUFDLEtBQUssTUFBTCxHQUFjLENBQWYsSUFBb0IsTUFBdEM7QUFDQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLE1BQXBCLEVBQTRCLEdBQTVCLEVBQWlDO0FBQzdCLHVCQUFPLGFBQVAsR0FBdUIsS0FBSyxLQUFMLENBQVcsSUFBSSxXQUFmLENBQXZCO0FBQ0EsdUJBQU8sV0FBUCxHQUFxQixLQUFLLEtBQUwsQ0FBVyxDQUFDLElBQUksQ0FBTCxJQUFVLFdBQXJCLENBQXJCOztBQUVBLHVCQUFPLElBQVAsQ0FBWSx5QkFBYyxJQUFkLEVBQW9CLElBQXBCLEVBQTBCLE1BQTFCLENBQVo7QUFDSDtBQUNELG1CQUFPLGFBQVAsR0FBdUIsSUFBdkI7QUFDQSxtQkFBTyxXQUFQLEdBQXFCLElBQXJCO0FBQ0gsU0FaRCxNQWFLO0FBQ0QsZ0JBQUksUUFBUSx5QkFBYyxJQUFkLEVBQW9CLElBQXBCLEVBQTBCLE1BQTFCLENBQVo7QUFDQSxnQkFBSSxDQUFDLE1BQU0sVUFBWCxFQUFzQjtBQUNsQixvQkFBSSxlQUFlLGtCQUFrQixLQUFsQixDQUFuQjtBQUNBLG9CQUFJLFlBQUosRUFBaUI7QUFDYiwyQkFBTyxJQUFQLENBQVksWUFBWjtBQUNIO0FBQ0o7QUFDSjtBQUNKO0FBN01vQixDQUF6Qjs7QUFpTkEsSUFBTSxrQkFBa0IsR0FBeEIsQyxDQUE2QjtBQUM3QixJQUFNLGdCQUFnQixHQUF0QixDLENBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGlCQUFULENBQTJCLEtBQTNCLEVBQWlDO0FBQzdCLFFBQUksa0JBQWtCLEVBQXRCO0FBQ0EsUUFBSSxnQkFBZ0IsRUFBcEI7QUFDQSxRQUFJLHdCQUF3QixRQUE1QjtBQUNBLFFBQUksc0JBQXNCLFFBQTFCOztBQUVBO0FBQ0EsV0FBTyxTQUFTLENBQUMsTUFBTSxVQUF2QixFQUFtQztBQUMvQixZQUFJLE1BQU0sVUFBTixHQUFtQixDQUF2QixFQUF5QjtBQUNyQjtBQUNBLGdCQUFJLE1BQU0sT0FBTixHQUFnQixtQkFBcEIsRUFBd0M7QUFDcEMsc0NBQXNCLE1BQU0sT0FBNUI7QUFDQSw4QkFBYyxPQUFkLENBQXNCLEtBQXRCO0FBQ0g7QUFDSixTQU5ELE1BT0s7QUFDRDtBQUNBLGdCQUFJLE1BQU0sT0FBTixHQUFnQixxQkFBcEIsRUFBMEM7QUFDdEMsd0NBQXdCLE1BQU0sT0FBOUI7QUFDQSxnQ0FBZ0IsT0FBaEIsQ0FBd0IsS0FBeEI7QUFDSDtBQUNKOztBQUVELGdCQUFRLHFCQUFVLFNBQVYsQ0FBb0IsS0FBcEIsQ0FBUjtBQUNIOztBQUVELFFBQUksZ0JBQWdCLGdCQUFnQixDQUFoQixDQUFwQjtBQUNBLFFBQUksY0FBYyxjQUFjLENBQWQsQ0FBbEI7O0FBRUEsUUFBSSxnQkFBZ0IsTUFBaEIsSUFBMEIsY0FBYyxPQUFkLEdBQXdCLGVBQXRELEVBQXNFO0FBQ2xFO0FBQ0EsZUFBTyxhQUFQO0FBQ0gsS0FIRCxNQUlLLElBQUksY0FBYyxNQUFkLElBQXdCLFlBQVksT0FBWixHQUFzQixhQUFsRCxFQUFnRTtBQUNqRTtBQUNBLGVBQU8sV0FBUDtBQUNILEtBSEksTUFJQTtBQUNEO0FBQ0EsZUFBTyxpQkFBaUIsV0FBeEI7QUFDSDtBQUNKOztBQUVELFVBQVUsVUFBVixHQUF1QixDQUF2QixDLENBQTBCOzs7Ozs7Ozs7Ozs7QUM5UTFCOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztvTUFWQTs7QUFZQTtBQUNBLElBQUksa0JBQWtCLENBQXRCOztBQUVPLElBQU0sa0NBQWE7QUFFdEIsYUFGc0IsdUJBRVQ7QUFDVCxZQUFJLGlCQUFPLE9BQVgsRUFBb0I7QUFDaEIsaUJBQUssTUFBTCxHQUFjLDJCQUFkO0FBQ0gsU0FGRCxNQUdLLElBQUksaUJBQU8sU0FBWCxFQUFzQjtBQUN2QixpQkFBSyxLQUFMLEdBQWEsRUFBYixDQUR1QixDQUNOO0FBQ3BCO0FBQ0osS0FUcUI7QUFXdEIsWUFYc0Isb0JBV1osSUFYWSxFQVdOO0FBQ1osZUFBTyxLQUFLLEtBQUwsQ0FBVyxLQUFLLEdBQWhCLENBQVA7QUFDSCxLQWJxQjtBQWV0QixvQkFmc0IsNEJBZUosT0FmSSxFQWVLLElBZkwsRUFlVyxPQWZYLEVBZW9CLElBZnBCLEVBZTBCO0FBQzVDO0FBQ0EsWUFBSSxPQUFPLEtBQUssZUFBTCxDQUFxQixPQUFyQixFQUE4QixJQUE5QixFQUFvQyxPQUFwQyxDQUFYO0FBQ0EsWUFBSSxRQUFRLElBQVIsSUFBZ0IsU0FBUyxFQUE3QixFQUFpQztBQUM3QixtQkFENkIsQ0FDckI7QUFDWDs7QUFFRDtBQUNBLFlBQUksZ0JBQWdCLHdCQUFhLE9BQWIsQ0FBcUIsT0FBckIsRUFBOEIsSUFBOUIsRUFBb0MsT0FBcEMsQ0FBcEI7QUFDQSxZQUFJLG9CQUFvQix3QkFBYSxHQUFiLENBQWlCLGFBQWpCLENBQXhCO0FBQ0EsWUFBSSxTQUFTLEtBQUssaUJBQUwsQ0FBdUIsRUFBdkIsRUFBMkIsT0FBM0IsRUFBb0MsSUFBcEMsRUFBMEMsT0FBMUMsRUFBbUQsSUFBbkQsRUFBeUQsSUFBekQsRUFBK0QsYUFBL0QsQ0FBYjs7QUFFQTtBQUNBLGFBQUssS0FBTCxDQUFXLEtBQUssR0FBaEIsSUFBdUIsS0FBSyxLQUFMLENBQVcsS0FBSyxHQUFoQixLQUF3QixFQUEvQztBQUNBLFlBQUksUUFBUSxLQUFLLEtBQUwsQ0FBVyxLQUFLLEdBQWhCLEVBQXFCLGlCQUFyQixJQUEwQyxLQUFLLEtBQUwsQ0FBVyxLQUFLLEdBQWhCLEVBQXFCLGlCQUFyQixLQUEyQyxFQUFqRzs7QUFFQTtBQUNBLFlBQUksQ0FBQyxNQUFNLElBQU4sQ0FBTCxFQUFrQjtBQUNkO0FBQ0Esa0JBQU0sSUFBTixJQUFjO0FBQ1YsNENBRFU7QUFFVixxQkFBSyxDQUZLLENBRUg7QUFGRyxhQUFkO0FBSUg7O0FBRUQsZUFBTztBQUNILHNCQURHLEVBQ0csVUFESCxFQUNTLG9DQURULEVBQzRCO0FBRDVCLFNBQVA7QUFHSCxLQTNDcUI7OztBQTZDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBbkRzQiwyQkFtREwsT0FuREssRUFtREksSUFuREosRUFtRFUsT0FuRFYsRUFtRG1CO0FBQ3JDLFlBQUksYUFBSjtBQUNBLFlBQUksU0FBUyxLQUFLLFdBQUwsSUFBb0IsTUFBakM7O0FBRUEsWUFBSSxNQUFNLE9BQU4sQ0FBYyxNQUFkLENBQUosRUFBMkI7QUFDdkIsaUJBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLE9BQU8sTUFBekIsRUFBaUMsR0FBakMsRUFBc0M7QUFDbEMsb0JBQUksT0FBTyxPQUFPLENBQVAsQ0FBUCxLQUFxQixRQUF6QixFQUFtQztBQUMvQiwyQkFBTyxRQUFRLFVBQVIsQ0FBbUIsT0FBTyxDQUFQLENBQW5CLENBQVA7QUFDSCxpQkFGRCxNQUVPLElBQUksT0FBTyxPQUFPLENBQVAsQ0FBUCxLQUFxQixVQUF6QixFQUFxQztBQUN4QywyQkFBTyxPQUFPLENBQVAsRUFBVSxPQUFWLENBQVA7QUFDSDs7QUFFRCxvQkFBSSxJQUFKLEVBQVU7QUFDTiwwQkFETSxDQUNDO0FBQ1Y7QUFDSjtBQUNKLFNBWkQsTUFhSyxJQUFJLE9BQU8sTUFBUCxLQUFrQixRQUF0QixFQUFnQztBQUNqQyxtQkFBTyxRQUFRLFVBQVIsQ0FBbUIsTUFBbkIsQ0FBUDtBQUNILFNBRkksTUFFRSxJQUFJLE9BQU8sTUFBUCxLQUFrQixVQUF0QixFQUFrQztBQUNyQyxtQkFBTyxPQUFPLE9BQVAsQ0FBUDtBQUNIO0FBQ0QsZUFBTyxJQUFQO0FBQ0gsS0ExRXFCO0FBNEV0QixxQkE1RXNCLDZCQTRFSCxJQTVFRyxFQTRFRyxlQTVFSCxFQTRFb0IsS0E1RXBCLEVBNEUyQjtBQUFBOztBQUM3QyxZQUFJLE9BQU8sSUFBUCxDQUFZLEtBQUssS0FBTCxDQUFXLEtBQUssR0FBaEIsS0FBc0IsRUFBbEMsRUFBc0MsTUFBdEMsS0FBaUQsQ0FBckQsRUFBd0Q7QUFDcEQsbUJBQU8sUUFBUSxPQUFSLENBQWdCLEVBQWhCLENBQVA7QUFDSDs7QUFFRDtBQUNBLGVBQU8sd0JBQWEsV0FBYixDQUF5QixLQUFLLGtCQUFMLEdBQXdCLGdCQUFqRCxFQUFtRSxLQUFLLEtBQUwsQ0FBVyxLQUFLLEdBQWhCLENBQW5FLEVBQXlGLElBQXpGLENBQThGLGlCQUFTOztBQUUxRyxnQkFBSSxLQUFLLFFBQVQsRUFBbUI7QUFDZixtQ0FBSSxPQUFKLGFBQXNCLE1BQUssSUFBM0IscURBQStFLEtBQUssR0FBcEY7QUFDQTtBQUNIOztBQUVELGtCQUFLLEtBQUwsQ0FBVyxLQUFLLEdBQWhCLElBQXVCLEtBQXZCO0FBQ0EsZ0JBQUksQ0FBQyxLQUFMLEVBQVk7QUFDUjtBQUNIOztBQUVELG1CQUFPLE1BQUssZUFBTCxDQUFxQixLQUFLLEdBQTFCLEVBQStCLEtBQS9CLENBQVA7QUFDSCxTQWJNLENBQVA7QUFjSCxLQWhHcUI7QUFrR3RCLDhCQWxHc0Isc0NBa0dNLElBbEdOLEVBa0dZLGVBbEdaLEVBa0c2QixNQWxHN0IsRUFrR3FDO0FBQUE7O0FBQ3ZELFlBQUksQ0FBQyxNQUFMLEVBQWE7QUFDVCxnQ0FBVSxPQUFWLENBQWtCLEVBQWxCLEVBQXNCLGVBQXRCLEVBQXVDLEtBQUssR0FBNUM7QUFDQSxtQkFBTyxRQUFRLE9BQVIsQ0FBZ0IsRUFBaEIsQ0FBUDtBQUNIOztBQUVELGVBQU8sb0JBQVUsT0FBVixDQUFrQixNQUFsQixFQUEwQixlQUExQixFQUEyQyxLQUFLLEdBQWhELEVBQXFELElBQXJELENBQTBELGtCQUFVO0FBQ3ZFLGdCQUFJLEtBQUssUUFBVCxFQUFtQjtBQUNmLG1DQUFJLE9BQUosa0RBQTJELEtBQUssR0FBaEU7QUFDQSx1QkFBTyxFQUFQO0FBQ0g7O0FBRUQsZ0JBQUksT0FBTyxNQUFQLEtBQWtCLENBQXRCLEVBQXlCO0FBQ3JCLHVCQUFPLEVBQVA7QUFDSDs7QUFFRCxnQkFBSSxRQUFRLE9BQUssS0FBTCxDQUFXLEtBQUssR0FBaEIsQ0FBWjtBQUNBLG1CQUFLLGNBQUwsQ0FBb0IsS0FBcEIsRUFBMkIsTUFBM0I7O0FBRUE7QUFDQSxtQkFBTyxPQUFQLENBQWUsYUFBSztBQUNoQixvQkFBSSxvQkFBb0IsRUFBRSxpQkFBMUI7QUFDQSxvQkFBSSxZQUFZLE1BQU0saUJBQU4sS0FBNEIsTUFBTSxpQkFBTixFQUF5QixFQUFFLElBQTNCLENBQTVDO0FBQ0Esb0JBQUksQ0FBQyxVQUFVLGFBQVYsQ0FBd0IsY0FBN0IsRUFBNEM7QUFDeEMsOEJBQVUsS0FBVixHQUFrQixVQUFVLEtBQVYsSUFBbUIsRUFBckM7QUFDQSw4QkFBVSxLQUFWLENBQWdCLEVBQUUsS0FBRixDQUFRLEtBQXhCLElBQWlDLEVBQWpDO0FBQ0g7QUFDSixhQVBEOztBQVNBO0FBQ0EsbUJBQU8sd0JBQWEsV0FBYixDQUF5QixPQUFLLGtCQUFMLEdBQXdCLGlCQUFqRCxFQUFvRSxLQUFLLEdBQXpFLEVBQThFLEtBQTlFLEVBQXFGLElBQXJGLENBQTBGLGdCQUF3QjtBQUFBLG9CQUFyQixLQUFxQixRQUFyQixLQUFxQjtBQUFBLG9CQUFkLE9BQWMsUUFBZCxPQUFjOztBQUNySCxvQkFBSSxLQUFLLFFBQVQsRUFBbUI7QUFDZix1Q0FBSSxPQUFKLGtEQUEyRCxLQUFLLEdBQWhFO0FBQ0EsMkJBQU8sRUFBUDtBQUNIOztBQUVELHVCQUFPLEVBQUUsY0FBRixFQUFVLFlBQVYsRUFBaUIsZ0JBQWpCLEVBQVA7QUFDSCxhQVBNLENBQVA7QUFRSCxTQWhDTSxDQUFQO0FBaUNILEtBeklxQjs7O0FBMkl0QjtBQUNBLGtCQTVJc0IsMEJBNElQLEtBNUlPLEVBNElBLE1BNUlBLEVBNElRO0FBQzFCO0FBQ0EsYUFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksT0FBTyxNQUF6QixFQUFpQyxHQUFqQyxFQUFzQztBQUNsQyxnQkFBSSxRQUFRLE9BQU8sQ0FBUCxDQUFaO0FBQ0Esa0JBQU0sTUFBTSxpQkFBWixFQUErQixNQUFNLElBQXJDLEVBQTJDLEdBQTNDO0FBQ0g7O0FBRUQ7QUFDQSxhQUFLLElBQUksS0FBVCxJQUFrQixLQUFsQixFQUF5QjtBQUNyQixpQkFBSyxJQUFJLElBQVQsSUFBaUIsTUFBTSxLQUFOLENBQWpCLEVBQStCO0FBQzNCO0FBQ0Esb0JBQUksTUFBTSxLQUFOLEVBQWEsSUFBYixFQUFtQixHQUFuQixHQUF5QixDQUE3QixFQUFnQztBQUM1QiwyQkFBTyxNQUFNLEtBQU4sRUFBYSxJQUFiLENBQVA7QUFDSDtBQUNKO0FBQ0o7O0FBRUQsYUFBSyxJQUFJLE1BQVQsSUFBa0IsS0FBbEIsRUFBeUI7QUFDckI7QUFDQSxnQkFBSSxPQUFPLElBQVAsQ0FBWSxNQUFNLE1BQU4sQ0FBWixFQUEwQixNQUExQixLQUFxQyxDQUF6QyxFQUE0QztBQUN4Qyx1QkFBTyxNQUFNLE1BQU4sQ0FBUDtBQUNIO0FBQ0o7QUFDSixLQW5LcUI7OztBQXFLdEI7QUFDQTtBQUNBO0FBQ0EsaUJBeEtzQix5QkF3S1AsS0F4S08sRUF3S0E7QUFDbEIsZUFBTyxLQUFLLE1BQUwsQ0FBWSxTQUFaLENBQXNCLEtBQXRCLENBQVA7QUFDSCxLQTFLcUI7OztBQTRLdEI7QUFDQSxrQkE3S3NCLDBCQTZLTixRQTdLTSxFQTZLSSxLQTdLSixFQTZLVztBQUM3QixZQUFJLFNBQVMsMkJBQWI7QUFDQSxlQUFPLGtCQUFQLENBQTBCLFFBQTFCOztBQUVBLFlBQUksZUFBZSxPQUFPLHVCQUFQLENBQStCLEtBQS9CLEVBQXNDLEtBQUssZ0JBQTNDLEVBQTZELFFBQTdELENBQW5CO0FBQ0EsMkJBQUksT0FBSiw2QkFBc0MsUUFBdEMsa0JBQTJELGFBQWEsQ0FBYixDQUEzRCxTQUE4RSxhQUFhLENBQWIsQ0FBOUU7O0FBRUE7QUFDQSxZQUFJLGFBQWEsQ0FBYixJQUFrQixLQUFLLGdCQUF2QixJQUEyQyxhQUFhLENBQWIsSUFBa0IsS0FBSyxnQkFBdEUsRUFBd0Y7QUFDcEY7QUFDQSxtQkFBTyxNQUFQLGtDQUFpQixZQUFqQjtBQUNBLG1CQUFPLFNBQVAsQ0FBaUIsS0FBakIsRUFBd0IsWUFBeEIsRUFBc0MsUUFBdEM7QUFDSCxTQUpELE1BS0s7QUFDRCwrQkFBSSxPQUFKLEVBQWEsMkJBQ2UsUUFEZixZQUM4QixhQUFhLENBQWIsQ0FEOUIsU0FDaUQsYUFBYSxDQUFiLENBRGpELDJDQUVxQixLQUFLLGdCQUYxQixTQUU4QyxLQUFLLGdCQUZuRCxTQUV5RSxJQUZ6RSxDQUU4RSxFQUY5RSxDQUFiO0FBR0g7O0FBRUQ7QUFDQSxZQUFJLElBQUksWUFBWSxRQUFaLEdBQXVCLEdBQXZCLEdBQThCLGlCQUF0QztBQUNBLDBCQUFRLE1BQVIsQ0FBZSxLQUFLLEVBQXBCLEVBQXdCLENBQXhCLEVBQTJCO0FBQ3ZCLHFCQUFTLE9BQU8sTUFETztBQUV2Qix1QkFBVyxRQUZZO0FBR3ZCLDRDQUFnQztBQUhULFNBQTNCO0FBS0EsMEJBQVEsTUFBUixDQUFlLENBQWY7O0FBRUEsZUFBTyxFQUFFLFlBQUYsRUFBUyxTQUFTLENBQWxCLEVBQVAsQ0E1QjZCLENBNEJDO0FBQ2pDLEtBMU1xQjtBQTRNdEIsa0JBNU1zQiwwQkE0TU4sSUE1TU0sRUE0TUE7QUFDbEI7QUFDQSxZQUFJLENBQUMsSUFBRCxJQUFTLENBQUMsS0FBSyxJQUFmLElBQXVCLFFBQU8sS0FBSyxJQUFaLE1BQXFCLFFBQWhELEVBQTBEO0FBQ3REO0FBQ0g7O0FBRUQ7QUFDQSxhQUFLLElBQUwsQ0FBVSxJQUFWLEdBQWlCLDBCQUFZLG1CQUFaLENBQWdDLEtBQUssSUFBTCxDQUFVLElBQTFDLENBQWpCO0FBQ0EsWUFBSSxLQUFLLElBQUwsQ0FBVSxNQUFkLEVBQXNCO0FBQ2xCLGlCQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLEtBQWpCLEdBQXlCLDBCQUFZLG1CQUFaLENBQWdDLEtBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsS0FBakQsQ0FBekI7QUFDSDs7QUFFRDtBQUNBLGFBQUssSUFBTCxDQUFVLE9BQVYsR0FBb0IsMEJBQVksbUJBQVosQ0FBZ0MsS0FBSyxJQUFMLENBQVUsSUFBVixJQUFrQix3QkFBYSxRQUFiLENBQXNCLElBQXhFLEVBQThFLHNCQUFXLGFBQXpGLENBQXBCO0FBQ0EsWUFBSSxLQUFLLElBQUwsQ0FBVSxNQUFWLElBQW9CLEtBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsS0FBakIsSUFBMEIsSUFBbEQsRUFBd0Q7QUFDcEQsaUJBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsS0FBakIsR0FBeUIsMEJBQVksbUJBQVosQ0FBZ0MsS0FBSyxJQUFMLENBQVUsTUFBVixDQUFpQixLQUFqRCxFQUF3RCxVQUF4RCxDQUF6QjtBQUNIOztBQUVEO0FBQ0EsYUFBSyxNQUFMLEdBQWMsMEJBQVksbUJBQVosQ0FBZ0MsS0FBSyxNQUFyQyxFQUE2QztBQUFBLG1CQUFNLE1BQU0sT0FBTixDQUFjLENBQWQsS0FBb0IsRUFBRSxHQUFGLENBQU0sVUFBTixDQUFyQixJQUEyQyxDQUFoRDtBQUFBLFNBQTdDLENBQWQ7O0FBRUE7QUFDQSxhQUFLLE1BQUwsR0FBYywwQkFBWSxtQkFBWixDQUFnQyxLQUFLLE1BQXJDLEVBQTZDO0FBQUEsbUJBQUssQ0FBQyxNQUFNLE9BQU4sQ0FBYyxDQUFkLElBQW1CLENBQW5CLEdBQXVCLENBQUMsQ0FBRCxFQUFJLENBQUosQ0FBeEIsRUFBZ0MsR0FBaEMsQ0FBb0MsVUFBcEMsS0FBbUQsQ0FBeEQ7QUFBQSxTQUE3QyxDQUFkOztBQUVBO0FBQ0EsYUFBSyxlQUFMLEdBQXVCLDBCQUFZLG1CQUFaLENBQWdDLEtBQUssZUFBTCxJQUF3QixjQUFJLFNBQTVELEVBQXVFLFVBQXZFLENBQXZCOztBQUVBLGVBQU8sSUFBUDtBQUNILEtBeE9xQjs7O0FBME90QjtBQUNBLHFCQTNPc0IsNkJBMk9ILE1BM09HLEVBMk9LLE9BM09MLEVBMk9jLElBM09kLEVBMk9vQixPQTNPcEIsRUEyTzZCLElBM083QixFQTJPbUMsSUEzT25DLEVBMk95QyxhQTNPekMsRUEyT3dEO0FBQzFFLFlBQUksU0FBUyxVQUFVLEVBQXZCOztBQUVBO0FBQ0EsaUJBQVMsS0FBSyxhQUFMLENBQW1CLE1BQW5CLEVBQTJCLE9BQTNCLEVBQW9DLElBQXBDLEVBQTBDLE9BQTFDLEVBQW1ELElBQW5ELENBQVQ7O0FBRUE7QUFDQSxlQUFPLGNBQVAsR0FBeUIsS0FBSyxjQUFMLElBQXVCLElBQXhCLEdBQWdDLEtBQUssY0FBckMsR0FBc0QsSUFBOUU7O0FBRUE7QUFDQSxlQUFPLGNBQVAsR0FBeUIsS0FBSyxjQUFMLElBQXVCLElBQXhCLEdBQWdDLEtBQUssY0FBckMsR0FBc0QsSUFBOUU7O0FBRUE7QUFDQSxZQUFJLE9BQU8sZUFBWCxFQUE0QjtBQUN4QixtQkFBTyxZQUFQLElBQXVCLE1BQU0sSUFBN0I7QUFDSDs7QUFFRDtBQUNBLGVBQU8sTUFBUCxHQUFnQixLQUFLLFNBQXJCOztBQUVBLGVBQU8sS0FBUCxHQUFlLEtBQUssS0FBcEI7O0FBRUE7QUFDQSxlQUFPLE1BQVAsR0FBaUIsY0FBYyxLQUFkLEtBQXdCLFFBQXpDOztBQUVBLGVBQU8sTUFBUDtBQUNIO0FBclFxQixDQUFuQjs7Ozs7Ozs7O0FDZlA7Ozs7QUFDQTs7OztBQUNBOzs7O0FBRUEsSUFBSSxZQUFKOztrQkFFZSxlQUFlOztBQUUxQjtBQUNBLE9BSDBCLGVBR3JCLFFBSHFCLEVBR1g7QUFDWCxlQUFPLENBQ0gsU0FBUyxLQUROLEVBRUgsU0FBUyxNQUZOLEVBR0gsU0FBUyxNQUhOLEVBSUgsU0FBUyxPQUpOLEVBS0gsU0FBUyxJQUxOLEVBTUgsU0FBUyxNQU5OLEVBT0gsU0FBUyxZQVBOLEVBUUgsU0FBUyxTQVJOLEVBU0gsU0FBUyxTQVROLEVBVUgsU0FBUyxTQVZOLEVBV0gsU0FBUyxXQVhOLEVBWUgsZ0JBQU0sa0JBWkgsRUFhTCxJQWJLLENBYUEsR0FiQSxDQUFQO0FBY0gsS0FsQnlCOzs7QUFvQjFCLGNBQVU7QUFDTixlQUFPLFFBREQ7QUFFTixnQkFBUSxJQUZGO0FBR04sY0FBTSxNQUhBO0FBSU4saUJBQVMsRUFKSDtBQUtOLGdCQUFRLFdBTEY7QUFNTixjQUFNLE9BTkE7QUFPTixtQkFBVyxFQVBMO0FBUU4sbUJBQVcsQ0FSTDtBQVNOLGVBQU8sUUFURDtBQVVOLGdCQUFRLElBVkY7QUFXTixzQkFBYztBQVhSLEtBcEJnQjs7QUFrQzFCLFdBbEMwQixtQkFrQ2pCLE9BbENpQixFQWtDUixJQWxDUSxFQWtDRixPQWxDRSxFQWtDTztBQUM3QixZQUFJLFFBQVEsRUFBWjs7QUFFQSxhQUFLLElBQUwsR0FBWSxLQUFLLElBQUwsSUFBYSxLQUFLLFFBQTlCOztBQUVBO0FBQ0EsY0FBTSxjQUFOLEdBQXVCLEtBQUssY0FBNUI7O0FBRUE7QUFDQSxjQUFNLElBQU4sR0FBYyxLQUFLLElBQUwsQ0FBVSxJQUFWLElBQWtCLGdCQUFNLFVBQU4sQ0FBaUIsMEJBQVksdUJBQVosQ0FBb0MsS0FBSyxJQUFMLENBQVUsSUFBOUMsRUFBb0QsT0FBcEQsQ0FBakIsQ0FBbkIsSUFBc0csS0FBSyxRQUFMLENBQWMsSUFBakk7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBTSxLQUFOLEdBQWMsS0FBSyxJQUFMLENBQVUsS0FBVixJQUFtQixLQUFLLFFBQUwsQ0FBYyxLQUEvQztBQUNBLGNBQU0sTUFBTixHQUFlLEtBQUssSUFBTCxDQUFVLE1BQVYsSUFBb0IsS0FBSyxRQUFMLENBQWMsTUFBakQ7QUFDQSxZQUFJLEtBQUssSUFBTCxDQUFVLE1BQWQsRUFBc0I7QUFDbEIsa0JBQU0sTUFBTixHQUFlLEtBQUssSUFBTCxDQUFVLE1BQXpCO0FBQ0EsZ0JBQUksTUFBTSxNQUFOLEtBQWlCLEtBQUssUUFBTCxDQUFjLE1BQW5DLEVBQTJDO0FBQ3ZDLHNCQUFNLE1BQU4sSUFBZ0IsT0FBTyxLQUFLLFFBQUwsQ0FBYyxNQUFyQztBQUNIO0FBQ0osU0FMRCxNQU1LO0FBQ0Qsa0JBQU0sTUFBTixHQUFlLEtBQUssUUFBTCxDQUFjLE1BQTdCO0FBQ0g7O0FBRUQsY0FBTSxTQUFOLEdBQWtCLEtBQUssSUFBTCxDQUFVLFNBQTVCOztBQUVBO0FBQ0EsY0FBTSxJQUFOLEdBQWEsS0FBSyxJQUFMLENBQVUsSUFBVixJQUFrQixLQUFLLFFBQUwsQ0FBYyxJQUE3Qzs7QUFFQTtBQUNBLGNBQU0sV0FBTixHQUFvQixLQUFLLGdCQUFMLEdBQXdCLEdBQXhCLEdBQThCLENBQWxELENBbkM2QixDQW1Dd0I7QUFDckQsY0FBTSxPQUFOLEdBQWdCLDBCQUFZLGtCQUFaLENBQStCLEtBQUssSUFBTCxDQUFVLE9BQXpDLEVBQWtELE9BQWxELElBQTZELE1BQU0sV0FBbkY7O0FBRUE7QUFDQSxZQUFJLEtBQUssSUFBTCxDQUFVLE1BQVYsSUFBb0IsS0FBSyxJQUFMLENBQVUsTUFBVixDQUFpQixLQUF6QyxFQUFnRDtBQUM1QyxrQkFBTSxNQUFOLEdBQWUsZ0JBQU0sVUFBTixDQUFpQiwwQkFBWSx1QkFBWixDQUFvQyxLQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLEtBQXJELEVBQTRELE9BQTVELEtBQXdFLEtBQUssUUFBTCxDQUFjLE1BQXZHLENBQWY7QUFDQSxrQkFBTSxZQUFOLEdBQXFCLDBCQUFZLGtCQUFaLENBQStCLEtBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsS0FBaEQsRUFBdUQsT0FBdkQsS0FBbUUsS0FBSyxRQUFMLENBQWMsWUFBdEc7QUFDSDs7QUFFRCxjQUFNLFFBQU4sR0FBaUIsS0FBSyxPQUFMLENBQWEsS0FBYixDQUFqQjs7QUFFQTtBQUNBO0FBQ0EsWUFBSSxZQUFZLEtBQUssU0FBckIsQ0FoRDZCLENBZ0RHOztBQUVoQyxZQUFJLGFBQWEsSUFBYixJQUFxQixjQUFJLFlBQUosQ0FBaUIsUUFBUSxRQUFSLENBQWlCLElBQWxDLE1BQTRDLE1BQXJFLEVBQTZFO0FBQ3pFO0FBQ0E7QUFDQSx3QkFBWSxJQUFaO0FBQ0g7O0FBRUQ7QUFDQSxZQUFJLGNBQWMsSUFBbEIsRUFBd0I7QUFDcEIsd0JBQVksS0FBSyxRQUFMLENBQWMsU0FBMUI7QUFDSDtBQUNELGNBQU0sU0FBTixHQUFrQixTQUFsQjs7QUFFQTtBQUNBLGNBQU0sU0FBTixHQUFrQixLQUFLLFNBQUwsSUFBa0IsS0FBSyxRQUFMLENBQWMsU0FBbEQ7O0FBRUEsZUFBTyxLQUFQO0FBQ0gsS0FwR3lCOzs7QUFzRzFCO0FBQ0EsV0F2RzBCLHlCQXVHbUI7QUFBQSxZQUFsQyxLQUFrQyxRQUFsQyxLQUFrQztBQUFBLFlBQTNCLE1BQTJCLFFBQTNCLE1BQTJCO0FBQUEsWUFBbkIsT0FBbUIsUUFBbkIsT0FBbUI7QUFBQSxZQUFWLE1BQVUsUUFBVixNQUFVOztBQUN6QyxlQUFPLENBQUMsS0FBRCxFQUFRLE1BQVIsRUFBZ0IsVUFBVSxJQUExQixFQUFnQyxNQUFoQyxFQUNGLE1BREUsQ0FDSztBQUFBLG1CQUFLLENBQUw7QUFBQSxTQURMLEVBQ2E7QUFEYixTQUVGLElBRkUsQ0FFRyxHQUZILENBQVA7QUFHSDtBQTNHeUIsQzs7Ozs7Ozs7Ozs7QUNOOUI7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBRUE7Ozs7Ozs7O0lBRXFCLEk7O0FBRWpCOzs7Ozs7O0FBT0Esd0JBQTBEO0FBQUEsWUFBNUMsTUFBNEMsUUFBNUMsTUFBNEM7QUFBQSxZQUFwQyxVQUFvQyxRQUFwQyxVQUFvQztBQUFBLFlBQXhCLE1BQXdCLFFBQXhCLE1BQXdCO0FBQUEsWUFBaEIsTUFBZ0IsUUFBaEIsTUFBZ0I7QUFBQSxZQUFSLElBQVEsUUFBUixJQUFROztBQUFBOztBQUN0RCxhQUFLLE1BQUwsR0FBYyxNQUFkO0FBQ0EsYUFBSyxJQUFMLEdBQVksSUFBWjtBQUNBLGFBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxhQUFLLFVBQUwsR0FBa0IsSUFBbEI7O0FBRUEsYUFBSyxPQUFMLEdBQWUsS0FBZjtBQUNBLGFBQUssU0FBTCxHQUFpQixJQUFqQjtBQUNBLGFBQUssV0FBTCxHQUFtQixDQUFuQjtBQUNBLGFBQUssVUFBTCxHQUFrQixJQUFsQjtBQUNBLGFBQUssT0FBTCxHQUFlLElBQWY7QUFDQSxhQUFLLE9BQUwsR0FBZSxLQUFmO0FBQ0EsYUFBSyxNQUFMLEdBQWMsS0FBZDtBQUNBLGFBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSxhQUFLLEtBQUwsR0FBYSxJQUFiO0FBQ0EsYUFBSyxLQUFMLEdBQWEsRUFBYjs7QUFFQSxhQUFLLE1BQUwsR0FBYyxLQUFLLHFCQUFMLENBQTJCLE1BQTNCLEVBQW1DLEtBQUssTUFBTCxDQUFZLFFBQS9DLENBQWQ7QUFDQSxhQUFLLFVBQUwsR0FBa0IsVUFBbEIsQ0FsQnNELENBa0J4QjtBQUM5QixhQUFLLFFBQUwsR0FBZ0IsS0FBSyxHQUFMLENBQVMsS0FBSyxVQUFMLEdBQWtCLEtBQUssTUFBTCxDQUFZLENBQXZDLEVBQTBDLENBQTFDLENBQWhCLENBbkJzRCxDQW1CUTtBQUM5RCxhQUFLLFNBQUwsR0FBaUIsS0FBSyxHQUFMLENBQVMsQ0FBVCxFQUFZLEtBQUssUUFBakIsQ0FBakI7QUFDQSxhQUFLLEdBQUwsR0FBVyxLQUFLLEdBQUwsQ0FBUyxLQUFLLE1BQWQsRUFBc0IsS0FBSyxNQUEzQixFQUFtQyxLQUFLLFVBQXhDLENBQVg7QUFDQSxhQUFLLEdBQUwsR0FBVyxjQUFJLGFBQUosQ0FBa0IsS0FBSyxNQUF2QixDQUFYO0FBQ0EsYUFBSyxHQUFMLEdBQVcsY0FBSSxhQUFKLENBQWtCLEVBQUMsR0FBRyxLQUFLLE1BQUwsQ0FBWSxDQUFaLEdBQWdCLENBQXBCLEVBQXVCLEdBQUcsS0FBSyxNQUFMLENBQVksQ0FBWixHQUFnQixDQUExQyxFQUE2QyxHQUFHLEtBQUssTUFBTCxDQUFZLENBQTVELEVBQWxCLENBQVgsRUFDQSxLQUFLLElBQUwsR0FBWSxFQUFFLEdBQUksS0FBSyxHQUFMLENBQVMsQ0FBVCxHQUFhLEtBQUssR0FBTCxDQUFTLENBQTVCLEVBQWdDLEdBQUksS0FBSyxHQUFMLENBQVMsQ0FBVCxHQUFhLEtBQUssR0FBTCxDQUFTLENBQTFELEVBRFo7QUFFQSxhQUFLLE1BQUwsR0FBYyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssR0FBTCxDQUFTLENBQWQsRUFBaUIsR0FBRyxLQUFLLEdBQUwsQ0FBUyxDQUE3QixFQUFOLEVBQXdDLElBQUksRUFBRSxHQUFHLEtBQUssR0FBTCxDQUFTLENBQWQsRUFBaUIsR0FBRyxLQUFLLEdBQUwsQ0FBUyxDQUE3QixFQUE1QyxFQUFkO0FBQ0EsYUFBSyxXQUFMLEdBQW1CLENBQW5COztBQUVBLGFBQUssZ0JBQUwsR0FBd0IsY0FBSSxjQUFKLENBQW1CLEtBQUssVUFBeEIsQ0FBeEI7QUFDQSxhQUFLLG1CQUFMLEdBQTJCLEtBQUssZ0JBQUwsR0FBd0IsS0FBSyxnQkFBeEQ7QUFDQSxhQUFLLGVBQUwsR0FBdUIsY0FBSSxlQUFKLEdBQXNCLEtBQUssU0FBbEQsQ0E5QnNELENBOEJPO0FBQzdELGFBQUssd0JBQUwsR0FBZ0MsY0FBSSxhQUFKLENBQWtCLEtBQUssTUFBTCxDQUFZLENBQTlCLElBQW1DLEtBQUssU0FBeEUsQ0EvQnNELENBK0I2Qjs7QUFFbkYsYUFBSyxNQUFMLEdBQWMsRUFBZCxDQWpDc0QsQ0FpQ3BDO0FBQ2xCLGFBQUssUUFBTCxHQUFnQixFQUFoQixDQWxDc0QsQ0FrQ2xDO0FBQ3BCLGFBQUssaUJBQUwsR0FBeUIsRUFBekIsQ0FuQ3NELENBbUN6QjtBQUM3QixhQUFLLGVBQUwsR0FBdUIsRUFBdkIsQ0FwQ3NELENBb0MzQjtBQUM5Qjs7Ozs7O0FBcUVEO3dDQUNpQjtBQUNiLGlCQUFLLElBQUksQ0FBVCxJQUFjLEtBQUssTUFBbkIsRUFBMkI7QUFDdkIscUJBQUssTUFBTCxDQUFZLENBQVosRUFBZSxPQUFmO0FBQ0g7QUFDRCxpQkFBSyxNQUFMLEdBQWMsRUFBZDs7QUFFQSxpQkFBSyxRQUFMLENBQWMsT0FBZCxDQUFzQjtBQUFBLHVCQUFLLGtCQUFRLE9BQVIsQ0FBZ0IsQ0FBaEIsQ0FBTDtBQUFBLGFBQXRCO0FBQ0EsaUJBQUssUUFBTCxHQUFnQixFQUFoQjs7QUFFQSxpQkFBSyxpQkFBTCxDQUF1QixPQUF2QixDQUErQjtBQUFBLHVCQUFLLGtCQUFRLE9BQVIsQ0FBZ0IsQ0FBaEIsQ0FBTDtBQUFBLGFBQS9CO0FBQ0EsaUJBQUssaUJBQUwsR0FBeUIsRUFBekI7QUFDSDs7O2tDQUVTO0FBQ04saUJBQUssYUFBTCxDQUFtQixpQkFBbkIsRUFBc0MsS0FBSyxHQUEzQztBQUNBLGlCQUFLLGFBQUw7QUFDQSxpQkFBSyxNQUFMLEdBQWMsSUFBZDtBQUNIOzs7eUNBRWdCO0FBQ2IsbUJBQU87QUFDSCxxQkFBSyxLQUFLLEdBRFA7QUFFSCx3QkFBUSxLQUFLLE1BQUwsQ0FBWSxJQUZqQjtBQUdILHdCQUFRLEtBQUssTUFIVjtBQUlILHFCQUFLLEtBQUssR0FKUDtBQUtILHFCQUFLLEtBQUssR0FMUDtBQU1ILGlDQUFpQixLQUFLLGVBTm5CO0FBT0gsa0NBQWtCLEtBQUssZ0JBUHBCO0FBUUgscUNBQXFCLEtBQUssbUJBUnZCO0FBU0gsMENBQTBCLEtBQUssd0JBVDVCO0FBVUgsNEJBQVksS0FBSyxVQVZkO0FBV0gsMEJBQVUsS0FBSyxRQVhaO0FBWUgsMkJBQVcsS0FBSyxTQVpiO0FBYUgsNEJBQVksS0FBSyxVQWJkO0FBY0gsdUJBQU8sS0FBSztBQWRULGFBQVA7QUFnQkg7Ozt3Q0FFMEI7QUFBQSw4Q0FBVCxPQUFTO0FBQVQsdUJBQVM7QUFBQTs7QUFDdkIsbUJBQU8sd0JBQWEsV0FBYixpQ0FBeUIsS0FBSyxNQUE5QixTQUF5QyxPQUF6QyxFQUFQO0FBQ0g7Ozs4QkFFSyxVLEVBQXFDO0FBQUEsNEZBQUosRUFBSTtBQUFBLHNDQUF2QixPQUF1QjtBQUFBLGdCQUF2QixPQUF1QixpQ0FBYixJQUFhOztBQUN2QyxpQkFBSyxVQUFMLEdBQWtCLFVBQWxCO0FBQ0EsaUJBQUssT0FBTCxHQUFlLE9BQWY7QUFDQSxnQkFBSSxDQUFDLEtBQUssTUFBVixFQUFrQjtBQUNkLHFCQUFLLE9BQUwsR0FBZSxJQUFmO0FBQ0EscUJBQUssS0FBTCxHQUFhLEtBQWI7QUFDSDtBQUNELG1CQUFPLEtBQUssYUFBTCxDQUFtQixnQkFBbkIsRUFBcUMsRUFBRSxNQUFNLEtBQUssY0FBTCxFQUFSLEVBQXJDLEVBQXNFLEtBQXRFLENBQTRFLGFBQUs7QUFBRSxzQkFBTSxDQUFOO0FBQVUsYUFBN0YsQ0FBUDtBQUNIOztBQUVEOzs7Ozs7Ozs7O0FBNk5BOzs7O29DQUlZLE0sRUFBUSxRLEVBQVU7QUFBQTs7QUFDMUIsZ0JBQUksS0FBSyxLQUFULEVBQWdCO0FBQ1o7QUFDSDs7QUFFRDtBQUNBLGlCQUFLLEtBQUwsQ0FBVyxVQUFYLEdBQXdCLENBQXhCO0FBQ0EsaUJBQUssS0FBTCxDQUFXLFdBQVgsR0FBeUIsQ0FBekI7O0FBRUE7QUFDQSxnQkFBSSxTQUFTLEVBQWI7QUFBQSxnQkFBaUIsV0FBVyxFQUE1QixDQVYwQixDQVVNO0FBQ2hDLGdCQUFJLFlBQVksS0FBSyxTQUFyQjtBQUNBLGdCQUFJLFNBQUosRUFBZTtBQUNYLHFCQUFLLElBQUksQ0FBVCxJQUFjLFNBQWQsRUFBeUI7QUFDckIsd0JBQUksVUFBVSxDQUFWLEVBQWEsV0FBakIsRUFBOEI7QUFDMUIsNkJBQUssS0FBTCxDQUFXLFdBQVgsSUFBMEIsVUFBVSxDQUFWLEVBQWEsV0FBYixDQUF5QixVQUFuRDtBQUNBLDRCQUFJLFVBQVUsQ0FBVixFQUFhLGVBQWpCLEVBQWtDO0FBQzlCLGlDQUFLLEtBQUwsQ0FBVyxXQUFYLElBQTBCLFVBQVUsQ0FBVixFQUFhLGVBQWIsQ0FBNkIsVUFBdkQ7QUFDSDtBQUNELDRCQUFJLENBQUMsT0FBTyxDQUFQLENBQUwsRUFBZ0I7QUFDWiwrQ0FBSSxNQUFKLDZDQUFvRCxDQUFwRCwrQkFBOEUsS0FBSyxHQUFuRjtBQUNBO0FBQ0g7QUFDRCwrQkFBTyxDQUFQLElBQVksT0FBTyxDQUFQLEVBQVUsUUFBVixDQUFtQixVQUFVLENBQVYsRUFBYSxXQUFoQyxFQUE2QyxVQUFVLENBQVYsRUFBYSxlQUExRCxFQUEyRSxVQUFVLENBQVYsQ0FBM0UsQ0FBWjtBQUNBLDZCQUFLLEtBQUwsQ0FBVyxVQUFYLElBQXlCLE9BQU8sQ0FBUCxFQUFVLGNBQW5DO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUFJLFVBQVUsQ0FBVixFQUFhLFFBQWpCLEVBQTJCO0FBQ3ZCLGlDQUFTLElBQVQsb0NBQWlCLFVBQVUsQ0FBVixFQUFhLFFBQTlCO0FBQ0g7QUFDSjtBQUNKO0FBQ0QsbUJBQU8sS0FBSyxTQUFaOztBQUVBO0FBQ0EsZ0JBQUksU0FBUyxLQUFiLEVBQW9CO0FBQ2hCLHFCQUFLLGVBQUwsR0FBdUIsRUFBdkIsQ0FEZ0IsQ0FDVztBQUMzQixxQkFBSyxpQkFBTCxnQ0FBNkIsS0FBSyxRQUFsQyxHQUZnQixDQUU2QjtBQUM3QyxxQkFBSyxRQUFMLEdBQWdCLEVBQWhCO0FBQ0g7O0FBRUQ7QUFDQSxpQkFBSyxJQUFJLENBQVQsSUFBYyxNQUFkLEVBQXNCO0FBQ2xCLG9CQUFJLEtBQUssTUFBTCxDQUFZLENBQVosQ0FBSixFQUFvQjtBQUNoQix5QkFBSyxNQUFMLENBQVksQ0FBWixFQUFlLE9BQWYsR0FEZ0IsQ0FDVTtBQUM3QjtBQUNELHFCQUFLLE1BQUwsQ0FBWSxDQUFaLElBQWlCLE9BQU8sQ0FBUCxDQUFqQixDQUprQixDQUlVO0FBQzVCLHFCQUFLLGVBQUwsQ0FBcUIsSUFBckIsQ0FBMEIsQ0FBMUI7QUFDSDs7QUFFRDtBQUNBLDhCQUFLLFFBQUwsRUFBYyxJQUFkLGtCQUFzQixRQUF0Qjs7QUFFQSxnQkFBSSxTQUFTLElBQWIsRUFBbUI7QUFDZjtBQUNBLHFCQUFLLElBQUksRUFBVCxJQUFjLEtBQUssTUFBbkIsRUFBMkI7QUFDdkIsd0JBQUksS0FBSyxlQUFMLENBQXFCLE9BQXJCLENBQTZCLEVBQTdCLE1BQW9DLENBQUMsQ0FBekMsRUFBNEM7QUFDeEMsNkJBQUssTUFBTCxDQUFZLEVBQVosRUFBZSxPQUFmO0FBQ0g7QUFDSjtBQUNELHFCQUFLLGVBQUwsR0FBdUIsRUFBdkI7O0FBRUE7QUFDQSxxQkFBSyxpQkFBTCxDQUF1QixPQUF2QixDQUErQjtBQUFBLDJCQUFLLGtCQUFRLE9BQVIsQ0FBZ0IsQ0FBaEIsQ0FBTDtBQUFBLGlCQUEvQjtBQUNBLHFCQUFLLGlCQUFMLEdBQXlCLEVBQXpCOztBQUVBLHFCQUFLLEtBQUwsQ0FBVyxVQUFYLEdBQXdCLENBQUMsS0FBSyxLQUFMLENBQVcsVUFBWCxHQUF3QixLQUFLLEtBQUwsQ0FBVyxRQUFwQyxFQUE4QyxPQUE5QyxDQUFzRCxDQUF0RCxDQUF4QjtBQUNBLHFCQUFLLFVBQUw7QUFDSDtBQUNKOztBQUVEOzs7Ozs7Ozs7O0FBdUJBO2lDQUNVO0FBQ04sZ0JBQUksU0FBUyxLQUFLLE1BQWxCO0FBQ0EsZ0JBQUksT0FBTyxDQUFQLEtBQWEsS0FBSyxJQUFMLENBQVUsTUFBVixDQUFpQixJQUFqQixDQUFzQixDQUF2QyxFQUEwQztBQUN0Qyx5QkFBUyxLQUFLLGdCQUFMLENBQXNCLE1BQXRCLEVBQThCLEtBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsSUFBakIsQ0FBc0IsQ0FBcEQsQ0FBVDtBQUNIO0FBQ0QsaUJBQUssV0FBTCxHQUFtQixLQUFLLEdBQUwsQ0FBUyxLQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLElBQWpCLENBQXNCLENBQXRCLEdBQTBCLE9BQU8sQ0FBMUMsSUFBK0MsS0FBSyxHQUFMLENBQVMsS0FBSyxJQUFMLENBQVUsTUFBVixDQUFpQixJQUFqQixDQUFzQixDQUF0QixHQUEwQixPQUFPLENBQTFDLENBQWxFO0FBQ0g7O0FBRUQ7Ozs7b0NBQ2EsSSxFQUFNO0FBQ2YsZ0JBQUksSUFBSixFQUFVO0FBQ04scUJBQUssT0FBTCxHQUFlLElBQWY7QUFDQSxxQkFBSyxTQUFMLEdBQWlCLEtBQUssU0FBTCxJQUFrQixFQUFuQztBQUNBLHFCQUFLLFNBQUwsQ0FBZSxJQUFmLENBQW9CLElBQXBCO0FBQ0EscUJBQUssV0FBTCxHQUFtQixDQUFuQixDQUpNLENBSWdCO0FBQ3RCLHFCQUFLLFVBQUwsR0FBbUIsS0FBSyxVQUFMLEdBQWtCLEtBQUssVUFBdkIsR0FBb0MsT0FBcEMsR0FBOEMsUUFBakU7QUFDQSxxQkFBSyxNQUFMO0FBQ0gsYUFQRCxNQVFLO0FBQ0QscUJBQUssU0FBTCxHQUFpQixJQUFqQjtBQUNBLHFCQUFLLFdBQUwsR0FBbUIsQ0FBbkI7QUFDSDtBQUNKOztBQUVEO0FBQ0E7QUFDQTs7Ozs0Q0FDcUIsSyxFQUFPO0FBQ3hCLG1CQUFPLENBQUMsS0FBSyxTQUFOLElBQW1CLEtBQUssU0FBTCxDQUFlLElBQWYsQ0FBb0I7QUFBQSx1QkFBSyxFQUFFLE1BQUYsQ0FBUyxLQUFULEtBQW1CLElBQXhCO0FBQUEsYUFBcEIsQ0FBMUI7QUFDSDs7QUFFRDs7Ozs0Q0FDa0MsTyxFQUFTO0FBQUEsZ0JBQTNCLEtBQTJCLFNBQTNCLEtBQTJCO0FBQUEsZ0JBQXBCLE9BQW9CLFNBQXBCLE9BQW9COztBQUN2QztBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsS0FBaEIsRUFBdUIsZUFBdkIsRUFBd0MsQ0FBQyxLQUFLLEdBQUwsQ0FBUyxDQUFWLEVBQWEsS0FBSyxHQUFMLENBQVMsQ0FBdEIsRUFBeUIsS0FBSyxVQUE5QixFQUEwQyxLQUFLLE1BQUwsQ0FBWSxDQUF0RCxDQUF4QztBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0Isb0JBQXRCLEVBQTRDLEtBQUssV0FBakQ7O0FBRUE7QUFDQSwyQkFBSyxRQUFMLENBQWMsS0FBZDtBQUNBLDJCQUFLLFNBQUwsQ0FBZSxLQUFmLEVBQXNCLEtBQXRCLEVBQTZCLGVBQUssVUFBTCxDQUFnQixLQUFLLEdBQUwsQ0FBUyxDQUF6QixFQUE0QixLQUFLLEdBQUwsQ0FBUyxDQUFyQyxFQUF3QyxDQUF4QyxDQUE3QjtBQUNBLDJCQUFLLEtBQUwsQ0FBVyxLQUFYLEVBQWtCLEtBQWxCLEVBQXlCLGVBQUssVUFBTCxDQUFnQixLQUFLLElBQUwsQ0FBVSxDQUFWLEdBQWMsY0FBSSxVQUFsQyxFQUE4QyxDQUFDLENBQUQsR0FBSyxLQUFLLElBQUwsQ0FBVSxDQUFmLEdBQW1CLGNBQUksVUFBckUsRUFBaUYsQ0FBakYsQ0FBekIsRUFSdUMsQ0FRd0U7QUFDL0csMkJBQUssSUFBTCxDQUFVLE9BQVYsRUFBbUIsS0FBbkI7QUFDQSxvQkFBUSxPQUFSLENBQWdCLFdBQWhCLEVBQTZCLFNBQTdCLEVBQXdDLE9BQXhDOztBQUVBO0FBQ0E7QUFDQSxvQkFBUSxPQUFSLENBQWdCLElBQWhCLEVBQXNCLGdCQUF0QixFQUF3QyxLQUFLLE9BQUwsSUFBZ0IsS0FBSyxVQUFMLEtBQW9CLE9BQTVFO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7Ozs7OEJBd0JNLEssRUFBTztBQUNULGlCQUFLLElBQUksR0FBVCxJQUFnQixLQUFoQixFQUF1QjtBQUNuQixvQkFBSSxRQUFRLEtBQVosRUFBbUI7QUFDZix5QkFBSyxHQUFMLElBQVksTUFBTSxHQUFOLENBQVo7QUFDSDtBQUNKO0FBQ0QsbUJBQU8sSUFBUDtBQUNIOzs7cUNBRWE7QUFDViwrQkFBSSxPQUFKLHVCQUFnQyxLQUFLLEdBQXJDLGFBQWdELEtBQUssU0FBTCxDQUFlLEtBQUssS0FBcEIsQ0FBaEQ7QUFDSDs7OytCQXBoQmEsSSxFQUFNO0FBQ2hCLG1CQUFPLElBQUksSUFBSixDQUFTLElBQVQsQ0FBUDtBQUNIOzs7OEJBRVksQyxFQUFHO0FBQ1osbUJBQU8sRUFBQyxHQUFHLEVBQUUsQ0FBTixFQUFTLEdBQUcsRUFBRSxDQUFkLEVBQWlCLEdBQUcsRUFBRSxDQUF0QixFQUF5QixLQUFLLEtBQUssUUFBTCxDQUFjLENBQWQsQ0FBOUIsRUFBUDtBQUNIOzs7d0NBRTBCO0FBQUEsZ0JBQVYsQ0FBVSxTQUFWLENBQVU7QUFBQSxnQkFBUCxDQUFPLFNBQVAsQ0FBTztBQUFBLGdCQUFKLENBQUksU0FBSixDQUFJOztBQUN2QixtQkFBTyxJQUFJLEdBQUosR0FBVSxDQUFWLEdBQWMsR0FBZCxHQUFvQixDQUEzQjtBQUNIOzs7NEJBRVcsTSxFQUFRLE0sRUFBUSxVLEVBQVk7QUFDcEMscUJBQVMsS0FBSyxxQkFBTCxDQUEyQixNQUEzQixFQUFtQyxPQUFPLFFBQTFDLENBQVQ7QUFDQSxnQkFBSSxPQUFPLENBQVAsR0FBVyxDQUFYLElBQWdCLE9BQU8sQ0FBUCxJQUFhLEtBQUssT0FBTyxDQUF6QyxJQUErQyxPQUFPLENBQVAsR0FBVyxDQUE5RCxFQUFpRTtBQUM3RCx1QkFENkQsQ0FDckQ7QUFDWDtBQUNELG1CQUFPLENBQUMsT0FBTyxJQUFSLEVBQWMsVUFBZCxFQUEwQixPQUFPLENBQWpDLEVBQW9DLE9BQU8sQ0FBM0MsRUFBOEMsT0FBTyxDQUFyRCxFQUF3RCxJQUF4RCxDQUE2RCxHQUE3RCxDQUFQO0FBQ0g7OztnREFFdUMsSSxFQUFNO0FBQUEsZ0JBQXJCLENBQXFCLFNBQXJCLENBQXFCO0FBQUEsZ0JBQWxCLENBQWtCLFNBQWxCLENBQWtCO0FBQUEsZ0JBQWYsQ0FBZSxTQUFmLENBQWU7QUFBQSxnQkFBWixHQUFZLFNBQVosR0FBWTs7QUFDMUMsZ0JBQUksTUFBTSxJQUFWLEVBQWdCO0FBQ1osb0JBQUksU0FBUyxLQUFLLEdBQUwsQ0FBUyxDQUFULEVBQVksSUFBSSxJQUFoQixDQUFiO0FBQ0Esb0JBQUksS0FBSyxLQUFMLENBQVcsSUFBSSxNQUFmLENBQUo7QUFDQSxvQkFBSSxLQUFLLEtBQUwsQ0FBVyxJQUFJLE1BQWYsQ0FBSjtBQUNBLG9CQUFJLElBQUo7QUFDSDtBQUNELG1CQUFPLEtBQUssS0FBTCxDQUFXLEVBQUMsSUFBRCxFQUFJLElBQUosRUFBTyxJQUFQLEVBQVgsQ0FBUDtBQUNIOzs7cURBRXVDLFEsRUFBVTtBQUFBLGdCQUFwQixDQUFvQixTQUFwQixDQUFvQjtBQUFBLGdCQUFqQixDQUFpQixTQUFqQixDQUFpQjtBQUFBLGdCQUFkLENBQWMsU0FBZCxDQUFjOztBQUM5QyxnQkFBSSxhQUFhLFNBQWIsSUFBMEIsSUFBSSxRQUFsQyxFQUE0QztBQUN4Qyx1QkFBTyxLQUFLLGdCQUFMLENBQXNCLEVBQUMsSUFBRCxFQUFJLElBQUosRUFBTyxJQUFQLEVBQXRCLEVBQWlDLFFBQWpDLENBQVA7QUFDSDtBQUNELG1CQUFPLEtBQUssS0FBTCxDQUFXLEVBQUMsSUFBRCxFQUFJLElBQUosRUFBTyxJQUFQLEVBQVgsQ0FBUDtBQUNIOzs7cURBRTRDO0FBQUEsZ0JBQWYsQ0FBZSxTQUFmLENBQWU7QUFBQSxnQkFBWixDQUFZLFNBQVosQ0FBWTtBQUFBLGdCQUFULENBQVMsU0FBVCxDQUFTO0FBQUEsZ0JBQU4sR0FBTSxTQUFOLEdBQU07O0FBQ3pDLGdCQUFJLENBQUMsS0FBSyxjQUFMLENBQW9CLEdBQXBCLENBQUwsRUFBK0I7QUFDM0I7QUFDQSxxQkFBSyxDQUFMO0FBQ0EscUJBQUssQ0FBTDtBQUNBLHFCQUFLLGNBQUwsQ0FBb0IsR0FBcEIsSUFBMkIsQ0FDdkIsS0FBSyxLQUFMLENBQVcsRUFBQyxJQUFELEVBQUksSUFBSixFQUFZLElBQVosRUFBWCxDQUR1QixFQUNLLEtBQUssS0FBTCxDQUFXLEVBQUMsR0FBRyxJQUFFLENBQU4sRUFBUyxJQUFULEVBQWlCLElBQWpCLEVBQVgsQ0FETCxFQUV2QixLQUFLLEtBQUwsQ0FBVyxFQUFDLElBQUQsRUFBSSxHQUFHLElBQUUsQ0FBVCxFQUFZLElBQVosRUFBWCxDQUZ1QixFQUVLLEtBQUssS0FBTCxDQUFXLEVBQUMsR0FBRyxJQUFFLENBQU4sRUFBUyxHQUFHLElBQUUsQ0FBZCxFQUFpQixJQUFqQixFQUFYLENBRkwsQ0FBM0I7QUFJSDtBQUNELG1CQUFPLEtBQUssY0FBTCxDQUFvQixHQUFwQixDQUFQO0FBQ0g7OztxQ0FFbUIsTSxFQUFRLFUsRUFBWTtBQUNwQyxnQkFBSSxXQUFXLENBQVgsR0FBZSxPQUFPLENBQTFCLEVBQTZCO0FBQUEsNENBQ1osS0FBSyxnQkFBTCxDQUFzQixVQUF0QixFQUFrQyxPQUFPLENBQXpDLENBRFk7QUFBQSxvQkFDcEIsQ0FEb0IseUJBQ3BCLENBRG9CO0FBQUEsb0JBQ2pCLENBRGlCLHlCQUNqQixDQURpQjs7QUFFekIsdUJBQVEsT0FBTyxDQUFQLEtBQWEsQ0FBYixJQUFrQixPQUFPLENBQVAsS0FBYSxDQUF2QztBQUNIO0FBQ0QsbUJBQU8sS0FBUDtBQUNIOztBQUVEOzs7OzZCQUNZLEssRUFBTztBQUNmLG1CQUFPLE1BQU0sSUFBTixDQUFXLFVBQUMsQ0FBRCxFQUFJLENBQUosRUFBVTtBQUN4QixvQkFBSSxLQUFLLEVBQUUsV0FBWDtBQUNBLG9CQUFJLEtBQUssRUFBRSxXQUFYO0FBQ0EsdUJBQVEsS0FBSyxFQUFMLEdBQVUsQ0FBQyxDQUFYLEdBQWdCLE9BQU8sRUFBUCxHQUFZLENBQVosR0FBZ0IsQ0FBeEM7QUFDSCxhQUpNLENBQVA7QUFLSDs7OytCQTREYSxJLEVBQU07QUFDaEIsZ0JBQUksSUFBSixFQUFVO0FBQ04scUJBQUssUUFBTCxHQUFnQixJQUFoQjtBQUNBLG9CQUFJLEtBQUssV0FBTCxJQUFvQixLQUFLLFdBQUwsQ0FBaUIsVUFBekMsRUFBcUQ7QUFDakQsb0NBQU0sYUFBTixDQUFvQixLQUFLLFdBQUwsQ0FBaUIsVUFBckMsRUFEaUQsQ0FDQztBQUNsRCx5QkFBSyxXQUFMLENBQWlCLFVBQWpCLEdBQThCLElBQTlCO0FBQ0g7QUFDRCxxQkFBSyxVQUFMLENBQWdCLElBQWhCO0FBQ0g7QUFDSjs7QUFFRDtBQUNBOzs7O3NDQUNzQixJLFNBQTRDO0FBQUEsZ0JBQXBDLFFBQW9DLFNBQXBDLFFBQW9DO0FBQUEsZ0JBQTFCLE1BQTBCLFNBQTFCLE1BQTBCO0FBQUEsZ0JBQWxCLE1BQWtCLFNBQWxCLE1BQWtCO0FBQUEsZ0JBQVYsTUFBVSxTQUFWLE1BQVU7O0FBQzlELGlCQUFLLEtBQUwsQ0FBVyxTQUFYLEdBQXVCLENBQUMsSUFBSSxJQUFKLEVBQXhCO0FBQ0EsaUJBQUssS0FBTCxDQUFXLFFBQVgsR0FBc0IsQ0FBdEI7O0FBRUEsZ0JBQUksT0FBTyxLQUFLLFdBQWhCOztBQUVBLGdDQUFVLFNBQVYsQ0FBb0IsS0FBSyxHQUF6Qjs7QUFFQTtBQUNBLGlCQUFLLElBQUksVUFBVCxJQUF1QixNQUF2QixFQUErQjtBQUMzQixvQkFBSSxRQUFRLE9BQU8sVUFBUCxDQUFaO0FBQ0E7QUFDQSxvQkFBSSxDQUFDLEtBQUQsSUFBVSxDQUFDLE1BQU0sTUFBTixDQUFhLElBQTVCLEVBQWtDO0FBQzlCLHVDQUFJLE1BQUosYUFBcUIsVUFBckI7QUFDQTtBQUNIOztBQUVEO0FBQ0Esb0JBQUksTUFBTSxNQUFOLENBQWEsSUFBYixDQUFrQixNQUFsQixLQUE2QixLQUFLLE1BQXRDLEVBQThDO0FBQzFDO0FBQ0g7O0FBRUQ7QUFDQSxvQkFBSSxnQkFBZ0IsS0FBSyxnQkFBTCxDQUFzQixJQUF0QixFQUE0QixNQUFNLE1BQU4sQ0FBYSxJQUF6QyxFQUErQyxVQUEvQyxDQUFwQjs7QUFFQTtBQUNBLHFCQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxjQUFjLE1BQWhDLEVBQXdDLEdBQXhDLEVBQTZDO0FBQ3pDLHdCQUFJLGVBQWUsY0FBYyxDQUFkLENBQW5CO0FBQ0Esd0JBQUksT0FBTyxhQUFhLElBQXhCO0FBQ0Esd0JBQUksQ0FBQyxJQUFMLEVBQVc7QUFDUDtBQUNIOztBQUVELHlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxRQUFMLENBQWMsTUFBbEMsRUFBMEMsR0FBMUMsRUFBK0M7QUFDM0MsNEJBQUksVUFBVSxLQUFLLFFBQUwsQ0FBYyxDQUFkLENBQWQ7QUFDQSw0QkFBSSxRQUFRLFFBQVIsSUFBb0IsSUFBeEIsRUFBOEI7QUFDMUIscUNBRDBCLENBQ2hCO0FBQ2I7O0FBRUQsNEJBQUksVUFBVSwwQkFBWSxzQkFBWixDQUFtQyxPQUFuQyxFQUE0QyxJQUE1QyxFQUFrRCxNQUFsRCxDQUFkO0FBQ0EsZ0NBQVEsT0FBUixHQUFrQixLQUFLLGVBQXZCO0FBQ0EsZ0NBQVEsTUFBUixHQUFpQixLQUFLLE1BQXRCLENBUjJDLENBUU47QUFDckMsZ0NBQVEsS0FBUixHQUFnQixhQUFhLEtBQTdCLENBVDJDLENBU047O0FBRXJDO0FBQ0EsNEJBQUksY0FBYyxNQUFNLGVBQU4sQ0FBc0IsT0FBdEIsRUFBK0IsSUFBL0IsQ0FBbEI7QUFDQSw0QkFBSSxDQUFDLFdBQUwsRUFBa0I7QUFDZDtBQUNIOztBQUVEO0FBQ0EsNkJBQUssSUFBSSxVQUFULElBQXVCLFdBQXZCLEVBQW9DO0FBQ2hDLGdDQUFJLFFBQVEsWUFBWSxVQUFaLENBQVo7QUFDQSxnQ0FBSSxDQUFDLE1BQU0sT0FBWCxFQUFvQjtBQUNoQjtBQUNIOztBQUVEO0FBQ0EsZ0NBQUksYUFBYSxNQUFNLEtBQU4sSUFBZSxVQUFoQztBQUNBLGdDQUFJLFFBQVEsT0FBTyxVQUFQLENBQVo7O0FBRUEsZ0NBQUksQ0FBQyxLQUFMLEVBQVk7QUFDUixtREFBSSxNQUFKLGVBQXNCLFVBQXRCLHVDQUFnRSxVQUFoRSxVQUFnRixLQUFoRixFQUF1RixPQUF2RjtBQUNBO0FBQ0g7O0FBRUQsb0NBQVEsTUFBUixHQUFpQixNQUFNLE1BQXZCLENBZmdDLENBZUE7O0FBRWhDLGtDQUFNLFVBQU4sQ0FBaUIsT0FBakIsRUFBMEIsS0FBMUIsRUFBaUMsT0FBakM7QUFDSDs7QUFFRCw2QkFBSyxLQUFMLENBQVcsUUFBWDtBQUNIO0FBQ0o7QUFDSjtBQUNELGlCQUFLLEtBQUwsQ0FBVyxTQUFYLEdBQXVCLENBQUMsSUFBSSxJQUFKLEVBQUQsR0FBYyxLQUFLLEtBQUwsQ0FBVyxTQUFoRDs7QUFFQTtBQUNBLGdCQUFJLGNBQWMsS0FBSyxhQUFMLENBQW1CLEtBQUssR0FBeEIsRUFBNkIsTUFBN0IsRUFBcUMsR0FBckMsQ0FBeUM7QUFBQSx1QkFBSyxPQUFPLENBQVAsQ0FBTDtBQUFBLGFBQXpDLENBQWxCO0FBQ0EsaUJBQUssZUFBTCxDQUFxQixJQUFyQixFQUEyQixXQUEzQixFQUF3QyxFQUFFLGtCQUFGLEVBQXhDLEVBQXNEO0FBQUEsdUJBQVMsTUFBTSxTQUFOLEdBQWtCLFdBQWxCLEdBQWdDLGVBQXpDO0FBQUEsYUFBdEQ7QUFDQTtBQUNBO0FBQ0g7OztzQ0FFcUIsUSxFQUFVLE0sRUFBUTtBQUNwQyxnQkFBSSxjQUFjLEVBQWxCO0FBQ0EsaUJBQUssSUFBSSxDQUFULElBQWMsTUFBZCxFQUFzQjtBQUNsQixvQkFBSSxPQUFPLENBQVAsRUFBVSxjQUFWLENBQXlCLFFBQXpCLENBQUosRUFBd0M7QUFDcEMsZ0NBQVksSUFBWixDQUFpQixDQUFqQjtBQUNIO0FBQ0o7QUFDRCxtQkFBTyxXQUFQO0FBQ0g7O0FBRUQ7QUFDQTs7Ozt3Q0FDdUIsSSxFQUFNLE0sU0FBc0IsUSxFQUFVO0FBQUEsZ0JBQXRCLFFBQXNCLFNBQXRCLFFBQXNCOztBQUN6RDtBQUNBLGdCQUFJLFNBQVMsRUFBYjtBQUNBLG1CQUFPLE9BQVAsQ0FBZSxhQUFLO0FBQ2hCLG9CQUFJLGFBQWEsU0FBUyxDQUFULENBQWpCO0FBQ0EsdUJBQU8sVUFBUCxJQUFxQixPQUFPLFVBQVAsS0FBc0IsRUFBM0M7QUFDQSx1QkFBTyxVQUFQLEVBQW1CLElBQW5CLENBQXdCLENBQXhCO0FBQ0gsYUFKRDs7QUFNQSxnQkFBSSxPQUFPLElBQVAsQ0FBWSxNQUFaLEVBQW9CLE1BQXBCLEdBQTZCLENBQWpDLEVBQW9DO0FBQUE7QUFDaEMsd0JBQUksV0FBVyxFQUFFLE9BQU8sSUFBVCxFQUFmO0FBQ0EseUJBQUssU0FBTCxHQUFpQixFQUFqQjs7QUFGZ0MsK0NBSXZCLFVBSnVCO0FBSzVCLDRCQUFJLFFBQVEsT0FBTyxVQUFQLENBQVo7O0FBRUEsZ0NBQVEsR0FBUixDQUFZLE1BQU0sR0FBTixDQUFVLGlCQUFTO0FBQzNCLG1DQUFPLE1BQU0sT0FBTixDQUFjLElBQWQsRUFBb0IsSUFBcEIsQ0FBeUIsc0JBQWM7QUFDMUMsb0NBQUksVUFBSixFQUFnQjtBQUNaLHlDQUFLLFNBQUwsQ0FBZSxNQUFNLElBQXJCLElBQTZCO0FBQ3pCLHFEQUFhLFdBQVcsV0FEQztBQUV6Qix5REFBaUIsV0FBVyxlQUZIO0FBR3pCLGtEQUFVLFdBQVcsUUFISTtBQUl6QixrREFBVSxXQUFXO0FBSkkscUNBQTdCO0FBTUg7QUFDSiw2QkFUTSxDQUFQO0FBVUgseUJBWFcsQ0FBWixFQVlDLElBWkQsQ0FZTSxZQUFNO0FBQ1IsK0NBQUksT0FBSiw4QkFBc0MsVUFBdEMsb0JBQThELEtBQUssR0FBbkU7O0FBRUE7QUFDQSxtQ0FBTyxVQUFQLElBQXFCLEVBQXJCO0FBQ0EsZ0NBQUksT0FBTyxJQUFQLENBQVksTUFBWixFQUFvQixLQUFwQixDQUEwQjtBQUFBLHVDQUFLLE9BQU8sQ0FBUCxFQUFVLE1BQVYsS0FBcUIsQ0FBMUI7QUFBQSw2QkFBMUIsQ0FBSixFQUE0RDtBQUN4RCx5Q0FBUyxJQUFULEdBQWdCLElBQWhCO0FBQ0g7O0FBRUQ7QUFDQSxvREFBYSxXQUFiLGtCQUNtQixRQURuQixnQ0FFSSx3QkFBYSxpQkFBYixDQUErQixFQUFFLE1BQU0sS0FBSyxLQUFMLENBQVcsSUFBWCxFQUFpQixDQUFDLFdBQUQsQ0FBakIsQ0FBUixFQUF5QyxrQkFBekMsRUFBL0IsQ0FGSjtBQUlBLHFDQUFTLEtBQVQsR0FBaUIsSUFBakI7QUFDQSxpQ0FBSyxTQUFMLEdBQWlCLEVBQWpCLENBZlEsQ0FlYTs7QUFFckIsZ0NBQUksU0FBUyxJQUFiLEVBQW1CO0FBQ2Ysb0RBQVUsU0FBVixDQUFvQixLQUFLLEdBQXpCLEVBRGUsQ0FDZ0I7QUFDbEM7QUFDSix5QkFoQ0Q7QUFQNEI7O0FBSWhDLHlCQUFLLElBQUksVUFBVCxJQUF1QixNQUF2QixFQUErQjtBQUFBLDhCQUF0QixVQUFzQjtBQW9DOUI7QUF4QytCO0FBeUNuQyxhQXpDRCxNQTBDSztBQUNEO0FBQ0Esd0NBQWEsV0FBYixrQkFDbUIsUUFEbkIsZ0NBRUksd0JBQWEsaUJBQWIsQ0FBK0IsRUFBRSxNQUFNLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBUixFQUEwQixVQUFVLEVBQUUsT0FBTyxJQUFULEVBQWUsTUFBTSxJQUFyQixFQUFwQyxFQUEvQixDQUZKO0FBSUEsb0NBQVUsU0FBVixDQUFvQixLQUFLLEdBQXpCLEVBTkMsQ0FNOEI7QUFDbEM7QUFDSjs7QUFFRDs7Ozs7Ozs7O3lDQU15QixXLEVBQWEsYSxFQUFxQztBQUFBLGdCQUF0QixhQUFzQix1RUFBTixJQUFNOztBQUN2RSxnQkFBSSxTQUFTLEVBQWI7O0FBRUEsZ0JBQUksaUJBQWlCLElBQXJCLEVBQTJCO0FBQ3ZCO0FBQ0Esb0JBQUksQ0FBQyxjQUFjLEtBQWYsSUFBd0IsWUFBWSxNQUFaLENBQW1CLFFBQS9DLEVBQXlEO0FBQ3JELDJCQUFPLElBQVAsQ0FBWTtBQUNSLDhCQUFNLFlBQVksTUFBWixDQUFtQjtBQURqQixxQkFBWjtBQUdIO0FBQ0Q7QUFMQSxxQkFNSyxJQUFJLENBQUMsY0FBYyxLQUFmLElBQXdCLGFBQTVCLEVBQTJDO0FBQzVDLCtCQUFPLElBQVAsQ0FBWTtBQUNSLG1DQUFPLGFBREM7QUFFUixrQ0FBTSxZQUFZLE1BQVosQ0FBbUIsYUFBbkI7QUFGRSx5QkFBWjtBQUlIO0FBQ0Q7QUFOSyx5QkFPQSxJQUFJLE9BQU8sY0FBYyxLQUFyQixLQUErQixRQUFuQyxFQUE2QztBQUM5QyxtQ0FBTyxJQUFQLENBQVk7QUFDUix1Q0FBTyxjQUFjLEtBRGI7QUFFUixzQ0FBTSxZQUFZLE1BQVosQ0FBbUIsY0FBYyxLQUFqQztBQUZFLDZCQUFaO0FBSUg7QUFDRDtBQU5LLDZCQU9BLElBQUksTUFBTSxPQUFOLENBQWMsY0FBYyxLQUE1QixDQUFKLEVBQXdDO0FBQ3pDLDhDQUFjLEtBQWQsQ0FBb0IsT0FBcEIsQ0FBNEIsaUJBQVM7QUFDakMsd0NBQUksWUFBWSxNQUFaLENBQW1CLEtBQW5CLEtBQTZCLFlBQVksTUFBWixDQUFtQixLQUFuQixFQUEwQixRQUEzRCxFQUFxRTtBQUNqRSwrQ0FBTyxJQUFQLENBQVk7QUFDUix3REFEUTtBQUVSLGtEQUFNLFlBQVksTUFBWixDQUFtQixLQUFuQjtBQUZFLHlDQUFaO0FBSUg7QUFDSixpQ0FQRDtBQVFIO0FBQ0o7O0FBRUQsbUJBQU8sTUFBUDtBQUNIOzs7bUNBdUZrQixJLEVBQU07QUFDckI7QUFDQSxnQkFBSSxLQUFLLFNBQVQsRUFBb0I7QUFDaEIscUJBQUssSUFBSSxDQUFULElBQWMsS0FBSyxTQUFuQixFQUE4QjtBQUMxQix3QkFBSSxXQUFXLEtBQUssU0FBTCxDQUFlLENBQWYsRUFBa0IsUUFBakM7QUFDQSx3QkFBSSxRQUFKLEVBQWM7QUFDVixpQ0FBUyxPQUFULENBQWlCLGFBQUs7QUFDbEIsZ0NBQUksVUFBVSxrQkFBUSxRQUFSLENBQWlCLENBQWpCLENBQWQ7QUFDQSxnQ0FBSSxPQUFKLEVBQWE7QUFDVCxtREFBSSxPQUFKLHlCQUFrQyxDQUFsQyxrQkFBZ0QsS0FBSyxHQUFyRDtBQUNBLHdDQUFRLE9BQVI7QUFDSDtBQUNKLHlCQU5EO0FBT0g7QUFDSjtBQUNKO0FBQ0o7Ozs4QkF3RGEsSSxFQUFNLEksRUFBTTtBQUN0QixnQkFBSSxPQUFPLENBQ1AsS0FETyxFQUVQLFNBRk8sRUFHUCxRQUhPLEVBSVAsWUFKTyxFQUtQLE9BTE8sRUFNUCxPQU5PLENBQVg7QUFRQSxnQkFBSSxNQUFNLE9BQU4sQ0FBYyxJQUFkLENBQUosRUFBeUI7QUFDckIscUJBQUssSUFBTCxnQ0FBYSxJQUFiO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBSSxjQUFjLEVBQWxCO0FBQ0EsaUJBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLEtBQUssTUFBdkIsRUFBK0IsR0FBL0IsRUFBb0M7QUFDaEMsb0JBQU0sTUFBTSxLQUFLLENBQUwsQ0FBWjtBQUNBLDRCQUFZLEdBQVosSUFBbUIsS0FBSyxHQUFMLENBQW5CO0FBQ0g7O0FBRUQsbUJBQU8sV0FBUDtBQUNIOzs7Ozs7a0JBdmpCZ0IsSTs7O0FBd2tCckIsS0FBSyxjQUFMLEdBQXNCLEVBQXRCLEMsQ0FBMEI7Ozs7Ozs7Ozs7O0FDbGxCMUI7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7O0lBRXFCLFc7QUFFakIsK0JBQTZCO0FBQUEsWUFBZixLQUFlLFFBQWYsS0FBZTtBQUFBLFlBQVIsSUFBUSxRQUFSLElBQVE7O0FBQUE7O0FBQ3pCLGFBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSxhQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsYUFBSyxLQUFMLEdBQWEsRUFBYjtBQUNBLGFBQUssT0FBTCxHQUFlLDRCQUFmO0FBQ0EsYUFBSyxjQUFMLEdBQXNCLEVBQXRCO0FBQ0EsYUFBSyxhQUFMLEdBQXFCLEVBQXJCO0FBQ0EsYUFBSyxjQUFMLEdBQXNCLElBQXRCO0FBQ0EsYUFBSyxnQkFBTCxHQUF3QixFQUF4QjtBQUNBLGFBQUssYUFBTCxHQUFxQixFQUFyQjs7QUFFQTtBQUNBLGFBQUssa0JBQUwsR0FBMEIsQ0FBQyxhQUFELEVBQWdCLEtBQUssS0FBTCxDQUFXLEVBQTNCLEVBQStCLElBQS9CLENBQW9DLEdBQXBDLENBQTFCO0FBQ0EsZ0NBQWEsU0FBYixDQUF1QixLQUFLLGtCQUE1QixFQUFnRCxJQUFoRDtBQUNIOzs7O2tDQUVTO0FBQ04saUJBQUssV0FBTCxDQUFpQjtBQUFBLHVCQUFRLEtBQUssT0FBTCxFQUFSO0FBQUEsYUFBakI7QUFDQSxpQkFBSyxLQUFMLEdBQWEsRUFBYjtBQUNBLGlCQUFLLE9BQUwsR0FBZSxJQUFmO0FBQ0EsaUJBQUssY0FBTCxHQUFzQixFQUF0QjtBQUNBLGlCQUFLLGFBQUwsR0FBcUIsRUFBckI7QUFDQSxpQkFBSyxLQUFMLEdBQWEsSUFBYjtBQUNBLGlCQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0g7OztpQ0FFUSxJLEVBQU07QUFDWCxpQkFBSyxLQUFMLENBQVcsS0FBSyxHQUFoQixJQUF1QixJQUF2QjtBQUNBLGlCQUFLLE9BQUwsQ0FBYSxPQUFiLENBQXFCLElBQXJCO0FBQ0g7OztnQ0FFTyxHLEVBQUs7QUFDVCxtQkFBTyxLQUFLLEtBQUwsQ0FBVyxHQUFYLE1BQW9CLFNBQTNCO0FBQ0g7OzttQ0FFVSxHLEVBQUs7QUFDWixnQkFBSSxLQUFLLE9BQUwsQ0FBYSxHQUFiLENBQUosRUFBdUI7QUFDbkIsb0JBQUksT0FBTyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQVg7QUFDQSxxQkFBSyxPQUFMLENBQWEsVUFBYixDQUF3QixJQUF4QjtBQUNIOztBQUVELG1CQUFPLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBUDtBQUNBLGlCQUFLLGFBQUwsQ0FBbUIsR0FBbkI7QUFDSDs7QUFFRDs7OzttQ0FDVyxHLEVBQUs7QUFDWiwrQkFBSSxPQUFKLHVCQUFnQyxHQUFoQzs7QUFFQSxnQkFBSSxPQUFPLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBWDs7QUFFQSxnQkFBSSxRQUFRLElBQVosRUFBa0I7QUFDZCxxQkFBSyxPQUFMO0FBQ0g7O0FBRUQsaUJBQUssVUFBTCxDQUFnQixLQUFLLEdBQXJCO0FBQ0EsaUJBQUssS0FBTCxDQUFXLGFBQVg7QUFDSDs7QUFFRDs7OztvQ0FDWSxJLEVBQU07QUFDZCxpQkFBSyxJQUFJLENBQVQsSUFBYyxLQUFLLEtBQW5CLEVBQTBCO0FBQ3RCLHFCQUFLLEtBQUssS0FBTCxDQUFXLENBQVgsQ0FBTDtBQUNIO0FBQ0o7O0FBRUQ7Ozs7b0NBQ1ksTSxFQUFRO0FBQ2hCLGdCQUFJLGVBQWUsRUFBbkI7QUFDQSxpQkFBSyxJQUFJLENBQVQsSUFBYyxLQUFLLEtBQW5CLEVBQTBCO0FBQ3RCLG9CQUFJLE9BQU8sS0FBSyxLQUFMLENBQVcsQ0FBWCxDQUFYO0FBQ0Esb0JBQUksT0FBTyxJQUFQLENBQUosRUFBa0I7QUFDZCxpQ0FBYSxJQUFiLENBQWtCLENBQWxCO0FBQ0g7QUFDSjtBQUNELGlCQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxhQUFhLE1BQS9CLEVBQXVDLEdBQXZDLEVBQTRDO0FBQ3hDLG9CQUFJLE1BQU0sYUFBYSxDQUFiLENBQVY7QUFDQSxxQkFBSyxVQUFMLENBQWdCLEdBQWhCO0FBQ0g7QUFDSjs7OzZDQUVvQjtBQUNqQjtBQUNBLGdCQUFJLGNBQWMsT0FBTyxJQUFQLENBQVksS0FBSyxjQUFqQixDQUFsQjtBQUNBLGlCQUFLLGNBQUwsR0FBc0IsRUFBdEI7QUFDQSxnQkFBSSxjQUFjLEtBQUssSUFBTCxDQUFVLDBCQUFWLEVBQWxCO0FBQ0EsaUJBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLFlBQVksTUFBOUIsRUFBc0MsR0FBdEMsRUFBMkM7QUFDdkMsb0JBQU0sU0FBUyxZQUFZLENBQVosQ0FBZjtBQUNBLHFCQUFLLGVBQUwsQ0FBcUIsTUFBckI7QUFDQSxxQkFBSyxjQUFMLENBQW9CLE9BQU8sR0FBM0IsSUFBa0MsTUFBbEM7QUFDSDs7QUFFRDtBQUNBO0FBQ0EsZ0JBQUksYUFBYSxPQUFPLElBQVAsQ0FBWSxLQUFLLGNBQWpCLENBQWpCO0FBQ0EsZ0JBQUksaUJBQWlCLEtBQXJCO0FBQ0EsZ0JBQUksWUFBWSxNQUFaLEtBQXVCLFdBQVcsTUFBdEMsRUFBOEM7QUFDMUMsaUNBQWlCLElBQWpCO0FBQ0gsYUFGRCxNQUdLO0FBQ0QsNEJBQVksSUFBWjtBQUNBLDJCQUFXLElBQVg7QUFDQSxvQkFBSSxDQUFDLFlBQVksS0FBWixDQUFrQixVQUFDLENBQUQsRUFBSSxDQUFKO0FBQUEsMkJBQVUsV0FBVyxDQUFYLE1BQWtCLENBQTVCO0FBQUEsaUJBQWxCLENBQUwsRUFBdUQ7QUFDbkQscUNBQWlCLElBQWpCO0FBQ0g7QUFDSjs7QUFFRCxpQkFBSyxnQkFBTDtBQUNIOzs7MkNBRW1CO0FBQUE7O0FBQ2hCLGlCQUFLLFdBQUwsQ0FBaUIsZ0JBQVE7QUFDckIsc0JBQUssZ0JBQUwsQ0FBc0IsSUFBdEI7QUFDQSxxQkFBSyxNQUFMO0FBQ0gsYUFIRDs7QUFLQSxpQkFBSyxxQkFBTDtBQUNBLGlCQUFLLGdCQUFMO0FBQ0EsaUJBQUssSUFBTCxDQUFVLGlCQUFWO0FBQ0EsaUJBQUsscUJBQUw7QUFDQSxpQkFBSyxrQkFBTDtBQUNIOzs7MkNBRW1CO0FBQUE7O0FBQ2hCLGdCQUFJLEtBQUssSUFBTCxDQUFVLGNBQVYsS0FBNkIsQ0FBakMsRUFBb0M7QUFDaEM7QUFDSDs7QUFFRDtBQUNBLGlCQUFLLFdBQUwsQ0FBaUI7QUFBQSx1QkFBUSxLQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBUjtBQUFBLGFBQWpCOztBQUVBLGdCQUFJLFFBQVEsS0FBWjtBQUNBLGlCQUFLLFdBQUwsQ0FBaUIsZ0JBQVE7QUFDckIsb0JBQUksT0FBSyxJQUFMLENBQVUsY0FBVixLQUE2QixDQUFqQyxFQUFvQztBQUNoQyx3QkFBSSxLQUFLLE9BQUwsSUFBZ0IsQ0FBQyxLQUFLLEtBQXRCLElBQStCLEtBQUssTUFBTCxDQUFZLENBQVosR0FBZ0IsQ0FBbkQsRUFBc0Q7QUFDbEQsNEJBQU0sU0FBUyxPQUFLLE9BQUwsQ0FBYSxXQUFiLENBQXlCLElBQXpCLENBQWY7QUFDQSw0QkFBSSxNQUFKLEVBQVk7QUFDUixtQ0FBTyxXQUFQLENBQW1CLElBQW5CO0FBQ0Esb0NBQVEsSUFBUjtBQUNIO0FBQ0o7QUFDSixpQkFSRCxNQVNLLElBQUksT0FBSyxJQUFMLENBQVUsY0FBVixLQUE2QixDQUFDLENBQWxDLEVBQXFDO0FBQ3RDLHdCQUFJLEtBQUssT0FBTCxJQUFnQixDQUFDLEtBQUssS0FBMUIsRUFBaUM7QUFDN0IsNEJBQU0sY0FBYyxPQUFLLE9BQUwsQ0FBYSxjQUFiLENBQTRCLElBQTVCLENBQXBCO0FBQ0EsNkJBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLFlBQVksTUFBOUIsRUFBc0MsR0FBdEMsRUFBMkM7QUFDdkMsd0NBQVksQ0FBWixFQUFlLFdBQWYsQ0FBMkIsSUFBM0I7QUFDQSxvQ0FBUSxJQUFSO0FBQ0g7QUFDSjtBQUNKO0FBQ0osYUFuQkQ7O0FBcUJBLGdCQUFJLENBQUMsS0FBTCxFQUFZO0FBQ1IscUJBQUssSUFBTCxDQUFVLGNBQVYsR0FBMkIsQ0FBM0I7QUFDSDtBQUNKOzs7eUNBRWdCLEksRUFBTTtBQUNuQixpQkFBSyxPQUFMLEdBQWUsS0FBZjtBQUNBLGdCQUFJLEtBQUssVUFBTCxLQUFvQixLQUFLLElBQUwsQ0FBVSxTQUFsQyxFQUE2QztBQUN6QyxvQkFBSSxLQUFLLGNBQUwsQ0FBb0IsS0FBSyxNQUFMLENBQVksR0FBaEMsQ0FBSixFQUEwQztBQUN0Qyx5QkFBSyxPQUFMLEdBQWUsSUFBZjtBQUNILGlCQUZELE1BR0s7QUFDRDtBQUNBLHlCQUFLLElBQUksR0FBVCxJQUFnQixLQUFLLGNBQXJCLEVBQXFDO0FBQ2pDLDRCQUFJLGVBQUssWUFBTCxDQUFrQixLQUFLLE1BQXZCLEVBQStCLEtBQUssY0FBTCxDQUFvQixHQUFwQixDQUEvQixDQUFKLEVBQThEO0FBQzFELGlDQUFLLE9BQUwsR0FBZSxJQUFmO0FBQ0E7QUFDSDtBQUNKO0FBQ0o7QUFDSjtBQUNKOztBQUVEOzs7OzhDQUN1QjtBQUNuQixpQkFBSyxXQUFMLENBQWlCO0FBQUEsdUJBQVEsQ0FBQyxLQUFLLE9BQWQ7QUFBQSxhQUFqQjtBQUNIOzs7NkNBRXFCO0FBQ2xCLG1CQUFPLEtBQUssZ0JBQVo7QUFDSDs7O2dEQUV1QjtBQUNwQixpQkFBSyxnQkFBTCxHQUF3QixFQUF4QjtBQUNBLGlCQUFLLElBQUksQ0FBVCxJQUFjLEtBQUssS0FBbkIsRUFBMEI7QUFDdEIsb0JBQUksT0FBTyxLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQVg7QUFDQSxvQkFBSSxLQUFLLE9BQUwsSUFBZ0IsS0FBSyxNQUF6QixFQUFpQztBQUM3Qix5QkFBSyxnQkFBTCxDQUFzQixJQUF0QixDQUEyQixJQUEzQjtBQUNIO0FBQ0o7QUFDRCxtQkFBTyxLQUFLLGdCQUFaO0FBQ0g7OzswQ0FFa0I7QUFDZixtQkFBTyxLQUFLLGFBQVo7QUFDSDs7OzZDQUVxQjtBQUNsQixnQkFBSSxRQUFRLEtBQUssZ0JBQWpCO0FBQ0EsZ0JBQUksU0FBUyxFQUFiO0FBQ0EsaUJBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLE1BQU0sTUFBeEIsRUFBZ0MsR0FBaEMsRUFBcUM7QUFDakMsb0JBQUksT0FBTyxNQUFNLENBQU4sQ0FBWDtBQUNBLHVCQUFPLElBQVAsQ0FBWSxLQUFLLE1BQWpCLEVBQXlCLE9BQXpCLENBQWlDO0FBQUEsMkJBQUssT0FBTyxDQUFQLElBQVksSUFBakI7QUFBQSxpQkFBakM7QUFDSDtBQUNELGlCQUFLLGFBQUwsR0FBcUIsT0FBTyxJQUFQLENBQVksTUFBWixDQUFyQjtBQUNBLG1CQUFPLEtBQUssYUFBWjtBQUNIOzs7Z0RBRXVCO0FBQUE7O0FBQ3BCLG1CQUFPLE9BQU8sSUFBUCxDQUFZLEtBQUssS0FBakIsRUFBd0IsSUFBeEIsQ0FBNkI7QUFBQSx1QkFBSyxPQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWMsT0FBZCxJQUF5QixDQUFDLE9BQUssS0FBTCxDQUFXLENBQVgsRUFBYyxLQUE3QztBQUFBLGFBQTdCLENBQVA7QUFDSDs7QUFFRDs7Ozt3Q0FDZ0IsTSxFQUFRO0FBQ3BCLGlCQUFLLGFBQUwsQ0FBbUIsS0FBSyxhQUFMLENBQW1CLE1BQXRDLElBQWdELE1BQWhEO0FBQ0g7O0FBRUQ7Ozs7Z0RBQ3dCO0FBQUE7O0FBQ3BCLGdCQUFJLEtBQUssYUFBTCxDQUFtQixNQUFuQixLQUE4QixDQUFsQyxFQUFxQztBQUNqQztBQUNIOztBQUVEO0FBQ0EsaUJBQUssYUFBTCxDQUFtQixJQUFuQixDQUF3QixVQUFDLENBQUQsRUFBSSxDQUFKLEVBQVU7QUFDOUIsb0JBQUksS0FBSyxLQUFLLEdBQUwsQ0FBUyxPQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLElBQWpCLENBQXNCLENBQXRCLEdBQTBCLEVBQUUsQ0FBckMsSUFBMEMsS0FBSyxHQUFMLENBQVMsT0FBSyxJQUFMLENBQVUsTUFBVixDQUFpQixJQUFqQixDQUFzQixDQUF0QixHQUEwQixFQUFFLENBQXJDLENBQW5EO0FBQ0Esb0JBQUksS0FBSyxLQUFLLEdBQUwsQ0FBUyxPQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLElBQWpCLENBQXNCLENBQXRCLEdBQTBCLEVBQUUsQ0FBckMsSUFBMEMsS0FBSyxHQUFMLENBQVMsT0FBSyxJQUFMLENBQVUsTUFBVixDQUFpQixJQUFqQixDQUFzQixDQUF0QixHQUEwQixFQUFFLENBQXJDLENBQW5EO0FBQ0EsdUJBQVEsS0FBSyxFQUFMLEdBQVUsQ0FBQyxDQUFYLEdBQWdCLE9BQU8sRUFBUCxHQUFZLENBQVosR0FBZ0IsQ0FBeEM7QUFDSCxhQUpEO0FBS0EsaUJBQUssYUFBTCxDQUFtQixPQUFuQixDQUEyQjtBQUFBLHVCQUFVLE9BQUssY0FBTCxDQUFvQixNQUFwQixDQUFWO0FBQUEsYUFBM0I7QUFDQSxpQkFBSyxhQUFMLEdBQXFCLEVBQXJCO0FBQ0g7O0FBRUQ7Ozs7dUNBQ2UsTSxFQUFRO0FBQ25CO0FBQ0EsZ0JBQUksT0FBTyxDQUFQLEtBQWEsS0FBSyxJQUFMLENBQVUsTUFBVixDQUFpQixJQUFqQixDQUFzQixDQUF2QyxFQUEwQztBQUN0QztBQUNIOztBQUVEO0FBQ0EsaUJBQUssSUFBSSxDQUFULElBQWMsS0FBSyxLQUFMLENBQVcsT0FBekIsRUFBa0M7QUFDOUIsb0JBQUksU0FBUyxLQUFLLEtBQUwsQ0FBVyxPQUFYLENBQW1CLENBQW5CLENBQWI7QUFDQTtBQUNBLG9CQUFJLENBQUMsT0FBTyxxQkFBUixJQUFpQyxDQUFDLE9BQU8sWUFBUCxDQUFvQixNQUFwQixFQUE0QixLQUFLLElBQUwsQ0FBVSxTQUF0QyxDQUF0QyxFQUF3RjtBQUNwRjtBQUNIOztBQUVELG9CQUFJLE1BQU0sZUFBSyxHQUFMLENBQVMsTUFBVCxFQUFpQixNQUFqQixFQUF5QixLQUFLLElBQUwsQ0FBVSxTQUFuQyxDQUFWO0FBQ0Esb0JBQUksT0FBTyxDQUFDLEtBQUssT0FBTCxDQUFhLEdBQWIsQ0FBWixFQUErQjtBQUMzQix3QkFBSSxPQUFPLGVBQUssTUFBTCxDQUFZO0FBQ25CLHNDQURtQjtBQUVuQixzQ0FGbUI7QUFHbkIsZ0NBQVEsS0FBSyxLQUFMLENBQVcsc0JBQVgsQ0FBa0MsTUFBbEMsQ0FIVztBQUluQixvQ0FBWSxLQUFLLElBQUwsQ0FBVSxTQUFWLENBQW9CLE9BQU8sQ0FBM0IsQ0FKTztBQUtuQiw4QkFBTSxLQUFLO0FBTFEscUJBQVosQ0FBWDs7QUFRQSx5QkFBSyxRQUFMLENBQWMsSUFBZDtBQUNBLHlCQUFLLFNBQUwsQ0FBZSxJQUFmO0FBQ0g7QUFDSjtBQUNKOztBQUVEOzs7O21DQUNXLEssRUFBTztBQUFBOztBQUNkLDJCQUFLLElBQUwsQ0FBVSxLQUFWLEVBQWlCLE9BQWpCLENBQXlCO0FBQUEsdUJBQVEsT0FBSyxTQUFMLENBQWUsSUFBZixDQUFSO0FBQUEsYUFBekI7QUFDQSxpQkFBSyxlQUFMO0FBQ0g7OztrQ0FFUyxJLEVBQU0sTyxFQUFTO0FBQ3JCLGlCQUFLLGNBQUwsQ0FBb0IsS0FBSyxHQUF6QjtBQUNBLGlCQUFLLGdCQUFMLENBQXNCLElBQXRCO0FBQ0EsaUJBQUssTUFBTDtBQUNBLGlCQUFLLEtBQUwsQ0FBVyxLQUFLLEtBQUwsQ0FBVyxVQUF0QixFQUFrQyxPQUFsQztBQUNIOztBQUVEOzs7O3dEQUM2QztBQUFBLGdCQUFsQixJQUFrQixTQUFsQixJQUFrQjtBQUFBLGdCQUFaLFFBQVksU0FBWixRQUFZOztBQUN6QztBQUNBLGdCQUFJLEtBQUssS0FBTCxDQUFXLEtBQUssR0FBaEIsS0FBd0IsSUFBNUIsRUFBa0M7QUFDOUIsbUNBQUksT0FBSixzQkFBK0IsS0FBSyxHQUFwQztBQUNBLCtCQUFLLFVBQUwsQ0FBZ0IsSUFBaEI7QUFDQSxxQkFBSyxnQkFBTDtBQUNIO0FBQ0Q7QUFMQSxpQkFNSyxJQUFJLEtBQUssVUFBTCxLQUFvQixLQUFLLEtBQUwsQ0FBVyxVQUFuQyxFQUErQztBQUNoRCx1Q0FBSSxPQUFKLEVBQWEsb0JBQWtCLEtBQUssR0FBdkIsMkZBQ1csS0FBSyxVQURoQixrQkFDdUMsS0FBSyxLQUFMLENBQVcsVUFEbEQsQ0FBYjtBQUVBLG1DQUFLLFVBQUwsQ0FBZ0IsSUFBaEI7QUFDQSx5QkFBSyxnQkFBTDtBQUNILGlCQUxJLE1BTUE7QUFDRDtBQUNBLHdCQUFJLEtBQUssS0FBTCxDQUFXLEtBQUssR0FBaEIsQ0FBSixFQUEwQjtBQUN0QiwrQkFBTyxLQUFLLEtBQUwsQ0FBVyxLQUFLLEdBQWhCLEVBQXFCLEtBQXJCLENBQTJCLElBQTNCLENBQVA7QUFDSDs7QUFFRCx3QkFBSSxTQUFTLElBQWIsRUFBbUI7QUFDZiw2QkFBSyxLQUFMLEdBQWEsSUFBYjtBQUNIOztBQUVELHlCQUFLLFdBQUwsQ0FBaUIsS0FBSyxLQUFMLENBQVcsTUFBNUIsRUFBb0MsUUFBcEM7QUFDQSx5QkFBSyxnQkFBTDtBQUNBLHlCQUFLLEtBQUwsQ0FBVyxhQUFYO0FBQ0g7O0FBRUQsZ0JBQUksU0FBUyxJQUFiLEVBQW1CO0FBQ2YscUJBQUssYUFBTCxDQUFtQixLQUFLLEdBQXhCO0FBQ0g7QUFDSjs7QUFFRDs7Ozt1Q0FDZSxJLEVBQU07QUFDakIsK0JBQUksT0FBSiwyQkFBb0MsS0FBSyxHQUF6QyxRQUFpRCxLQUFLLEtBQXREO0FBQ0EsaUJBQUssVUFBTCxDQUFnQixLQUFLLEdBQXJCO0FBQ0EsMkJBQUssVUFBTCxDQUFnQixJQUFoQjtBQUNIOztBQUVEOzs7O3VDQUNlLEcsRUFBSztBQUNoQixpQkFBSyxjQUFMLEdBQXNCLEtBQUssY0FBTCxJQUF1QixFQUE3QztBQUNBLGlCQUFLLGNBQUwsQ0FBb0IsR0FBcEIsSUFBMkIsSUFBM0I7QUFDQSwrQkFBSSxPQUFKLDBCQUFtQyxHQUFuQyxVQUEyQyxPQUFPLElBQVAsQ0FBWSxLQUFLLGNBQWpCLEVBQWlDLE1BQTVFO0FBQ0g7OztzQ0FFYSxHLEVBQUs7QUFDZjtBQUNBLGdCQUFJLEtBQUssY0FBVCxFQUF5QjtBQUNyQixtQ0FBSSxPQUFKLHlCQUFrQyxHQUFsQyxVQUEwQyxPQUFPLElBQVAsQ0FBWSxLQUFLLGNBQWpCLEVBQWlDLE1BQTNFO0FBQ0EsdUJBQU8sS0FBSyxjQUFMLENBQW9CLEdBQXBCLENBQVA7QUFDQSxxQkFBSyxlQUFMO0FBQ0g7QUFDSjs7QUFFRDs7OzswQ0FDa0I7QUFDZCxnQkFBSSxDQUFDLEtBQUssY0FBTixJQUF3QixPQUFPLElBQVAsQ0FBWSxLQUFLLGNBQWpCLEVBQWlDLE1BQWpDLEtBQTRDLENBQXhFLEVBQTJFO0FBQ3ZFLHFCQUFLLGNBQUwsR0FBc0IsSUFBdEI7QUFDQSxxQkFBSyxLQUFMLENBQVcsb0JBQVg7QUFDSDtBQUNKOztBQUVEOzs7O29DQUNZLEksRUFBTSxNLEVBQVE7QUFDdEIsZ0JBQUksTUFBTSxDQUFWO0FBQ0EsaUJBQUssSUFBSSxDQUFULElBQWMsS0FBSyxLQUFuQixFQUEwQjtBQUN0QixvQkFBSSxLQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWMsS0FBZCxDQUFvQixJQUFwQixLQUE2QixJQUE3QixLQUFzQyxPQUFPLE1BQVAsS0FBa0IsVUFBbEIsSUFBZ0MsT0FBTyxLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQVAsTUFBMEIsSUFBaEcsQ0FBSixFQUEyRztBQUN2RywyQkFBTyxLQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWMsS0FBZCxDQUFvQixJQUFwQixDQUFQO0FBQ0g7QUFDSjtBQUNELG1CQUFPLEdBQVA7QUFDSDs7QUFFRDs7Ozt3Q0FDZ0IsSSxFQUFNLE0sRUFBUTtBQUMxQixtQkFBTyxLQUFLLFdBQUwsQ0FBaUIsSUFBakIsRUFBdUIsTUFBdkIsSUFBaUMsT0FBTyxJQUFQLENBQVksS0FBSyxLQUFqQixFQUF3QixNQUFoRTtBQUNIOzs7Ozs7a0JBMVdnQixXOzs7Ozs7Ozs7OztBQ0xyQjs7OztBQUNBOzs7Ozs7Ozs7O0lBRXFCLFc7QUFFakIsMkJBQWM7QUFBQTs7QUFDVixhQUFLLE1BQUwsR0FBYyxFQUFkO0FBQ0EsYUFBSywwQkFBTCxHQUFrQyxDQUFsQyxDQUZVLENBRTJCO0FBQ3JDLGFBQUssd0JBQUwsR0FBZ0MsQ0FBaEM7QUFDSDs7OztvQ0FFVyxLLEVBQU8sTSxFQUFRO0FBQ3ZCLG1CQUNJLEtBQUssTUFBTCxDQUFZLE1BQU0sR0FBbEIsS0FDQSxLQUFLLE1BQUwsQ0FBWSxNQUFNLEdBQWxCLEVBQXVCLE9BRHZCLElBRUEsS0FBSyxNQUFMLENBQVksTUFBTSxHQUFsQixFQUF1QixPQUF2QixDQUErQixPQUFPLElBQXRDLENBSEo7QUFJSDs7O2dDQUVPLEksRUFBTTtBQUNWO0FBQ0EsZ0JBQUksTUFBTSxLQUFLLE1BQUwsQ0FBWSxHQUF0QjtBQUNBLGdCQUFJLFFBQVEsS0FBSyxNQUFMLENBQVksR0FBWixDQUFaO0FBQ0EsZ0JBQUksQ0FBQyxLQUFMLEVBQVk7QUFDUix3QkFBUSxLQUFLLE1BQUwsQ0FBWSxHQUFaLElBQW1CLEVBQUUsYUFBYSxDQUFmLEVBQTNCO0FBQ0g7O0FBRUQsZ0JBQUksQ0FBQyxNQUFNLE9BQVgsRUFBb0I7QUFDaEIsc0JBQU0sT0FBTixHQUFnQixFQUFoQjtBQUNIOztBQUVELGdCQUFJLENBQUMsTUFBTSxPQUFOLENBQWMsS0FBSyxNQUFMLENBQVksSUFBMUIsQ0FBTCxFQUFzQztBQUNsQyxzQkFBTSxPQUFOLENBQWMsS0FBSyxNQUFMLENBQVksSUFBMUIsSUFBa0MsRUFBbEM7QUFDSDtBQUNELGtCQUFNLE9BQU4sQ0FBYyxLQUFLLE1BQUwsQ0FBWSxJQUExQixFQUFnQyxLQUFLLFVBQXJDLElBQW1ELElBQW5EOztBQUVBO0FBQ0EsaUJBQUssSUFBSSxJQUFJLEtBQUssTUFBTCxDQUFZLENBQVosR0FBZ0IsQ0FBN0IsRUFBZ0MsS0FBSyxDQUFyQyxFQUF3QyxHQUF4QyxFQUE2QztBQUN6QyxvQkFBSSxLQUFLLGVBQUssZ0JBQUwsQ0FBc0IsS0FBSyxNQUEzQixFQUFtQyxDQUFuQyxDQUFUO0FBQ0Esb0JBQUksQ0FBQyxLQUFLLE1BQUwsQ0FBWSxHQUFHLEdBQWYsQ0FBTCxFQUEwQjtBQUN0Qix5QkFBSyxNQUFMLENBQVksR0FBRyxHQUFmLElBQXNCLEVBQUUsYUFBYSxDQUFmLEVBQXRCO0FBQ0g7QUFDRCxxQkFBSyxNQUFMLENBQVksR0FBRyxHQUFmLEVBQW9CLFdBQXBCO0FBQ0g7QUFDSjs7O21DQUVVLEksRUFBTTtBQUNiO0FBQ0EsZ0JBQUksZUFBZSxLQUFLLFdBQUwsQ0FBaUIsS0FBSyxNQUF0QixFQUE4QixLQUFLLE1BQW5DLENBQW5CO0FBQ0EsZ0JBQUksTUFBTSxLQUFLLE1BQUwsQ0FBWSxHQUF0Qjs7QUFFQSxnQkFBSSxZQUFKLEVBQWtCO0FBQ2QsdUJBQU8sYUFBYSxLQUFLLFVBQWxCLENBQVA7QUFDQSxvQkFBSSxPQUFPLElBQVAsQ0FBWSxZQUFaLEVBQTBCLE1BQTFCLEtBQXFDLENBQXpDLEVBQTRDO0FBQ3hDO0FBQ0EsMkJBQU8sS0FBSyxNQUFMLENBQVksR0FBWixFQUFpQixPQUFqQixDQUF5QixLQUFLLE1BQUwsQ0FBWSxJQUFyQyxDQUFQO0FBQ0Esd0JBQUksT0FBTyxJQUFQLENBQVksS0FBSyxNQUFMLENBQVksR0FBWixFQUFpQixPQUE3QixFQUFzQyxNQUF0QyxLQUFpRCxDQUFyRCxFQUF3RDtBQUNwRCwrQkFBTyxLQUFLLE1BQUwsQ0FBWSxHQUFaLEVBQWlCLE9BQXhCOztBQUVBLDRCQUFJLEtBQUssTUFBTCxDQUFZLEdBQVosRUFBaUIsV0FBakIsS0FBaUMsQ0FBckMsRUFBd0M7QUFDcEM7QUFDQSxtQ0FBTyxLQUFLLE1BQUwsQ0FBWSxHQUFaLENBQVA7QUFDSDtBQUNKO0FBQ0o7QUFDSjs7QUFFRDtBQUNBLGlCQUFLLElBQUksSUFBSSxLQUFLLE1BQUwsQ0FBWSxDQUFaLEdBQWdCLENBQTdCLEVBQWdDLEtBQUssQ0FBckMsRUFBd0MsR0FBeEMsRUFBNkM7QUFDekMsb0JBQUksT0FBTyxlQUFLLGdCQUFMLENBQXNCLEtBQUssTUFBM0IsRUFBbUMsQ0FBbkMsQ0FBWDtBQUNBLG9CQUFJLEtBQUssTUFBTCxDQUFZLEtBQUssR0FBakIsS0FBeUIsS0FBSyxNQUFMLENBQVksS0FBSyxHQUFqQixFQUFzQixXQUF0QixHQUFvQyxDQUFqRSxFQUFvRTtBQUNoRSx5QkFBSyxNQUFMLENBQVksS0FBSyxHQUFqQixFQUFzQixXQUF0QjtBQUNBLHdCQUFJLEtBQUssTUFBTCxDQUFZLEtBQUssR0FBakIsRUFBc0IsV0FBdEIsS0FBc0MsQ0FBdEMsSUFBMkMsQ0FBQyxLQUFLLE1BQUwsQ0FBWSxLQUFLLEdBQWpCLEVBQXNCLE9BQXRFLEVBQStFO0FBQzNFLCtCQUFPLEtBQUssTUFBTCxDQUFZLEtBQUssR0FBakIsQ0FBUDtBQUNIO0FBQ0o7QUFDSjtBQUNKOzs7MENBRXVEO0FBQUEsZ0JBQXpDLE1BQXlDLFFBQXpDLE1BQXlDO0FBQUEsZ0JBQWpDLFVBQWlDLFFBQWpDLFVBQWlDO0FBQUEsZ0JBQXJCLE1BQXFCLFFBQXJCLE1BQXFCO0FBQUEsZ0JBQVgsS0FBVyx1RUFBSCxDQUFHOztBQUNwRCxnQkFBSSxRQUFRLEtBQUssd0JBQWpCLEVBQTJDO0FBQ3ZDO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBSSxhQUFhLE9BQU8sUUFBeEIsRUFBa0M7QUFDOUIsb0JBQUksZUFBZSxLQUFLLFdBQUwsQ0FBaUIsTUFBakIsRUFBeUIsTUFBekIsQ0FBbkI7QUFDQSxvQkFBSSxZQUFKLEVBQWtCO0FBQ2QseUJBQUssSUFBSSxJQUFJLGFBQWEsQ0FBMUIsRUFBNkIsS0FBSyxPQUFPLFFBQXpDLEVBQW1ELEdBQW5ELEVBQXdEO0FBQ3BELDRCQUFJLGFBQWEsQ0FBYixLQUFtQixhQUFhLENBQWIsRUFBZ0IsTUFBdkMsRUFBK0M7QUFDM0MsbUNBQU8sYUFBYSxDQUFiLENBQVA7QUFDSDs7QUFFRCw0QkFBSSxFQUFFLEtBQUYsR0FBVSxLQUFLLHdCQUFuQixFQUE2QztBQUN6QztBQUNIO0FBQ0o7QUFDSjtBQUNELDZCQUFhLE9BQU8sUUFBcEI7QUFDSDs7QUFFRDtBQUNBO0FBQ0EsZ0JBQUksU0FBUyxlQUFLLGdCQUFMLENBQXNCLE1BQXRCLEVBQThCLE9BQU8sQ0FBUCxHQUFXLENBQXpDLENBQWI7QUFDQSxnQkFBSSxlQUFlLEtBQUssV0FBTCxDQUFpQixNQUFqQixFQUF5QixNQUF6QixDQUFuQjtBQUNBLGdCQUFJLGdCQUFnQixhQUFhLFVBQWIsQ0FBaEIsSUFBNEMsYUFBYSxVQUFiLEVBQXlCLE1BQXpFLEVBQWlGO0FBQzdFLHVCQUFPLGFBQWEsVUFBYixDQUFQO0FBQ0g7QUFDRDtBQUNBLGdCQUFJLE9BQU8sQ0FBUCxHQUFXLENBQWYsRUFBa0I7QUFDZCx1QkFBTyxLQUFLLFdBQUwsQ0FBaUIsRUFBRSxRQUFRLE1BQVYsRUFBa0Isc0JBQWxCLEVBQThCLGNBQTlCLEVBQWpCLEVBQXlELFFBQVEsQ0FBakUsQ0FBUDtBQUNIO0FBQ0o7Ozs4Q0FFMEQ7QUFBQSxnQkFBekMsTUFBeUMsU0FBekMsTUFBeUM7QUFBQSxnQkFBakMsVUFBaUMsU0FBakMsVUFBaUM7QUFBQSxnQkFBckIsTUFBcUIsU0FBckIsTUFBcUI7QUFBQSxnQkFBWCxLQUFXLHVFQUFILENBQUc7O0FBQ3ZELGdCQUFJLGNBQWMsRUFBbEI7O0FBRUE7QUFDQSxnQkFBSSxjQUFjLE9BQU8sUUFBekIsRUFBbUM7QUFDL0Isb0JBQUksZUFBZSxLQUFLLFdBQUwsQ0FBaUIsTUFBakIsRUFBeUIsTUFBekIsQ0FBbkI7QUFDQSxvQkFBSSxZQUFKLEVBQWtCO0FBQ2Qsd0JBQUksa0JBQWtCLEtBQUssR0FBTCxDQUFTLGNBQUkscUJBQWIsRUFBb0MsYUFBYSxLQUFLLDBCQUF0RCxDQUF0QjtBQUNBLHlCQUFLLElBQUksSUFBSSxhQUFhLENBQTFCLEVBQTZCLEtBQUssZUFBbEMsRUFBbUQsR0FBbkQsRUFBd0Q7QUFDcEQsNEJBQUksYUFBYSxDQUFiLEtBQW1CLGFBQWEsQ0FBYixFQUFnQixNQUF2QyxFQUErQztBQUMzQyx3Q0FBWSxJQUFaLENBQWlCLGFBQWEsQ0FBYixDQUFqQjtBQUNBLG1DQUFPLFdBQVA7QUFDSDtBQUNKO0FBQ0o7QUFDRCx1QkFBTyxXQUFQO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBSSxLQUFLLE1BQUwsQ0FBWSxPQUFPLEdBQW5CLEtBQTJCLEtBQUssTUFBTCxDQUFZLE9BQU8sR0FBbkIsRUFBd0IsV0FBeEIsR0FBc0MsQ0FBckUsRUFBd0U7QUFDcEU7QUFDQSxvQkFBTSxXQUFXLGVBQUsscUJBQUwsQ0FBMkIsTUFBM0IsQ0FBakI7QUFDQSxxQkFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksU0FBUyxNQUEzQixFQUFtQyxHQUFuQyxFQUF3QztBQUNwQyx3QkFBTSxRQUFRLFNBQVMsQ0FBVCxDQUFkO0FBQ0Esd0JBQUksY0FBYyxLQUFLLFdBQUwsQ0FBaUIsS0FBakIsRUFBd0IsTUFBeEIsQ0FBbEI7QUFDQSx3QkFBSSxlQUFlLFlBQVksVUFBWixDQUFmLElBQTBDLFlBQVksVUFBWixFQUF3QixNQUF0RSxFQUE4RTtBQUMxRSxvQ0FBWSxJQUFaLENBQWlCLFlBQVksVUFBWixDQUFqQjtBQUNIO0FBQ0Q7QUFIQSx5QkFJSyxJQUFJLFNBQVMsS0FBSywwQkFBZCxJQUE0QyxNQUFNLENBQU4sSUFBVyxPQUFPLFFBQWxFLEVBQTRFO0FBQzdFLHdDQUFZLElBQVosdUNBQW9CLEtBQUssY0FBTCxDQUFvQixFQUFFLFFBQVEsS0FBVixFQUFpQixjQUFqQixFQUF5QixzQkFBekIsRUFBcEIsRUFBMkQsUUFBUSxDQUFuRSxDQUFwQjtBQUNIO0FBQ0o7QUFDSjs7QUFFRCxtQkFBTyxXQUFQO0FBQ0g7Ozs7OztrQkFsSmdCLFc7Ozs7Ozs7O2tCQ0hOO0FBQ1g7QUFDQSxnQ0FBNEIsS0FGakI7QUFHWDtBQUNBLDhCQUEwQixLQUpmO0FBS1g7QUFDQSw0QkFBd0IsS0FOYjtBQU9YO0FBQ0EsbUNBQStCO0FBUnBCLEM7Ozs7Ozs7Ozs7Ozs7OztJQ0VGLG9CLFdBQUEsb0I7OztBQUNULGtDQUFZLFVBQVosRUFBd0I7QUFBQTs7QUFBQTs7QUFFcEIsY0FBSyxJQUFMLEdBQWUsc0JBQWY7QUFDQSxjQUFLLE9BQUwsR0FBZSxZQUFZLFVBQVosR0FBeUIsa0NBQXhDO0FBSG9CO0FBSXZCOzs7RUFMcUMsSzs7Ozs7Ozs7OztBQ21CMUM7Ozs7QUFDQTs7OztBQVVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUF0Q0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFNLE9BQU87QUFDVCxjQURTLHNCQUNHLENBREgsRUFDTSxDQUROLEVBQ1MsQ0FEVCxFQUNZO0FBQ2pCLFlBQUksTUFBTSxJQUFJLFlBQUosQ0FBaUIsQ0FBakIsQ0FBVjtBQUNBLFlBQUksQ0FBSixJQUFTLENBQVQ7QUFDQSxZQUFJLENBQUosSUFBUyxDQUFUO0FBQ0EsWUFBSSxDQUFKLElBQVMsQ0FBVDtBQUNBLGVBQU8sR0FBUDtBQUNIO0FBUFEsQ0FBYjs7QUFXQTs7QUFLQSxJQUFNLE9BQU87QUFDVCwyQ0FEUztBQUVUO0FBRlMsQ0FBYjs7QUFNQTs7QUFVQSxJQUFNLE9BQU87QUFDVCxnQ0FEUztBQUVULGtDQUZTO0FBR1QsMEJBSFM7QUFJVCxzQ0FKUztBQUtULDRCQUxTO0FBTVQsZ0NBTlM7QUFPVDtBQVBTLENBQWI7O1FBV1EsSSxHQUFBLEk7UUFBTSxJLEdBQUEsSTtRQUFNLEksR0FBQSxJOzs7Ozs7OztrQkM3QkksRzs7QUF0QnhCOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7QUFFQSxJQUFNLFNBQVM7QUFDWCxZQUFRLENBQUMsQ0FERTtBQUVYLFdBQU8sQ0FGSTtBQUdYLFVBQU0sQ0FISztBQUlYLFVBQU0sQ0FKSztBQUtYLFdBQU8sQ0FMSTtBQU1YLFdBQU87QUFOSSxDQUFmOztBQVNBLElBQU0sVUFBVSxFQUFoQjs7QUFFQSxTQUFTLGNBQVQsQ0FBeUIsS0FBekIsRUFBZ0M7QUFDNUIsUUFBSSxpQkFBTyxPQUFYLEVBQW9CO0FBQ2hCLGdCQUFRLEtBQVIsSUFBaUIsUUFBUSxLQUFSLEtBQWtCLENBQUMsUUFBUSxLQUFSLElBQWlCLFFBQVEsS0FBUixDQUFqQixHQUFrQyxRQUFRLEdBQTNDLEVBQWdELElBQWhELENBQXFELE9BQXJELENBQW5DO0FBQ0EsZUFBTyxRQUFRLEtBQVIsQ0FBUDtBQUNIO0FBQ0o7O0FBRWMsU0FBUyxHQUFULENBQWMsU0FBZCxFQUFpQztBQUM1QyxRQUFJLE9BQU8sU0FBUCxLQUFxQixPQUFPLElBQUksS0FBWCxDQUF6QixFQUE0QztBQUFBLDBDQURMLEdBQ0s7QUFETCxlQUNLO0FBQUE7O0FBQ3hDLFlBQUksaUJBQU8sU0FBWCxFQUFzQjtBQUNsQjtBQUNBLG9DQUFhLFdBQWIsaUNBQXlCLFdBQXpCLEVBQXNDLFNBQXRDLFNBQW9ELEdBQXBEO0FBQ0gsU0FIRCxNQUlLO0FBQ0QsZ0JBQUksU0FBUyxlQUFlLFNBQWYsQ0FBYjs7QUFFQTtBQUNBLGdCQUFJLElBQUksTUFBSixHQUFhLENBQWpCLEVBQW9CO0FBQ2hCLGlGQUE4QixTQUE5QixXQUE2QyxJQUFJLENBQUosQ0FBN0MsNEJBQTBELElBQUksS0FBSixDQUFVLENBQVYsQ0FBMUQ7QUFDSCxhQUZELE1BR0s7QUFDRCwrREFBOEIsU0FBOUIsV0FBNkMsSUFBSSxDQUFKLENBQTdDO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7O0FBRUQsSUFBSSxLQUFKLEdBQVksTUFBWjtBQUNBLElBQUksT0FBSixHQUFjLElBQWQ7O0FBRUEsSUFBSSxRQUFKLEdBQWUsVUFBVSxLQUFWLEVBQWlCO0FBQzVCLFFBQUksS0FBSixHQUFZLEtBQVo7O0FBRUEsUUFBSSxpQkFBTyxPQUFQLElBQWtCLE1BQU0sT0FBTixDQUFjLElBQUksT0FBbEIsQ0FBdEIsRUFBa0Q7QUFDOUMsZ0NBQWEsV0FBYixDQUF5QixJQUFJLE9BQTdCLEVBQXNDLG1CQUF0QyxFQUEyRCxLQUEzRDtBQUNIO0FBQ0osQ0FORDs7QUFRQSxJQUFJLGlCQUFPLE9BQVgsRUFBb0I7QUFDaEIsUUFBSSxVQUFKLEdBQWlCLFVBQVUsT0FBVixFQUFtQjtBQUNoQyxZQUFJLE9BQUosR0FBYyxPQUFkO0FBQ0gsS0FGRDtBQUtIOztBQUVELHdCQUFhLFNBQWIsQ0FBdUIsV0FBdkIsRUFBb0MsR0FBcEMsRSxDQUE0RDtBQUM1RCx3QkFBYSxTQUFiLENBQXVCLG1CQUF2QixFQUE0QyxJQUFJLFFBQWhELEUsQ0FBNEQ7Ozs7Ozs7OztxakJDOUQ1RDs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0lBRXFCLFk7QUFFakIsNEJBQWM7QUFBQTs7QUFDVixhQUFLLGdCQUFMLEdBQXdCLElBQXhCO0FBQ0EsYUFBSyxhQUFMLEdBQXFCLElBQXJCO0FBQ0g7Ozs7a0NBRVUsTSxFQUFRO0FBQ2YsaUJBQUssTUFBTCxHQUFjLE1BQWQ7QUFDSDs7QUFFRDs7OztxQ0FDYztBQUFBOztBQUNWLGdCQUFJLEtBQUssZ0JBQUwsSUFBeUIsSUFBN0IsRUFBbUM7QUFDL0IsdUJBQU8sS0FBSyxnQkFBTCxDQUFzQixPQUE3QixDQUQrQixDQUNPO0FBQ3pDOztBQUVEO0FBQ0EsaUJBQUssZ0JBQUwsR0FBd0IsRUFBeEI7QUFDQSxpQkFBSyxnQkFBTCxDQUFzQixPQUF0QixHQUFnQyxJQUFJLE9BQUosQ0FBWSxVQUFDLE9BQUQsRUFBVSxNQUFWLEVBQXFCO0FBQzdELHNCQUFLLGdCQUFMLENBQXNCLE9BQXRCLEdBQWdDLE9BQWhDO0FBQ0Esc0JBQUssZ0JBQUwsQ0FBc0IsTUFBdEIsR0FBK0IsTUFBL0I7QUFDSCxhQUgrQixDQUFoQztBQUlBLG1CQUFPLEtBQUssZ0JBQUwsQ0FBc0IsT0FBN0I7QUFDSDs7QUFFRDs7Ozs2Q0FDc0I7QUFDbEIsZ0JBQUksS0FBSyxnQkFBTCxJQUF5QixJQUE3QixFQUFtQztBQUMvQjtBQUNBO0FBQ0E7QUFDQSxvQkFBTSxNQUFNLEtBQUssTUFBTCxDQUFZLFNBQVosQ0FBc0IsV0FBdEIsQ0FBWjtBQUNBLG9CQUFNLE9BQU8sS0FBSyxJQUFJLEtBQUosQ0FBVSxFQUFWLENBQUwsQ0FBYjtBQUNBLG9CQUFNLFNBQVMsSUFBSSxVQUFKLENBQWUsS0FBSyxNQUFwQixDQUFmO0FBQ0EscUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFLLE1BQXpCLEVBQWlDLEVBQUUsQ0FBbkMsRUFBc0M7QUFDbEMsMkJBQU8sQ0FBUCxJQUFZLEtBQUssVUFBTCxDQUFnQixDQUFoQixDQUFaO0FBQ0g7QUFDRCxvQkFBTSxPQUFPLElBQUksSUFBSixDQUFTLENBQUMsTUFBRCxDQUFULEVBQW1CLEVBQUUsTUFBTSxXQUFSLEVBQW5CLENBQWI7O0FBRUE7QUFDQSxxQkFBSyxnQkFBTCxDQUFzQixPQUF0QixDQUE4QixFQUFFLFFBQUYsRUFBTyxVQUFQLEVBQWEsTUFBTSxLQUFuQixFQUE5QjtBQUNBLHFCQUFLLGdCQUFMLEdBQXdCLElBQXhCO0FBQ0g7QUFDSjs7QUFFRDs7Ozs0Q0FDcUI7QUFBQTs7QUFDakIsZ0JBQUksT0FBTyxPQUFPLGFBQWQsS0FBZ0MsVUFBaEMsSUFBOEMsQ0FBQyxLQUFLLE1BQXBELElBQThELE9BQU8sS0FBSyxNQUFMLENBQVksYUFBbkIsS0FBcUMsVUFBdkcsRUFBbUg7QUFDL0csbUNBQUksTUFBSixFQUFZLHlGQUFaO0FBQ0EsdUJBQU8sS0FBUDtBQUNILGFBSEQsTUFJSyxJQUFJLEtBQUssYUFBVCxFQUF3QjtBQUN6QixtQ0FBSSxNQUFKLEVBQVksd0VBQVo7QUFDQSx1QkFBTyxLQUFQO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBSTtBQUFBO0FBQ0Esd0JBQUksTUFBTSxPQUFLLGFBQUwsR0FBcUIsRUFBL0I7QUFDQSx3QkFBSSxNQUFKLEdBQWEsRUFBYjtBQUNBLHdCQUFJLE1BQUosR0FBYSxPQUFLLE1BQUwsQ0FBWSxhQUFaLEVBQWI7QUFDQSx3QkFBSSxPQUFKLEdBQWMsRUFBRSxVQUFVLFlBQVosRUFBZCxDQUpBLENBSTBDO0FBQzFDLHdCQUFJLGNBQUosR0FBcUIsSUFBSSxhQUFKLENBQWtCLElBQUksTUFBdEIsRUFBOEIsSUFBSSxPQUFsQyxDQUFyQjtBQUNBLHdCQUFJLGNBQUosQ0FBbUIsZUFBbkIsR0FBcUMsVUFBQyxLQUFELEVBQVc7QUFDNUMsNEJBQUksTUFBTSxJQUFOLENBQVcsSUFBWCxHQUFrQixDQUF0QixFQUF5QjtBQUN0QixnQ0FBSSxNQUFKLENBQVcsSUFBWCxDQUFnQixNQUFNLElBQXRCO0FBQ0Y7O0FBRUQ7QUFDQSw0QkFBSSxJQUFJLE9BQVIsRUFBaUI7QUFDYixnQ0FBSSxPQUFPLElBQUksSUFBSixDQUFTLElBQUksTUFBYixFQUFxQixFQUFFLE1BQU0sSUFBSSxPQUFKLENBQVksUUFBcEIsRUFBckIsQ0FBWDtBQUNBLGdDQUFJLE1BQU0sMkJBQWdCLElBQWhCLENBQVY7O0FBRUE7QUFDQSxnQ0FBSSxJQUFJLE1BQVIsRUFBZ0I7QUFDWixvQ0FBSSxTQUFTLElBQUksTUFBSixDQUFXLFNBQVgsTUFBMEIsRUFBdkM7QUFDQSx1Q0FBTyxPQUFQLENBQWUsaUJBQVM7QUFDcEIsMENBQU0sSUFBTjtBQUNBLHdDQUFJLE1BQUosQ0FBVyxXQUFYLENBQXVCLEtBQXZCO0FBQ0gsaUNBSEQ7QUFJSDtBQUNELGdDQUFJLE1BQUosR0FBYSxJQUFiO0FBQ0EsZ0NBQUksY0FBSixHQUFxQixJQUFyQjtBQUNBLG1DQUFLLGFBQUwsR0FBcUIsSUFBckI7O0FBRUEsZ0NBQUksT0FBSixDQUFZLEVBQUUsUUFBRixFQUFPLFVBQVAsRUFBYSxNQUFNLE1BQW5CLEVBQVo7QUFDSDtBQUNKLHFCQXhCRDtBQXlCQSx3QkFBSSxjQUFKLENBQW1CLEtBQW5CO0FBL0JBO0FBZ0NILGFBaENELENBaUNBLE9BQU8sQ0FBUCxFQUFVO0FBQ04scUJBQUssYUFBTCxHQUFxQixJQUFyQjtBQUNBLG1DQUFJLE9BQUosRUFBYSw0QkFBYixFQUEyQyxDQUEzQztBQUNBLHVCQUFPLEtBQVA7QUFDSDtBQUNELG1CQUFPLElBQVA7QUFDSDs7QUFFRDs7OzsyQ0FDb0I7QUFBQTs7QUFDaEIsZ0JBQUksQ0FBQyxLQUFLLGFBQVYsRUFBeUI7QUFDckIsbUNBQUksTUFBSixFQUFZLDBFQUFaO0FBQ0EsdUJBQU8sUUFBUSxPQUFSLENBQWdCLEVBQWhCLENBQVA7QUFDSDs7QUFFRDtBQUNBLGlCQUFLLGFBQUwsQ0FBbUIsT0FBbkIsR0FBNkIsSUFBSSxPQUFKLENBQVksVUFBQyxPQUFELEVBQVUsTUFBVixFQUFxQjtBQUMxRCx1QkFBSyxhQUFMLENBQW1CLE9BQW5CLEdBQTZCLE9BQTdCO0FBQ0EsdUJBQUssYUFBTCxDQUFtQixNQUFuQixHQUE0QixNQUE1QjtBQUNILGFBSDRCLENBQTdCOztBQUtBO0FBQ0EsaUJBQUssYUFBTCxDQUFtQixjQUFuQixDQUFrQyxJQUFsQzs7QUFFQSxtQkFBTyxLQUFLLGFBQUwsQ0FBbUIsT0FBMUI7QUFDSDs7Ozs7O2tCQXBIZ0IsWTs7Ozs7Ozs7Ozs7a0JDSEcsWTtBQUR4QjtBQUNlLFNBQVMsWUFBVCxDQUF1QixJQUF2QixFQUF5QztBQUFBLHNDQUFULE9BQVM7QUFBVCxlQUFTO0FBQUE7O0FBQ3BELFNBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLFFBQVEsTUFBMUIsRUFBa0MsR0FBbEMsRUFBdUM7QUFDbkMsWUFBSSxTQUFTLFFBQVEsQ0FBUixDQUFiO0FBQ0EsWUFBSSxDQUFDLE1BQUwsRUFBYTtBQUNUO0FBQ0g7QUFDRCxhQUFLLElBQUksR0FBVCxJQUFnQixNQUFoQixFQUF3QjtBQUNwQixnQkFBSSxRQUFRLE9BQU8sR0FBUCxDQUFaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQUksVUFBVSxJQUFWLElBQWtCLFFBQU8sS0FBUCx5Q0FBTyxLQUFQLE9BQWlCLFFBQW5DLElBQStDLENBQUMsTUFBTSxPQUFOLENBQWMsS0FBZCxDQUFwRCxFQUEwRTtBQUN0RSxvQkFBSSxLQUFLLEdBQUwsTUFBYyxJQUFkLElBQXNCLFFBQU8sS0FBSyxHQUFMLENBQVAsTUFBcUIsUUFBM0MsSUFBdUQsQ0FBQyxNQUFNLE9BQU4sQ0FBYyxLQUFLLEdBQUwsQ0FBZCxDQUE1RCxFQUFzRjtBQUNsRix5QkFBSyxHQUFMLElBQVksYUFBYSxLQUFLLEdBQUwsQ0FBYixFQUF3QixLQUF4QixDQUFaO0FBQ0gsaUJBRkQsTUFHSztBQUNELHlCQUFLLEdBQUwsSUFBWSxhQUFhLEVBQWIsRUFBaUIsS0FBakIsQ0FBWixDQURDLENBQ29DO0FBQ3hDO0FBQ0o7QUFDRDtBQUNBO0FBVEEsaUJBVUssSUFBSSxVQUFVLFNBQWQsRUFBeUI7QUFDMUIseUJBQUssR0FBTCxJQUFZLEtBQVo7QUFDSDtBQUNEO0FBQ0g7QUFFSjtBQUNELFdBQU8sSUFBUDtBQUNIOzs7Ozs7Ozs7OztBQzlCRDs7Ozs7Ozs7SUFFcUIsRztBQUVqQixpQkFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLENBQW5CLEVBQXNCLENBQXRCLEVBQXlCLENBQXpCLEVBQTRCO0FBQUE7O0FBQ3hCLGFBQUssU0FBTCxHQUFpQixDQUFDLENBQUQsRUFBSSxDQUFKLENBQWpCO0FBQ0EsYUFBSyxLQUFMLEdBQWEsQ0FBYjtBQUNBLGFBQUssUUFBTCxHQUFnQixDQUFDLENBQUQsRUFBSSxDQUFKLENBQWhCO0FBQ0EsYUFBSyxJQUFMLEdBQVksRUFBWjtBQUNBLGFBQUssSUFBTCxHQUFZLEVBQVo7O0FBRUEsYUFBSyxNQUFMO0FBQ0g7Ozs7NkJBRUssRSxFQUFJLEUsRUFBSTtBQUNiLGlCQUFLLFFBQUwsR0FBZ0IsQ0FBQyxFQUFELEVBQUssRUFBTCxDQUFoQjs7QUFFQSxpQkFBSyxNQUFMO0FBQ0E7OztvQ0FFWTtBQUNaLGdCQUFJLE1BQU0sR0FBVjtBQUNBLGdCQUFJLE9BQU8sQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXLENBQUMsR0FBWixFQUFpQixDQUFDLEdBQWxCLENBQVg7O0FBRUEsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxDQUFwQixFQUF1QixFQUFFLENBQXpCLEVBQTRCO0FBQ3JCLHFCQUFLLENBQUwsSUFBVSxLQUFLLEdBQUwsQ0FBUyxLQUFLLElBQUwsQ0FBVSxDQUFWLEVBQWEsQ0FBYixDQUFULEVBQTBCLEtBQUssQ0FBTCxDQUExQixDQUFWO0FBQ0EscUJBQUssQ0FBTCxJQUFVLEtBQUssR0FBTCxDQUFTLEtBQUssSUFBTCxDQUFVLENBQVYsRUFBYSxDQUFiLENBQVQsRUFBMEIsS0FBSyxDQUFMLENBQTFCLENBQVY7QUFDQSxxQkFBSyxDQUFMLElBQVUsS0FBSyxHQUFMLENBQVMsS0FBSyxJQUFMLENBQVUsQ0FBVixFQUFhLENBQWIsQ0FBVCxFQUEwQixLQUFLLENBQUwsQ0FBMUIsQ0FBVjtBQUNBLHFCQUFLLENBQUwsSUFBVSxLQUFLLEdBQUwsQ0FBUyxLQUFLLElBQUwsQ0FBVSxDQUFWLEVBQWEsQ0FBYixDQUFULEVBQTBCLEtBQUssQ0FBTCxDQUExQixDQUFWO0FBQ047O0FBRUQsbUJBQU8sSUFBUDtBQUNBOzs7bUNBRVc7QUFDWCxpQkFBSyxJQUFMLENBQVUsQ0FBVixJQUFlLGlCQUFPLFNBQVAsQ0FBaUIsaUJBQU8sR0FBUCxDQUFXLEtBQUssSUFBTCxDQUFVLENBQVYsQ0FBWCxFQUF5QixLQUFLLElBQUwsQ0FBVSxDQUFWLENBQXpCLENBQWpCLENBQWY7QUFDQSxpQkFBSyxJQUFMLENBQVUsQ0FBVixJQUFlLGlCQUFPLFNBQVAsQ0FBaUIsaUJBQU8sR0FBUCxDQUFXLEtBQUssSUFBTCxDQUFVLENBQVYsQ0FBWCxFQUF5QixLQUFLLElBQUwsQ0FBVSxDQUFWLENBQXpCLENBQWpCLENBQWY7QUFDQTs7O2lDQUVTO0FBQ1QsZ0JBQUksSUFBSSxDQUFFLEtBQUssR0FBTCxDQUFTLEtBQUssS0FBZCxDQUFGLEVBQXdCLEtBQUssR0FBTCxDQUFTLEtBQUssS0FBZCxDQUF4QixDQUFSO0FBQ0EsZ0JBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFMLENBQVMsS0FBSyxLQUFkLENBQUYsRUFBd0IsS0FBSyxHQUFMLENBQVMsS0FBSyxLQUFkLENBQXhCLENBQVI7O0FBRUEsZ0JBQUksaUJBQU8sSUFBUCxDQUFZLENBQVosRUFBZSxLQUFLLFNBQUwsQ0FBZSxDQUFmLElBQW9CLEdBQW5DLENBQUo7QUFDQSxnQkFBSSxpQkFBTyxJQUFQLENBQVksQ0FBWixFQUFlLEtBQUssU0FBTCxDQUFlLENBQWYsSUFBb0IsR0FBbkMsQ0FBSjs7QUFFQSxpQkFBSyxJQUFMLENBQVUsQ0FBVixJQUFlLGlCQUFPLEdBQVAsQ0FBVyxpQkFBTyxHQUFQLENBQVcsS0FBSyxRQUFoQixFQUEwQixDQUExQixDQUFYLEVBQXlDLENBQXpDLENBQWYsQ0FQUyxDQU9tRDtBQUM1RCxpQkFBSyxJQUFMLENBQVUsQ0FBVixJQUFlLGlCQUFPLEdBQVAsQ0FBVyxpQkFBTyxHQUFQLENBQVcsS0FBSyxRQUFoQixFQUEwQixDQUExQixDQUFYLEVBQXlDLENBQXpDLENBQWYsQ0FSUyxDQVFtRDtBQUM1RCxpQkFBSyxJQUFMLENBQVUsQ0FBVixJQUFlLGlCQUFPLEdBQVAsQ0FBVyxpQkFBTyxHQUFQLENBQVcsS0FBSyxRQUFoQixFQUEwQixDQUExQixDQUFYLEVBQXlDLENBQXpDLENBQWYsQ0FUUyxDQVNtRDtBQUM1RCxpQkFBSyxJQUFMLENBQVUsQ0FBVixJQUFlLGlCQUFPLEdBQVAsQ0FBVyxpQkFBTyxHQUFQLENBQVcsS0FBSyxRQUFoQixFQUEwQixDQUExQixDQUFYLEVBQXlDLENBQXpDLENBQWYsQ0FWUyxDQVVtRDs7QUFFNUQsaUJBQUssUUFBTDtBQUNBOzs7c0NBRXFCLEcsRUFBSyxJLEVBQU07QUFDaEMsZ0JBQUksTUFBTSxHQUFWO0FBQ0EsZ0JBQUksTUFBTSxHQUFWO0FBQ0EsZ0JBQUksTUFBTSxDQUFDLEdBQVg7O0FBRUEsZ0JBQUksT0FBTyxJQUFJLElBQWY7O0FBRUE7QUFDQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLENBQXBCLEVBQXVCLEVBQUUsQ0FBekIsRUFBNEI7QUFDckIsb0JBQUksSUFBSyxpQkFBTyxHQUFQLENBQVcsS0FBSyxDQUFMLENBQVgsRUFBb0IsSUFBcEIsQ0FBVDtBQUNBLHNCQUFNLEtBQUssR0FBTCxDQUFTLEdBQVQsRUFBYyxDQUFkLENBQU47QUFDQSxzQkFBTSxLQUFLLEdBQUwsQ0FBUyxHQUFULEVBQWMsQ0FBZCxDQUFOO0FBQ047O0FBRUQsbUJBQU8sQ0FBQyxHQUFELEVBQU0sR0FBTixDQUFQO0FBQ0E7OztvQ0FFbUIsSyxFQUFPLEssRUFBTyxJLEVBQU07QUFDdkMsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxDQUFwQixFQUF1QixFQUFFLENBQXpCLEVBQTRCO0FBQzNCLG9CQUFJLFNBQVMsSUFBSSxhQUFKLENBQWtCLEtBQWxCLEVBQXlCLEtBQUssQ0FBTCxDQUF6QixDQUFiO0FBQ0Esb0JBQUksU0FBUyxJQUFJLGFBQUosQ0FBa0IsS0FBbEIsRUFBeUIsS0FBSyxDQUFMLENBQXpCLENBQWI7O0FBRUEsb0JBQUksT0FBTyxDQUFQLElBQVksT0FBTyxDQUFQLENBQVosSUFBeUIsT0FBTyxDQUFQLElBQVksT0FBTyxDQUFQLENBQXpDLEVBQW9EO0FBQ25ELDJCQUFPLEtBQVA7QUFDQTtBQUNEO0FBQ0QsbUJBQU8sSUFBUDtBQUNBOzs7a0NBRWdCLEssRUFBTyxLLEVBQU87QUFDOUIsbUJBQU8sSUFBSSxXQUFKLENBQWdCLEtBQWhCLEVBQXVCLEtBQXZCLEVBQThCLE1BQU0sSUFBcEMsS0FBNkMsSUFBSSxXQUFKLENBQWdCLEtBQWhCLEVBQXVCLEtBQXZCLEVBQThCLE1BQU0sSUFBcEMsQ0FBcEQ7QUFDQTs7Ozs7O2tCQW5GZ0IsRzs7Ozs7QUNEckI7O0FBRUE7QUFDQTtBQUNBLElBQUksT0FBTyxPQUFPLE1BQWQsS0FBeUIsVUFBN0IsRUFBeUM7QUFDckMsS0FBQyxZQUFZO0FBQ1QsZUFBTyxNQUFQLEdBQWdCLFVBQVUsTUFBVixFQUFrQjtBQUM5QjtBQUNBOztBQUNBLGdCQUFJLFdBQVcsU0FBWCxJQUF3QixXQUFXLElBQXZDLEVBQTZDO0FBQ3pDLHNCQUFNLElBQUksU0FBSixDQUFjLDRDQUFkLENBQU47QUFDSDs7QUFFRCxnQkFBSSxTQUFTLE9BQU8sTUFBUCxDQUFiO0FBQ0EsaUJBQUssSUFBSSxRQUFRLENBQWpCLEVBQW9CLFFBQVEsVUFBVSxNQUF0QyxFQUE4QyxPQUE5QyxFQUF1RDtBQUNuRCxvQkFBSSxTQUFTLFVBQVUsS0FBVixDQUFiO0FBQ0Esb0JBQUksV0FBVyxTQUFYLElBQXdCLFdBQVcsSUFBdkMsRUFBNkM7QUFDekMseUJBQUssSUFBSSxPQUFULElBQW9CLE1BQXBCLEVBQTRCO0FBQ3hCLDRCQUFJLE9BQU8sY0FBUCxDQUFzQixPQUF0QixDQUFKLEVBQW9DO0FBQ2hDLG1DQUFPLE9BQVAsSUFBa0IsT0FBTyxPQUFQLENBQWxCO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7QUFDRCxtQkFBTyxNQUFQO0FBQ0gsU0FuQkQ7QUFvQkgsS0FyQkQ7QUFzQkgsQyxDQTVCRDs7Ozs7Ozs7a0JDRXdCLGM7O0FBRnhCOzs7Ozs7QUFFZSxTQUFTLGNBQVQsQ0FBeUIsTUFBekIsRUFBaUM7O0FBRTVDLFFBQUksWUFBWSxFQUFoQjs7QUFFQSxXQUFPLE9BQU8sTUFBUCxDQUFjLE1BQWQsRUFBc0I7QUFFekIsaUJBRnlCLHFCQUVmLFFBRmUsRUFFTDtBQUNoQixnQkFBSSxVQUFVLE9BQVYsQ0FBa0IsUUFBbEIsTUFBZ0MsQ0FBQyxDQUFyQyxFQUF3QztBQUNwQywwQkFBVSxJQUFWLENBQWUsUUFBZjtBQUNIO0FBQ0osU0FOd0I7QUFRekIsbUJBUnlCLHVCQVFiLFFBUmEsRUFRSDtBQUNsQixnQkFBSSxRQUFRLFVBQVUsT0FBVixDQUFrQixRQUFsQixDQUFaO0FBQ0EsZ0JBQUksUUFBUSxDQUFDLENBQWIsRUFBZ0I7QUFDWiwwQkFBVSxNQUFWLENBQWlCLEtBQWpCLEVBQXdCLENBQXhCO0FBQ0g7QUFDSixTQWJ3QjtBQWV6QixzQkFmeUIsNEJBZVI7QUFDYix3QkFBWSxFQUFaO0FBQ0gsU0FqQndCO0FBbUJ6QixlQW5CeUIsbUJBbUJqQixLQW5CaUIsRUFtQkQ7QUFBQSw4Q0FBTixJQUFNO0FBQU4sb0JBQU07QUFBQTs7QUFDcEIsc0JBQVUsT0FBVixDQUFrQixvQkFBWTtBQUMxQixvQkFBSSxPQUFPLFNBQVMsS0FBVCxDQUFQLEtBQTJCLFVBQS9CLEVBQTJDO0FBQ3ZDLHdCQUFJO0FBQ0EsaUNBQVMsS0FBVCxrQkFBbUIsSUFBbkI7QUFDSCxxQkFGRCxDQUdBLE9BQU0sQ0FBTixFQUFTO0FBQ0wsMkNBQUksTUFBSixnREFBdUQsS0FBdkQsVUFBa0UsQ0FBbEU7QUFDSDtBQUNKO0FBQ0osYUFURDtBQVVILFNBOUJ3QjtBQWdDekIseUJBaEN5Qiw2QkFnQ1AsS0FoQ08sRUFnQ0E7QUFDckIsZ0JBQUksTUFBTSxLQUFWO0FBQ0Esc0JBQVUsT0FBVixDQUFrQixvQkFBWTtBQUMxQixvQkFBSSxPQUFPLFNBQVMsS0FBVCxDQUFQLEtBQTJCLFVBQS9CLEVBQTJDO0FBQ3ZDLDBCQUFNLElBQU47QUFDSDtBQUNKLGFBSkQ7QUFLQSxtQkFBTyxHQUFQO0FBQ0g7QUF4Q3dCLEtBQXRCLENBQVA7QUE0Q0g7Ozs7Ozs7O0FDbEREOztBQUVBO0FBQ0EsSUFBTSxTQUFTLEVBQWY7O2tCQUVlLE07OztBQUVmLElBQUk7QUFDQSxRQUFJLE9BQU8sUUFBUCxLQUFvQixZQUF4QixFQUFzQztBQUFFO0FBQ3BDLGVBQU8sU0FBUCxHQUFtQixLQUFuQjtBQUNBLGVBQU8sT0FBUCxHQUFtQixJQUFuQjtBQUNIO0FBQ0osQ0FMRCxDQU1BLE9BQU8sQ0FBUCxFQUFVO0FBQ04sUUFBSSxTQUFTLFNBQWIsRUFBd0I7QUFDcEIsZUFBTyxTQUFQLEdBQW1CLElBQW5CO0FBQ0EsZUFBTyxPQUFQLEdBQW1CLEtBQW5COztBQUVBO0FBQ0E7QUFDQSxhQUFLLE1BQUwsR0FBYyxFQUFFLFVBQVUsRUFBWixFQUFkO0FBQ0EsYUFBSyxRQUFMLEdBQWdCLEtBQUssTUFBTCxDQUFZLFFBQTVCO0FBQ0g7QUFDSjs7Ozs7Ozs7UUNsQmUsVSxHQUFBLFU7UUF5Q0EsVSxHQUFBLFU7UUFpQkEsZSxHQUFBLGU7UUFRQSxhLEdBQUEsYTtRQVFBLGtCLEdBQUEsa0I7UUFrQkEsYyxHQUFBLGM7UUFxQ0EsZSxHQUFBLGU7UUFxQkEsYyxHQUFBLGM7O0FBM0poQjs7Ozs7O0FBRUE7QUFDQTtBQUNBO0FBQ08sU0FBUyxVQUFULENBQXFCLEdBQXJCLEVBQTBCLElBQTFCLEVBQWdDO0FBQ25DLFFBQUksQ0FBQyxHQUFMLEVBQVU7QUFDTjtBQUNIOztBQUVEO0FBQ0EsUUFBSSxJQUFJLE1BQUosQ0FBVyxDQUFYLEVBQWMsQ0FBZCxNQUFxQixJQUF6QixFQUErQjtBQUMzQixjQUFNLE9BQU8sUUFBUCxDQUFnQixRQUFoQixHQUEyQixHQUFqQztBQUNIO0FBQ0Q7QUFIQSxTQUlLLElBQUksSUFBSSxNQUFKLENBQVcsMEJBQVgsSUFBeUMsQ0FBN0MsRUFBZ0Q7QUFDakQsZ0JBQUksV0FBWSxJQUFJLENBQUosTUFBVyxHQUEzQjtBQUNBLGdCQUFJLFNBQUo7QUFDQSxnQkFBSSxJQUFKLEVBQVU7QUFDTiw0QkFBWSxTQUFTLGFBQVQsQ0FBdUIsR0FBdkIsQ0FBWixDQURNLENBQ21DO0FBQ3pDLDBCQUFVLElBQVYsR0FBaUIsSUFBakI7QUFDSCxhQUhELE1BSUs7QUFDRCw0QkFBWSxPQUFPLFFBQW5CO0FBQ0g7O0FBRUQsZ0JBQUksUUFBSixFQUFjO0FBQ1Ysb0JBQUksT0FBTyxXQUFXLFVBQVUsSUFBckIsQ0FBWDtBQUNBLHNCQUFNLE9BQU8sR0FBYjtBQUNILGFBSEQsTUFJSztBQUNEO0FBQ0Esb0JBQUksVUFBVSxNQUFkLEVBQXNCO0FBQ2xCLDBCQUFNLFVBQVUsTUFBVixHQUFtQixHQUFuQixHQUF5QixHQUEvQjtBQUNIO0FBQ0Q7QUFIQSxxQkFJSztBQUNELDRCQUFJLFNBQVMsSUFBSSxLQUFKLENBQVUsd0NBQVYsQ0FBYjtBQUNBLGlDQUFVLFVBQVUsT0FBTyxNQUFQLEdBQWdCLENBQTNCLEdBQWdDLE9BQU8sQ0FBUCxDQUFoQyxHQUE0QyxFQUFyRDtBQUNBLDhCQUFNLFNBQVMsR0FBZjtBQUNIO0FBQ0o7QUFDSjtBQUNELFdBQU8sR0FBUDtBQUNIOztBQUVNLFNBQVMsVUFBVCxDQUFxQixHQUFyQixFQUEwQjtBQUM3QixRQUFJLE9BQU8sR0FBUCxLQUFlLFFBQWYsSUFBMkIsSUFBSSxNQUFKLENBQVcsZUFBWCxNQUFnQyxDQUFDLENBQWhFLEVBQW1FO0FBQy9ELFlBQUksS0FBSyxJQUFJLE9BQUosQ0FBWSxHQUFaLENBQVQ7QUFDQSxZQUFJLEtBQUssQ0FBQyxDQUFWLEVBQWE7QUFDVCxrQkFBTSxJQUFJLE1BQUosQ0FBVyxDQUFYLEVBQWMsRUFBZCxDQUFOO0FBQ0g7O0FBRUQsWUFBSSxPQUFPLElBQUksT0FBSixDQUFZLEdBQVosQ0FBWDtBQUNBLFlBQUksT0FBTyxDQUFDLENBQVosRUFBZTtBQUNYLGtCQUFNLElBQUksTUFBSixDQUFXLENBQVgsRUFBYyxJQUFkLENBQU47QUFDSDs7QUFFRCxlQUFPLElBQUksTUFBSixDQUFXLENBQVgsRUFBYyxJQUFJLFdBQUosQ0FBZ0IsR0FBaEIsSUFBdUIsQ0FBckMsS0FBMkMsRUFBbEQ7QUFDSDtBQUNELFdBQU8sRUFBUDtBQUNIOztBQUVNLFNBQVMsZUFBVCxDQUEwQixHQUExQixFQUErQjtBQUNsQyxVQUFNLElBQUksS0FBSixDQUFVLEdBQVYsRUFBZSxHQUFmLEVBQU47QUFDQSxRQUFJLFdBQVcsSUFBSSxXQUFKLENBQWdCLEdBQWhCLENBQWY7QUFDQSxRQUFJLFdBQVcsQ0FBQyxDQUFoQixFQUFtQjtBQUNmLGVBQU8sSUFBSSxTQUFKLENBQWMsV0FBVyxDQUF6QixDQUFQO0FBQ0g7QUFDSjs7QUFFTSxTQUFTLGFBQVQsQ0FBd0IsR0FBeEIsRUFBNkI7QUFDaEMsUUFBSSxPQUFPLEdBQVAsS0FBZSxRQUFuQixFQUE2QjtBQUN6QjtBQUNIO0FBQ0QsV0FBTyxFQUFFLElBQUksTUFBSixDQUFXLDBCQUFYLElBQXlDLENBQUMsQ0FBMUMsSUFBK0MsSUFBSSxNQUFKLENBQVcsQ0FBWCxFQUFjLENBQWQsTUFBcUIsSUFBdEUsQ0FBUDtBQUNIOztBQUVEO0FBQ08sU0FBUyxrQkFBVCxDQUE2QixHQUE3QixFQUFrQztBQUNyQyxRQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQVIsRUFBWSxLQUFaLENBQWtCLEdBQWxCLENBQVg7QUFDQSxTQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxNQUF6QixFQUFpQyxHQUFqQyxFQUFzQztBQUNsQyxZQUFJLEtBQUssQ0FBTCxNQUFZLEdBQWhCLEVBQXFCO0FBQ2pCLGlCQUFLLE1BQUwsQ0FBWSxDQUFaLEVBQWUsQ0FBZjtBQUNBO0FBQ0gsU0FIRCxNQUlLLElBQUksS0FBSyxDQUFMLE1BQVksSUFBaEIsRUFBc0I7QUFDdkIsZ0JBQUksSUFBSSxDQUFSO0FBQ0EsaUJBQUssTUFBTCxDQUFZLElBQUUsQ0FBZCxFQUFpQixDQUFqQjtBQUNBO0FBQ0g7QUFDSjtBQUNELFdBQU8sS0FBSyxJQUFMLENBQVUsR0FBVixDQUFQO0FBQ0g7O0FBRUQ7QUFDQTtBQUNPLFNBQVMsY0FBVCxDQUF5QixHQUF6QixFQUE4QixNQUE5QixFQUFzQztBQUN6QyxRQUFJLENBQUMsTUFBRCxJQUFXLE9BQU8sSUFBUCxDQUFZLE1BQVosRUFBb0IsTUFBcEIsS0FBK0IsQ0FBOUMsRUFBaUQ7QUFDN0MsZUFBTyxHQUFQO0FBQ0g7O0FBRUQsUUFBSSxXQUFXLElBQUksT0FBSixDQUFZLEdBQVosQ0FBZjtBQUNBLFFBQUksYUFBYSxJQUFJLE9BQUosQ0FBWSxHQUFaLENBQWpCOztBQUVBO0FBQ0EsUUFBSSxPQUFPLEVBQVg7QUFDQSxRQUFJLGFBQWEsQ0FBQyxDQUFsQixFQUFxQjtBQUNqQixlQUFPLElBQUksS0FBSixDQUFVLFVBQVYsQ0FBUDtBQUNBLGNBQU0sSUFBSSxLQUFKLENBQVUsQ0FBVixFQUFhLFVBQWIsQ0FBTjtBQUNIOztBQUVEO0FBQ0EsUUFBSSxhQUFhLENBQUMsQ0FBbEIsRUFBcUI7QUFDakIsbUJBQVcsSUFBSSxNQUFmO0FBQ0EsZUFBTyxHQUFQO0FBQ0g7QUFDRCxlQXBCeUMsQ0FvQjdCOztBQUVaO0FBQ0EsUUFBSSxhQUFhLEVBQWpCO0FBQ0EsU0FBSyxJQUFJLENBQVQsSUFBYyxNQUFkLEVBQXNCO0FBQ2xCLHNCQUFpQixDQUFqQixTQUFzQixPQUFPLENBQVAsQ0FBdEI7QUFDSDs7QUFFRDtBQUNBO0FBQ0EsVUFBTSxJQUFJLEtBQUosQ0FBVSxDQUFWLEVBQWEsUUFBYixJQUF5QixVQUF6QixHQUFzQyxJQUFJLEtBQUosQ0FBVSxRQUFWLENBQXRDLEdBQTRELElBQWxFOztBQUVBLFdBQU8sR0FBUDtBQUNIOztBQUVEO0FBQ0EsSUFBSSx5QkFBSjtBQUNPLFNBQVMsZUFBVCxDQUEwQixHQUExQixFQUErQjtBQUNsQyxRQUFJLHFCQUFxQixTQUF6QixFQUFvQztBQUNoQywyQkFBb0IsT0FBTyxHQUFQLElBQWMsT0FBTyxHQUFQLENBQVcsZUFBMUIsSUFBK0MsT0FBTyxTQUFQLElBQW9CLE9BQU8sU0FBUCxDQUFpQixlQUF2Rzs7QUFFQSxZQUFJLE9BQU8sZ0JBQVAsS0FBNEIsVUFBaEMsRUFBNEM7QUFDeEMsK0JBQW1CLElBQW5CO0FBQ0EsK0JBQUksTUFBSjtBQUNIO0FBQ0o7O0FBRUQsUUFBSSxnQkFBSixFQUFzQjtBQUNsQixlQUFPLGlCQUFpQixHQUFqQixDQUFQO0FBQ0gsS0FGRCxNQUdLO0FBQ0QsZUFBTyxHQUFQO0FBQ0g7QUFDSjs7QUFFRDtBQUNBO0FBQ0E7QUFDTyxTQUFTLGNBQVQsR0FBbUM7QUFDdEM7QUFDQSxRQUFJLFNBQVMsU0FBUyxhQUF0Qjs7QUFGc0Msc0NBQVAsS0FBTztBQUFQLGFBQU87QUFBQTs7QUFHdEMsUUFBSSxNQUFKLEVBQVk7QUFDUixlQUFPLE9BQU8sR0FBZDtBQUNILEtBRkQsTUFHSyxJQUFJLE1BQU0sT0FBTixDQUFjLEtBQWQsQ0FBSixFQUEwQjtBQUMzQjtBQUNBLFlBQUksVUFBVSxTQUFTLG9CQUFULENBQThCLFFBQTlCLENBQWQ7QUFDQSxhQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxRQUFRLE1BQTFCLEVBQWtDLEdBQWxDLEVBQXVDO0FBQ25DLGlCQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxNQUFNLE1BQXhCLEVBQWdDLEdBQWhDLEVBQXFDO0FBQ2pDLG9CQUFJLFFBQVEsQ0FBUixFQUFXLEdBQVgsQ0FBZSxPQUFmLENBQXVCLE1BQU0sQ0FBTixDQUF2QixJQUFtQyxDQUFDLENBQXhDLEVBQTJDO0FBQ3hDLDJCQUFPLFFBQVEsQ0FBUixFQUFXLEdBQWxCO0FBQ0Y7QUFDSjtBQUNKO0FBQ0o7QUFDSjs7Ozs7Ozs7OzhRQzVLRDtBQUNBOztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7OztBQUVBLElBQUksS0FBSjtrQkFDZSxRQUFRLEU7OztBQUV2Qix3QkFBYSxTQUFiLENBQXVCLE9BQXZCLEVBQWdDLEtBQWhDOztBQUVBO0FBQ0E7QUFDQSxNQUFNLFFBQU4sR0FBaUIsWUFBWTtBQUN6QixXQUFPLGtDQUFpQyxJQUFqQyxDQUFzQyxVQUFVLFNBQWhEO0FBQVA7QUFDSCxDQUZEOztBQUlBO0FBQ0EsTUFBTSxXQUFOLEdBQW9CLFlBQVk7QUFDNUIsV0FBTyx3Q0FBdUMsSUFBdkMsQ0FBNEMsVUFBVSxTQUF0RDtBQUFQO0FBQ0gsQ0FGRDs7QUFJQSxNQUFNLFNBQU4sR0FBa0IsRUFBbEIsQyxDQUE0QjtBQUM1QixNQUFNLGVBQU4sR0FBd0IsRUFBeEIsQyxDQUE0Qjs7QUFFNUI7QUFDQSxNQUFNLEVBQU4sR0FBVyxVQUFVLEdBQVYsRUFBd0g7QUFBQSxRQUF6RyxPQUF5Ryx1RUFBL0YsS0FBK0Y7QUFBQSxRQUF4RixZQUF3Rix1RUFBekUsTUFBeUU7QUFBQSxRQUFqRSxNQUFpRSx1RUFBeEQsS0FBd0Q7QUFBQSxRQUFqRCxPQUFpRCx1RUFBdkMsRUFBdUM7QUFBQSxRQUFuQyxXQUFtQyx1RUFBckIsSUFBcUI7QUFBQSxRQUFmLEtBQWUsdUVBQVAsS0FBTzs7QUFDL0gsUUFBSSxpQkFBTyxTQUFQLElBQW9CLE1BQU0sV0FBTixFQUF4QixFQUE2QztBQUN6QztBQUNBO0FBQ0E7QUFDQSwyQkFBSSxPQUFKLEVBQWEsb0NBQWIsRUFBbUQsR0FBbkQ7O0FBRUEsWUFBSSxXQUFKLEVBQWlCO0FBQ2Isa0JBQU0sZUFBTixDQUFzQixXQUF0QixJQUFxQyxJQUFyQyxDQURhLENBQzhCO0FBQzlDO0FBQ0QsZUFBTyx3QkFBYSxXQUFiLENBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLEVBQTBDLE9BQTFDLEVBQW1ELFlBQW5ELEVBQWlFLE1BQWpFLEVBQXlFLE9BQXpFLEVBQWtGLFdBQWxGLEVBQStGLElBQS9GLENBQVA7QUFDSCxLQVZELE1BV0s7QUFDRCxZQUFJLFVBQVUsSUFBSSxjQUFKLEVBQWQ7QUFDQSxZQUFJLFVBQVUsSUFBSSxPQUFKLENBQVksVUFBQyxPQUFELEVBQVUsTUFBVixFQUFxQjtBQUMzQyxvQkFBUSxJQUFSLENBQWEsTUFBYixFQUFxQixHQUFyQixFQUEwQixJQUExQjtBQUNBLG9CQUFRLE9BQVIsR0FBa0IsT0FBbEI7QUFDQSxvQkFBUSxZQUFSLEdBQXVCLFlBQXZCO0FBQ0Esb0JBQVEsTUFBUixHQUFpQixZQUFNO0FBQ25CLG9CQUFJLFFBQVEsTUFBUixLQUFtQixHQUF2QixFQUE0QjtBQUN4Qix3QkFBSSxDQUFDLE1BQUQsRUFBUyxNQUFULEVBQWlCLE9BQWpCLENBQXlCLFFBQVEsWUFBakMsSUFBaUQsQ0FBQyxDQUF0RCxFQUF5RDtBQUNyRCxnQ0FBUSxRQUFRLFlBQWhCO0FBQ0gscUJBRkQsTUFHSztBQUNELGdDQUFRLFFBQVEsUUFBaEI7QUFDSDtBQUNKLGlCQVBELE1BT087QUFDSCwyQkFBTyxNQUFNLG9DQUFvQyxRQUFRLFVBQWxELENBQVA7QUFDSDtBQUNKLGFBWEQ7QUFZQSxvQkFBUSxPQUFSLEdBQWtCLFVBQUMsR0FBRCxFQUFTO0FBQ3ZCLHVCQUFPLE1BQU0sOEJBQThCLElBQUksUUFBSixFQUFwQyxDQUFQO0FBQ0gsYUFGRDtBQUdBLG9CQUFRLFNBQVIsR0FBb0IsVUFBQyxHQUFELEVBQVM7QUFDekIsdUJBQU8sTUFBTSxhQUFZLElBQUksUUFBSixFQUFsQixDQUFQO0FBQ0gsYUFGRDtBQUdBLG9CQUFRLElBQVI7QUFDSCxTQXZCYSxDQUFkOztBQXlCQSxrQkFBVSxRQUFRLElBQVIsQ0FBYSxvQkFBWTtBQUMvQixnQkFBSSxXQUFKLEVBQWlCO0FBQ2IsdUJBQU8sTUFBTSxTQUFOLENBQWdCLFdBQWhCLENBQVA7QUFDSDs7QUFFRCxnQkFBSSxLQUFKLEVBQVc7QUFDUCx1QkFBTyx3QkFBYSxpQkFBYixDQUErQixRQUEvQixDQUFQO0FBQ0g7QUFDRCxtQkFBTyxRQUFQO0FBQ0gsU0FUUyxDQUFWOztBQVdBLFlBQUksV0FBSixFQUFpQjtBQUNiLGtCQUFNLFNBQU4sQ0FBZ0IsV0FBaEIsSUFBK0IsT0FBL0I7QUFDSDs7QUFFRCxlQUFPLE9BQVA7QUFDSDtBQUNKLENBeEREOztBQTBEQTtBQUNBLE1BQU0sYUFBTixHQUFzQixVQUFVLEdBQVYsRUFBZTtBQUNqQztBQUNBLFFBQUksaUJBQU8sU0FBUCxJQUFvQixNQUFNLGVBQU4sQ0FBc0IsR0FBdEIsQ0FBeEIsRUFBb0Q7QUFDaEQsZUFBTyx3QkFBYSxXQUFiLENBQXlCLHFCQUF6QixFQUFnRCxHQUFoRCxDQUFQLENBRGdELENBQ2E7QUFDaEU7O0FBRUQsUUFBSSxNQUFNLE1BQU0sU0FBTixDQUFnQixHQUFoQixDQUFWO0FBQ0EsUUFBSSxHQUFKLEVBQVM7QUFDTCwyQkFBSSxPQUFKLHdDQUFnRCxHQUFoRDtBQUNBLGNBQU0sU0FBTixDQUFnQixHQUFoQixFQUFxQixLQUFyQjtBQUNBLGVBQU8sTUFBTSxTQUFOLENBQWdCLEdBQWhCLENBQVA7QUFDSCxLQUpELE1BS0s7QUFDRCwyQkFBSSxPQUFKLDRDQUFvRCxHQUFwRDtBQUNIO0FBQ0osQ0FmRDs7QUFpQkE7QUFDQSxNQUFNLDZCQUFOLEdBQXNDLFlBQVk7QUFDOUMsUUFBSSxPQUFPLE9BQU8scUJBQWQsS0FBd0MsVUFBNUMsRUFBd0Q7QUFDcEQsZUFBTyxxQkFBUCxHQUNJLE9BQU8sMkJBQVAsSUFDQSxPQUFPLHdCQURQLElBRUEsT0FBTyxzQkFGUCxJQUdBLE9BQU8sdUJBSFAsSUFJQSxVQUFVLEVBQVYsRUFBYztBQUNWLHVCQUFXLEVBQVgsRUFBZSxPQUFNLEVBQXJCO0FBQ0gsU0FQTDtBQVFIO0FBQ0osQ0FYRDs7QUFhQTtBQUNBLE1BQU0sc0JBQU4sR0FBK0IsVUFBVSxHQUFWLEVBQWU7QUFDMUMsUUFBSSxhQUFhLEtBQUssU0FBTCxDQUFlLEdBQWYsRUFBb0IsVUFBUyxDQUFULEVBQVksQ0FBWixFQUFlO0FBQ2hEO0FBQ0EsWUFBSSxPQUFPLENBQVAsS0FBYSxVQUFqQixFQUE2QjtBQUN6QixtQkFBTyxFQUFFLFFBQUYsRUFBUDtBQUNIO0FBQ0QsZUFBTyxDQUFQO0FBQ0gsS0FOZ0IsQ0FBakI7O0FBUUEsV0FBTyxVQUFQO0FBQ0gsQ0FWRDs7QUFZQTtBQUNBLE1BQU0sa0JBQU4sR0FBMkIsVUFBUyxHQUFULEVBQWMsSUFBZCxFQUFvQjtBQUMzQztBQUNBLFFBQUksT0FBTyxHQUFQLEtBQWUsUUFBbkIsRUFBNkI7QUFDekIsY0FBTSxNQUFNLGdCQUFOLENBQXVCLEdBQXZCLEVBQTRCLElBQTVCLENBQU47QUFDSDtBQUNEO0FBSEEsU0FJSyxJQUFJLE9BQU8sSUFBUCxJQUFlLFFBQU8sR0FBUCx5Q0FBTyxHQUFQLE9BQWUsUUFBbEMsRUFBNEM7QUFDN0MsaUJBQUssSUFBSSxDQUFULElBQWMsR0FBZCxFQUFtQjtBQUNmLG9CQUFJLENBQUosSUFBUyxNQUFNLGtCQUFOLENBQXlCLElBQUksQ0FBSixDQUF6QixFQUFpQyxJQUFqQyxDQUFUO0FBQ0g7QUFDSjtBQUNELFdBQU8sR0FBUDtBQUNILENBWkQ7O0FBY0E7QUFDQSxNQUFNLGdCQUFOLEdBQXlCLFVBQVMsR0FBVCxFQUFjLElBQWQsRUFBb0I7QUFDekM7QUFDQSxRQUFJLFNBQ0MsT0FBTyxHQUFQLEtBQWUsUUFBaEIsSUFDQSxJQUFJLEtBQUosQ0FBVSxpREFBVixDQUZKOztBQUlBLFFBQUksVUFBVSxPQUFPLE1BQVAsR0FBZ0IsQ0FBOUIsRUFBaUM7QUFDN0IsWUFBSTtBQUNBLGdCQUFJLE1BQU0sT0FBTyxDQUFQLENBQVY7QUFDQSxnQkFBSSxPQUFPLE9BQU8sQ0FBUCxFQUFVLE1BQVYsR0FBbUIsQ0FBbkIsSUFBd0IsT0FBTyxDQUFQLEVBQVUsS0FBVixDQUFnQixHQUFoQixFQUFxQixHQUFyQixDQUF5QjtBQUFBLHVCQUFLLEVBQUUsSUFBRixFQUFMO0FBQUEsYUFBekIsRUFBd0MsTUFBeEMsQ0FBK0M7QUFBQSx1QkFBSyxDQUFMO0FBQUEsYUFBL0MsQ0FBbkM7QUFDQSxtQkFBTyxLQUFLLE1BQUwsR0FBYyxDQUFkLEdBQWtCLElBQWxCLEdBQXlCLENBQUMsU0FBRCxDQUFoQyxDQUhBLENBRzZDOztBQUU3QyxnQkFBSSxPQUFPLElBQVAsS0FBZ0IsVUFBcEIsRUFBZ0M7QUFDNUIsMERBQVcsUUFBWCxtQ0FBdUIsSUFBdkIsSUFBNkIsS0FBSyxHQUFMLENBQTdCLE9BRDRCLENBQ2E7QUFDNUMsYUFGRCxNQUdLO0FBQ0QsMERBQVcsUUFBWCxtQ0FBdUIsSUFBdkIsSUFBNkIsR0FBN0IsT0FEQyxDQUNrQztBQUN0QztBQUNKLFNBWEQsQ0FZQSxPQUFPLENBQVAsRUFBVTtBQUNOO0FBQ0EsbUJBQU8sR0FBUDtBQUNIO0FBQ0o7QUFDRCxXQUFPLEdBQVA7QUFDSCxDQXpCRDs7QUEyQkE7QUFDQTtBQUNBLE1BQU0sd0JBQU4sR0FBaUMsSUFBakM7QUFDQSxNQUFNLHNCQUFOLEdBQStCLFlBQVk7QUFDdkMsUUFBSSxPQUFPLE1BQU0sa0JBQWpCO0FBQ0EsVUFBTSxrQkFBTixHQUE0QixNQUFNLHdCQUFOLElBQWtDLE9BQU8sZ0JBQTFDLElBQStELENBQTFGO0FBQ0EsV0FBTyxNQUFNLGtCQUFOLEtBQTZCLElBQXBDO0FBQ0gsQ0FKRDs7QUFNQSxJQUFJLGlCQUFPLE9BQVgsRUFBb0I7QUFDaEIsVUFBTSxzQkFBTjtBQUNIOztBQUVEO0FBQ0E7QUFDQSxNQUFNLFVBQU4sR0FBbUIsVUFBUyxLQUFULEVBQWdCO0FBQy9CLFdBQU8sQ0FBQyxRQUFTLFFBQVEsQ0FBbEIsTUFBMEIsQ0FBakM7QUFDSCxDQUZEOztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLFdBQU4sR0FBb0IsVUFBUyxDQUFULEVBQVksTUFBWixFQUFvQixTQUFwQixFQUErQjtBQUMvQztBQUNBLFFBQUksQ0FBQyxNQUFNLE9BQU4sQ0FBYyxNQUFkLENBQUQsSUFBMEIsQ0FBQyxNQUFNLE9BQU4sQ0FBYyxPQUFPLENBQVAsQ0FBZCxDQUEvQixFQUF5RDtBQUNyRCxlQUFPLE1BQVA7QUFDSCxLQUZELE1BR0ssSUFBSSxPQUFPLE1BQVAsR0FBZ0IsQ0FBcEIsRUFBdUI7QUFDeEIsZUFBTyxNQUFQO0FBQ0g7O0FBRUQsUUFBSSxFQUFKLEVBQVEsRUFBUixFQUFZLENBQVosRUFBZSxDQUFmLEVBQWtCLEVBQWxCLEVBQXNCLEVBQXRCOztBQUVBO0FBQ0EsUUFBSSxLQUFLLE9BQU8sQ0FBUCxFQUFVLENBQVYsQ0FBVCxFQUF1QjtBQUNuQixZQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsQ0FBSjtBQUNBLFlBQUksT0FBTyxTQUFQLEtBQXFCLFVBQXpCLEVBQXFDO0FBQ2pDLGdCQUFJLFVBQVUsQ0FBVixDQUFKO0FBQ0g7QUFDSjtBQUNEO0FBTkEsU0FPSyxJQUFJLEtBQUssT0FBTyxPQUFPLE1BQVAsR0FBYyxDQUFyQixFQUF3QixDQUF4QixDQUFULEVBQXFDO0FBQ3RDLGdCQUFJLE9BQU8sT0FBTyxNQUFQLEdBQWMsQ0FBckIsRUFBd0IsQ0FBeEIsQ0FBSjtBQUNBLGdCQUFJLE9BQU8sU0FBUCxLQUFxQixVQUF6QixFQUFxQztBQUNqQyxvQkFBSSxVQUFVLENBQVYsQ0FBSjtBQUNIO0FBQ0o7QUFDRDtBQU5LLGFBT0E7QUFDRCxxQkFBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksT0FBTyxNQUFQLEdBQWdCLENBQWxDLEVBQXFDLEdBQXJDLEVBQTBDO0FBQ3RDLHdCQUFJLEtBQUssT0FBTyxDQUFQLEVBQVUsQ0FBVixDQUFMLElBQXFCLElBQUksT0FBTyxJQUFFLENBQVQsRUFBWSxDQUFaLENBQTdCLEVBQTZDO0FBQ3pDO0FBQ0EsNkJBQUssT0FBTyxDQUFQLEVBQVUsQ0FBVixDQUFMO0FBQ0EsNkJBQUssT0FBTyxJQUFFLENBQVQsRUFBWSxDQUFaLENBQUw7O0FBRUE7QUFDQSw0QkFBSSxNQUFNLE9BQU4sQ0FBYyxPQUFPLENBQVAsRUFBVSxDQUFWLENBQWQsQ0FBSixFQUFpQztBQUM3QixnQ0FBSSxFQUFKO0FBQ0EsaUNBQUssSUFBSSxJQUFFLENBQVgsRUFBYyxJQUFJLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxNQUEvQixFQUF1QyxHQUF2QyxFQUE0QztBQUN4QyxvQ0FBSSxPQUFPLFNBQVAsS0FBcUIsVUFBekIsRUFBcUM7QUFDakMseUNBQUssVUFBVSxPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixDQUFWLENBQUw7QUFDQSx5Q0FBSyxVQUFVLE9BQU8sSUFBRSxDQUFULEVBQVksQ0FBWixFQUFlLENBQWYsQ0FBVixDQUFMO0FBQ0Esd0NBQUksS0FBSyxFQUFUO0FBQ0Esc0NBQUUsQ0FBRixJQUFPLEtBQUssSUFBSSxFQUFULEtBQWdCLEtBQUssRUFBckIsSUFBMkIsRUFBbEM7QUFDSCxpQ0FMRCxNQU1LO0FBQ0Qsd0NBQUksT0FBTyxJQUFFLENBQVQsRUFBWSxDQUFaLEVBQWUsQ0FBZixJQUFvQixPQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixDQUF4QjtBQUNBLHNDQUFFLENBQUYsSUFBTyxLQUFLLElBQUksRUFBVCxLQUFnQixLQUFLLEVBQXJCLElBQTJCLE9BQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLENBQWxDO0FBQ0g7QUFDSjtBQUNKO0FBQ0Q7QUFmQSw2QkFnQks7QUFDRCxvQ0FBSSxPQUFPLFNBQVAsS0FBcUIsVUFBekIsRUFBcUM7QUFDakMseUNBQUssVUFBVSxPQUFPLENBQVAsRUFBVSxDQUFWLENBQVYsQ0FBTDtBQUNBLHlDQUFLLFVBQVUsT0FBTyxJQUFFLENBQVQsRUFBWSxDQUFaLENBQVYsQ0FBTDtBQUNBLHdDQUFJLEtBQUssRUFBVDtBQUNBLHdDQUFJLEtBQUssSUFBSSxFQUFULEtBQWdCLEtBQUssRUFBckIsSUFBMkIsRUFBL0I7QUFDSCxpQ0FMRCxNQU1LO0FBQ0Qsd0NBQUksT0FBTyxJQUFFLENBQVQsRUFBWSxDQUFaLElBQWlCLE9BQU8sQ0FBUCxFQUFVLENBQVYsQ0FBckI7QUFDQSx3Q0FBSSxLQUFLLElBQUksRUFBVCxLQUFnQixLQUFLLEVBQXJCLElBQTJCLE9BQU8sQ0FBUCxFQUFVLENBQVYsQ0FBL0I7QUFDSDtBQUNKO0FBQ0Q7QUFDSDtBQUNKO0FBQ0o7QUFDRCxXQUFPLENBQVA7QUFDSCxDQW5FRDs7QUFxRUEsTUFBTSxVQUFOLEdBQW1CLFVBQVUsS0FBVixFQUFpQjtBQUNoQyxRQUFJLE1BQU0sQ0FBTixNQUFhLENBQWpCLEVBQW9CO0FBQUU7QUFDbEIsd0JBQWMsTUFBTSxLQUFOLENBQVksQ0FBWixFQUFlLENBQWYsRUFBa0IsR0FBbEIsQ0FBc0I7QUFBQSxtQkFBSyxLQUFLLEtBQUwsQ0FBVyxJQUFJLEdBQWYsQ0FBTDtBQUFBLFNBQXRCLEVBQWdELElBQWhELENBQXFELElBQXJELENBQWQ7QUFDSDtBQUNEO0FBQ0EscUJBQWUsTUFBTSxHQUFOLENBQVUsVUFBQyxDQUFELEVBQUksQ0FBSjtBQUFBLGVBQVcsSUFBSSxDQUFKLElBQVMsS0FBSyxLQUFMLENBQVcsSUFBSSxHQUFmLENBQVYsSUFBa0MsQ0FBNUM7QUFBQSxLQUFWLEVBQXlELElBQXpELENBQThELElBQTlELENBQWY7QUFDSCxDQU5EOztBQVFBLE1BQU0sV0FBTixHQUFvQixVQUFVLEtBQVYsRUFBaUI7QUFDakMsV0FBTyxNQUFNLENBQU4sS0FBWSxDQUFaLElBQWlCLE1BQU0sQ0FBTixJQUFXLENBQUMsY0FBSSxVQUFqQyxJQUErQyxNQUFNLENBQU4sSUFBVyxjQUFJLFVBQTlELElBQTRFLE1BQU0sQ0FBTixLQUFZLENBQS9GO0FBQ0gsQ0FGRDs7Ozs7Ozs7QUM1UkEsSUFBSSxLQUFLLFFBQVEsSUFBUixDQUFUO0FBQ0EsSUFBSSxNQUFNLEtBQUssS0FBTCxDQUFXLEdBQUcsWUFBSCxDQUFnQixZQUFZLHFCQUE1QixFQUFtRCxNQUFuRCxDQUFYLENBQVY7QUFDQSxJQUFJLGdCQUFKO2tCQUNlLFVBQVUsTUFBTSxJQUFJLE87Ozs7Ozs7Ozs7Ozs7QUNvRm5DOzs7O0FBQ0E7Ozs7OztvTUF4RkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUtBLElBQUksWUFBSjtrQkFDZSxlQUFlLEU7O0FBRTlCO0FBQ0E7O0FBQ0EsSUFBSSxhQUFhLENBQWpCO0FBQ0EsSUFBSSxXQUFXLEVBQWY7O0FBRUE7QUFDQSxJQUFJLFVBQVUsRUFBZDtBQUNBLGFBQWEsU0FBYixHQUF5QixVQUFVLElBQVYsRUFBZ0IsTUFBaEIsRUFBd0I7QUFDN0MsWUFBUSxJQUFSLElBQWdCLE1BQWhCO0FBQ0gsQ0FGRDs7QUFJQTtBQUNBO0FBQ0EsU0FBUyxVQUFULENBQXFCLE1BQXJCLEVBQTZCO0FBQ3pCLFFBQUksUUFBUSxFQUFaO0FBQ0EsUUFBSSxPQUFPLE1BQVAsS0FBa0IsUUFBdEIsRUFBZ0M7QUFDNUIsZ0JBQVEsT0FBTyxLQUFQLENBQWEsR0FBYixDQUFSO0FBQ0EsaUJBQVMsTUFBTSxHQUFOLEVBQVQ7QUFDSDs7QUFFRCxRQUFJLFNBQVMsT0FBYjs7QUFFQSxTQUFLLElBQUksSUFBRSxDQUFYLEVBQWMsSUFBSSxNQUFNLE1BQXhCLEVBQWdDLEdBQWhDLEVBQXFDO0FBQ2pDLFlBQUksT0FBTyxNQUFNLENBQU4sQ0FBUCxDQUFKLEVBQXNCO0FBQ2xCLHFCQUFTLE9BQU8sTUFBTSxDQUFOLENBQVAsQ0FBVDtBQUNILFNBRkQsTUFHSztBQUNELG1CQUFPLEVBQVA7QUFDSDtBQUNKOztBQUVELFdBQU8sQ0FBQyxNQUFELEVBQVMsTUFBVCxDQUFQO0FBQ0g7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsU0FBUyxlQUFULEdBQTRCOztBQUV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWEsV0FBYixHQUEyQixVQUFVLE1BQVYsRUFBa0IsTUFBbEIsRUFBc0M7QUFBQSwwQ0FBVCxPQUFTO0FBQVQsbUJBQVM7QUFBQTs7QUFDN0Q7QUFDQSxZQUFJLE1BQU0sT0FBTixDQUFjLE1BQWQsQ0FBSixFQUEyQjtBQUN2QixtQkFBTyxRQUFRLEdBQVIsQ0FDSCxPQUFPLEdBQVAsQ0FBVztBQUFBOztBQUFBLHVCQUFLLCtCQUFhLFdBQWIsdUJBQXlCLENBQXpCLEVBQTRCLE1BQTVCLDRCQUF1QyxPQUF2QyxHQUFMO0FBQUEsYUFBWCxDQURHLENBQVA7QUFHSDs7QUFFRDtBQUNBLFlBQUksVUFBVSxJQUFJLE9BQUosQ0FBWSxVQUFDLE9BQUQsRUFBVSxNQUFWLEVBQXFCO0FBQzNDLHFCQUFTLFVBQVQsSUFBdUIsRUFBRSxjQUFGLEVBQVUsZ0JBQVYsRUFBbUIsZ0JBQW5CLEVBQTRCLGNBQTVCLEVBQXZCO0FBQ0gsU0FGYSxDQUFkOztBQUtBLFlBQUksZ0JBQUo7QUFBQSxZQUFhLGdCQUFnQixFQUE3Qjs7QUFFQSxZQUFJLFdBQVcsUUFBUSxNQUFSLEtBQW1CLENBQTlCLElBQW1DLFFBQVEsQ0FBUixhQUFzQixhQUFhLGlCQUExRSxFQUE2RjtBQUN6Riw0QkFBZ0IsUUFBUSxDQUFSLEVBQVcsYUFBM0I7QUFDQSxzQkFBVSxRQUFRLENBQVIsRUFBVyxLQUFyQjtBQUNIOztBQUVELGtCQUFVO0FBQ04sa0JBQU0sV0FEQSxFQUNrQjtBQUN4QixrQ0FGTSxFQUVrQjtBQUN4QiwwQkFITSxFQUdrQjtBQUN4Qiw0QkFKTSxDQUlrQjtBQUpsQixTQUFWOztBQU9BLGtCQUFVLFlBQVksT0FBWixFQUFxQixhQUFyQixDQUFWO0FBQ0EsZUFBTyxXQUFQLENBQW1CLE9BQW5CLEVBQTRCLGNBQWMsR0FBZCxDQUFrQjtBQUFBLG1CQUFLLEVBQUUsTUFBUDtBQUFBLFNBQWxCLENBQTVCO0FBQ0EsMEJBQWtCLGFBQWxCO0FBQ0EsWUFBSSxjQUFjLE1BQWQsR0FBdUIsQ0FBM0IsRUFBOEI7QUFDMUIsK0JBQUksT0FBSixTQUFpQixNQUFqQix1QkFBd0MsY0FBYyxNQUF0RDtBQUNIOztBQUVEO0FBQ0EsZUFBTyxPQUFQO0FBQ0gsS0FyQ0Q7O0FBdUNBO0FBQ0EsaUJBQWEsU0FBYixHQUF5QixVQUFVLE1BQVYsRUFBa0I7QUFDdkMsWUFBSSxFQUFFLGtCQUFrQixNQUFwQixDQUFKLEVBQWlDO0FBQzdCLGtCQUFNLHVEQUF1RCxNQUF2RCxDQUFOO0FBQ0g7O0FBRUQsZUFBTyxnQkFBUCxDQUF3QixTQUF4QixFQUFtQyxTQUFTLDZCQUFULENBQXVDLEtBQXZDLEVBQThDO0FBQzdFLGdCQUFJLE9BQU8sWUFBWSxNQUFNLElBQWxCLENBQVg7QUFDQSxnQkFBSSxLQUFLLEtBQUssVUFBZDs7QUFFQTtBQUNBLGdCQUFJLEtBQUssSUFBTCxLQUFjLGNBQWxCLEVBQWtDO0FBQzlCO0FBQ0Esb0JBQUksU0FBUyxFQUFULENBQUosRUFBa0I7QUFDZCx3QkFBSSxLQUFLLEtBQVQsRUFBZ0I7QUFDWixpQ0FBUyxFQUFULEVBQWEsTUFBYixDQUFvQixLQUFLLEtBQXpCO0FBQ0gscUJBRkQsTUFHSztBQUNELGlDQUFTLEVBQVQsRUFBYSxPQUFiLENBQXFCLEtBQUssT0FBMUI7QUFDSDtBQUNELDJCQUFPLFNBQVMsRUFBVCxDQUFQO0FBQ0g7QUFDSjtBQUNEO0FBQ0E7QUFDQTtBQWRBLGlCQWVLLElBQUksS0FBSyxJQUFMLEtBQWMsYUFBZCxJQUErQixNQUFNLElBQXpDLEVBQStDO0FBQUEsd0JBRTNDLFdBRjJDLEVBRTlCLE1BRjhCO0FBQUEsd0JBTzVDLE1BUDRDO0FBQUEsd0JBWTVDLE1BWjRDLEVBWXBDLEtBWm9DOztBQUFBO0FBQUEsMENBRXBCLFdBQVcsS0FBSyxNQUFoQixDQUZvQjtBQUNoRDs7O0FBRGdEOztBQUUzQyxtQ0FGMkM7QUFFOUIsOEJBRjhCOztBQUdoRCw0QkFBSSxDQUFDLE1BQUwsRUFBYTtBQUNULGtDQUFNLHlEQUF1RCxLQUFLLE1BQTVELG1CQUFnRixLQUFLLE1BQXJGLG9FQUFOO0FBQ0g7O0FBRUcsaUNBQVUsT0FBTyxPQUFPLFdBQVAsQ0FBUCxLQUErQixVQUFoQyxJQUErQyxPQUFPLFdBQVAsQ0FQWjs7QUFRaEQsNEJBQUksQ0FBQyxNQUFMLEVBQWE7QUFDVCxrQ0FBTSx5REFBdUQsS0FBSyxNQUE1RCxtQkFBZ0YsS0FBSyxNQUFyRixrREFBTjtBQUNIOztBQUdELDRCQUFJO0FBQ0EscUNBQVMsT0FBTyxLQUFQLENBQWEsTUFBYixFQUFxQixLQUFLLE9BQTFCLENBQVQ7QUFDSCx5QkFGRCxDQUdBLE9BQU0sQ0FBTixFQUFTO0FBQ0w7QUFDQSxvQ0FBUSxDQUFSO0FBQ0g7O0FBRUQ7QUFDQSw0QkFBSSxnQkFBSjtBQUFBLDRCQUFhLGdCQUFnQixFQUE3Qjs7QUFFQTtBQUNBLDRCQUFJLGtCQUFrQixPQUF0QixFQUErQjtBQUMzQixtQ0FBTyxJQUFQLENBQVksVUFBQyxLQUFELEVBQVc7QUFDbkIsb0NBQUksaUJBQWlCLGFBQWEsaUJBQWxDLEVBQXFEO0FBQ2pELG9EQUFnQixNQUFNLGFBQXRCO0FBQ0EsNENBQVEsTUFBTSxLQUFOLENBQVksQ0FBWixDQUFSO0FBQ0g7O0FBRUQsMENBQVU7QUFDTiwwQ0FBTSxZQURBO0FBRU4sZ0RBQVksRUFGTjtBQUdOLDZDQUFTO0FBSEgsaUNBQVY7QUFLQSwwQ0FBVSxZQUFZLE9BQVosRUFBcUIsYUFBckIsQ0FBVjtBQUNBLHVDQUFPLFdBQVAsQ0FBbUIsT0FBbkIsRUFBNEIsY0FBYyxHQUFkLENBQWtCO0FBQUEsMkNBQUssRUFBRSxNQUFQO0FBQUEsaUNBQWxCLENBQTVCO0FBQ0Esa0RBQWtCLGFBQWxCO0FBQ0Esb0NBQUksY0FBYyxNQUFkLEdBQXVCLENBQTNCLEVBQThCO0FBQzFCLHVEQUFJLE9BQUosU0FBaUIsV0FBakIsdUJBQTZDLGNBQWMsTUFBM0Q7QUFDSDtBQUVKLDZCQWxCRCxFQWtCRyxVQUFDLEtBQUQsRUFBVztBQUNWLHVDQUFPLFdBQVAsQ0FBbUI7QUFDZiwwQ0FBTSxZQURTO0FBRWYsZ0RBQVksRUFGRztBQUdmLDJDQUFRLGlCQUFpQixLQUFqQixHQUE0QixNQUFNLE9BQWxDLFVBQThDLE1BQU0sS0FBcEQsR0FBOEQ7QUFIdkQsaUNBQW5CO0FBS0gsNkJBeEJEO0FBeUJIO0FBQ0Q7QUEzQkEsNkJBNEJLO0FBQ0Qsb0NBQUksa0JBQWtCLGFBQWEsaUJBQW5DLEVBQXNEO0FBQ2xELG9EQUFnQixPQUFPLGFBQXZCO0FBQ0EsNkNBQVMsT0FBTyxLQUFQLENBQWEsQ0FBYixDQUFUO0FBQ0g7O0FBRUQsMENBQVU7QUFDTiwwQ0FBTSxZQURBO0FBRU4sZ0RBQVksRUFGTjtBQUdOLDZDQUFTLE1BSEg7QUFJTiwyQ0FBUSxpQkFBaUIsS0FBakIsR0FBNEIsTUFBTSxPQUFsQyxVQUE4QyxNQUFNLEtBQXBELEdBQThEO0FBSmhFLGlDQUFWO0FBTUEsMENBQVUsWUFBWSxPQUFaLEVBQXFCLGFBQXJCLENBQVY7QUFDQSx1Q0FBTyxXQUFQLENBQW1CLE9BQW5CLEVBQTRCLGNBQWMsR0FBZCxDQUFrQjtBQUFBLDJDQUFLLEVBQUUsTUFBUDtBQUFBLGlDQUFsQixDQUE1QjtBQUNBLGtEQUFrQixhQUFsQjtBQUNBLG9DQUFJLGNBQWMsTUFBZCxHQUF1QixDQUEzQixFQUE4QjtBQUMxQix1REFBSSxPQUFKLFNBQWlCLFdBQWpCLHVCQUE2QyxjQUFjLE1BQTNEO0FBQ0g7QUFDSjtBQXZFK0M7QUF3RW5EO0FBQ0osU0E3RkQ7QUErRkgsS0FwR0Q7O0FBc0dBO0FBQ0EsaUJBQWEsV0FBYixHQUEyQixZQUFZO0FBQ25DLGVBQU8sUUFBUDtBQUNILEtBRkQ7O0FBSUEsaUJBQWEsWUFBYixHQUE0QixZQUFZO0FBQ3BDLGVBQU8sVUFBUDtBQUNILEtBRkQ7QUFJSDs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxTQUFTLGlCQUFULEdBQThCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFhLFdBQWIsR0FBMkIsVUFBVSxNQUFWLEVBQThCO0FBQUEsMkNBQVQsT0FBUztBQUFULG1CQUFTO0FBQUE7O0FBQ3JEO0FBQ0EsWUFBSSxVQUFVLElBQUksT0FBSixDQUFZLFVBQUMsT0FBRCxFQUFVLE1BQVYsRUFBcUI7QUFDM0MscUJBQVMsVUFBVCxJQUF1QixFQUFFLGNBQUYsRUFBVSxnQkFBVixFQUFtQixnQkFBbkIsRUFBNEIsY0FBNUIsRUFBdkI7QUFDSCxTQUZhLENBQWQ7O0FBSUQsWUFBSSxnQkFBSjtBQUFBLFlBQWEsZ0JBQWdCLEVBQTdCOztBQUVDLFlBQUksV0FBVyxRQUFRLE1BQVIsS0FBbUIsQ0FBOUIsSUFBbUMsUUFBUSxDQUFSLGFBQXNCLGFBQWEsaUJBQTFFLEVBQTZGO0FBQ3pGLDRCQUFnQixRQUFRLENBQVIsRUFBVyxhQUEzQjtBQUNBLHNCQUFVLFFBQVEsQ0FBUixFQUFXLEtBQXJCO0FBQ0g7O0FBRUQsa0JBQVU7QUFDTixrQkFBTSxhQURBLEVBQ2tCO0FBQ3hCLGtDQUZNLEVBRWtCO0FBQ3hCLDBCQUhNLEVBR2tCO0FBQ3hCLDRCQUpNLENBSWtCO0FBSmxCLFNBQVY7O0FBT0Esa0JBQVUsWUFBWSxPQUFaLEVBQXFCLGFBQXJCLENBQVY7QUFDQSxhQUFLLFdBQUwsQ0FBaUIsT0FBakIsRUFBMEIsY0FBYyxHQUFkLENBQWtCO0FBQUEsbUJBQUssRUFBRSxNQUFQO0FBQUEsU0FBbEIsQ0FBMUI7QUFDQSwwQkFBa0IsYUFBbEI7QUFDQSxZQUFJLGNBQWMsTUFBZCxHQUF1QixDQUEzQixFQUE4QjtBQUMxQiwrQkFBSSxPQUFKLFNBQWlCLE1BQWpCLHVCQUF3QyxjQUFjLE1BQXREO0FBQ0g7O0FBRUQ7QUFDQSxlQUFPLE9BQVA7QUFDSCxLQTdCRDs7QUErQkEsU0FBSyxnQkFBTCxDQUFzQixTQUF0QixFQUFpQyxTQUFTLCtCQUFULENBQXlDLEtBQXpDLEVBQWdEO0FBQzdFLFlBQUksT0FBTyxZQUFZLE1BQU0sSUFBbEIsQ0FBWDtBQUNBLFlBQUksS0FBSyxLQUFLLFVBQWQ7O0FBRUE7QUFDQSxZQUFJLEtBQUssSUFBTCxLQUFjLFlBQWxCLEVBQWdDO0FBQzVCO0FBQ0EsZ0JBQUksU0FBUyxFQUFULENBQUosRUFBa0I7QUFDZCxvQkFBSSxLQUFLLEtBQVQsRUFBZ0I7QUFDWiw2QkFBUyxFQUFULEVBQWEsTUFBYixDQUFvQixLQUFLLEtBQXpCO0FBQ0gsaUJBRkQsTUFHSztBQUNELDZCQUFTLEVBQVQsRUFBYSxPQUFiLENBQXFCLEtBQUssT0FBMUI7QUFDSDtBQUNELHVCQUFPLFNBQVMsRUFBVCxDQUFQO0FBQ0g7QUFDSjtBQUNEO0FBQ0E7QUFiQSxhQWNLLElBQUksS0FBSyxJQUFMLEtBQWMsV0FBZCxJQUE2QixNQUFNLElBQXZDLEVBQTZDO0FBQUEsb0JBRXpDLFdBRnlDLEVBRTVCLE1BRjRCO0FBQUEsb0JBTzFDLE1BUDBDO0FBQUEsb0JBYTFDLE1BYjBDLEVBYWxDLEtBYmtDOztBQUFBO0FBQUEsdUNBRWxCLFdBQVcsS0FBSyxNQUFoQixDQUZrQjtBQUM5Qzs7O0FBRDhDOztBQUV6QywrQkFGeUM7QUFFNUIsMEJBRjRCOztBQUc5Qyx3QkFBSSxDQUFDLE1BQUwsRUFBYTtBQUNULDhCQUFNLHlEQUF1RCxLQUFLLE1BQTVELG1CQUFnRixLQUFLLE1BQXJGLG9FQUFOO0FBQ0g7O0FBRUcsNkJBQVUsT0FBTyxPQUFPLFdBQVAsQ0FBUCxLQUErQixVQUFoQyxJQUErQyxPQUFPLFdBQVAsQ0FQZDs7O0FBUzlDLHdCQUFJLENBQUMsTUFBTCxFQUFhO0FBQ1QsOEJBQU0seURBQXVELEtBQUssTUFBNUQsa0RBQU47QUFDSDs7QUFHRCx3QkFBSTtBQUNBLGlDQUFTLE9BQU8sS0FBUCxDQUFhLE1BQWIsRUFBcUIsS0FBSyxPQUExQixDQUFUO0FBQ0gscUJBRkQsQ0FHQSxPQUFNLENBQU4sRUFBUztBQUNMO0FBQ0EsZ0NBQVEsQ0FBUjtBQUNIOztBQUVEO0FBQ0Esd0JBQUksZ0JBQUo7QUFBQSx3QkFBYSxnQkFBZ0IsRUFBN0I7O0FBRUE7QUFDQSx3QkFBSSxrQkFBa0IsT0FBdEIsRUFBK0I7QUFDM0IsK0JBQU8sSUFBUCxDQUFZLFVBQUMsS0FBRCxFQUFXO0FBQ25CLGdDQUFJLGlCQUFpQixhQUFhLGlCQUFsQyxFQUFxRDtBQUNqRCxnREFBZ0IsTUFBTSxhQUF0QjtBQUNBLHdDQUFRLE1BQU0sS0FBTixDQUFZLENBQVosQ0FBUjtBQUNIOztBQUVELHNDQUFVO0FBQ04sc0NBQU0sY0FEQTtBQUVOLDRDQUFZLEVBRk47QUFHTix5Q0FBUztBQUhILDZCQUFWO0FBS0Esc0NBQVUsWUFBWSxPQUFaLEVBQXFCLGFBQXJCLENBQVY7QUFDQSxpQ0FBSyxXQUFMLENBQWlCLE9BQWpCLEVBQTBCLGNBQWMsR0FBZCxDQUFrQjtBQUFBLHVDQUFLLEVBQUUsTUFBUDtBQUFBLDZCQUFsQixDQUExQjtBQUNBLDhDQUFrQixhQUFsQjtBQUNBLGdDQUFJLGNBQWMsTUFBZCxHQUF1QixDQUEzQixFQUE4QjtBQUMxQixtREFBSSxPQUFKLFNBQWlCLFdBQWpCLHVCQUE2QyxjQUFjLE1BQTNEO0FBQ0g7QUFDSix5QkFqQkQsRUFpQkcsVUFBQyxLQUFELEVBQVc7QUFDVixpQ0FBSyxXQUFMLENBQWlCO0FBQ2Isc0NBQU0sY0FETztBQUViLDRDQUFZLEVBRkM7QUFHYix1Q0FBUSxpQkFBaUIsS0FBakIsR0FBNEIsTUFBTSxPQUFsQyxVQUE4QyxNQUFNLEtBQXBELEdBQThEO0FBSHpELDZCQUFqQjtBQUtILHlCQXZCRDtBQXdCSDtBQUNEO0FBMUJBLHlCQTJCSztBQUNELGdDQUFJLGtCQUFrQixhQUFhLGlCQUFuQyxFQUFzRDtBQUNsRCxnREFBZ0IsT0FBTyxhQUF2QjtBQUNBLHlDQUFTLE9BQU8sS0FBUCxDQUFhLENBQWIsQ0FBVDtBQUNIOztBQUVELHNDQUFVO0FBQ04sc0NBQU0sY0FEQTtBQUVOLDRDQUFZLEVBRk47QUFHTix5Q0FBUyxNQUhIO0FBSU4sdUNBQVEsaUJBQWlCLEtBQWpCLEdBQTRCLE1BQU0sT0FBbEMsVUFBOEMsTUFBTSxLQUFwRCxHQUE4RDtBQUpoRSw2QkFBVjtBQU1BLHNDQUFVLFlBQVksT0FBWixFQUFxQixhQUFyQixDQUFWO0FBQ0EsaUNBQUssV0FBTCxDQUFpQixPQUFqQixFQUEwQixjQUFjLEdBQWQsQ0FBa0I7QUFBQSx1Q0FBSyxFQUFFLE1BQVA7QUFBQSw2QkFBbEIsQ0FBMUI7QUFDQSw4Q0FBa0IsYUFBbEI7QUFDQSxnQ0FBSSxjQUFjLE1BQWQsR0FBdUIsQ0FBM0IsRUFBOEI7QUFDMUIsbURBQUksT0FBSixTQUFpQixXQUFqQix1QkFBNkMsY0FBYyxNQUEzRDtBQUNIO0FBQ0o7QUF2RTZDO0FBd0VqRDtBQUNKLEtBNUZEO0FBOEZIOztBQUVEO0FBQ0EsYUFBYSxpQkFBYixHQUFpQyxZQUFvQjtBQUFBLHVDQUFQLEtBQU87QUFBUCxhQUFPO0FBQUE7O0FBQ2pELFFBQUksRUFBRSxnQkFBZ0IsYUFBYSxpQkFBL0IsQ0FBSixFQUF1RDtBQUNuRCxrREFBVyxhQUFhLGlCQUF4QixnQkFBNkMsS0FBN0M7QUFDSDs7QUFFRCxTQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0EsU0FBSyxhQUFMLEdBQXFCLGtCQUFrQixLQUFLLEtBQXZCLENBQXJCO0FBQ0gsQ0FQRDs7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGlCQUFULENBQTJCLE1BQTNCLEVBQThFO0FBQUEsUUFBM0MsTUFBMkMsdUVBQWxDLElBQWtDO0FBQUEsUUFBNUIsUUFBNEIsdUVBQWpCLElBQWlCO0FBQUEsUUFBWCxJQUFXLHVFQUFKLEVBQUk7O0FBQzFFLFFBQUksQ0FBQyxNQUFMLEVBQWE7QUFDUixlQUFPLElBQVA7QUFDSjs7QUFFRCxRQUFJLE1BQU0sT0FBTixDQUFjLE1BQWQsQ0FBSixFQUEyQjtBQUN2QjtBQUNBLGVBQU8sT0FBUCxDQUFlLFVBQUMsQ0FBRCxFQUFJLENBQUo7QUFBQSxtQkFBVSxrQkFBa0IsQ0FBbEIsRUFBcUIsTUFBckIsRUFBNkIsQ0FBN0IsRUFBZ0MsSUFBaEMsQ0FBVjtBQUFBLFNBQWY7QUFDSCxLQUhELE1BSUssSUFBSSxRQUFPLE1BQVAseUNBQU8sTUFBUCxPQUFrQixRQUF0QixFQUFnQztBQUNqQztBQUNBLFlBQUksa0JBQWtCLFdBQXRCLEVBQW1DO0FBQy9CLGlCQUFLLElBQUwsQ0FBVSxFQUFFLFFBQVEsTUFBVixFQUFrQixjQUFsQixFQUEwQixrQkFBMUIsRUFBVjtBQUNIO0FBQ0Q7QUFIQSxhQUlLLElBQUksT0FBTyxNQUFQLFlBQXlCLFdBQTdCLEVBQTBDO0FBQzNDLHFCQUFLLElBQUwsQ0FBVSxFQUFFLFFBQVEsT0FBTyxNQUFqQixFQUF5QixjQUF6QixFQUFpQyxrQkFBakMsRUFBVjtBQUNIO0FBQ0Q7QUFISyxpQkFJQTtBQUNELHlCQUFLLElBQUksSUFBVCxJQUFpQixNQUFqQixFQUF5QjtBQUNyQiwwQ0FBa0IsT0FBTyxJQUFQLENBQWxCLEVBQWdDLE1BQWhDLEVBQXdDLElBQXhDLEVBQThDLElBQTlDO0FBQ0g7QUFDSjtBQUNKO0FBQ0QsV0FBTyxJQUFQO0FBQ0g7O0FBRUQ7QUFDQSxTQUFTLGlCQUFULENBQTJCLGFBQTNCLEVBQTBDO0FBQ3RDLFFBQUksQ0FBQyxNQUFNLE9BQU4sQ0FBYyxhQUFkLENBQUwsRUFBbUM7QUFDL0I7QUFDSDtBQUNELGtCQUFjLE1BQWQsQ0FBcUI7QUFBQSxlQUFLLEVBQUUsTUFBRixJQUFZLEVBQUUsUUFBbkI7QUFBQSxLQUFyQixFQUFrRCxPQUFsRCxDQUEwRDtBQUFBLGVBQUssT0FBTyxFQUFFLE1BQUYsQ0FBUyxFQUFFLFFBQVgsQ0FBWjtBQUFBLEtBQTFEO0FBQ0g7O0FBRUQ7QUFDQSxTQUFTLFdBQVQsQ0FBc0IsT0FBdEIsRUFBK0IsYUFBL0IsRUFBOEM7QUFDMUMsUUFBSSxjQUFjLE1BQWQsS0FBeUIsQ0FBN0IsRUFBZ0M7QUFDNUIsa0JBQVUsS0FBSyxTQUFMLENBQWUsT0FBZixDQUFWO0FBQ0g7QUFDRCxXQUFPLE9BQVA7QUFDSDs7QUFFRDtBQUNBLFNBQVMsV0FBVCxDQUFzQixJQUF0QixFQUE0QjtBQUN4QixXQUFRLE9BQU8sSUFBUCxLQUFnQixRQUFoQixHQUEyQixLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQTNCLEdBQThDLElBQXREO0FBQ0g7O0FBRUQ7QUFDQSxJQUFJLGlCQUFPLE9BQVgsRUFBb0I7QUFDaEI7QUFDSDs7QUFFRCxJQUFJLGlCQUFPLFNBQVgsRUFBc0I7QUFDbEI7QUFDSDs7Ozs7Ozs7Ozs7QUN4ZkQ7O0FBRUEsSUFBSSxNQUFKO2tCQUNlLFNBQVMsRTs7O0FBRXhCLE9BQU8sR0FBUCxHQUFhLFVBQVUsQ0FBVixFQUFhO0FBQ3RCLFFBQUksSUFBSSxFQUFSO0FBQ0EsUUFBSSxNQUFNLEVBQUUsTUFBWjtBQUNBLFNBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxHQUFwQixFQUF5QixHQUF6QixFQUE4QjtBQUMxQixVQUFFLENBQUYsSUFBTyxFQUFFLENBQUYsQ0FBUDtBQUNIO0FBQ0QsV0FBTyxDQUFQO0FBQ0gsQ0FQRDs7QUFTQSxPQUFPLEdBQVAsR0FBYSxVQUFVLENBQVYsRUFBYTtBQUN0QixRQUFJLElBQUksRUFBUjtBQUNBLFFBQUksTUFBTSxFQUFFLE1BQVo7QUFDQSxTQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksR0FBcEIsRUFBeUIsR0FBekIsRUFBOEI7QUFDMUIsVUFBRSxDQUFGLElBQU8sRUFBRSxDQUFGLElBQU8sQ0FBQyxDQUFmO0FBQ0g7QUFDRCxXQUFPLENBQVA7QUFDSCxDQVBEOztBQVNBO0FBQ0EsT0FBTyxHQUFQLEdBQWEsVUFBVSxFQUFWLEVBQWMsRUFBZCxFQUFrQjtBQUMzQixRQUFJLElBQUksRUFBUjtBQUNBLFFBQUksTUFBTSxLQUFLLEdBQUwsQ0FBUyxHQUFHLE1BQVosRUFBbUIsR0FBRyxNQUF0QixDQUFWO0FBQ0EsU0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEdBQXBCLEVBQXlCLEdBQXpCLEVBQThCO0FBQzFCLFVBQUUsQ0FBRixJQUFPLEdBQUcsQ0FBSCxJQUFRLEdBQUcsQ0FBSCxDQUFmO0FBQ0g7QUFDRCxXQUFPLENBQVA7QUFDSCxDQVBEOztBQVNBO0FBQ0EsT0FBTyxHQUFQLEdBQWEsVUFBVSxFQUFWLEVBQWMsRUFBZCxFQUFrQjtBQUMzQixRQUFJLElBQUksRUFBUjtBQUNBLFFBQUksTUFBTSxLQUFLLEdBQUwsQ0FBUyxHQUFHLE1BQVosRUFBbUIsR0FBRyxNQUF0QixDQUFWOztBQUVBLFNBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxHQUFwQixFQUF5QixHQUF6QixFQUE4QjtBQUMxQixVQUFFLENBQUYsSUFBTyxHQUFHLENBQUgsSUFBUSxHQUFHLENBQUgsQ0FBZjtBQUNIO0FBQ0QsV0FBTyxDQUFQO0FBQ0gsQ0FSRDs7QUFVQSxPQUFPLFdBQVAsR0FBcUIsVUFBVSxFQUFWLEVBQWMsRUFBZCxFQUFrQixFQUFsQixFQUFzQjtBQUN2QyxXQUFPLENBQUMsR0FBRyxDQUFILElBQU0sR0FBRyxDQUFILENBQVAsS0FBZSxHQUFHLENBQUgsSUFBTSxHQUFHLENBQUgsQ0FBckIsSUFBOEIsQ0FBQyxHQUFHLENBQUgsSUFBTSxHQUFHLENBQUgsQ0FBUCxLQUFlLEdBQUcsQ0FBSCxJQUFNLEdBQUcsQ0FBSCxDQUFyQixDQUFyQztBQUNILENBRkQ7O0FBSUE7QUFDQSxPQUFPLElBQVAsR0FBYyxVQUFVLEVBQVYsRUFBYyxFQUFkLEVBQWtCO0FBQzVCLFFBQUksSUFBSSxFQUFSO0FBQUEsUUFDSSxNQUFNLEdBQUcsTUFEYjtBQUFBLFFBRUksQ0FGSjs7QUFJQSxRQUFJLE9BQU8sRUFBUCxLQUFjLFFBQWxCLEVBQTRCO0FBQ3hCO0FBQ0EsYUFBSyxJQUFJLENBQVQsRUFBWSxJQUFJLEdBQWhCLEVBQXFCLEdBQXJCLEVBQTBCO0FBQ3RCLGNBQUUsQ0FBRixJQUFPLEdBQUcsQ0FBSCxJQUFRLEVBQWY7QUFDSDtBQUNKLEtBTEQsTUFNSztBQUNEO0FBQ0EsY0FBTSxLQUFLLEdBQUwsQ0FBUyxHQUFHLE1BQVosRUFBbUIsR0FBRyxNQUF0QixDQUFOO0FBQ0EsYUFBSyxJQUFJLENBQVQsRUFBWSxJQUFJLEdBQWhCLEVBQXFCLEdBQXJCLEVBQTBCO0FBQ3RCLGNBQUUsQ0FBRixJQUFPLEdBQUcsQ0FBSCxJQUFRLEdBQUcsQ0FBSCxDQUFmO0FBQ0g7QUFDSjtBQUNELFdBQU8sQ0FBUDtBQUNILENBbkJEOztBQXFCQTtBQUNBLE9BQU8sR0FBUCxHQUFhLFVBQVUsRUFBVixFQUFjLEVBQWQsRUFBa0I7QUFDM0IsUUFBSSxJQUFJLEVBQVI7QUFBQSxRQUNJLENBREo7QUFFQSxRQUFHLE9BQU8sRUFBUCxLQUFjLFFBQWpCLEVBQTBCO0FBQ3RCO0FBQ0EsYUFBSyxJQUFJLENBQVQsRUFBWSxJQUFJLEdBQUcsTUFBbkIsRUFBMkIsR0FBM0IsRUFBK0I7QUFDM0IsY0FBRSxDQUFGLElBQU8sR0FBRyxDQUFILElBQVEsRUFBZjtBQUNIO0FBQ0osS0FMRCxNQUtPO0FBQ0g7QUFDQSxZQUFJLE1BQU0sS0FBSyxHQUFMLENBQVMsR0FBRyxNQUFaLEVBQW1CLEdBQUcsTUFBdEIsQ0FBVjtBQUNBLGFBQUssSUFBSSxDQUFULEVBQVksSUFBSSxHQUFoQixFQUFxQixHQUFyQixFQUEwQjtBQUN0QixjQUFFLENBQUYsSUFBTyxHQUFHLENBQUgsSUFBUSxHQUFHLENBQUgsQ0FBZjtBQUNIO0FBQ0o7QUFDRCxXQUFPLENBQVA7QUFDSCxDQWhCRDs7QUFrQkE7QUFDQSxPQUFPLElBQVAsR0FBYyxVQUFVLEVBQVYsRUFBYyxFQUFkLEVBQWtCO0FBQzVCLFdBQU8sQ0FBRSxHQUFHLENBQUgsSUFBUSxHQUFHLENBQUgsQ0FBVixFQUNFLEdBQUcsQ0FBSCxJQUFRLEdBQUcsQ0FBSCxDQURWLENBQVA7QUFFSCxDQUhEOztBQUtBO0FBQ0EsT0FBTyxHQUFQLEdBQWEsVUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQjtBQUN6QixRQUFJLElBQUksS0FBSyxHQUFMLENBQVMsQ0FBVCxDQUFSO0FBQ0EsUUFBSSxJQUFJLEtBQUssR0FBTCxDQUFTLENBQVQsQ0FBUjtBQUNBLFdBQU8sQ0FBQyxFQUFFLENBQUYsSUFBTyxDQUFQLEdBQVcsRUFBRSxDQUFGLElBQU8sQ0FBbkIsRUFDQyxFQUFFLENBQUYsSUFBTyxDQUFQLEdBQVcsRUFBRSxDQUFGLElBQU8sQ0FEbkIsQ0FBUDtBQUVILENBTEQ7O0FBT0E7QUFDQSxPQUFPLEtBQVAsR0FBZSxnQkFBa0I7QUFBQTtBQUFBLFFBQVAsQ0FBTztBQUFBLFFBQUosQ0FBSTs7QUFDN0IsV0FBTyxLQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWEsQ0FBYixDQUFQO0FBQ0gsQ0FGRDs7QUFJQTtBQUNBLE9BQU8sWUFBUCxHQUFzQixVQUFTLENBQVQsRUFBWSxDQUFaLEVBQWM7QUFDaEMsUUFBSSxRQUFRLE9BQU8sR0FBUCxDQUFXLENBQVgsRUFBYyxDQUFkLENBQVo7QUFDQSxRQUFJLFFBQVEsQ0FBQyxDQUFiLEVBQWdCO0FBQ1osZ0JBQVEsQ0FBQyxDQUFUO0FBQ0g7QUFDRCxXQUFPLEtBQUssSUFBTCxDQUFVLEtBQVYsQ0FBUDtBQUNILENBTkQ7O0FBUUE7QUFDQSxPQUFPLE9BQVAsR0FBaUIsVUFBVSxFQUFWLEVBQWMsRUFBZCxFQUFrQjtBQUMvQixRQUFJLE1BQU0sR0FBRyxNQUFiO0FBQ0EsU0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEdBQXBCLEVBQXlCLEdBQXpCLEVBQThCO0FBQzFCLFlBQUksR0FBRyxDQUFILE1BQVUsR0FBRyxDQUFILENBQWQsRUFBb0I7QUFDaEIsbUJBQU8sS0FBUDtBQUNIO0FBQ0o7QUFDRCxXQUFPLElBQVA7QUFDSCxDQVJEOztBQVVBO0FBQ0EsT0FBTyxRQUFQLEdBQWtCLFVBQVUsQ0FBVixFQUFhO0FBQzNCLFFBQUksRUFBRSxNQUFGLEtBQWEsQ0FBakIsRUFBb0I7QUFDaEIsZUFBUSxFQUFFLENBQUYsSUFBSyxFQUFFLENBQUYsQ0FBTCxHQUFZLEVBQUUsQ0FBRixJQUFLLEVBQUUsQ0FBRixDQUF6QjtBQUNILEtBRkQsTUFHSyxJQUFJLEVBQUUsTUFBRixJQUFZLENBQWhCLEVBQW1CO0FBQ3BCLGVBQVEsRUFBRSxDQUFGLElBQUssRUFBRSxDQUFGLENBQUwsR0FBWSxFQUFFLENBQUYsSUFBSyxFQUFFLENBQUYsQ0FBakIsR0FBd0IsRUFBRSxDQUFGLElBQUssRUFBRSxDQUFGLENBQXJDO0FBQ0g7QUFDRCxXQUFPLENBQVA7QUFDSCxDQVJEOztBQVVBO0FBQ0EsT0FBTyxNQUFQLEdBQWdCLFVBQVUsQ0FBVixFQUFhO0FBQ3pCLFdBQU8sS0FBSyxJQUFMLENBQVUsT0FBTyxRQUFQLENBQWdCLENBQWhCLENBQVYsQ0FBUDtBQUNILENBRkQ7O0FBSUE7QUFDQSxPQUFPLFNBQVAsR0FBbUIsVUFBVSxDQUFWLEVBQWE7QUFDNUIsUUFBSSxDQUFKO0FBQ0EsUUFBSSxFQUFFLE1BQUYsS0FBYSxDQUFqQixFQUFvQjtBQUNoQixZQUFJLEVBQUUsQ0FBRixJQUFLLEVBQUUsQ0FBRixDQUFMLEdBQVksRUFBRSxDQUFGLElBQUssRUFBRSxDQUFGLENBQXJCO0FBQ0EsWUFBSSxLQUFLLElBQUwsQ0FBVSxDQUFWLENBQUo7O0FBRUEsWUFBSSxNQUFNLENBQVYsRUFBYTtBQUNULG1CQUFPLENBQUMsRUFBRSxDQUFGLElBQU8sQ0FBUixFQUFXLEVBQUUsQ0FBRixJQUFPLENBQWxCLENBQVA7QUFDSDtBQUNELGVBQU8sQ0FBQyxDQUFELEVBQUksQ0FBSixDQUFQO0FBQ0gsS0FSRCxNQVFPLElBQUksRUFBRSxNQUFGLElBQVksQ0FBaEIsRUFBbUI7QUFDdEIsWUFBSSxFQUFFLENBQUYsSUFBSyxFQUFFLENBQUYsQ0FBTCxHQUFZLEVBQUUsQ0FBRixJQUFLLEVBQUUsQ0FBRixDQUFqQixHQUF3QixFQUFFLENBQUYsSUFBSyxFQUFFLENBQUYsQ0FBakM7QUFDQSxZQUFJLEtBQUssSUFBTCxDQUFVLENBQVYsQ0FBSjs7QUFFQSxZQUFJLE1BQU0sQ0FBVixFQUFhO0FBQ1QsbUJBQU8sQ0FBQyxFQUFFLENBQUYsSUFBTyxDQUFSLEVBQVcsRUFBRSxDQUFGLElBQU8sQ0FBbEIsRUFBcUIsRUFBRSxDQUFGLElBQU8sQ0FBNUIsQ0FBUDtBQUNIO0FBQ0o7QUFDRCxXQUFPLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLENBQVA7QUFDSCxDQW5CRDs7QUFxQkE7QUFDQSxPQUFPLEtBQVAsR0FBZ0IsVUFBVSxFQUFWLEVBQWMsRUFBZCxFQUFrQjtBQUM5QixXQUFPLENBQ0YsR0FBRyxDQUFILElBQVEsR0FBRyxDQUFILENBQVQsR0FBbUIsR0FBRyxDQUFILElBQVEsR0FBRyxDQUFILENBRHhCLEVBRUYsR0FBRyxDQUFILElBQVEsR0FBRyxDQUFILENBQVQsR0FBbUIsR0FBRyxDQUFILElBQVEsR0FBRyxDQUFILENBRnhCLEVBR0YsR0FBRyxDQUFILElBQVEsR0FBRyxDQUFILENBQVQsR0FBbUIsR0FBRyxDQUFILElBQVEsR0FBRyxDQUFILENBSHhCLENBQVA7QUFLSCxDQU5EOztBQVFBO0FBQ0EsT0FBTyxHQUFQLEdBQWEsVUFBVSxFQUFWLEVBQWMsRUFBZCxFQUFrQjtBQUMzQixRQUFJLElBQUksQ0FBUjtBQUNBLFFBQUksTUFBTSxLQUFLLEdBQUwsQ0FBUyxHQUFHLE1BQVosRUFBb0IsR0FBRyxNQUF2QixDQUFWO0FBQ0EsU0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEdBQXBCLEVBQXlCLEdBQXpCLEVBQThCO0FBQzFCLGFBQUssR0FBRyxDQUFILElBQVEsR0FBRyxDQUFILENBQWI7QUFDSDtBQUNELFdBQU8sQ0FBUDtBQUNILENBUEQ7Ozs7Ozs7Ozs7Ozs7O0FDaExBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7QUFFTyxJQUFNLGtEQUFxQixHQUEzQjs7SUFFYyxJO0FBRWpCLGtCQUFhLEtBQWIsRUFBb0IsT0FBcEIsRUFBNkI7QUFBQTs7QUFDekIsaUNBQWUsSUFBZjs7QUFFQSxhQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0EsYUFBSyxjQUFMOztBQUVBLGFBQUssSUFBTCxHQUFZLElBQVo7QUFDQSxhQUFLLE1BQUwsR0FBYyxJQUFkO0FBQ0EsYUFBSyxNQUFMLEdBQWMsSUFBZDtBQUNBLGFBQUssZ0JBQUwsR0FBd0IsSUFBeEI7O0FBRUEsYUFBSyxPQUFMLEdBQWUsS0FBZjtBQUNBLGFBQUssZUFBTCxHQUF1QixDQUF2QjtBQUNBLGFBQUssY0FBTCxHQUFzQixDQUF0QjtBQUNBLGFBQUssT0FBTCxHQUFlLEtBQWY7QUFDQSxhQUFLLGNBQUwsR0FBc0IsQ0FBdEI7O0FBRUE7QUFDQSxhQUFLLElBQUwsR0FBWTtBQUNSLGlCQUFLLEVBREc7QUFFUixvQkFBUSxFQUZBO0FBR1Isb0JBQVE7QUFIQSxTQUFaO0FBS0EsYUFBSyxNQUFMLEdBQWMsSUFBZDs7QUFFQSxhQUFLLE1BQUwsR0FBYyxDQUFkO0FBQ0EsYUFBSyxlQUFMLEdBQXdCLE9BQU8sUUFBUSxjQUFmLEtBQWtDLFNBQW5DLEdBQWdELFFBQVEsY0FBeEQsR0FBeUUsSUFBaEc7QUFDQSxhQUFLLHlCQUFMLEdBQWlDLENBQWpDLENBM0J5QixDQTJCVztBQUNwQyxhQUFLLDBCQUFMLEdBQWtDLENBQWxDOztBQUVBLGFBQUssS0FBTDtBQUNIOztBQUVEOzs7OztnQ0FDUztBQUNMLGlCQUFLLFlBQUw7QUFDSDs7QUFFRDs7Ozt1Q0FDZ0I7QUFDWixnQkFBSSxnQkFBZ0IsS0FBSyxlQUFMLEVBQXBCO0FBQ0EsZ0JBQUksYUFBSixFQUFtQjtBQUNmLHFCQUFLLE1BQUwsR0FBYyxpQkFBTyxNQUFQLENBQWMsYUFBZCxFQUE2QixJQUE3QixFQUFtQyxLQUFLLEtBQUwsQ0FBVyxNQUFYLENBQWtCLE9BQWxCLENBQTBCLGFBQTFCLENBQW5DLENBQWQ7QUFDQSxxQkFBSyxNQUFMLENBQVksVUFBWjtBQUNIO0FBQ0o7O0FBRUQ7Ozs7MENBQ21CO0FBQ2YsZ0JBQUksS0FBSyxLQUFMLENBQVcsTUFBWCxJQUFxQixLQUFLLEtBQUwsQ0FBVyxNQUFYLENBQWtCLE9BQTNDLEVBQW9EO0FBQ2hELHFCQUFLLElBQUksSUFBVCxJQUFpQixLQUFLLEtBQUwsQ0FBVyxNQUFYLENBQWtCLE9BQW5DLEVBQTRDO0FBQ3hDLHdCQUFJLEtBQUssS0FBTCxDQUFXLE1BQVgsQ0FBa0IsT0FBbEIsQ0FBMEIsSUFBMUIsRUFBZ0MsTUFBcEMsRUFBNEM7QUFDeEMsK0JBQU8sSUFBUDtBQUNIO0FBQ0o7O0FBRUQ7QUFDQSxvQkFBSSxPQUFPLE9BQU8sSUFBUCxDQUFZLEtBQUssS0FBTCxDQUFXLE1BQVgsQ0FBa0IsT0FBOUIsQ0FBWDtBQUNBLHVCQUFPLEtBQUssTUFBTCxJQUFlLEtBQUssQ0FBTCxDQUF0QjtBQUNIO0FBQ0o7O0FBRUQ7Ozs7d0NBQ2lCLEksRUFBTTtBQUNuQixnQkFBSSxPQUFPLEtBQUssZUFBTCxFQUFYO0FBQ0EsZ0JBQUksS0FBSyxLQUFMLENBQVcsTUFBWCxDQUFrQixPQUFsQixDQUEwQixJQUExQixDQUFKLEVBQXFDO0FBQ2pDLHFCQUFLLEtBQUwsQ0FBVyxNQUFYLENBQWtCLE9BQWxCLENBQTBCLElBQTFCLEVBQWdDLE1BQWhDLEdBQXlDLElBQXpDOztBQUVBO0FBQ0Esb0JBQUksUUFBUSxTQUFTLElBQWpCLElBQXlCLEtBQUssS0FBTCxDQUFXLE1BQVgsQ0FBa0IsT0FBbEIsQ0FBMEIsSUFBMUIsQ0FBN0IsRUFBOEQ7QUFDMUQsMkJBQU8sS0FBSyxLQUFMLENBQVcsTUFBWCxDQUFrQixPQUFsQixDQUEwQixJQUExQixFQUFnQyxNQUF2QztBQUNIO0FBQ0o7O0FBRUQsaUJBQUssS0FBTCxDQUFXLFlBQVgsQ0FBd0IsRUFBRSxTQUFTLEtBQVgsRUFBeEI7QUFDQSxtQkFBTyxLQUFLLGVBQUwsRUFBUDtBQUNIOztBQUVEOzs7O2lDQUNVO0FBQ04saUJBQUssTUFBTCxDQUFZLE1BQVo7QUFDQSxpQkFBSyxjQUFMLEdBQXNCLENBQUUsQ0FBQyxJQUFJLElBQUosRUFBRixHQUFnQixLQUFLLGVBQXRCLElBQXlDLElBQS9EO0FBQ0g7O0FBRUQ7Ozs7d0NBQ2lCLEssRUFBTyxNLEVBQVE7QUFDNUIsaUJBQUssSUFBTCxDQUFVLEdBQVYsR0FBZ0IsRUFBRSxZQUFGLEVBQVMsY0FBVCxFQUFoQjtBQUNBLGlCQUFLLElBQUwsQ0FBVSxNQUFWLEdBQW1CO0FBQ2YsdUJBQU8sS0FBSyxLQUFMLENBQVcsS0FBSyxJQUFMLENBQVUsR0FBVixDQUFjLEtBQWQsR0FBc0IsZ0JBQU0sa0JBQXZDLENBRFE7QUFFZix3QkFBUSxLQUFLLEtBQUwsQ0FBVyxLQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsTUFBZCxHQUF1QixnQkFBTSxrQkFBeEM7QUFGTyxhQUFuQjtBQUlBLGlCQUFLLE1BQUwsR0FBYyxLQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsS0FBZCxHQUFzQixLQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsTUFBbEQ7QUFDQSxpQkFBSyxZQUFMO0FBQ0g7O0FBRUQ7Ozs7a0NBQ2tDO0FBQUEsMkZBQUosRUFBSTtBQUFBLGdCQUF2QixHQUF1QixRQUF2QixHQUF1QjtBQUFBLGdCQUFsQixHQUFrQixRQUFsQixHQUFrQjtBQUFBLGdCQUFiLElBQWEsUUFBYixJQUFhOztBQUM5QixnQkFBSSxVQUFVLEtBQWQ7O0FBRUE7QUFDQSxnQkFBSSxPQUFPLEdBQVAsS0FBZSxRQUFmLElBQTJCLE9BQU8sR0FBUCxLQUFlLFFBQTlDLEVBQXdEO0FBQ3BELG9CQUFJLENBQUMsS0FBSyxNQUFOLElBQWdCLFFBQVEsS0FBSyxNQUFMLENBQVksR0FBcEMsSUFBMkMsUUFBUSxLQUFLLE1BQUwsQ0FBWSxHQUFuRSxFQUF3RTtBQUNwRSw4QkFBVSxJQUFWO0FBQ0EseUJBQUssTUFBTCxHQUFjLEVBQUUsS0FBSyxjQUFJLE9BQUosQ0FBWSxHQUFaLENBQVAsRUFBeUIsUUFBekIsRUFBZDtBQUNIO0FBQ0o7O0FBRUQ7QUFDQSxnQkFBSSxPQUFPLElBQVAsS0FBZ0IsUUFBaEIsSUFBNEIsU0FBUyxLQUFLLElBQTlDLEVBQW9EO0FBQ2hELDBCQUFVLElBQVY7QUFDQSxxQkFBSyxPQUFMLENBQWEsSUFBYjtBQUNIOztBQUVELGdCQUFJLE9BQUosRUFBYTtBQUNULHFCQUFLLFlBQUw7QUFDSDtBQUNELG1CQUFPLE9BQVA7QUFDSDs7O2dDQUVRLEksRUFBTTtBQUNYLGdCQUFJLEtBQUssT0FBVCxFQUFrQjtBQUNkLHFCQUFLLE9BQUwsR0FBZSxLQUFmO0FBQ0gsYUFGRCxNQUdLO0FBQ0QscUJBQUssU0FBTCxHQUFpQixLQUFLLElBQXRCO0FBQ0g7O0FBRUQsZ0JBQUksaUJBQWlCLEtBQUssU0FBMUI7QUFDQSxnQkFBSSxZQUFZLEtBQUssUUFBTCxDQUFjLElBQWQsQ0FBaEI7QUFDQSxnQkFBSSxDQUFDLEtBQUssZUFBVixFQUEyQjtBQUN2Qix1QkFBTyxTQUFQO0FBQ0g7O0FBRUQsZ0JBQUksY0FBYyxjQUFsQixFQUFrQztBQUM5QixxQkFBSyxjQUFMLEdBQXNCLFlBQVksY0FBWixHQUE2QixDQUE3QixHQUFpQyxDQUFDLENBQXhEO0FBQ0g7O0FBRUQsaUJBQUssU0FBTCxHQUFpQixLQUFLLElBQXRCO0FBQ0EsaUJBQUssSUFBTCxHQUFZLElBQVo7QUFDQSxpQkFBSyxTQUFMLEdBQWlCLFNBQWpCOztBQUVBLGlCQUFLLFlBQUw7QUFDQSxpQkFBSyxLQUFMLENBQVcsYUFBWDtBQUNIOzs7b0NBRVk7QUFDVCxpQkFBSyxTQUFMLEdBQWlCLEtBQUssSUFBdEI7QUFDQSxpQkFBSyxPQUFMLEdBQWUsSUFBZjtBQUNIOztBQUVEOzs7O2lDQUNVLEksRUFBTTtBQUNaLG1CQUFPLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBUDtBQUNIOztBQUVEOzs7O2lDQUNVLFMsRUFBVztBQUNqQixtQkFBTyxLQUFLLFFBQUwsQ0FBYyxTQUFkLElBQTJCLEtBQUsseUJBQXZDO0FBQ0g7O0FBRUQ7Ozs7a0NBQ1csUyxFQUFXO0FBQ2xCLG1CQUFPLEtBQUssUUFBTCxDQUFjLFNBQWQsSUFBMkIsS0FBSyx5QkFBdkM7QUFDSDs7O21DQUVXLE8sRUFBUztBQUNqQixpQkFBSyxPQUFMLEdBQWUsT0FBZjtBQUNBLGdCQUFJLENBQUMsS0FBSyxPQUFWLEVBQW1CO0FBQ2YscUJBQUssZUFBTCxHQUF3QixDQUFDLElBQUksSUFBSixFQUF6QjtBQUNIO0FBQ0o7OztnQ0FFUTtBQUNMO0FBQ0EsZ0JBQUksT0FBTyxLQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsS0FBckIsS0FBK0IsUUFBL0IsSUFDQSxPQUFPLEtBQUssSUFBTCxDQUFVLEdBQVYsQ0FBYyxNQUFyQixLQUFnQyxRQURoQyxJQUVBLEtBQUssTUFBTCxJQUFlLElBRmYsSUFHQSxPQUFPLEtBQUssSUFBWixLQUFxQixRQUh6QixFQUdtQztBQUM5Qix1QkFBTyxLQUFQO0FBQ0o7QUFDRCxtQkFBTyxJQUFQO0FBQ0g7O0FBRUQ7Ozs7dUNBQ2dCO0FBQ1osZ0JBQUksQ0FBQyxLQUFLLEtBQUwsRUFBTCxFQUFtQjtBQUNmO0FBQ0g7O0FBRUQsaUJBQUssZ0JBQUwsR0FBd0IsY0FBSSxjQUFKLENBQW1CLEtBQUssSUFBeEIsQ0FBeEI7O0FBRUE7QUFDQSxpQkFBSyxJQUFMLENBQVUsTUFBVixHQUFtQjtBQUNmLG1CQUFHLEtBQUssSUFBTCxDQUFVLEdBQVYsQ0FBYyxLQUFkLEdBQXNCLEtBQUssZ0JBRGY7QUFFZixtQkFBRyxLQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsTUFBZCxHQUF1QixLQUFLO0FBRmhCLGFBQW5COztBQUtBOztBQWJZLHNDQWNDLGNBQUksY0FBSixDQUFtQixDQUFDLEtBQUssTUFBTCxDQUFZLEdBQWIsRUFBa0IsS0FBSyxNQUFMLENBQVksR0FBOUIsQ0FBbkIsQ0FkRDtBQUFBO0FBQUEsZ0JBY1AsQ0FkTztBQUFBLGdCQWNKLENBZEk7O0FBZVosaUJBQUssTUFBTCxDQUFZLE1BQVosR0FBcUIsRUFBRSxJQUFGLEVBQUssSUFBTCxFQUFyQjs7QUFFQSxpQkFBSyxNQUFMLENBQVksSUFBWixHQUFtQixjQUFJLGFBQUosQ0FBa0IsQ0FBQyxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLENBQXBCLEVBQXVCLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsQ0FBMUMsQ0FBbEIsRUFBZ0UsS0FBSyxTQUFyRSxDQUFuQjs7QUFFQTtBQUNBLGlCQUFLLE1BQUwsR0FBYztBQUNWLG9CQUFJO0FBQ0EsdUJBQUcsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFuQixHQUF1QixLQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLENBQWpCLEdBQXFCLENBRC9DO0FBRUEsdUJBQUcsS0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixDQUFuQixHQUF1QixLQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLENBQWpCLEdBQXFCO0FBRi9DLGlCQURNO0FBS1Ysb0JBQUk7QUFDQSx1QkFBRyxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLENBQW5CLEdBQXVCLEtBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsQ0FBakIsR0FBcUIsQ0FEL0M7QUFFQSx1QkFBRyxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLENBQW5CLEdBQXVCLEtBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsQ0FBakIsR0FBcUI7QUFGL0M7QUFMTSxhQUFkOztBQVdBLGlCQUFLLEtBQUwsQ0FBVyxZQUFYLENBQXdCLGtCQUF4Qjs7QUFFQSxpQkFBSyxPQUFMLENBQWEsTUFBYjtBQUNBLGlCQUFLLEtBQUwsQ0FBVyxhQUFYLEdBbENZLENBa0NnQjtBQUMvQjs7O3FEQUU2QjtBQUMxQixnQkFBSSxDQUFDLEtBQUssTUFBVixFQUFrQjtBQUNkLHVCQUFPLEVBQVA7QUFDSDs7QUFFRCxnQkFBSSxJQUFJLEtBQUssU0FBYjtBQUNBLGdCQUFJLEtBQUssY0FBSSxhQUFKLENBQWtCLENBQUMsS0FBSyxNQUFMLENBQVksRUFBWixDQUFlLENBQWhCLEVBQW1CLEtBQUssTUFBTCxDQUFZLEVBQVosQ0FBZSxDQUFsQyxDQUFsQixFQUF3RCxDQUF4RCxDQUFUO0FBQ0EsZ0JBQUksS0FBSyxjQUFJLGFBQUosQ0FBa0IsQ0FBQyxLQUFLLE1BQUwsQ0FBWSxFQUFaLENBQWUsQ0FBaEIsRUFBbUIsS0FBSyxNQUFMLENBQVksRUFBWixDQUFlLENBQWxDLENBQWxCLEVBQXdELENBQXhELENBQVQ7O0FBRUEsZ0JBQUksU0FBUyxFQUFiO0FBQ0EsaUJBQUssSUFBSSxJQUFJLEdBQUcsQ0FBSCxHQUFPLEtBQUssTUFBekIsRUFBaUMsS0FBSyxHQUFHLENBQUgsR0FBTyxLQUFLLE1BQWxELEVBQTBELEdBQTFELEVBQStEO0FBQzNELHFCQUFLLElBQUksSUFBSSxHQUFHLENBQUgsR0FBTyxLQUFLLE1BQXpCLEVBQWlDLEtBQUssR0FBRyxDQUFILEdBQU8sS0FBSyxNQUFsRCxFQUEwRCxHQUExRCxFQUErRDtBQUMzRCwyQkFBTyxJQUFQLENBQVksZUFBSyxLQUFMLENBQVcsRUFBRSxJQUFGLEVBQUssSUFBTCxFQUFRLElBQVIsRUFBWCxDQUFaO0FBQ0g7QUFDSjtBQUNELG1CQUFPLE1BQVA7QUFDSDs7QUFFRDs7Ozs0Q0FDcUI7QUFBQTs7QUFDakI7QUFDQSxnQkFBSSxDQUFDLEtBQUssS0FBTCxFQUFMLEVBQW1CO0FBQ2Y7QUFDSDs7QUFFRDtBQUNBLGdCQUFJLGVBQWUsQ0FDZixLQUFLLElBQUwsQ0FBVSxDQUFDLEtBQUssS0FBTCxDQUFXLEtBQUssSUFBTCxDQUFVLEdBQVYsQ0FBYyxLQUFkLEdBQXNCLGNBQUksU0FBckMsSUFBa0QsQ0FBbkQsSUFBd0QsQ0FBbEUsQ0FEZSxFQUVmLEtBQUssSUFBTCxDQUFVLENBQUMsS0FBSyxLQUFMLENBQVcsS0FBSyxJQUFMLENBQVUsR0FBVixDQUFjLE1BQWQsR0FBdUIsY0FBSSxTQUF0QyxJQUFtRCxDQUFwRCxJQUF5RCxDQUFuRSxDQUZlLENBQW5COztBQUtBLGlCQUFLLEtBQUwsQ0FBVyxZQUFYLENBQXdCLFdBQXhCLENBQW9DLGdCQUFRO0FBQ3hDO0FBQ0Esb0JBQUksS0FBSyxPQUFMLElBQWdCLEtBQUssU0FBekIsRUFBb0M7QUFDaEMsMkJBQU8sS0FBUDtBQUNIOztBQUVEO0FBQ0Esb0JBQUksS0FBSyxPQUFMLElBQWdCLEtBQUssVUFBTCxLQUFvQixNQUFLLFNBQTdDLEVBQXdEO0FBQ3BELDJCQUFPLElBQVA7QUFDSDs7QUFFRDtBQUNBLG9CQUFJLFFBQVEsS0FBSyxHQUFMLENBQVMsS0FBSyxVQUFMLEdBQWtCLE1BQUssU0FBaEMsQ0FBWjtBQUNBLG9CQUFJLFFBQVEsTUFBSywwQkFBakIsRUFBNkM7QUFDekMsMkJBQU8sSUFBUDtBQUNIOztBQUVEO0FBQ0Esb0JBQUksU0FBUyxlQUFLLGdCQUFMLENBQXNCLEtBQUssTUFBM0IsRUFBbUMsTUFBSyxTQUF4QyxDQUFiOztBQUVBO0FBQ0Esb0JBQUksS0FBSyxHQUFMLENBQVMsT0FBTyxDQUFQLEdBQVcsTUFBSyxNQUFMLENBQVksSUFBWixDQUFpQixDQUFyQyxJQUEwQyxhQUFhLENBQWIsQ0FBMUMsR0FBNEQsTUFBSyxNQUFyRSxFQUE2RTtBQUN6RSx1Q0FBSSxPQUFKLHlCQUFrQyxLQUFLLEdBQXZDLGFBQWtELE9BQU8sQ0FBekQsU0FBOEQsT0FBTyxDQUFyRSxTQUEwRSxNQUFLLFNBQS9FO0FBQ0EsMkJBQU8sSUFBUDtBQUNILGlCQUhELE1BSUssSUFBSSxLQUFLLEdBQUwsQ0FBUyxPQUFPLENBQVAsR0FBVyxNQUFLLE1BQUwsQ0FBWSxJQUFaLENBQWlCLENBQXJDLElBQTBDLGFBQWEsQ0FBYixDQUExQyxHQUE0RCxNQUFLLE1BQXJFLEVBQTZFO0FBQzlFLHVDQUFJLE9BQUoseUJBQWtDLEtBQUssR0FBdkMsYUFBa0QsT0FBTyxDQUF6RCxTQUE4RCxPQUFPLENBQXJFLFNBQTBFLE1BQUssU0FBL0U7QUFDQSwyQkFBTyxJQUFQO0FBQ0g7QUFDRCx1QkFBTyxLQUFQO0FBQ0gsYUE5QkQ7QUErQkg7O0FBRUQ7QUFDQTtBQUNBOzs7O3lDQUNrQjtBQUNkLGlCQUFLLFFBQUwsR0FBZ0IsRUFBaEI7QUFDQSxpQkFBSyxRQUFMLENBQWMsS0FBZCxHQUFzQixJQUFJLFlBQUosQ0FBaUIsRUFBakIsQ0FBdEI7QUFDQSxpQkFBSyxRQUFMLENBQWMsT0FBZCxHQUF3QixJQUFJLFlBQUosQ0FBaUIsRUFBakIsQ0FBeEI7QUFDQSxpQkFBSyxRQUFMLENBQWMsVUFBZCxHQUEyQixJQUFJLFlBQUosQ0FBaUIsRUFBakIsQ0FBM0I7QUFDQSxpQkFBSyxRQUFMLENBQWMsWUFBZCxHQUE2QixJQUFJLFlBQUosQ0FBaUIsRUFBakIsQ0FBN0I7QUFDQSxpQkFBSyxRQUFMLENBQWMsTUFBZCxHQUF1QixJQUFJLFlBQUosQ0FBaUIsQ0FBakIsQ0FBdkI7QUFDQSxpQkFBSyxRQUFMLENBQWMsUUFBZCxHQUF5QixJQUFJLFlBQUosQ0FBaUIsQ0FBakIsQ0FBekI7QUFDQSxpQkFBSyxRQUFMLENBQWMsZ0JBQWQsR0FBaUMsSUFBSSxZQUFKLENBQWlCLENBQWpCLENBQWpDO0FBQ0g7O0FBRUQ7Ozs7a0NBQ1csSSxFQUFNLE8sRUFBUztBQUN0QjtBQUNBO0FBQ0EsaUJBQUssWUFBTCxDQUFrQixLQUFLLFFBQXZCLEVBQWlDLE9BQWpDOztBQUVBO0FBQ0EsaUJBQUssTUFBTCxDQUFZLGFBQVosQ0FBMEIsS0FBSyxRQUEvQixFQUF5QyxPQUF6QztBQUNIOztBQUVEOzs7O3FDQUNjLE8sRUFBUztBQUNuQixvQkFBUSxPQUFSLENBQWdCLEtBQWhCLEVBQXVCLGNBQXZCLEVBQXVDLENBQUMsS0FBSyxJQUFMLENBQVUsTUFBVixDQUFpQixLQUFsQixFQUF5QixLQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLE1BQTFDLENBQXZDO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixLQUFoQixFQUF1QixnQkFBdkIsRUFBeUMsQ0FBQyxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLENBQXBCLEVBQXVCLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsQ0FBMUMsRUFBNkMsS0FBSyxJQUFsRCxDQUF6QztBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0Isb0JBQXRCLEVBQTRDLEtBQUssZ0JBQWpEO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQixzQkFBdEIsRUFBOEMsZ0JBQU0sa0JBQXBEO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQix1QkFBdEIsRUFBK0MsS0FBSyxjQUFwRDtBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0IsZ0JBQXRCLEVBQXdDLEtBQUssT0FBN0M7O0FBRUEsaUJBQUssTUFBTCxDQUFZLFlBQVosQ0FBeUIsT0FBekI7QUFDSDs7QUFFRDs7OztzQ0FDZTtBQUNYLG1CQUFRLEtBQUssY0FBTCxJQUF1QixrQkFBL0I7QUFDSDs7Ozs7O2tCQXRVZ0IsSSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gcmF3QXNhcCBwcm92aWRlcyBldmVyeXRoaW5nIHdlIG5lZWQgZXhjZXB0IGV4Y2VwdGlvbiBtYW5hZ2VtZW50LlxudmFyIHJhd0FzYXAgPSByZXF1aXJlKFwiLi9yYXdcIik7XG4vLyBSYXdUYXNrcyBhcmUgcmVjeWNsZWQgdG8gcmVkdWNlIEdDIGNodXJuLlxudmFyIGZyZWVUYXNrcyA9IFtdO1xuLy8gV2UgcXVldWUgZXJyb3JzIHRvIGVuc3VyZSB0aGV5IGFyZSB0aHJvd24gaW4gcmlnaHQgb3JkZXIgKEZJRk8pLlxuLy8gQXJyYXktYXMtcXVldWUgaXMgZ29vZCBlbm91Z2ggaGVyZSwgc2luY2Ugd2UgYXJlIGp1c3QgZGVhbGluZyB3aXRoIGV4Y2VwdGlvbnMuXG52YXIgcGVuZGluZ0Vycm9ycyA9IFtdO1xudmFyIHJlcXVlc3RFcnJvclRocm93ID0gcmF3QXNhcC5tYWtlUmVxdWVzdENhbGxGcm9tVGltZXIodGhyb3dGaXJzdEVycm9yKTtcblxuZnVuY3Rpb24gdGhyb3dGaXJzdEVycm9yKCkge1xuICAgIGlmIChwZW5kaW5nRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBwZW5kaW5nRXJyb3JzLnNoaWZ0KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIENhbGxzIGEgdGFzayBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHJldHVybmluZywgaW4gaXRzIG93biBldmVudCwgd2l0aCBwcmlvcml0eVxuICogb3ZlciBvdGhlciBldmVudHMgbGlrZSBhbmltYXRpb24sIHJlZmxvdywgYW5kIHJlcGFpbnQuIEFuIGVycm9yIHRocm93biBmcm9tIGFuXG4gKiBldmVudCB3aWxsIG5vdCBpbnRlcnJ1cHQsIG5vciBldmVuIHN1YnN0YW50aWFsbHkgc2xvdyBkb3duIHRoZSBwcm9jZXNzaW5nIG9mXG4gKiBvdGhlciBldmVudHMsIGJ1dCB3aWxsIGJlIHJhdGhlciBwb3N0cG9uZWQgdG8gYSBsb3dlciBwcmlvcml0eSBldmVudC5cbiAqIEBwYXJhbSB7e2NhbGx9fSB0YXNrIEEgY2FsbGFibGUgb2JqZWN0LCB0eXBpY2FsbHkgYSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vXG4gKiBhcmd1bWVudHMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gYXNhcDtcbmZ1bmN0aW9uIGFzYXAodGFzaykge1xuICAgIHZhciByYXdUYXNrO1xuICAgIGlmIChmcmVlVGFza3MubGVuZ3RoKSB7XG4gICAgICAgIHJhd1Rhc2sgPSBmcmVlVGFza3MucG9wKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmF3VGFzayA9IG5ldyBSYXdUYXNrKCk7XG4gICAgfVxuICAgIHJhd1Rhc2sudGFzayA9IHRhc2s7XG4gICAgcmF3QXNhcChyYXdUYXNrKTtcbn1cblxuLy8gV2Ugd3JhcCB0YXNrcyB3aXRoIHJlY3ljbGFibGUgdGFzayBvYmplY3RzLiAgQSB0YXNrIG9iamVjdCBpbXBsZW1lbnRzXG4vLyBgY2FsbGAsIGp1c3QgbGlrZSBhIGZ1bmN0aW9uLlxuZnVuY3Rpb24gUmF3VGFzaygpIHtcbiAgICB0aGlzLnRhc2sgPSBudWxsO1xufVxuXG4vLyBUaGUgc29sZSBwdXJwb3NlIG9mIHdyYXBwaW5nIHRoZSB0YXNrIGlzIHRvIGNhdGNoIHRoZSBleGNlcHRpb24gYW5kIHJlY3ljbGVcbi8vIHRoZSB0YXNrIG9iamVjdCBhZnRlciBpdHMgc2luZ2xlIHVzZS5cblJhd1Rhc2sucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdGhpcy50YXNrLmNhbGwoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoYXNhcC5vbmVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGhvb2sgZXhpc3RzIHB1cmVseSBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAgICAgICAgICAgIC8vIEl0cyBuYW1lIHdpbGwgYmUgcGVyaW9kaWNhbGx5IHJhbmRvbWl6ZWQgdG8gYnJlYWsgYW55IGNvZGUgdGhhdFxuICAgICAgICAgICAgLy8gZGVwZW5kcyBvbiBpdHMgZXhpc3RlbmNlLlxuICAgICAgICAgICAgYXNhcC5vbmVycm9yKGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEluIGEgd2ViIGJyb3dzZXIsIGV4Y2VwdGlvbnMgYXJlIG5vdCBmYXRhbC4gSG93ZXZlciwgdG8gYXZvaWRcbiAgICAgICAgICAgIC8vIHNsb3dpbmcgZG93biB0aGUgcXVldWUgb2YgcGVuZGluZyB0YXNrcywgd2UgcmV0aHJvdyB0aGUgZXJyb3IgaW4gYVxuICAgICAgICAgICAgLy8gbG93ZXIgcHJpb3JpdHkgdHVybi5cbiAgICAgICAgICAgIHBlbmRpbmdFcnJvcnMucHVzaChlcnJvcik7XG4gICAgICAgICAgICByZXF1ZXN0RXJyb3JUaHJvdygpO1xuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy50YXNrID0gbnVsbDtcbiAgICAgICAgZnJlZVRhc2tzW2ZyZWVUYXNrcy5sZW5ndGhdID0gdGhpcztcbiAgICB9XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIFVzZSB0aGUgZmFzdGVzdCBtZWFucyBwb3NzaWJsZSB0byBleGVjdXRlIGEgdGFzayBpbiBpdHMgb3duIHR1cm4sIHdpdGhcbi8vIHByaW9yaXR5IG92ZXIgb3RoZXIgZXZlbnRzIGluY2x1ZGluZyBJTywgYW5pbWF0aW9uLCByZWZsb3csIGFuZCByZWRyYXdcbi8vIGV2ZW50cyBpbiBicm93c2Vycy5cbi8vXG4vLyBBbiBleGNlcHRpb24gdGhyb3duIGJ5IGEgdGFzayB3aWxsIHBlcm1hbmVudGx5IGludGVycnVwdCB0aGUgcHJvY2Vzc2luZyBvZlxuLy8gc3Vic2VxdWVudCB0YXNrcy4gVGhlIGhpZ2hlciBsZXZlbCBgYXNhcGAgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IGlmIGFuXG4vLyBleGNlcHRpb24gaXMgdGhyb3duIGJ5IGEgdGFzaywgdGhhdCB0aGUgdGFzayBxdWV1ZSB3aWxsIGNvbnRpbnVlIGZsdXNoaW5nIGFzXG4vLyBzb29uIGFzIHBvc3NpYmxlLCBidXQgaWYgeW91IHVzZSBgcmF3QXNhcGAgZGlyZWN0bHksIHlvdSBhcmUgcmVzcG9uc2libGUgdG9cbi8vIGVpdGhlciBlbnN1cmUgdGhhdCBubyBleGNlcHRpb25zIGFyZSB0aHJvd24gZnJvbSB5b3VyIHRhc2ssIG9yIHRvIG1hbnVhbGx5XG4vLyBjYWxsIGByYXdBc2FwLnJlcXVlc3RGbHVzaGAgaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93bi5cbm1vZHVsZS5leHBvcnRzID0gcmF3QXNhcDtcbmZ1bmN0aW9uIHJhd0FzYXAodGFzaykge1xuICAgIGlmICghcXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHJlcXVlc3RGbHVzaCgpO1xuICAgICAgICBmbHVzaGluZyA9IHRydWU7XG4gICAgfVxuICAgIC8vIEVxdWl2YWxlbnQgdG8gcHVzaCwgYnV0IGF2b2lkcyBhIGZ1bmN0aW9uIGNhbGwuXG4gICAgcXVldWVbcXVldWUubGVuZ3RoXSA9IHRhc2s7XG59XG5cbnZhciBxdWV1ZSA9IFtdO1xuLy8gT25jZSBhIGZsdXNoIGhhcyBiZWVuIHJlcXVlc3RlZCwgbm8gZnVydGhlciBjYWxscyB0byBgcmVxdWVzdEZsdXNoYCBhcmVcbi8vIG5lY2Vzc2FyeSB1bnRpbCB0aGUgbmV4dCBgZmx1c2hgIGNvbXBsZXRlcy5cbnZhciBmbHVzaGluZyA9IGZhbHNlO1xuLy8gYHJlcXVlc3RGbHVzaGAgaXMgYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgbWV0aG9kIHRoYXQgYXR0ZW1wdHMgdG8ga2lja1xuLy8gb2ZmIGEgYGZsdXNoYCBldmVudCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLiBgZmx1c2hgIHdpbGwgYXR0ZW1wdCB0byBleGhhdXN0XG4vLyB0aGUgZXZlbnQgcXVldWUgYmVmb3JlIHlpZWxkaW5nIHRvIHRoZSBicm93c2VyJ3Mgb3duIGV2ZW50IGxvb3AuXG52YXIgcmVxdWVzdEZsdXNoO1xuLy8gVGhlIHBvc2l0aW9uIG9mIHRoZSBuZXh0IHRhc2sgdG8gZXhlY3V0ZSBpbiB0aGUgdGFzayBxdWV1ZS4gVGhpcyBpc1xuLy8gcHJlc2VydmVkIGJldHdlZW4gY2FsbHMgdG8gYGZsdXNoYCBzbyB0aGF0IGl0IGNhbiBiZSByZXN1bWVkIGlmXG4vLyBhIHRhc2sgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbnZhciBpbmRleCA9IDA7XG4vLyBJZiBhIHRhc2sgc2NoZWR1bGVzIGFkZGl0aW9uYWwgdGFza3MgcmVjdXJzaXZlbHksIHRoZSB0YXNrIHF1ZXVlIGNhbiBncm93XG4vLyB1bmJvdW5kZWQuIFRvIHByZXZlbnQgbWVtb3J5IGV4aGF1c3Rpb24sIHRoZSB0YXNrIHF1ZXVlIHdpbGwgcGVyaW9kaWNhbGx5XG4vLyB0cnVuY2F0ZSBhbHJlYWR5LWNvbXBsZXRlZCB0YXNrcy5cbnZhciBjYXBhY2l0eSA9IDEwMjQ7XG5cbi8vIFRoZSBmbHVzaCBmdW5jdGlvbiBwcm9jZXNzZXMgYWxsIHRhc2tzIHRoYXQgaGF2ZSBiZWVuIHNjaGVkdWxlZCB3aXRoXG4vLyBgcmF3QXNhcGAgdW5sZXNzIGFuZCB1bnRpbCBvbmUgb2YgdGhvc2UgdGFza3MgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbi8vIElmIGEgdGFzayB0aHJvd3MgYW4gZXhjZXB0aW9uLCBgZmx1c2hgIGVuc3VyZXMgdGhhdCBpdHMgc3RhdGUgd2lsbCByZW1haW5cbi8vIGNvbnNpc3RlbnQgYW5kIHdpbGwgcmVzdW1lIHdoZXJlIGl0IGxlZnQgb2ZmIHdoZW4gY2FsbGVkIGFnYWluLlxuLy8gSG93ZXZlciwgYGZsdXNoYCBkb2VzIG5vdCBtYWtlIGFueSBhcnJhbmdlbWVudHMgdG8gYmUgY2FsbGVkIGFnYWluIGlmIGFuXG4vLyBleGNlcHRpb24gaXMgdGhyb3duLlxuZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgd2hpbGUgKGluZGV4IDwgcXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHZhciBjdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICAgICAgLy8gQWR2YW5jZSB0aGUgaW5kZXggYmVmb3JlIGNhbGxpbmcgdGhlIHRhc2suIFRoaXMgZW5zdXJlcyB0aGF0IHdlIHdpbGxcbiAgICAgICAgLy8gYmVnaW4gZmx1c2hpbmcgb24gdGhlIG5leHQgdGFzayB0aGUgdGFzayB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgIGluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICBxdWV1ZVtjdXJyZW50SW5kZXhdLmNhbGwoKTtcbiAgICAgICAgLy8gUHJldmVudCBsZWFraW5nIG1lbW9yeSBmb3IgbG9uZyBjaGFpbnMgb2YgcmVjdXJzaXZlIGNhbGxzIHRvIGBhc2FwYC5cbiAgICAgICAgLy8gSWYgd2UgY2FsbCBgYXNhcGAgd2l0aGluIHRhc2tzIHNjaGVkdWxlZCBieSBgYXNhcGAsIHRoZSBxdWV1ZSB3aWxsXG4gICAgICAgIC8vIGdyb3csIGJ1dCB0byBhdm9pZCBhbiBPKG4pIHdhbGsgZm9yIGV2ZXJ5IHRhc2sgd2UgZXhlY3V0ZSwgd2UgZG9uJ3RcbiAgICAgICAgLy8gc2hpZnQgdGFza3Mgb2ZmIHRoZSBxdWV1ZSBhZnRlciB0aGV5IGhhdmUgYmVlbiBleGVjdXRlZC5cbiAgICAgICAgLy8gSW5zdGVhZCwgd2UgcGVyaW9kaWNhbGx5IHNoaWZ0IDEwMjQgdGFza3Mgb2ZmIHRoZSBxdWV1ZS5cbiAgICAgICAgaWYgKGluZGV4ID4gY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIC8vIE1hbnVhbGx5IHNoaWZ0IGFsbCB2YWx1ZXMgc3RhcnRpbmcgYXQgdGhlIGluZGV4IGJhY2sgdG8gdGhlXG4gICAgICAgICAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIHF1ZXVlLlxuICAgICAgICAgICAgZm9yICh2YXIgc2NhbiA9IDAsIG5ld0xlbmd0aCA9IHF1ZXVlLmxlbmd0aCAtIGluZGV4OyBzY2FuIDwgbmV3TGVuZ3RoOyBzY2FuKyspIHtcbiAgICAgICAgICAgICAgICBxdWV1ZVtzY2FuXSA9IHF1ZXVlW3NjYW4gKyBpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWV1ZS5sZW5ndGggLT0gaW5kZXg7XG4gICAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUubGVuZ3RoID0gMDtcbiAgICBpbmRleCA9IDA7XG4gICAgZmx1c2hpbmcgPSBmYWxzZTtcbn1cblxuLy8gYHJlcXVlc3RGbHVzaGAgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSBzdHJhdGVneSBiYXNlZCBvbiBkYXRhIGNvbGxlY3RlZCBmcm9tXG4vLyBldmVyeSBhdmFpbGFibGUgU2F1Y2VMYWJzIFNlbGVuaXVtIHdlYiBkcml2ZXIgd29ya2VyIGF0IHRpbWUgb2Ygd3JpdGluZy5cbi8vIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFtRy01VVlHdXA1cXhHZEVNV2toUDZCV0N6MDUzTlViMkUxUW9VVFUxNnVBL2VkaXQjZ2lkPTc4MzcyNDU5M1xuXG4vLyBTYWZhcmkgNiBhbmQgNi4xIGZvciBkZXNrdG9wLCBpUGFkLCBhbmQgaVBob25lIGFyZSB0aGUgb25seSBicm93c2VycyB0aGF0XG4vLyBoYXZlIFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIgYnV0IG5vdCB1bi1wcmVmaXhlZCBNdXRhdGlvbk9ic2VydmVyLlxuLy8gTXVzdCB1c2UgYGdsb2JhbGAgb3IgYHNlbGZgIGluc3RlYWQgb2YgYHdpbmRvd2AgdG8gd29yayBpbiBib3RoIGZyYW1lcyBhbmQgd2ViXG4vLyB3b3JrZXJzLiBgZ2xvYmFsYCBpcyBhIHByb3Zpc2lvbiBvZiBCcm93c2VyaWZ5LCBNciwgTXJzLCBvciBNb3AuXG5cbi8qIGdsb2JhbHMgc2VsZiAqL1xudmFyIHNjb3BlID0gdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHNlbGY7XG52YXIgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPSBzY29wZS5NdXRhdGlvbk9ic2VydmVyIHx8IHNjb3BlLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5cbi8vIE11dGF0aW9uT2JzZXJ2ZXJzIGFyZSBkZXNpcmFibGUgYmVjYXVzZSB0aGV5IGhhdmUgaGlnaCBwcmlvcml0eSBhbmQgd29ya1xuLy8gcmVsaWFibHkgZXZlcnl3aGVyZSB0aGV5IGFyZSBpbXBsZW1lbnRlZC5cbi8vIFRoZXkgYXJlIGltcGxlbWVudGVkIGluIGFsbCBtb2Rlcm4gYnJvd3NlcnMuXG4vL1xuLy8gLSBBbmRyb2lkIDQtNC4zXG4vLyAtIENocm9tZSAyNi0zNFxuLy8gLSBGaXJlZm94IDE0LTI5XG4vLyAtIEludGVybmV0IEV4cGxvcmVyIDExXG4vLyAtIGlQYWQgU2FmYXJpIDYtNy4xXG4vLyAtIGlQaG9uZSBTYWZhcmkgNy03LjFcbi8vIC0gU2FmYXJpIDYtN1xuaWYgKHR5cGVvZiBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmVxdWVzdEZsdXNoID0gbWFrZVJlcXVlc3RDYWxsRnJvbU11dGF0aW9uT2JzZXJ2ZXIoZmx1c2gpO1xuXG4vLyBNZXNzYWdlQ2hhbm5lbHMgYXJlIGRlc2lyYWJsZSBiZWNhdXNlIHRoZXkgZ2l2ZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBIVE1MXG4vLyB0YXNrIHF1ZXVlLCBhcmUgaW1wbGVtZW50ZWQgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAsIFNhZmFyaSA1LjAtMSwgYW5kIE9wZXJhXG4vLyAxMS0xMiwgYW5kIGluIHdlYiB3b3JrZXJzIGluIG1hbnkgZW5naW5lcy5cbi8vIEFsdGhvdWdoIG1lc3NhZ2UgY2hhbm5lbHMgeWllbGQgdG8gYW55IHF1ZXVlZCByZW5kZXJpbmcgYW5kIElPIHRhc2tzLCB0aGV5XG4vLyB3b3VsZCBiZSBiZXR0ZXIgdGhhbiBpbXBvc2luZyB0aGUgNG1zIGRlbGF5IG9mIHRpbWVycy5cbi8vIEhvd2V2ZXIsIHRoZXkgZG8gbm90IHdvcmsgcmVsaWFibHkgaW4gSW50ZXJuZXQgRXhwbG9yZXIgb3IgU2FmYXJpLlxuXG4vLyBJbnRlcm5ldCBFeHBsb3JlciAxMCBpcyB0aGUgb25seSBicm93c2VyIHRoYXQgaGFzIHNldEltbWVkaWF0ZSBidXQgZG9lc1xuLy8gbm90IGhhdmUgTXV0YXRpb25PYnNlcnZlcnMuXG4vLyBBbHRob3VnaCBzZXRJbW1lZGlhdGUgeWllbGRzIHRvIHRoZSBicm93c2VyJ3MgcmVuZGVyZXIsIGl0IHdvdWxkIGJlXG4vLyBwcmVmZXJyYWJsZSB0byBmYWxsaW5nIGJhY2sgdG8gc2V0VGltZW91dCBzaW5jZSBpdCBkb2VzIG5vdCBoYXZlXG4vLyB0aGUgbWluaW11bSA0bXMgcGVuYWx0eS5cbi8vIFVuZm9ydHVuYXRlbHkgdGhlcmUgYXBwZWFycyB0byBiZSBhIGJ1ZyBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMCBNb2JpbGUgKGFuZFxuLy8gRGVza3RvcCB0byBhIGxlc3NlciBleHRlbnQpIHRoYXQgcmVuZGVycyBib3RoIHNldEltbWVkaWF0ZSBhbmRcbi8vIE1lc3NhZ2VDaGFubmVsIHVzZWxlc3MgZm9yIHRoZSBwdXJwb3NlcyBvZiBBU0FQLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xL2lzc3Vlcy8zOTZcblxuLy8gVGltZXJzIGFyZSBpbXBsZW1lbnRlZCB1bml2ZXJzYWxseS5cbi8vIFdlIGZhbGwgYmFjayB0byB0aW1lcnMgaW4gd29ya2VycyBpbiBtb3N0IGVuZ2luZXMsIGFuZCBpbiBmb3JlZ3JvdW5kXG4vLyBjb250ZXh0cyBpbiB0aGUgZm9sbG93aW5nIGJyb3dzZXJzLlxuLy8gSG93ZXZlciwgbm90ZSB0aGF0IGV2ZW4gdGhpcyBzaW1wbGUgY2FzZSByZXF1aXJlcyBudWFuY2VzIHRvIG9wZXJhdGUgaW4gYVxuLy8gYnJvYWQgc3BlY3RydW0gb2YgYnJvd3NlcnMuXG4vL1xuLy8gLSBGaXJlZm94IDMtMTNcbi8vIC0gSW50ZXJuZXQgRXhwbG9yZXIgNi05XG4vLyAtIGlQYWQgU2FmYXJpIDQuM1xuLy8gLSBMeW54IDIuOC43XG59IGVsc2Uge1xuICAgIHJlcXVlc3RGbHVzaCA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcihmbHVzaCk7XG59XG5cbi8vIGByZXF1ZXN0Rmx1c2hgIHJlcXVlc3RzIHRoYXQgdGhlIGhpZ2ggcHJpb3JpdHkgZXZlbnQgcXVldWUgYmUgZmx1c2hlZCBhc1xuLy8gc29vbiBhcyBwb3NzaWJsZS5cbi8vIFRoaXMgaXMgdXNlZnVsIHRvIHByZXZlbnQgYW4gZXJyb3IgdGhyb3duIGluIGEgdGFzayBmcm9tIHN0YWxsaW5nIHRoZSBldmVudFxuLy8gcXVldWUgaWYgdGhlIGV4Y2VwdGlvbiBoYW5kbGVkIGJ5IE5vZGUuanPigJlzXG4vLyBgcHJvY2Vzcy5vbihcInVuY2F1Z2h0RXhjZXB0aW9uXCIpYCBvciBieSBhIGRvbWFpbi5cbnJhd0FzYXAucmVxdWVzdEZsdXNoID0gcmVxdWVzdEZsdXNoO1xuXG4vLyBUbyByZXF1ZXN0IGEgaGlnaCBwcmlvcml0eSBldmVudCwgd2UgaW5kdWNlIGEgbXV0YXRpb24gb2JzZXJ2ZXIgYnkgdG9nZ2xpbmdcbi8vIHRoZSB0ZXh0IG9mIGEgdGV4dCBub2RlIGJldHdlZW4gXCIxXCIgYW5kIFwiLTFcIi5cbmZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21NdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKSB7XG4gICAgdmFyIHRvZ2dsZSA9IDE7XG4gICAgdmFyIG9ic2VydmVyID0gbmV3IEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4gICAgICAgIHRvZ2dsZSA9IC10b2dnbGU7XG4gICAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZTtcbiAgICB9O1xufVxuXG4vLyBUaGUgbWVzc2FnZSBjaGFubmVsIHRlY2huaXF1ZSB3YXMgZGlzY292ZXJlZCBieSBNYWx0ZSBVYmwgYW5kIHdhcyB0aGVcbi8vIG9yaWdpbmFsIGZvdW5kYXRpb24gZm9yIHRoaXMgbGlicmFyeS5cbi8vIGh0dHA6Ly93d3cubm9uYmxvY2tpbmcuaW8vMjAxMS8wNi93aW5kb3duZXh0dGljay5odG1sXG5cbi8vIFNhZmFyaSA2LjAuNSAoYXQgbGVhc3QpIGludGVybWl0dGVudGx5IGZhaWxzIHRvIGNyZWF0ZSBtZXNzYWdlIHBvcnRzIG9uIGFcbi8vIHBhZ2UncyBmaXJzdCBsb2FkLiBUaGFua2Z1bGx5LCB0aGlzIHZlcnNpb24gb2YgU2FmYXJpIHN1cHBvcnRzXG4vLyBNdXRhdGlvbk9ic2VydmVycywgc28gd2UgZG9uJ3QgbmVlZCB0byBmYWxsIGJhY2sgaW4gdGhhdCBjYXNlLlxuXG4vLyBmdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tTWVzc2FnZUNoYW5uZWwoY2FsbGJhY2spIHtcbi8vICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuLy8gICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gY2FsbGJhY2s7XG4vLyAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuLy8gICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKDApO1xuLy8gICAgIH07XG4vLyB9XG5cbi8vIEZvciByZWFzb25zIGV4cGxhaW5lZCBhYm92ZSwgd2UgYXJlIGFsc28gdW5hYmxlIHRvIHVzZSBgc2V0SW1tZWRpYXRlYFxuLy8gdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMuXG4vLyBFdmVuIGlmIHdlIHdlcmUsIHRoZXJlIGlzIGFub3RoZXIgYnVnIGluIEludGVybmV0IEV4cGxvcmVyIDEwLlxuLy8gSXQgaXMgbm90IHN1ZmZpY2llbnQgdG8gYXNzaWduIGBzZXRJbW1lZGlhdGVgIHRvIGByZXF1ZXN0Rmx1c2hgIGJlY2F1c2Vcbi8vIGBzZXRJbW1lZGlhdGVgIG11c3QgYmUgY2FsbGVkICpieSBuYW1lKiBhbmQgdGhlcmVmb3JlIG11c3QgYmUgd3JhcHBlZCBpbiBhXG4vLyBjbG9zdXJlLlxuLy8gTmV2ZXIgZm9yZ2V0LlxuXG4vLyBmdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tU2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4vLyAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuLy8gICAgICAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2spO1xuLy8gICAgIH07XG4vLyB9XG5cbi8vIFNhZmFyaSA2LjAgaGFzIGEgcHJvYmxlbSB3aGVyZSB0aW1lcnMgd2lsbCBnZXQgbG9zdCB3aGlsZSB0aGUgdXNlciBpc1xuLy8gc2Nyb2xsaW5nLiBUaGlzIHByb2JsZW0gZG9lcyBub3QgaW1wYWN0IEFTQVAgYmVjYXVzZSBTYWZhcmkgNi4wIHN1cHBvcnRzXG4vLyBtdXRhdGlvbiBvYnNlcnZlcnMsIHNvIHRoYXQgaW1wbGVtZW50YXRpb24gaXMgdXNlZCBpbnN0ZWFkLlxuLy8gSG93ZXZlciwgaWYgd2UgZXZlciBlbGVjdCB0byB1c2UgdGltZXJzIGluIFNhZmFyaSwgdGhlIHByZXZhbGVudCB3b3JrLWFyb3VuZFxuLy8gaXMgdG8gYWRkIGEgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyIHRoYXQgY2FsbHMgZm9yIGEgZmx1c2guXG5cbi8vIGBzZXRUaW1lb3V0YCBkb2VzIG5vdCBjYWxsIHRoZSBwYXNzZWQgY2FsbGJhY2sgaWYgdGhlIGRlbGF5IGlzIGxlc3MgdGhhblxuLy8gYXBwcm94aW1hdGVseSA3IGluIHdlYiB3b3JrZXJzIGluIEZpcmVmb3ggOCB0aHJvdWdoIDE4LCBhbmQgc29tZXRpbWVzIG5vdFxuLy8gZXZlbiB0aGVuLlxuXG5mdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4gICAgICAgIC8vIFdlIGRpc3BhdGNoIGEgdGltZW91dCB3aXRoIGEgc3BlY2lmaWVkIGRlbGF5IG9mIDAgZm9yIGVuZ2luZXMgdGhhdFxuICAgICAgICAvLyBjYW4gcmVsaWFibHkgYWNjb21tb2RhdGUgdGhhdCByZXF1ZXN0LiBUaGlzIHdpbGwgdXN1YWxseSBiZSBzbmFwcGVkXG4gICAgICAgIC8vIHRvIGEgNCBtaWxpc2Vjb25kIGRlbGF5LCBidXQgb25jZSB3ZSdyZSBmbHVzaGluZywgdGhlcmUncyBubyBkZWxheVxuICAgICAgICAvLyBiZXR3ZWVuIGV2ZW50cy5cbiAgICAgICAgdmFyIHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KGhhbmRsZVRpbWVyLCAwKTtcbiAgICAgICAgLy8gSG93ZXZlciwgc2luY2UgdGhpcyB0aW1lciBnZXRzIGZyZXF1ZW50bHkgZHJvcHBlZCBpbiBGaXJlZm94XG4gICAgICAgIC8vIHdvcmtlcnMsIHdlIGVubGlzdCBhbiBpbnRlcnZhbCBoYW5kbGUgdGhhdCB3aWxsIHRyeSB0byBmaXJlXG4gICAgICAgIC8vIGFuIGV2ZW50IDIwIHRpbWVzIHBlciBzZWNvbmQgdW50aWwgaXQgc3VjY2VlZHMuXG4gICAgICAgIHZhciBpbnRlcnZhbEhhbmRsZSA9IHNldEludGVydmFsKGhhbmRsZVRpbWVyLCA1MCk7XG5cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlVGltZXIoKSB7XG4gICAgICAgICAgICAvLyBXaGljaGV2ZXIgdGltZXIgc3VjY2VlZHMgd2lsbCBjYW5jZWwgYm90aCB0aW1lcnMgYW5kXG4gICAgICAgICAgICAvLyBleGVjdXRlIHRoZSBjYWxsYmFjay5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxIYW5kbGUpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8vIFRoaXMgaXMgZm9yIGBhc2FwLmpzYCBvbmx5LlxuLy8gSXRzIG5hbWUgd2lsbCBiZSBwZXJpb2RpY2FsbHkgcmFuZG9taXplZCB0byBicmVhayBhbnkgY29kZSB0aGF0IGRlcGVuZHMgb25cbi8vIGl0cyBleGlzdGVuY2UuXG5yYXdBc2FwLm1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lciA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcjtcblxuLy8gQVNBUCB3YXMgb3JpZ2luYWxseSBhIG5leHRUaWNrIHNoaW0gaW5jbHVkZWQgaW4gUS4gVGhpcyB3YXMgZmFjdG9yZWQgb3V0XG4vLyBpbnRvIHRoaXMgQVNBUCBwYWNrYWdlLiBJdCB3YXMgbGF0ZXIgYWRhcHRlZCB0byBSU1ZQIHdoaWNoIG1hZGUgZnVydGhlclxuLy8gYW1lbmRtZW50cy4gVGhlc2UgZGVjaXNpb25zLCBwYXJ0aWN1bGFybHkgdG8gbWFyZ2luYWxpemUgTWVzc2FnZUNoYW5uZWwgYW5kXG4vLyB0byBjYXB0dXJlIHRoZSBNdXRhdGlvbk9ic2VydmVyIGltcGxlbWVudGF0aW9uIGluIGEgY2xvc3VyZSwgd2VyZSBpbnRlZ3JhdGVkXG4vLyBiYWNrIGludG8gQVNBUCBwcm9wZXIuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGlsZGVpby9yc3ZwLmpzL2Jsb2IvY2RkZjcyMzI1NDZhOWNmODU4NTI0Yjc1Y2RlNmY5ZWRmNzI2MjBhNy9saWIvcnN2cC9hc2FwLmpzXG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBwbGFjZUhvbGRlcnNDb3VudCAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICByZXR1cm4gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMFxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG4gIHJldHVybiBiNjQubGVuZ3RoICogMyAvIDQgLSBwbGFjZUhvbGRlcnNDb3VudChiNjQpXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcbiAgcGxhY2VIb2xkZXJzID0gcGxhY2VIb2xkZXJzQ291bnQoYjY0KVxuXG4gIGFyciA9IG5ldyBBcnIobGVuICogMyAvIDQgLSBwbGFjZUhvbGRlcnMpXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICBsID0gcGxhY2VIb2xkZXJzID4gMCA/IGxlbiAtIDQgOiBsZW5cblxuICB2YXIgTCA9IDBcblxuICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzID09PSAyKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfSBlbHNlIGlmIChwbGFjZUhvbGRlcnMgPT09IDEpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArICh1aW50OFtpICsgMl0pXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBvdXRwdXQgPSAnJ1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPT0nXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArICh1aW50OFtsZW4gLSAxXSlcbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAxMF1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9ICc9J1xuICB9XG5cbiAgcGFydHMucHVzaChvdXRwdXQpXG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCIiLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xuZXhwb3J0cy5rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSAodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKG51bGwsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAodGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGFycmF5LmJ5dGVMZW5ndGggLy8gdGhpcyB0aHJvd3MgaWYgYGFycmF5YCBpcyBub3QgYSB2YWxpZCBBcnJheUJ1ZmZlclxuXG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gYXJyYXlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuKVxuXG4gICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIG9iai5jb3B5KHRoYXQsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAoaXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJlxuICAgICAgICB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJykuUHJvbWlzZTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKVxuICAsIEFycmF5UHJvdG8gID0gQXJyYXkucHJvdG90eXBlO1xuaWYoQXJyYXlQcm90b1tVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKXJlcXVpcmUoJy4vX2hpZGUnKShBcnJheVByb3RvLCBVTlNDT1BBQkxFUywge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKXtcbiAgaWYoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB8fCAoZm9yYmlkZGVuRmllbGQgIT09IHVuZGVmaW5lZCAmJiBmb3JiaWRkZW5GaWVsZCBpbiBpdCkpe1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgdG9JbmRleCAgID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oSVNfSU5DTFVERVMpe1xuICByZXR1cm4gZnVuY3Rpb24oJHRoaXMsIGVsLCBmcm9tSW5kZXgpe1xuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3QoJHRoaXMpXG4gICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuICAgICAgLCBpbmRleCAgPSB0b0luZGV4KGZyb21JbmRleCwgbGVuZ3RoKVxuICAgICAgLCB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgaWYoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpd2hpbGUobGVuZ3RoID4gaW5kZXgpe1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgaWYodmFsdWUgIT0gdmFsdWUpcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjdG9JbmRleCBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKWlmKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pe1xuICAgICAgaWYoT1tpbmRleF0gPT09IGVsKXJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07IiwiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpXG4gIC8vIEVTMyB3cm9uZyBoZXJlXG4gICwgQVJHID0gY29mKGZ1bmN0aW9uKCl7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTsiLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59OyIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7dmVyc2lvbjogJzIuNC4wJ307XG5pZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCB0aGF0LCBsZW5ndGgpe1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZih0aGF0ID09PSB1bmRlZmluZWQpcmV0dXJuIGZuO1xuICBzd2l0Y2gobGVuZ3RoKXtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbihhKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYSwgYil7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEsIGIsIGMpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59OyIsIi8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG59KTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnRcbiAgLy8gaW4gb2xkIElFIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnXG4gICwgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07IiwiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7IiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY29yZSAgICAgID0gcmVxdWlyZSgnLi9fY29yZScpXG4gICwgaGlkZSAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgcmVkZWZpbmUgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIGN0eCAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKXtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkZcbiAgICAsIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0LkdcbiAgICAsIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlNcbiAgICAsIElTX1BST1RPICA9IHR5cGUgJiAkZXhwb3J0LlBcbiAgICAsIElTX0JJTkQgICA9IHR5cGUgJiAkZXhwb3J0LkJcbiAgICAsIHRhcmdldCAgICA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSB8fCAoZ2xvYmFsW25hbWVdID0ge30pIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXVxuICAgICwgZXhwb3J0cyAgID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSlcbiAgICAsIGV4cFByb3RvICA9IGV4cG9ydHNbUFJPVE9UWVBFXSB8fCAoZXhwb3J0c1tQUk9UT1RZUEVdID0ge30pXG4gICAgLCBrZXksIG93biwgb3V0LCBleHA7XG4gIGlmKElTX0dMT0JBTClzb3VyY2UgPSBuYW1lO1xuICBmb3Ioa2V5IGluIHNvdXJjZSl7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYodGFyZ2V0KXJlZGVmaW5lKHRhcmdldCwga2V5LCBvdXQsIHR5cGUgJiAkZXhwb3J0LlUpO1xuICAgIC8vIGV4cG9ydFxuICAgIGlmKGV4cG9ydHNba2V5XSAhPSBvdXQpaGlkZShleHBvcnRzLCBrZXksIGV4cCk7XG4gICAgaWYoSVNfUFJPVE8gJiYgZXhwUHJvdG9ba2V5XSAhPSBvdXQpZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWAgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07IiwidmFyIGN0eCAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBjYWxsICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpXG4gICwgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJylcbiAgLCBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgdG9MZW5ndGggICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGdldEl0ZXJGbiAgID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKVxuICAsIEJSRUFLICAgICAgID0ge31cbiAgLCBSRVRVUk4gICAgICA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCwgSVRFUkFUT1Ipe1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbigpeyByZXR1cm4gaXRlcmFibGU7IH0gOiBnZXRJdGVyRm4oaXRlcmFibGUpXG4gICAgLCBmICAgICAgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSlcbiAgICAsIGluZGV4ICA9IDBcbiAgICAsIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3IsIHJlc3VsdDtcbiAgaWYodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYoaXNBcnJheUl0ZXIoaXRlckZuKSlmb3IobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4Kyspe1xuICAgIHJlc3VsdCA9IGVudHJpZXMgPyBmKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGYoaXRlcmFibGVbaW5kZXhdKTtcbiAgICBpZihyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKXJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgKXtcbiAgICByZXN1bHQgPSBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgICBpZihyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKXJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLICA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47IiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZiA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZih0eXBlb2YgX19nID09ICdudW1iZXInKV9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwga2V5KXtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59OyIsInZhciBkUCAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsiLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdkaXYnKSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgYXJncywgdGhhdCl7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoKGFyZ3MubGVuZ3RoKXtcbiAgICBjYXNlIDA6IHJldHVybiB1biA/IGZuKClcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCk7XG4gICAgY2FzZSAxOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgY2FzZSA0OiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgfSByZXR1cm4gICAgICAgICAgICAgIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTsiLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTsiLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgSVRFUkFUT1IgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG9bSVRFUkFUT1JdID09PSBpdCk7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTsiLCIvLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaChlKXtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmKHJldCAhPT0gdW5kZWZpbmVkKWFuT2JqZWN0KHJldC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTsiLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCBkZXNjcmlwdG9yICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpe1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHtuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcbiAgLCAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgcmVkZWZpbmUgICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgaGlkZSAgICAgICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgSXRlcmF0b3JzICAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsICRpdGVyQ3JlYXRlICAgID0gcmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpXG4gICwgSVRFUkFUT1IgICAgICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEJVR0dZICAgICAgICAgID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpIC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbiAgLCBGRl9JVEVSQVRPUiAgICA9ICdAQGl0ZXJhdG9yJ1xuICAsIEtFWVMgICAgICAgICAgID0gJ2tleXMnXG4gICwgVkFMVUVTICAgICAgICAgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpe1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbihraW5kKXtcbiAgICBpZighQlVHR1kgJiYga2luZCBpbiBwcm90bylyZXR1cm4gcHJvdG9ba2luZF07XG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgICAgICAgID0gTkFNRSArICcgSXRlcmF0b3InXG4gICAgLCBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVNcbiAgICAsIFZBTFVFU19CVUcgPSBmYWxzZVxuICAgICwgcHJvdG8gICAgICA9IEJhc2UucHJvdG90eXBlXG4gICAgLCAkbmF0aXZlICAgID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdXG4gICAgLCAkZGVmYXVsdCAgID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVClcbiAgICAsICRlbnRyaWVzICAgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkXG4gICAgLCAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZVxuICAgICwgbWV0aG9kcywga2V5LCBJdGVyYXRvclByb3RvdHlwZTtcbiAgLy8gRml4IG5hdGl2ZVxuICBpZigkYW55TmF0aXZlKXtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSkpO1xuICAgIGlmKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKXtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZighTElCUkFSWSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUyl7XG4gICAgVkFMVUVTX0JVRyA9IHRydWU7XG4gICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpe1xuICAgIGhpZGUocHJvdG8sIElURVJBVE9SLCAkZGVmYXVsdCk7XG4gIH1cbiAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuICBJdGVyYXRvcnNbTkFNRV0gPSAkZGVmYXVsdDtcbiAgSXRlcmF0b3JzW1RBR10gID0gcmV0dXJuVGhpcztcbiAgaWYoREVGQVVMVCl7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogIERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogICAgSVNfU0VUICAgICA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmKEZPUkNFRClmb3Ioa2V5IGluIG1ldGhvZHMpe1xuICAgICAgaWYoIShrZXkgaW4gcHJvdG8pKXJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07IiwidmFyIElURVJBVE9SICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24oKXsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTtcbiAgQXJyYXkuZnJvbShyaXRlciwgZnVuY3Rpb24oKXsgdGhyb3cgMjsgfSk7XG59IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYywgc2tpcENsb3Npbmcpe1xuICBpZighc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORylyZXR1cm4gZmFsc2U7XG4gIHZhciBzYWZlID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIGFyciAgPSBbN11cbiAgICAgICwgaXRlciA9IGFycltJVEVSQVRPUl0oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbigpeyByZXR1cm4ge2RvbmU6IHNhZmUgPSB0cnVlfTsgfTtcbiAgICBhcnJbSVRFUkFUT1JdID0gZnVuY3Rpb24oKXsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcbiAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG59OyIsIm1vZHVsZS5leHBvcnRzID0ge307IiwibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0XG4gICwgT2JzZXJ2ZXIgID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXJcbiAgLCBwcm9jZXNzICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIFByb21pc2UgICA9IGdsb2JhbC5Qcm9taXNlXG4gICwgaXNOb2RlICAgID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24oKXtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZihpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSlwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlKGhlYWQpe1xuICAgICAgZm4gICA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIGlmKGhlYWQpbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYocGFyZW50KXBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYoaXNOb2RlKXtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyXG4gIH0gZWxzZSBpZihPYnNlcnZlcil7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWVcbiAgICAgICwgbm9kZSAgID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7Y2hhcmFjdGVyRGF0YTogdHJ1ZX0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZihQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSl7XG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oZm4pe1xuICAgIHZhciB0YXNrID0ge2ZuOiBmbiwgbmV4dDogdW5kZWZpbmVkfTtcbiAgICBpZihsYXN0KWxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYoIWhlYWQpe1xuICAgICAgaGVhZCA9IHRhc2s7XG4gICAgICBub3RpZnkoKTtcbiAgICB9IGxhc3QgPSB0YXNrO1xuICB9O1xufTsiLCIvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbnZhciBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgZFBzICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJylcbiAgLCBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKVxuICAsIElFX1BST1RPICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpXG4gICwgRW1wdHkgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XG4gICwgUFJPVE9UWVBFICAgPSAncHJvdG90eXBlJztcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbigpe1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKVxuICAgICwgaSAgICAgID0gZW51bUJ1Z0tleXMubGVuZ3RoXG4gICAgLCBsdCAgICAgPSAnPCdcbiAgICAsIGd0ICAgICA9ICc+J1xuICAgICwgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUoaS0tKWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKXtcbiAgdmFyIHJlc3VsdDtcbiAgaWYoTyAhPT0gbnVsbCl7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKVxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBkUCAgICAgICAgICAgICA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpe1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgaWYoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKXRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmKCd2YWx1ZScgaW4gQXR0cmlidXRlcylPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59OyIsInZhciBkUCAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGdldEtleXMgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpe1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgICA9IGdldEtleXMoUHJvcGVydGllcylcbiAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgLCBpID0gMFxuICAgICwgUDtcbiAgd2hpbGUobGVuZ3RoID4gaSlkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07IiwiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgdG9PYmplY3QgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsIElFX1BST1RPICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpXG4gICwgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbihPKXtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZihoYXMoTywgSUVfUFJPVE8pKXJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcil7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTsiLCJ2YXIgaGFzICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCB0b0lPYmplY3QgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKVxuICAsIElFX1BST1RPICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIG5hbWVzKXtcbiAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwga2V5O1xuICBmb3Ioa2V5IGluIE8paWYoa2V5ICE9IElFX1BST1RPKWhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSlpZihoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpe1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07IiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpXG4gICwgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKXtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihiaXRtYXAsIHZhbHVlKXtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlICA6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlICAgIDogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZSAgICAgICA6IHZhbHVlXG4gIH07XG59OyIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHRhcmdldCwgc3JjLCBzYWZlKXtcbiAgZm9yKHZhciBrZXkgaW4gc3JjKXJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgc2FmZSk7XG4gIHJldHVybiB0YXJnZXQ7XG59OyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGhpZGUgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIGhhcyAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgU1JDICAgICAgID0gcmVxdWlyZSgnLi9fdWlkJykoJ3NyYycpXG4gICwgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJ1xuICAsICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR11cbiAgLCBUUEwgICAgICAgPSAoJycgKyAkdG9TdHJpbmcpLnNwbGl0KFRPX1NUUklORyk7XG5cbnJlcXVpcmUoJy4vX2NvcmUnKS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTywga2V5LCB2YWwsIHNhZmUpe1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJztcbiAgaWYoaXNGdW5jdGlvbiloYXModmFsLCAnbmFtZScpIHx8IGhpZGUodmFsLCAnbmFtZScsIGtleSk7XG4gIGlmKE9ba2V5XSA9PT0gdmFsKXJldHVybjtcbiAgaWYoaXNGdW5jdGlvbiloYXModmFsLCBTUkMpIHx8IGhpZGUodmFsLCBTUkMsIE9ba2V5XSA/ICcnICsgT1trZXldIDogVFBMLmpvaW4oU3RyaW5nKGtleSkpKTtcbiAgaWYoTyA9PT0gZ2xvYmFsKXtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaWYoIXNhZmUpe1xuICAgICAgZGVsZXRlIE9ba2V5XTtcbiAgICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZihPW2tleV0pT1trZXldID0gdmFsO1xuICAgICAgZWxzZSBoaWRlKE8sIGtleSwgdmFsKTtcbiAgICB9XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIHRoaXNbU1JDXSB8fCAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbn0pOyIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgZFAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKVxuICAsIFNQRUNJRVMgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVkpe1xuICB2YXIgQyA9IGdsb2JhbFtLRVldO1xuICBpZihERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKWRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTsiLCJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZlxuICAsIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIHRhZywgc3RhdCl7XG4gIGlmKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpZGVmKGl0LCBUQUcsIHtjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWd9KTtcbn07IiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJylcbiAgLCB1aWQgICAgPSByZXF1aXJlKCcuL191aWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07IiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXydcbiAgLCBzdG9yZSAgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pO1xufTsiLCIvLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcbnZhciBhbk9iamVjdCAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIFNQRUNJRVMgICA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE8sIEQpe1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yLCBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59OyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBkZWZpbmVkICAgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUT19TVFJJTkcpe1xuICByZXR1cm4gZnVuY3Rpb24odGhhdCwgcG9zKXtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKVxuICAgICAgLCBpID0gdG9JbnRlZ2VyKHBvcylcbiAgICAgICwgbCA9IHMubGVuZ3RoXG4gICAgICAsIGEsIGI7XG4gICAgaWYoaSA8IDAgfHwgaSA+PSBsKXJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59OyIsInZhciBjdHggICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGludm9rZSAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2ludm9rZScpXG4gICwgaHRtbCAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faHRtbCcpXG4gICwgY2VsICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpXG4gICwgZ2xvYmFsICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsIHNldFRhc2sgICAgICAgICAgICA9IGdsb2JhbC5zZXRJbW1lZGlhdGVcbiAgLCBjbGVhclRhc2sgICAgICAgICAgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGVcbiAgLCBNZXNzYWdlQ2hhbm5lbCAgICAgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWxcbiAgLCBjb3VudGVyICAgICAgICAgICAgPSAwXG4gICwgcXVldWUgICAgICAgICAgICAgID0ge31cbiAgLCBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJ1xuICAsIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uKCl7XG4gIHZhciBpZCA9ICt0aGlzO1xuICBpZihxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpe1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCl7XG4gIHJ1bi5jYWxsKGV2ZW50LmRhdGEpO1xufTtcbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spe1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKXtcbiAgICB2YXIgYXJncyA9IFtdLCBpID0gMTtcbiAgICB3aGlsZShhcmd1bWVudHMubGVuZ3RoID4gaSlhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbigpe1xuICAgICAgaW52b2tlKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbiksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyVGFzayA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKXtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYocmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIH0gZWxzZSBpZihNZXNzYWdlQ2hhbm5lbCl7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbDtcbiAgICBwb3J0ICAgID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNlbCgnc2NyaXB0Jykpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjZWwoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24oKXtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6ICAgc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTsiLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgbWF4ICAgICAgID0gTWF0aC5tYXhcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaW5kZXgsIGxlbmd0aCl7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59OyIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgID0gTWF0aC5jZWlsXG4gICwgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTsiLCIvLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpXG4gICwgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59OyIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59OyIsIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTsiLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBTKXtcbiAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZihTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgaWYoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTsiLCJ2YXIgaWQgPSAwXG4gICwgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTsiLCJ2YXIgc3RvcmUgICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKVxuICAsIHVpZCAgICAgICAgPSByZXF1aXJlKCcuL191aWQnKVxuICAsIFN5bWJvbCAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2xcbiAgLCBVU0VfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xuXG52YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTsiLCJ2YXIgY2xhc3NvZiAgID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgSVRFUkFUT1IgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29yZScpLmdldEl0ZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCAhPSB1bmRlZmluZWQpcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTsiLCIndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpXG4gICwgc3RlcCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpXG4gICwgSXRlcmF0b3JzICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgdG9JT2JqZWN0ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwga2luZCAgPSB0aGlzLl9rXG4gICAgLCBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpe1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYoa2luZCA9PSAna2V5cycgIClyZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpOyIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCB0ZXN0ICAgID0ge307XG50ZXN0W3JlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpXSA9ICd6JztcbmlmKHRlc3QgKyAnJyAhPSAnW29iamVjdCB6XScpe1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG4gICAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nO1xuICB9LCB0cnVlKTtcbn0iLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgZ2xvYmFsICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjdHggICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGNsYXNzb2YgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsICRleHBvcnQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgaXNPYmplY3QgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBhRnVuY3Rpb24gICAgICAgICAgPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcbiAgLCBhbkluc3RhbmNlICAgICAgICAgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpXG4gICwgZm9yT2YgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZm9yLW9mJylcbiAgLCBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJylcbiAgLCB0YXNrICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL190YXNrJykuc2V0XG4gICwgbWljcm90YXNrICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKVxuICAsIFBST01JU0UgICAgICAgICAgICA9ICdQcm9taXNlJ1xuICAsIFR5cGVFcnJvciAgICAgICAgICA9IGdsb2JhbC5UeXBlRXJyb3JcbiAgLCBwcm9jZXNzICAgICAgICAgICAgPSBnbG9iYWwucHJvY2Vzc1xuICAsICRQcm9taXNlICAgICAgICAgICA9IGdsb2JhbFtQUk9NSVNFXVxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgaXNOb2RlICAgICAgICAgICAgID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2VzcydcbiAgLCBlbXB0eSAgICAgICAgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XG4gICwgSW50ZXJuYWwsIEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgV3JhcHBlcjtcblxudmFyIFVTRV9OQVRJVkUgPSAhIWZ1bmN0aW9uKCl7XG4gIHRyeSB7XG4gICAgLy8gY29ycmVjdCBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgICAgID0gJFByb21pc2UucmVzb2x2ZSgxKVxuICAgICAgLCBGYWtlUHJvbWlzZSA9IChwcm9taXNlLmNvbnN0cnVjdG9yID0ge30pW3JlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyldID0gZnVuY3Rpb24oZXhlYyl7IGV4ZWMoZW1wdHksIGVtcHR5KTsgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKSAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2U7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbn0oKTtcblxuLy8gaGVscGVyc1xudmFyIHNhbWVDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKGEsIGIpe1xuICAvLyB3aXRoIGxpYnJhcnkgd3JhcHBlciBzcGVjaWFsIGNhc2VcbiAgcmV0dXJuIGEgPT09IGIgfHwgYSA9PT0gJFByb21pc2UgJiYgYiA9PT0gV3JhcHBlcjtcbn07XG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbihDKXtcbiAgcmV0dXJuIHNhbWVDb25zdHJ1Y3RvcigkUHJvbWlzZSwgQylcbiAgICA/IG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgIDogbmV3IEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbihDKXtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24oJCRyZXNvbHZlLCAkJHJlamVjdCl7XG4gICAgaWYocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCAgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59O1xudmFyIHBlcmZvcm0gPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICBleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHtlcnJvcjogZX07XG4gIH1cbn07XG52YXIgbm90aWZ5ID0gZnVuY3Rpb24ocHJvbWlzZSwgaXNSZWplY3Qpe1xuICBpZihwcm9taXNlLl9uKXJldHVybjtcbiAgcHJvbWlzZS5fbiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2M7XG4gIG1pY3JvdGFzayhmdW5jdGlvbigpe1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3ZcbiAgICAgICwgb2sgICAgPSBwcm9taXNlLl9zID09IDFcbiAgICAgICwgaSAgICAgPSAwO1xuICAgIHZhciBydW4gPSBmdW5jdGlvbihyZWFjdGlvbil7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsXG4gICAgICAgICwgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmVcbiAgICAgICAgLCByZWplY3QgID0gcmVhY3Rpb24ucmVqZWN0XG4gICAgICAgICwgZG9tYWluICA9IHJlYWN0aW9uLmRvbWFpblxuICAgICAgICAsIHJlc3VsdCwgdGhlbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmKGhhbmRsZXIpe1xuICAgICAgICAgIGlmKCFvayl7XG4gICAgICAgICAgICBpZihwcm9taXNlLl9oID09IDIpb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgICAgICAgICBwcm9taXNlLl9oID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoaGFuZGxlciA9PT0gdHJ1ZSlyZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmKGRvbWFpbilkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpO1xuICAgICAgICAgICAgaWYoZG9tYWluKWRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSl7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZih0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKXtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoKGUpe1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZShjaGFpbi5sZW5ndGggPiBpKXJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmKGlzUmVqZWN0ICYmICFwcm9taXNlLl9oKW9uVW5oYW5kbGVkKHByb21pc2UpO1xuICB9KTtcbn07XG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24oKXtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92XG4gICAgICAsIGFicnVwdCwgaGFuZGxlciwgY29uc29sZTtcbiAgICBpZihpc1VuaGFuZGxlZChwcm9taXNlKSl7XG4gICAgICBhYnJ1cHQgPSBwZXJmb3JtKGZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKGlzTm9kZSl7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZihoYW5kbGVyID0gZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKXtcbiAgICAgICAgICBoYW5kbGVyKHtwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlfSk7XG4gICAgICAgIH0gZWxzZSBpZigoY29uc29sZSA9IGdsb2JhbC5jb25zb2xlKSAmJiBjb25zb2xlLmVycm9yKXtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYoYWJydXB0KXRocm93IGFicnVwdC5lcnJvcjtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIGlmKHByb21pc2UuX2ggPT0gMSlyZXR1cm4gZmFsc2U7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2EgfHwgcHJvbWlzZS5fY1xuICAgICwgaSAgICAgPSAwXG4gICAgLCByZWFjdGlvbjtcbiAgd2hpbGUoY2hhaW4ubGVuZ3RoID4gaSl7XG4gICAgcmVhY3Rpb24gPSBjaGFpbltpKytdO1xuICAgIGlmKHJlYWN0aW9uLmZhaWwgfHwgIWlzVW5oYW5kbGVkKHJlYWN0aW9uLnByb21pc2UpKXJldHVybiBmYWxzZTtcbiAgfSByZXR1cm4gdHJ1ZTtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24oKXtcbiAgICB2YXIgaGFuZGxlcjtcbiAgICBpZihpc05vZGUpe1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub25yZWplY3Rpb25oYW5kbGVkKXtcbiAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdn0pO1xuICAgIH1cbiAgfSk7XG59O1xudmFyICRyZWplY3QgPSBmdW5jdGlvbih2YWx1ZSl7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYocHJvbWlzZS5fZClyZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICBwcm9taXNlLl9zID0gMjtcbiAgaWYoIXByb21pc2UuX2EpcHJvbWlzZS5fYSA9IHByb21pc2UuX2Muc2xpY2UoKTtcbiAgbm90aWZ5KHByb21pc2UsIHRydWUpO1xufTtcbnZhciAkcmVzb2x2ZSA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIHByb21pc2UgPSB0aGlzXG4gICAgLCB0aGVuO1xuICBpZihwcm9taXNlLl9kKXJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmKHByb21pc2UgPT09IHZhbHVlKXRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSl7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7X3c6IHByb21pc2UsIF9kOiBmYWxzZX07IC8vIHdyYXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGN0eCgkcmVzb2x2ZSwgd3JhcHBlciwgMSksIGN0eCgkcmVqZWN0LCB3cmFwcGVyLCAxKSk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgJHJlamVjdC5jYWxsKHdyYXBwZXIsIGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fcyA9IDE7XG4gICAgICBub3RpZnkocHJvbWlzZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaChlKXtcbiAgICAkcmVqZWN0LmNhbGwoe193OiBwcm9taXNlLCBfZDogZmFsc2V9LCBlKTsgLy8gd3JhcFxuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYoIVVTRV9OQVRJVkUpe1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICAkUHJvbWlzZSA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3Ipe1xuICAgIGFuSW5zdGFuY2UodGhpcywgJFByb21pc2UsIFBST01JU0UsICdfaCcpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoY3R4KCRyZXNvbHZlLCB0aGlzLCAxKSwgY3R4KCRyZWplY3QsIHRoaXMsIDEpKTtcbiAgICB9IGNhdGNoKGVycil7XG4gICAgICAkcmVqZWN0LmNhbGwodGhpcywgZXJyKTtcbiAgICB9XG4gIH07XG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcil7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKXtcbiAgICAgIHZhciByZWFjdGlvbiAgICA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkUHJvbWlzZSkpO1xuICAgICAgcmVhY3Rpb24ub2sgICAgID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsICAgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBpc05vZGUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2MucHVzaChyZWFjdGlvbik7XG4gICAgICBpZih0aGlzLl9hKXRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZih0aGlzLl9zKW5vdGlmeSh0aGlzLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24ob25SZWplY3RlZCl7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbigpe1xuICAgIHZhciBwcm9taXNlICA9IG5ldyBJbnRlcm5hbDtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGN0eCgkcmVzb2x2ZSwgcHJvbWlzZSwgMSk7XG4gICAgdGhpcy5yZWplY3QgID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7UHJvbWlzZTogJFByb21pc2V9KTtcbnJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJykoJFByb21pc2UsIFBST01JU0UpO1xucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKShQUk9NSVNFKTtcbldyYXBwZXIgPSByZXF1aXJlKCcuL19jb3JlJylbUFJPTUlTRV07XG5cbi8vIHN0YXRpY3NcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjUgUHJvbWlzZS5yZWplY3QocilcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocil7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKVxuICAgICAgLCAkJHJlamVjdCAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgJCRyZWplY3Qocik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChMSUJSQVJZIHx8ICFVU0VfTkFUSVZFKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNiBQcm9taXNlLnJlc29sdmUoeClcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KXtcbiAgICAvLyBpbnN0YW5jZW9mIGluc3RlYWQgb2YgaW50ZXJuYWwgc2xvdCBjaGVjayBiZWNhdXNlIHdlIHNob3VsZCBmaXggaXQgd2l0aG91dCByZXBsYWNlbWVudCBuYXRpdmUgUHJvbWlzZSBjb3JlXG4gICAgaWYoeCBpbnN0YW5jZW9mICRQcm9taXNlICYmIHNhbWVDb25zdHJ1Y3Rvcih4LmNvbnN0cnVjdG9yLCB0aGlzKSlyZXR1cm4geDtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpXG4gICAgICAsICQkcmVzb2x2ZSAgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgJCRyZXNvbHZlKHgpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKFVTRV9OQVRJVkUgJiYgcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbihpdGVyKXtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpe1xuICAgIHZhciBDICAgICAgICAgID0gdGhpc1xuICAgICAgLCBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgICwgcmVzb2x2ZSAgICA9IGNhcGFiaWxpdHkucmVzb2x2ZVxuICAgICAgLCByZWplY3QgICAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgIHZhciB2YWx1ZXMgICAgPSBbXVxuICAgICAgICAsIGluZGV4ICAgICA9IDBcbiAgICAgICAgLCByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbihwcm9taXNlKXtcbiAgICAgICAgdmFyICRpbmRleCAgICAgICAgPSBpbmRleCsrXG4gICAgICAgICAgLCBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgIHJlbWFpbmluZysrO1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihmdW5jdGlvbih2YWx1ZSl7XG4gICAgICAgICAgaWYoYWxyZWFkeUNhbGxlZClyZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCAgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlc1skaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYoYWJydXB0KXJlamVjdChhYnJ1cHQuZXJyb3IpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH0sXG4gIC8vIDI1LjQuNC40IFByb21pc2UucmFjZShpdGVyYWJsZSlcbiAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSB0aGlzXG4gICAgICAsIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgLCByZWplY3QgICAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24ocHJvbWlzZSl7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmKGFicnVwdClyZWplY3QoYWJydXB0LmVycm9yKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTsiLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ICA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwgaW5kZXggPSB0aGlzLl9pXG4gICAgLCBwb2ludDtcbiAgaWYoaW5kZXggPj0gTy5sZW5ndGgpcmV0dXJuIHt2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHt2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlfTtcbn0pOyIsInZhciAkaXRlcmF0b3JzICAgID0gcmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKVxuICAsIHJlZGVmaW5lICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgZ2xvYmFsICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGlkZSAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIEl0ZXJhdG9ycyAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIHdrcyAgICAgICAgICAgPSByZXF1aXJlKCcuL193a3MnKVxuICAsIElURVJBVE9SICAgICAgPSB3a3MoJ2l0ZXJhdG9yJylcbiAgLCBUT19TVFJJTkdfVEFHID0gd2tzKCd0b1N0cmluZ1RhZycpXG4gICwgQXJyYXlWYWx1ZXMgICA9IEl0ZXJhdG9ycy5BcnJheTtcblxuZm9yKHZhciBjb2xsZWN0aW9ucyA9IFsnTm9kZUxpc3QnLCAnRE9NVG9rZW5MaXN0JywgJ01lZGlhTGlzdCcsICdTdHlsZVNoZWV0TGlzdCcsICdDU1NSdWxlTGlzdCddLCBpID0gMDsgaSA8IDU7IGkrKyl7XG4gIHZhciBOQU1FICAgICAgID0gY29sbGVjdGlvbnNbaV1cbiAgICAsIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV1cbiAgICAsIHByb3RvICAgICAgPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlXG4gICAgLCBrZXk7XG4gIGlmKHByb3RvKXtcbiAgICBpZighcHJvdG9bSVRFUkFUT1JdKWhpZGUocHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgaWYoIXByb3RvW1RPX1NUUklOR19UQUddKWhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IEFycmF5VmFsdWVzO1xuICAgIGZvcihrZXkgaW4gJGl0ZXJhdG9ycylpZighcHJvdG9ba2V5XSlyZWRlZmluZShwcm90bywga2V5LCAkaXRlcmF0b3JzW2tleV0sIHRydWUpO1xuICB9XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJnKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IEJ1ZmZlci5pc0J1ZmZlcjtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuIiwiLy8gKGMpIERlYW4gTWNOYW1lZSA8ZGVhbkBnbWFpbC5jb20+LCAyMDEyLlxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kZWFubS9jc3MtY29sb3ItcGFyc2VyLWpzXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbi8vIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1Ncbi8vIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci9cbnZhciBrQ1NTQ29sb3JUYWJsZSA9IHtcbiAgXCJ0cmFuc3BhcmVudFwiOiBbMCwwLDAsMF0sIFwiYWxpY2VibHVlXCI6IFsyNDAsMjQ4LDI1NSwxXSxcbiAgXCJhbnRpcXVld2hpdGVcIjogWzI1MCwyMzUsMjE1LDFdLCBcImFxdWFcIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJhcXVhbWFyaW5lXCI6IFsxMjcsMjU1LDIxMiwxXSwgXCJhenVyZVwiOiBbMjQwLDI1NSwyNTUsMV0sXG4gIFwiYmVpZ2VcIjogWzI0NSwyNDUsMjIwLDFdLCBcImJpc3F1ZVwiOiBbMjU1LDIyOCwxOTYsMV0sXG4gIFwiYmxhY2tcIjogWzAsMCwwLDFdLCBcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsMjM1LDIwNSwxXSxcbiAgXCJibHVlXCI6IFswLDAsMjU1LDFdLCBcImJsdWV2aW9sZXRcIjogWzEzOCw0MywyMjYsMV0sXG4gIFwiYnJvd25cIjogWzE2NSw0Miw0MiwxXSwgXCJidXJseXdvb2RcIjogWzIyMiwxODQsMTM1LDFdLFxuICBcImNhZGV0Ymx1ZVwiOiBbOTUsMTU4LDE2MCwxXSwgXCJjaGFydHJldXNlXCI6IFsxMjcsMjU1LDAsMV0sXG4gIFwiY2hvY29sYXRlXCI6IFsyMTAsMTA1LDMwLDFdLCBcImNvcmFsXCI6IFsyNTUsMTI3LDgwLDFdLFxuICBcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsMTQ5LDIzNywxXSwgXCJjb3Juc2lsa1wiOiBbMjU1LDI0OCwyMjAsMV0sXG4gIFwiY3JpbXNvblwiOiBbMjIwLDIwLDYwLDFdLCBcImN5YW5cIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJkYXJrYmx1ZVwiOiBbMCwwLDEzOSwxXSwgXCJkYXJrY3lhblwiOiBbMCwxMzksMTM5LDFdLFxuICBcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwxMzQsMTEsMV0sIFwiZGFya2dyYXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtncmVlblwiOiBbMCwxMDAsMCwxXSwgXCJkYXJrZ3JleVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2toYWtpXCI6IFsxODksMTgzLDEwNywxXSwgXCJkYXJrbWFnZW50YVwiOiBbMTM5LDAsMTM5LDFdLFxuICBcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwxMDcsNDcsMV0sIFwiZGFya29yYW5nZVwiOiBbMjU1LDE0MCwwLDFdLFxuICBcImRhcmtvcmNoaWRcIjogWzE1Myw1MCwyMDQsMV0sIFwiZGFya3JlZFwiOiBbMTM5LDAsMCwxXSxcbiAgXCJkYXJrc2FsbW9uXCI6IFsyMzMsMTUwLDEyMiwxXSwgXCJkYXJrc2VhZ3JlZW5cIjogWzE0MywxODgsMTQzLDFdLFxuICBcImRhcmtzbGF0ZWJsdWVcIjogWzcyLDYxLDEzOSwxXSwgXCJkYXJrc2xhdGVncmF5XCI6IFs0Nyw3OSw3OSwxXSxcbiAgXCJkYXJrc2xhdGVncmV5XCI6IFs0Nyw3OSw3OSwxXSwgXCJkYXJrdHVycXVvaXNlXCI6IFswLDIwNiwyMDksMV0sXG4gIFwiZGFya3Zpb2xldFwiOiBbMTQ4LDAsMjExLDFdLCBcImRlZXBwaW5rXCI6IFsyNTUsMjAsMTQ3LDFdLFxuICBcImRlZXBza3libHVlXCI6IFswLDE5MSwyNTUsMV0sIFwiZGltZ3JheVwiOiBbMTA1LDEwNSwxMDUsMV0sXG4gIFwiZGltZ3JleVwiOiBbMTA1LDEwNSwxMDUsMV0sIFwiZG9kZ2VyYmx1ZVwiOiBbMzAsMTQ0LDI1NSwxXSxcbiAgXCJmaXJlYnJpY2tcIjogWzE3OCwzNCwzNCwxXSwgXCJmbG9yYWx3aGl0ZVwiOiBbMjU1LDI1MCwyNDAsMV0sXG4gIFwiZm9yZXN0Z3JlZW5cIjogWzM0LDEzOSwzNCwxXSwgXCJmdWNoc2lhXCI6IFsyNTUsMCwyNTUsMV0sXG4gIFwiZ2FpbnNib3JvXCI6IFsyMjAsMjIwLDIyMCwxXSwgXCJnaG9zdHdoaXRlXCI6IFsyNDgsMjQ4LDI1NSwxXSxcbiAgXCJnb2xkXCI6IFsyNTUsMjE1LDAsMV0sIFwiZ29sZGVucm9kXCI6IFsyMTgsMTY1LDMyLDFdLFxuICBcImdyYXlcIjogWzEyOCwxMjgsMTI4LDFdLCBcImdyZWVuXCI6IFswLDEyOCwwLDFdLFxuICBcImdyZWVueWVsbG93XCI6IFsxNzMsMjU1LDQ3LDFdLCBcImdyZXlcIjogWzEyOCwxMjgsMTI4LDFdLFxuICBcImhvbmV5ZGV3XCI6IFsyNDAsMjU1LDI0MCwxXSwgXCJob3RwaW5rXCI6IFsyNTUsMTA1LDE4MCwxXSxcbiAgXCJpbmRpYW5yZWRcIjogWzIwNSw5Miw5MiwxXSwgXCJpbmRpZ29cIjogWzc1LDAsMTMwLDFdLFxuICBcIml2b3J5XCI6IFsyNTUsMjU1LDI0MCwxXSwgXCJraGFraVwiOiBbMjQwLDIzMCwxNDAsMV0sXG4gIFwibGF2ZW5kZXJcIjogWzIzMCwyMzAsMjUwLDFdLCBcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwyNDAsMjQ1LDFdLFxuICBcImxhd25ncmVlblwiOiBbMTI0LDI1MiwwLDFdLCBcImxlbW9uY2hpZmZvblwiOiBbMjU1LDI1MCwyMDUsMV0sXG4gIFwibGlnaHRibHVlXCI6IFsxNzMsMjE2LDIzMCwxXSwgXCJsaWdodGNvcmFsXCI6IFsyNDAsMTI4LDEyOCwxXSxcbiAgXCJsaWdodGN5YW5cIjogWzIyNCwyNTUsMjU1LDFdLCBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsMjUwLDIxMCwxXSxcbiAgXCJsaWdodGdyYXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0Z3JlZW5cIjogWzE0NCwyMzgsMTQ0LDFdLFxuICBcImxpZ2h0Z3JleVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRwaW5rXCI6IFsyNTUsMTgyLDE5MywxXSxcbiAgXCJsaWdodHNhbG1vblwiOiBbMjU1LDE2MCwxMjIsMV0sIFwibGlnaHRzZWFncmVlblwiOiBbMzIsMTc4LDE3MCwxXSxcbiAgXCJsaWdodHNreWJsdWVcIjogWzEzNSwyMDYsMjUwLDFdLCBcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksMTM2LDE1MywxXSxcbiAgXCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LDEzNiwxNTMsMV0sIFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwxOTYsMjIyLDFdLFxuICBcImxpZ2h0eWVsbG93XCI6IFsyNTUsMjU1LDIyNCwxXSwgXCJsaW1lXCI6IFswLDI1NSwwLDFdLFxuICBcImxpbWVncmVlblwiOiBbNTAsMjA1LDUwLDFdLCBcImxpbmVuXCI6IFsyNTAsMjQwLDIzMCwxXSxcbiAgXCJtYWdlbnRhXCI6IFsyNTUsMCwyNTUsMV0sIFwibWFyb29uXCI6IFsxMjgsMCwwLDFdLFxuICBcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwyMDUsMTcwLDFdLCBcIm1lZGl1bWJsdWVcIjogWzAsMCwyMDUsMV0sXG4gIFwibWVkaXVtb3JjaGlkXCI6IFsxODYsODUsMjExLDFdLCBcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LDExMiwyMTksMV0sXG4gIFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLDE3OSwxMTMsMV0sIFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsMTA0LDIzOCwxXSxcbiAgXCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwyNTAsMTU0LDFdLCBcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsMjA5LDIwNCwxXSxcbiAgXCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwyMSwxMzMsMV0sIFwibWlkbmlnaHRibHVlXCI6IFsyNSwyNSwxMTIsMV0sXG4gIFwibWludGNyZWFtXCI6IFsyNDUsMjU1LDI1MCwxXSwgXCJtaXN0eXJvc2VcIjogWzI1NSwyMjgsMjI1LDFdLFxuICBcIm1vY2Nhc2luXCI6IFsyNTUsMjI4LDE4MSwxXSwgXCJuYXZham93aGl0ZVwiOiBbMjU1LDIyMiwxNzMsMV0sXG4gIFwibmF2eVwiOiBbMCwwLDEyOCwxXSwgXCJvbGRsYWNlXCI6IFsyNTMsMjQ1LDIzMCwxXSxcbiAgXCJvbGl2ZVwiOiBbMTI4LDEyOCwwLDFdLCBcIm9saXZlZHJhYlwiOiBbMTA3LDE0MiwzNSwxXSxcbiAgXCJvcmFuZ2VcIjogWzI1NSwxNjUsMCwxXSwgXCJvcmFuZ2VyZWRcIjogWzI1NSw2OSwwLDFdLFxuICBcIm9yY2hpZFwiOiBbMjE4LDExMiwyMTQsMV0sIFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LDIzMiwxNzAsMV0sXG4gIFwicGFsZWdyZWVuXCI6IFsxNTIsMjUxLDE1MiwxXSwgXCJwYWxldHVycXVvaXNlXCI6IFsxNzUsMjM4LDIzOCwxXSxcbiAgXCJwYWxldmlvbGV0cmVkXCI6IFsyMTksMTEyLDE0NywxXSwgXCJwYXBheWF3aGlwXCI6IFsyNTUsMjM5LDIxMywxXSxcbiAgXCJwZWFjaHB1ZmZcIjogWzI1NSwyMTgsMTg1LDFdLCBcInBlcnVcIjogWzIwNSwxMzMsNjMsMV0sXG4gIFwicGlua1wiOiBbMjU1LDE5MiwyMDMsMV0sIFwicGx1bVwiOiBbMjIxLDE2MCwyMjEsMV0sXG4gIFwicG93ZGVyYmx1ZVwiOiBbMTc2LDIyNCwyMzAsMV0sIFwicHVycGxlXCI6IFsxMjgsMCwxMjgsMV0sXG4gIFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLDUxLDE1MywxXSxcbiAgXCJyZWRcIjogWzI1NSwwLDAsMV0sIFwicm9zeWJyb3duXCI6IFsxODgsMTQzLDE0MywxXSxcbiAgXCJyb3lhbGJsdWVcIjogWzY1LDEwNSwyMjUsMV0sIFwic2FkZGxlYnJvd25cIjogWzEzOSw2OSwxOSwxXSxcbiAgXCJzYWxtb25cIjogWzI1MCwxMjgsMTE0LDFdLCBcInNhbmR5YnJvd25cIjogWzI0NCwxNjQsOTYsMV0sXG4gIFwic2VhZ3JlZW5cIjogWzQ2LDEzOSw4NywxXSwgXCJzZWFzaGVsbFwiOiBbMjU1LDI0NSwyMzgsMV0sXG4gIFwic2llbm5hXCI6IFsxNjAsODIsNDUsMV0sIFwic2lsdmVyXCI6IFsxOTIsMTkyLDE5MiwxXSxcbiAgXCJza3libHVlXCI6IFsxMzUsMjA2LDIzNSwxXSwgXCJzbGF0ZWJsdWVcIjogWzEwNiw5MCwyMDUsMV0sXG4gIFwic2xhdGVncmF5XCI6IFsxMTIsMTI4LDE0NCwxXSwgXCJzbGF0ZWdyZXlcIjogWzExMiwxMjgsMTQ0LDFdLFxuICBcInNub3dcIjogWzI1NSwyNTAsMjUwLDFdLCBcInNwcmluZ2dyZWVuXCI6IFswLDI1NSwxMjcsMV0sXG4gIFwic3RlZWxibHVlXCI6IFs3MCwxMzAsMTgwLDFdLCBcInRhblwiOiBbMjEwLDE4MCwxNDAsMV0sXG4gIFwidGVhbFwiOiBbMCwxMjgsMTI4LDFdLCBcInRoaXN0bGVcIjogWzIxNiwxOTEsMjE2LDFdLFxuICBcInRvbWF0b1wiOiBbMjU1LDk5LDcxLDFdLCBcInR1cnF1b2lzZVwiOiBbNjQsMjI0LDIwOCwxXSxcbiAgXCJ2aW9sZXRcIjogWzIzOCwxMzAsMjM4LDFdLCBcIndoZWF0XCI6IFsyNDUsMjIyLDE3OSwxXSxcbiAgXCJ3aGl0ZVwiOiBbMjU1LDI1NSwyNTUsMV0sIFwid2hpdGVzbW9rZVwiOiBbMjQ1LDI0NSwyNDUsMV0sXG4gIFwieWVsbG93XCI6IFsyNTUsMjU1LDAsMV0sIFwieWVsbG93Z3JlZW5cIjogWzE1NCwyMDUsNTAsMV19XG5cbmZ1bmN0aW9uIGNsYW1wX2Nzc19ieXRlKGkpIHsgIC8vIENsYW1wIHRvIGludGVnZXIgMCAuLiAyNTUuXG4gIGkgPSBNYXRoLnJvdW5kKGkpOyAgLy8gU2VlbXMgdG8gYmUgd2hhdCBDaHJvbWUgZG9lcyAodnMgdHJ1bmNhdGlvbikuXG4gIHJldHVybiBpIDwgMCA/IDAgOiBpID4gMjU1ID8gMjU1IDogaTtcbn1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2Zsb2F0KGYpIHsgIC8vIENsYW1wIHRvIGZsb2F0IDAuMCAuLiAxLjAuXG4gIHJldHVybiBmIDwgMCA/IDAgOiBmID4gMSA/IDEgOiBmO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfaW50KHN0cikgeyAgLy8gaW50IG9yIHBlcmNlbnRhZ2UuXG4gIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnJScpXG4gICAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlRmxvYXQoc3RyKSAvIDEwMCAqIDI1NSk7XG4gIHJldHVybiBjbGFtcF9jc3NfYnl0ZShwYXJzZUludChzdHIpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3NzX2Zsb2F0KHN0cikgeyAgLy8gZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2Zsb2F0KHBhcnNlRmxvYXQoc3RyKSAvIDEwMCk7XG4gIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpKTtcbn1cblxuZnVuY3Rpb24gY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSB7XG4gIGlmIChoIDwgMCkgaCArPSAxO1xuICBlbHNlIGlmIChoID4gMSkgaCAtPSAxO1xuXG4gIGlmIChoICogNiA8IDEpIHJldHVybiBtMSArIChtMiAtIG0xKSAqIGggKiA2O1xuICBpZiAoaCAqIDIgPCAxKSByZXR1cm4gbTI7XG4gIGlmIChoICogMyA8IDIpIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyLzMgLSBoKSAqIDY7XG4gIHJldHVybiBtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VDU1NDb2xvcihjc3Nfc3RyKSB7XG4gIC8vIFJlbW92ZSBhbGwgd2hpdGVzcGFjZSwgbm90IGNvbXBsaWFudCwgYnV0IHNob3VsZCBqdXN0IGJlIG1vcmUgYWNjZXB0aW5nLlxuICB2YXIgc3RyID0gY3NzX3N0ci5yZXBsYWNlKC8gL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIENvbG9yIGtleXdvcmRzIChhbmQgdHJhbnNwYXJlbnQpIGxvb2t1cC5cbiAgaWYgKHN0ciBpbiBrQ1NTQ29sb3JUYWJsZSkgcmV0dXJuIGtDU1NDb2xvclRhYmxlW3N0cl0uc2xpY2UoKTsgIC8vIGR1cC5cblxuICAvLyAjYWJjIGFuZCAjYWJjMTIzIHN5bnRheC5cbiAgaWYgKHN0clswXSA9PT0gJyMnKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPT09IDQpIHtcbiAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZikpIHJldHVybiBudWxsOyAgLy8gQ292ZXJzIE5hTi5cbiAgICAgIHJldHVybiBbKChpdiAmIDB4ZjAwKSA+PiA0KSB8ICgoaXYgJiAweGYwMCkgPj4gOCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZjApIHwgKChpdiAmIDB4ZjApID4+IDQpLFxuICAgICAgICAgICAgICAoaXYgJiAweGYpIHwgKChpdiAmIDB4ZikgPDwgNCksXG4gICAgICAgICAgICAgIDFdO1xuICAgIH0gZWxzZSBpZiAoc3RyLmxlbmd0aCA9PT0gNykge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoaXYgJiAweGZmMDAwMCkgPj4gMTYsXG4gICAgICAgICAgICAgIChpdiAmIDB4ZmYwMCkgPj4gOCxcbiAgICAgICAgICAgICAgaXYgJiAweGZmLFxuICAgICAgICAgICAgICAxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBvcCA9IHN0ci5pbmRleE9mKCcoJyksIGVwID0gc3RyLmluZGV4T2YoJyknKTtcbiAgaWYgKG9wICE9PSAtMSAmJiBlcCArIDEgPT09IHN0ci5sZW5ndGgpIHtcbiAgICB2YXIgZm5hbWUgPSBzdHIuc3Vic3RyKDAsIG9wKTtcbiAgICB2YXIgcGFyYW1zID0gc3RyLnN1YnN0cihvcCsxLCBlcC0ob3ArMSkpLnNwbGl0KCcsJyk7XG4gICAgdmFyIGFscGhhID0gMTsgIC8vIFRvIGFsbG93IGNhc2UgZmFsbHRocm91Z2guXG4gICAgc3dpdGNoIChmbmFtZSkge1xuICAgICAgY2FzZSAncmdiYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAncmdiJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gW3BhcnNlX2Nzc19pbnQocGFyYW1zWzBdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1sxXSksXG4gICAgICAgICAgICAgICAgcGFyc2VfY3NzX2ludChwYXJhbXNbMl0pLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGNhc2UgJ2hzbGEnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGFscGhhID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtcy5wb3AoKSk7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJ2hzbCc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGggPSAoKChwYXJzZUZsb2F0KHBhcmFtc1swXSkgJSAzNjApICsgMzYwKSAlIDM2MCkgLyAzNjA7ICAvLyAwIC4uIDFcbiAgICAgICAgLy8gTk9URShkZWFubSk6IEFjY29yZGluZyB0byB0aGUgQ1NTIHNwZWMgcy9sIHNob3VsZCBvbmx5IGJlXG4gICAgICAgIC8vIHBlcmNlbnRhZ2VzLCBidXQgd2UgZG9uJ3QgYm90aGVyIGFuZCBsZXQgZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgICAgICAgdmFyIHMgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzFdKTtcbiAgICAgICAgdmFyIGwgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzJdKTtcbiAgICAgICAgdmFyIG0yID0gbCA8PSAwLjUgPyBsICogKHMgKyAxKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgICAgIHZhciBtMSA9IGwgKiAyIC0gbTI7XG4gICAgICAgIHJldHVybiBbY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKzEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCkgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaC0xLzMpICogMjU1KSxcbiAgICAgICAgICAgICAgICBhbHBoYV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudHJ5IHsgZXhwb3J0cy5wYXJzZUNTU0NvbG9yID0gcGFyc2VDU1NDb2xvciB9IGNhdGNoKGUpIHsgfVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVhcmN1dDtcblxuZnVuY3Rpb24gZWFyY3V0KGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0pIHtcblxuICAgIGRpbSA9IGRpbSB8fCAyO1xuXG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoLFxuICAgICAgICBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aCxcbiAgICAgICAgb3V0ZXJOb2RlID0gbGlua2VkTGlzdChkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlKSxcbiAgICAgICAgdHJpYW5nbGVzID0gW107XG5cbiAgICBpZiAoIW91dGVyTm9kZSkgcmV0dXJuIHRyaWFuZ2xlcztcblxuICAgIHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBzaXplO1xuXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xuXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcbiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdO1xuICAgICAgICBtaW5ZID0gbWF4WSA9IGRhdGFbMV07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xuICAgICAgICAgICAgeCA9IGRhdGFbaV07XG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgc2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cbiAgICAgICAgc2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgfVxuXG4gICAgZWFyY3V0TGlua2VkKG91dGVyTm9kZSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgcmV0dXJuIHRyaWFuZ2xlcztcbn1cblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5mdW5jdGlvbiBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlKSB7XG4gICAgdmFyIGksIGxhc3Q7XG5cbiAgICBpZiAoY2xvY2t3aXNlID09PSAoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pID4gMCkpIHtcbiAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpID0gZW5kIC0gZGltOyBpID49IHN0YXJ0OyBpIC09IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH1cblxuICAgIGlmIChsYXN0ICYmIGVxdWFscyhsYXN0LCBsYXN0Lm5leHQpKSB7XG4gICAgICAgIHJlbW92ZU5vZGUobGFzdCk7XG4gICAgICAgIGxhc3QgPSBsYXN0Lm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3Q7XG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5mdW5jdGlvbiBmaWx0ZXJQb2ludHMoc3RhcnQsIGVuZCkge1xuICAgIGlmICghc3RhcnQpIHJldHVybiBzdGFydDtcbiAgICBpZiAoIWVuZCkgZW5kID0gc3RhcnQ7XG5cbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBhZ2FpbjtcbiAgICBkbyB7XG4gICAgICAgIGFnYWluID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFwLnN0ZWluZXIgJiYgKGVxdWFscyhwLCBwLm5leHQpIHx8IGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID09PSAwKSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcbiAgICAgICAgICAgIHAgPSBlbmQgPSBwLnByZXY7XG4gICAgICAgICAgICBpZiAocCA9PT0gcC5uZXh0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGFnYWluID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcCA9IHAubmV4dDtcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKGFnYWluIHx8IHAgIT09IGVuZCk7XG5cbiAgICByZXR1cm4gZW5kO1xufVxuXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCBwYXNzKSB7XG4gICAgaWYgKCFlYXIpIHJldHVybjtcblxuICAgIC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbiAgICBpZiAoIXBhc3MgJiYgc2l6ZSkgaW5kZXhDdXJ2ZShlYXIsIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgdmFyIHN0b3AgPSBlYXIsXG4gICAgICAgIHByZXYsIG5leHQ7XG5cbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmVcbiAgICB3aGlsZSAoZWFyLnByZXYgIT09IGVhci5uZXh0KSB7XG4gICAgICAgIHByZXYgPSBlYXIucHJldjtcbiAgICAgICAgbmV4dCA9IGVhci5uZXh0O1xuXG4gICAgICAgIGlmIChzaXplID8gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBzaXplKSA6IGlzRWFyKGVhcikpIHtcbiAgICAgICAgICAgIC8vIGN1dCBvZmYgdGhlIHRyaWFuZ2xlXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChwcmV2LmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goZWFyLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gobmV4dC5pIC8gZGltKTtcblxuICAgICAgICAgICAgcmVtb3ZlTm9kZShlYXIpO1xuXG4gICAgICAgICAgICAvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0aWNlIGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuICAgICAgICAgICAgZWFyID0gbmV4dC5uZXh0O1xuICAgICAgICAgICAgc3RvcCA9IG5leHQubmV4dDtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlYXIgPSBuZXh0O1xuXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXG4gICAgICAgIGlmIChlYXIgPT09IHN0b3ApIHtcbiAgICAgICAgICAgIC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCAxKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZWFyLCB0cmlhbmdsZXMsIGRpbSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUsIDIpO1xuXG4gICAgICAgICAgICAvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAyKSB7XG4gICAgICAgICAgICAgICAgc3BsaXRFYXJjdXQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBjaGVjayB3aGV0aGVyIGEgcG9seWdvbiBub2RlIGZvcm1zIGEgdmFsaWQgZWFyIHdpdGggYWRqYWNlbnQgbm9kZXNcbmZ1bmN0aW9uIGlzRWFyKGVhcikge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBvdGhlciBwb2ludHMgaW5zaWRlIHRoZSBwb3RlbnRpYWwgZWFyXG4gICAgdmFyIHAgPSBlYXIubmV4dC5uZXh0O1xuXG4gICAgd2hpbGUgKHAgIT09IGVhci5wcmV2KSB7XG4gICAgICAgIGlmIChwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIHRyaWFuZ2xlIGJib3g7IG1pbiAmIG1heCBhcmUgY2FsY3VsYXRlZCBsaWtlIHRoaXMgZm9yIHNwZWVkXG4gICAgdmFyIG1pblRYID0gYS54IDwgYi54ID8gKGEueCA8IGMueCA/IGEueCA6IGMueCkgOiAoYi54IDwgYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWluVFkgPSBhLnkgPCBiLnkgPyAoYS55IDwgYy55ID8gYS55IDogYy55KSA6IChiLnkgPCBjLnkgPyBiLnkgOiBjLnkpLFxuICAgICAgICBtYXhUWCA9IGEueCA+IGIueCA/IChhLnggPiBjLnggPyBhLnggOiBjLngpIDogKGIueCA+IGMueCA/IGIueCA6IGMueCksXG4gICAgICAgIG1heFRZID0gYS55ID4gYi55ID8gKGEueSA+IGMueSA/IGEueSA6IGMueSkgOiAoYi55ID4gYy55ID8gYi55IDogYy55KTtcblxuICAgIC8vIHotb3JkZXIgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHRyaWFuZ2xlIGJib3g7XG4gICAgdmFyIG1pblogPSB6T3JkZXIobWluVFgsIG1pblRZLCBtaW5YLCBtaW5ZLCBzaXplKSxcbiAgICAgICAgbWF4WiA9IHpPcmRlcihtYXhUWCwgbWF4VFksIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgLy8gZmlyc3QgbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgaW4gaW5jcmVhc2luZyB6LW9yZGVyXG4gICAgdmFyIHAgPSBlYXIubmV4dFo7XG5cbiAgICB3aGlsZSAocCAmJiBwLnogPD0gbWF4Wikge1xuICAgICAgICBpZiAocCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgfVxuXG4gICAgLy8gdGhlbiBsb29rIGZvciBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyXG4gICAgcCA9IGVhci5wcmV2WjtcblxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5wcmV2WjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcywgZGltKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBhID0gcC5wcmV2LFxuICAgICAgICAgICAgYiA9IHAubmV4dC5uZXh0O1xuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcblxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYS5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChiLmkgLyBkaW0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwLm5leHQpO1xuXG4gICAgICAgICAgICBwID0gc3RhcnQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIHA7XG59XG5cbi8vIHRyeSBzcGxpdHRpbmcgcG9seWdvbiBpbnRvIHR3byBhbmQgdHJpYW5ndWxhdGUgdGhlbSBpbmRlcGVuZGVudGx5XG5mdW5jdGlvbiBzcGxpdEVhcmN1dChzdGFydCwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpIHtcbiAgICAvLyBsb29rIGZvciBhIHZhbGlkIGRpYWdvbmFsIHRoYXQgZGl2aWRlcyB0aGUgcG9seWdvbiBpbnRvIHR3b1xuICAgIHZhciBhID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICB2YXIgYiA9IGEubmV4dC5uZXh0O1xuICAgICAgICB3aGlsZSAoYiAhPT0gYS5wcmV2KSB7XG4gICAgICAgICAgICBpZiAoYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKGEsIGIpKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbFxuICAgICAgICAgICAgICAgIHZhciBjID0gc3BsaXRQb2x5Z29uKGEsIGIpO1xuXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcbiAgICAgICAgICAgICAgICBhID0gZmlsdGVyUG9pbnRzKGEsIGEubmV4dCk7XG4gICAgICAgICAgICAgICAgYyA9IGZpbHRlclBvaW50cyhjLCBjLm5leHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChjLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYiA9IGIubmV4dDtcbiAgICAgICAgfVxuICAgICAgICBhID0gYS5uZXh0O1xuICAgIH0gd2hpbGUgKGEgIT09IHN0YXJ0KTtcbn1cblxuLy8gbGluayBldmVyeSBob2xlIGludG8gdGhlIG91dGVyIGxvb3AsIHByb2R1Y2luZyBhIHNpbmdsZS1yaW5nIHBvbHlnb24gd2l0aG91dCBob2xlc1xuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltKSB7XG4gICAgdmFyIHF1ZXVlID0gW10sXG4gICAgICAgIGksIGxlbiwgc3RhcnQsIGVuZCwgbGlzdDtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XG4gICAgICAgIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgIGxpc3QgPSBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgZmFsc2UpO1xuICAgICAgICBpZiAobGlzdCA9PT0gbGlzdC5uZXh0KSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuICAgICAgICBxdWV1ZS5wdXNoKGdldExlZnRtb3N0KGxpc3QpKTtcbiAgICB9XG5cbiAgICBxdWV1ZS5zb3J0KGNvbXBhcmVYKTtcblxuICAgIC8vIHByb2Nlc3MgaG9sZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0XG4gICAgZm9yIChpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVsaW1pbmF0ZUhvbGUocXVldWVbaV0sIG91dGVyTm9kZSk7XG4gICAgICAgIG91dGVyTm9kZSA9IGZpbHRlclBvaW50cyhvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0ZXJOb2RlO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlWChhLCBiKSB7XG4gICAgcmV0dXJuIGEueCAtIGIueDtcbn1cblxuLy8gZmluZCBhIGJyaWRnZSBiZXR3ZWVuIHZlcnRpY2VzIHRoYXQgY29ubmVjdHMgaG9sZSB3aXRoIGFuIG91dGVyIHJpbmcgYW5kIGFuZCBsaW5rIGl0XG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIG91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSk7XG4gICAgaWYgKG91dGVyTm9kZSkge1xuICAgICAgICB2YXIgYiA9IHNwbGl0UG9seWdvbihvdXRlck5vZGUsIGhvbGUpO1xuICAgICAgICBmaWx0ZXJQb2ludHMoYiwgYi5uZXh0KTtcbiAgICB9XG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cbmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIHZhciBwID0gb3V0ZXJOb2RlLFxuICAgICAgICBoeCA9IGhvbGUueCxcbiAgICAgICAgaHkgPSBob2xlLnksXG4gICAgICAgIHF4ID0gLUluZmluaXR5LFxuICAgICAgICBtO1xuXG4gICAgLy8gZmluZCBhIHNlZ21lbnQgaW50ZXJzZWN0ZWQgYnkgYSByYXkgZnJvbSB0aGUgaG9sZSdzIGxlZnRtb3N0IHBvaW50IHRvIHRoZSBsZWZ0O1xuICAgIC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcbiAgICBkbyB7XG4gICAgICAgIGlmIChoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcC54ICsgKGh5IC0gcC55KSAqIChwLm5leHQueCAtIHAueCkgLyAocC5uZXh0LnkgLSBwLnkpO1xuICAgICAgICAgICAgaWYgKHggPD0gaHggJiYgeCA+IHF4KSB7XG4gICAgICAgICAgICAgICAgcXggPSB4O1xuICAgICAgICAgICAgICAgIGlmICh4ID09PSBoeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAueSkgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC5uZXh0LnkpIHJldHVybiBwLm5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBvdXRlck5vZGUpO1xuXG4gICAgaWYgKCFtKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChoeCA9PT0gcXgpIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XG5cbiAgICAvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247XG4gICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuICAgIHZhciBzdG9wID0gbSxcbiAgICAgICAgbXggPSBtLngsXG4gICAgICAgIG15ID0gbS55LFxuICAgICAgICB0YW5NaW4gPSBJbmZpbml0eSxcbiAgICAgICAgdGFuO1xuXG4gICAgcCA9IG0ubmV4dDtcblxuICAgIHdoaWxlIChwICE9PSBzdG9wKSB7XG4gICAgICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmXG4gICAgICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55KSkge1xuXG4gICAgICAgICAgICB0YW4gPSBNYXRoLmFicyhoeSAtIHAueSkgLyAoaHggLSBwLngpOyAvLyB0YW5nZW50aWFsXG5cbiAgICAgICAgICAgIGlmICgodGFuIDwgdGFuTWluIHx8ICh0YW4gPT09IHRhbk1pbiAmJiBwLnggPiBtLngpKSAmJiBsb2NhbGx5SW5zaWRlKHAsIGhvbGUpKSB7XG4gICAgICAgICAgICAgICAgbSA9IHA7XG4gICAgICAgICAgICAgICAgdGFuTWluID0gdGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbTtcbn1cblxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuZnVuY3Rpb24gaW5kZXhDdXJ2ZShzdGFydCwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIHZhciBwID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC56ID09PSBudWxsKSBwLnogPSB6T3JkZXIocC54LCBwLnksIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICBwLnByZXZaID0gcC5wcmV2O1xuICAgICAgICBwLm5leHRaID0gcC5uZXh0O1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHAucHJldloubmV4dFogPSBudWxsO1xuICAgIHAucHJldlogPSBudWxsO1xuXG4gICAgc29ydExpbmtlZChwKTtcbn1cblxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXG5mdW5jdGlvbiBzb3J0TGlua2VkKGxpc3QpIHtcbiAgICB2YXIgaSwgcCwgcSwgZSwgdGFpbCwgbnVtTWVyZ2VzLCBwU2l6ZSwgcVNpemUsXG4gICAgICAgIGluU2l6ZSA9IDE7XG5cbiAgICBkbyB7XG4gICAgICAgIHAgPSBsaXN0O1xuICAgICAgICBsaXN0ID0gbnVsbDtcbiAgICAgICAgdGFpbCA9IG51bGw7XG4gICAgICAgIG51bU1lcmdlcyA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHApIHtcbiAgICAgICAgICAgIG51bU1lcmdlcysrO1xuICAgICAgICAgICAgcSA9IHA7XG4gICAgICAgICAgICBwU2l6ZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5TaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwU2l6ZSsrO1xuICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgIGlmICghcSkgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHFTaXplID0gaW5TaXplO1xuXG4gICAgICAgICAgICB3aGlsZSAocFNpemUgPiAwIHx8IChxU2l6ZSA+IDAgJiYgcSkpIHtcblxuICAgICAgICAgICAgICAgIGlmIChwU2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxU2l6ZSA9PT0gMCB8fCAhcSkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcDtcbiAgICAgICAgICAgICAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHBTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwLnogPD0gcS56KSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRhaWwpIHRhaWwubmV4dFogPSBlO1xuICAgICAgICAgICAgICAgIGVsc2UgbGlzdCA9IGU7XG5cbiAgICAgICAgICAgICAgICBlLnByZXZaID0gdGFpbDtcbiAgICAgICAgICAgICAgICB0YWlsID0gZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcCA9IHE7XG4gICAgICAgIH1cblxuICAgICAgICB0YWlsLm5leHRaID0gbnVsbDtcbiAgICAgICAgaW5TaXplICo9IDI7XG5cbiAgICB9IHdoaWxlIChudW1NZXJnZXMgPiAxKTtcblxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBzaXplIG9mIHRoZSBkYXRhIGJvdW5kaW5nIGJveFxuZnVuY3Rpb24gek9yZGVyKHgsIHksIG1pblgsIG1pblksIHNpemUpIHtcbiAgICAvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG4gICAgeCA9IDMyNzY3ICogKHggLSBtaW5YKSAvIHNpemU7XG4gICAgeSA9IDMyNzY3ICogKHkgLSBtaW5ZKSAvIHNpemU7XG5cbiAgICB4ID0gKHggfCAoeCA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeCA9ICh4IHwgKHggPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB4ID0gKHggfCAoeCA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgeSA9ICh5IHwgKHkgPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB5ID0gKHkgfCAoeSA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeSA9ICh5IHwgKHkgPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHJldHVybiB4IHwgKHkgPDwgMSk7XG59XG5cbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcbmZ1bmN0aW9uIGdldExlZnRtb3N0KHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgbGVmdG1vc3QgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnggPCBsZWZ0bW9zdC54KSBsZWZ0bW9zdCA9IHA7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGxlZnRtb3N0O1xufVxuXG4vLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KSB7XG4gICAgcmV0dXJuIChjeCAtIHB4KSAqIChheSAtIHB5KSAtIChheCAtIHB4KSAqIChjeSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChheCAtIHB4KSAqIChieSAtIHB5KSAtIChieCAtIHB4KSAqIChheSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChieCAtIHB4KSAqIChjeSAtIHB5KSAtIChjeCAtIHB4KSAqIChieSAtIHB5KSA+PSAwO1xufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcbmZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbChhLCBiKSB7XG4gICAgcmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhaW50ZXJzZWN0c1BvbHlnb24oYSwgYikgJiZcbiAgICAgICAgICAgbG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpICYmIG1pZGRsZUluc2lkZShhLCBiKTtcbn1cblxuLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZVxuZnVuY3Rpb24gYXJlYShwLCBxLCByKSB7XG4gICAgcmV0dXJuIChxLnkgLSBwLnkpICogKHIueCAtIHEueCkgLSAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpO1xufVxuXG4vLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbFxuZnVuY3Rpb24gZXF1YWxzKHAxLCBwMikge1xuICAgIHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBzZWdtZW50cyBpbnRlcnNlY3RcbmZ1bmN0aW9uIGludGVyc2VjdHMocDEsIHExLCBwMiwgcTIpIHtcbiAgICBpZiAoKGVxdWFscyhwMSwgcTEpICYmIGVxdWFscyhwMiwgcTIpKSB8fFxuICAgICAgICAoZXF1YWxzKHAxLCBxMikgJiYgZXF1YWxzKHAyLCBxMSkpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gYXJlYShwMSwgcTEsIHAyKSA+IDAgIT09IGFyZWEocDEsIHExLCBxMikgPiAwICYmXG4gICAgICAgICAgIGFyZWEocDIsIHEyLCBwMSkgPiAwICE9PSBhcmVhKHAyLCBxMiwgcTEpID4gMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGludGVyc2VjdHMgYW55IHBvbHlnb24gc2VnbWVudHNcbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgcCA9IGE7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmXG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0cyhwLCBwLm5leHQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGxvY2FsbHkgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBsb2NhbGx5SW5zaWRlKGEsIGIpIHtcbiAgICByZXR1cm4gYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPCAwID9cbiAgICAgICAgYXJlYShhLCBiLCBhLm5leHQpID49IDAgJiYgYXJlYShhLCBhLnByZXYsIGIpID49IDAgOlxuICAgICAgICBhcmVhKGEsIGIsIGEucHJldikgPCAwIHx8IGFyZWEoYSwgYS5uZXh0LCBiKSA8IDA7XG59XG5cbi8vIGNoZWNrIGlmIHRoZSBtaWRkbGUgcG9pbnQgb2YgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKGEsIGIpIHtcbiAgICB2YXIgcCA9IGEsXG4gICAgICAgIGluc2lkZSA9IGZhbHNlLFxuICAgICAgICBweCA9IChhLnggKyBiLngpIC8gMixcbiAgICAgICAgcHkgPSAoYS55ICsgYi55KSAvIDI7XG4gICAgZG8ge1xuICAgICAgICBpZiAoKChwLnkgPiBweSkgIT09IChwLm5leHQueSA+IHB5KSkgJiYgKHB4IDwgKHAubmV4dC54IC0gcC54KSAqIChweSAtIHAueSkgLyAocC5uZXh0LnkgLSBwLnkpICsgcC54KSlcbiAgICAgICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gaW5zaWRlO1xufVxuXG4vLyBsaW5rIHR3byBwb2x5Z29uIHZlcnRpY2VzIHdpdGggYSBicmlkZ2U7IGlmIHRoZSB2ZXJ0aWNlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcmluZywgaXQgc3BsaXRzIHBvbHlnb24gaW50byB0d287XG4vLyBpZiBvbmUgYmVsb25ncyB0byB0aGUgb3V0ZXIgcmluZyBhbmQgYW5vdGhlciB0byBhIGhvbGUsIGl0IG1lcmdlcyBpdCBpbnRvIGEgc2luZ2xlIHJpbmdcbmZ1bmN0aW9uIHNwbGl0UG9seWdvbihhLCBiKSB7XG4gICAgdmFyIGEyID0gbmV3IE5vZGUoYS5pLCBhLngsIGEueSksXG4gICAgICAgIGIyID0gbmV3IE5vZGUoYi5pLCBiLngsIGIueSksXG4gICAgICAgIGFuID0gYS5uZXh0LFxuICAgICAgICBicCA9IGIucHJldjtcblxuICAgIGEubmV4dCA9IGI7XG4gICAgYi5wcmV2ID0gYTtcblxuICAgIGEyLm5leHQgPSBhbjtcbiAgICBhbi5wcmV2ID0gYTI7XG5cbiAgICBiMi5uZXh0ID0gYTI7XG4gICAgYTIucHJldiA9IGIyO1xuXG4gICAgYnAubmV4dCA9IGIyO1xuICAgIGIyLnByZXYgPSBicDtcblxuICAgIHJldHVybiBiMjtcbn1cblxuLy8gY3JlYXRlIGEgbm9kZSBhbmQgb3B0aW9uYWxseSBsaW5rIGl0IHdpdGggcHJldmlvdXMgb25lIChpbiBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGluc2VydE5vZGUoaSwgeCwgeSwgbGFzdCkge1xuICAgIHZhciBwID0gbmV3IE5vZGUoaSwgeCwgeSk7XG5cbiAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgcC5wcmV2ID0gcDtcbiAgICAgICAgcC5uZXh0ID0gcDtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHAubmV4dCA9IGxhc3QubmV4dDtcbiAgICAgICAgcC5wcmV2ID0gbGFzdDtcbiAgICAgICAgbGFzdC5uZXh0LnByZXYgPSBwO1xuICAgICAgICBsYXN0Lm5leHQgPSBwO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShwKSB7XG4gICAgcC5uZXh0LnByZXYgPSBwLnByZXY7XG4gICAgcC5wcmV2Lm5leHQgPSBwLm5leHQ7XG5cbiAgICBpZiAocC5wcmV2WikgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7XG4gICAgaWYgKHAubmV4dFopIHAubmV4dFoucHJldlogPSBwLnByZXZaO1xufVxuXG5mdW5jdGlvbiBOb2RlKGksIHgsIHkpIHtcbiAgICAvLyB2ZXJ0aWNlIGluZGV4IGluIGNvb3JkaW5hdGVzIGFycmF5XG4gICAgdGhpcy5pID0gaTtcblxuICAgIC8vIHZlcnRleCBjb29yZGluYXRlc1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IHZlcnRpY2Ugbm9kZXMgaW4gYSBwb2x5Z29uIHJpbmdcbiAgICB0aGlzLnByZXYgPSBudWxsO1xuICAgIHRoaXMubmV4dCA9IG51bGw7XG5cbiAgICAvLyB6LW9yZGVyIGN1cnZlIHZhbHVlXG4gICAgdGhpcy56ID0gbnVsbDtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcbiAgICB0aGlzLnByZXZaID0gbnVsbDtcbiAgICB0aGlzLm5leHRaID0gbnVsbDtcblxuICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG4gICAgdGhpcy5zdGVpbmVyID0gZmFsc2U7XG59XG5cbi8vIHJldHVybiBhIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwb2x5Z29uIGFyZWEgYW5kIGl0cyB0cmlhbmd1bGF0aW9uIGFyZWE7XG4vLyB1c2VkIHRvIHZlcmlmeSBjb3JyZWN0bmVzcyBvZiB0cmlhbmd1bGF0aW9uXG5lYXJjdXQuZGV2aWF0aW9uID0gZnVuY3Rpb24gKGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0sIHRyaWFuZ2xlcykge1xuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aDtcbiAgICB2YXIgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGg7XG5cbiAgICB2YXIgcG9seWdvbkFyZWEgPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIDAsIG91dGVyTGVuLCBkaW0pKTtcbiAgICBpZiAoaGFzSG9sZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgcG9seWdvbkFyZWEgLT0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0cmlhbmdsZXNBcmVhID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBhID0gdHJpYW5nbGVzW2ldICogZGltO1xuICAgICAgICB2YXIgYiA9IHRyaWFuZ2xlc1tpICsgMV0gKiBkaW07XG4gICAgICAgIHZhciBjID0gdHJpYW5nbGVzW2kgKyAyXSAqIGRpbTtcbiAgICAgICAgdHJpYW5nbGVzQXJlYSArPSBNYXRoLmFicyhcbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtjXSkgKiAoZGF0YVtiICsgMV0gLSBkYXRhW2EgKyAxXSkgLVxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2JdKSAqIChkYXRhW2MgKyAxXSAtIGRhdGFbYSArIDFdKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvbHlnb25BcmVhID09PSAwICYmIHRyaWFuZ2xlc0FyZWEgPT09IDAgPyAwIDpcbiAgICAgICAgTWF0aC5hYnMoKHRyaWFuZ2xlc0FyZWEgLSBwb2x5Z29uQXJlYSkgLyBwb2x5Z29uQXJlYSk7XG59O1xuXG5mdW5jdGlvbiBzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSBzdGFydCwgaiA9IGVuZCAtIGRpbTsgaSA8IGVuZDsgaSArPSBkaW0pIHtcbiAgICAgICAgc3VtICs9IChkYXRhW2pdIC0gZGF0YVtpXSkgKiAoZGF0YVtpICsgMV0gKyBkYXRhW2ogKyAxXSk7XG4gICAgICAgIGogPSBpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG4vLyB0dXJuIGEgcG9seWdvbiBpbiBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IGZvcm0gKGUuZy4gYXMgaW4gR2VvSlNPTikgaW50byBhIGZvcm0gRWFyY3V0IGFjY2VwdHNcbmVhcmN1dC5mbGF0dGVuID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgZGltID0gZGF0YVswXVswXS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IHt2ZXJ0aWNlczogW10sIGhvbGVzOiBbXSwgZGltZW5zaW9uczogZGltfSxcbiAgICAgICAgaG9sZUluZGV4ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgZGltOyBkKyspIHJlc3VsdC52ZXJ0aWNlcy5wdXNoKGRhdGFbaV1bal1bZF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgaG9sZUluZGV4ICs9IGRhdGFbaSAtIDFdLmxlbmd0aDtcbiAgICAgICAgICAgIHJlc3VsdC5ob2xlcy5wdXNoKGhvbGVJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbkV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uKG4pIHtcbiAgaWYgKCFpc051bWJlcihuKSB8fCBuIDwgMCB8fCBpc05hTihuKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGVyLCBoYW5kbGVyLCBsZW4sIGFyZ3MsIGksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmICh0eXBlID09PSAnZXJyb3InKSB7XG4gICAgaWYgKCF0aGlzLl9ldmVudHMuZXJyb3IgfHxcbiAgICAgICAgKGlzT2JqZWN0KHRoaXMuX2V2ZW50cy5lcnJvcikgJiYgIXRoaXMuX2V2ZW50cy5lcnJvci5sZW5ndGgpKSB7XG4gICAgICBlciA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgXCJlcnJvclwiIGV2ZW50LiAoJyArIGVyICsgJyknKTtcbiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzVW5kZWZpbmVkKGhhbmRsZXIpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgLy8gZmFzdCBjYXNlc1xuICAgICAgY2FzZSAxOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gc2xvd2VyXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoaGFuZGxlcikpIHtcbiAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG4gICAgbGVuID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICBpZiAodGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyKVxuICAgIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uKGxpc3RlbmVyLmxpc3RlbmVyKSA/XG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICBlbHNlIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2VcbiAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG5cbiAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkgJiYgIXRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQpIHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX21heExpc3RlbmVycykpIHtcbiAgICAgIG0gPSB0aGlzLl9tYXhMaXN0ZW5lcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgICB9XG5cbiAgICBpZiAobSAmJiBtID4gMCAmJiB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoID4gbSkge1xuICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCcobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2xlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZS50cmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIElFIDEwXG4gICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgdmFyIGZpcmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuXG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHRoaXMub24odHlwZSwgZyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBsaXN0LCBwb3NpdGlvbiwgbGVuZ3RoLCBpO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGxpc3QgPSB0aGlzLl9ldmVudHNbdHlwZV07XG4gIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBwb3NpdGlvbiA9IC0xO1xuXG4gIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fFxuICAgICAgKGlzRnVuY3Rpb24obGlzdC5saXN0ZW5lcikgJiYgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcblxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxpc3QpKSB7XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnNwbGljZShwb3NpdGlvbiwgMSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIga2V5LCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICBpZiAoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgZWxzZSBpZiAodGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAoa2V5IGluIHRoaXMuX2V2ZW50cykge1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcnMpKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICB9IGVsc2UgaWYgKGxpc3RlbmVycykge1xuICAgIC8vIExJRk8gb3JkZXJcbiAgICB3aGlsZSAobGlzdGVuZXJzLmxlbmd0aClcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IFtdO1xuICBlbHNlIGlmIChpc0Z1bmN0aW9uKHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgcmV0ID0gW3RoaXMuX2V2ZW50c1t0eXBlXV07XG4gIGVsc2VcbiAgICByZXQgPSB0aGlzLl9ldmVudHNbdHlwZV0uc2xpY2UoKTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgaWYgKHRoaXMuX2V2ZW50cykge1xuICAgIHZhciBldmxpc3RlbmVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oZXZsaXN0ZW5lcikpXG4gICAgICByZXR1cm4gMTtcbiAgICBlbHNlIGlmIChldmxpc3RlbmVyKVxuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICB9XG4gIHJldHVybiAwO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG59O1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG4iLCIoZnVuY3Rpb24oKXt2YXIgaz0hIWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXI7ZnVuY3Rpb24gbChhLGIpe2s/YS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsYiwhMSk6YS5hdHRhY2hFdmVudChcInNjcm9sbFwiLGIpfWZ1bmN0aW9uIHYoYSl7ZG9jdW1lbnQuYm9keT9hKCk6az9kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLGEpOmRvY3VtZW50LmF0dGFjaEV2ZW50KFwib25yZWFkeXN0YXRlY2hhbmdlXCIsZnVuY3Rpb24oKXtcImludGVyYWN0aXZlXCIhPWRvY3VtZW50LnJlYWR5U3RhdGUmJlwiY29tcGxldGVcIiE9ZG9jdW1lbnQucmVhZHlTdGF0ZXx8YSgpfSl9O2Z1bmN0aW9uIHcoYSl7dGhpcy5hPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dGhpcy5hLnNldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpO3RoaXMuYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7dGhpcy5iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt0aGlzLmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7dGhpcy5mPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuZz0tMTt0aGlzLmIuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6c2Nyb2xsO2ZvbnQtc2l6ZToxNnB4O1wiO3RoaXMuYy5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtvdmVyZmxvdzpzY3JvbGw7Zm9udC1zaXplOjE2cHg7XCI7XG50aGlzLmYuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7b3ZlcmZsb3c6c2Nyb2xsO2ZvbnQtc2l6ZToxNnB4O1wiO3RoaXMuaC5zdHlsZS5jc3NUZXh0PVwiZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MjAwJTtoZWlnaHQ6MjAwJTtmb250LXNpemU6MTZweDttYXgtd2lkdGg6bm9uZTtcIjt0aGlzLmIuYXBwZW5kQ2hpbGQodGhpcy5oKTt0aGlzLmMuYXBwZW5kQ2hpbGQodGhpcy5mKTt0aGlzLmEuYXBwZW5kQ2hpbGQodGhpcy5iKTt0aGlzLmEuYXBwZW5kQ2hpbGQodGhpcy5jKX1cbmZ1bmN0aW9uIHkoYSxiKXthLmEuc3R5bGUuY3NzVGV4dD1cIm1heC13aWR0aDpub25lO21pbi13aWR0aDoyMHB4O21pbi1oZWlnaHQ6MjBweDtkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6YXV0bzttYXJnaW46MDtwYWRkaW5nOjA7dG9wOi05OTlweDtsZWZ0Oi05OTlweDt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udDpcIitiK1wiO1wifWZ1bmN0aW9uIHooYSl7dmFyIGI9YS5hLm9mZnNldFdpZHRoLGM9YisxMDA7YS5mLnN0eWxlLndpZHRoPWMrXCJweFwiO2EuYy5zY3JvbGxMZWZ0PWM7YS5iLnNjcm9sbExlZnQ9YS5iLnNjcm9sbFdpZHRoKzEwMDtyZXR1cm4gYS5nIT09Yj8oYS5nPWIsITApOiExfWZ1bmN0aW9uIEEoYSxiKXtmdW5jdGlvbiBjKCl7dmFyIGE9bTt6KGEpJiZudWxsIT09YS5hLnBhcmVudE5vZGUmJmIoYS5nKX12YXIgbT1hO2woYS5iLGMpO2woYS5jLGMpO3ooYSl9O2Z1bmN0aW9uIEIoYSxiKXt2YXIgYz1ifHx7fTt0aGlzLmZhbWlseT1hO3RoaXMuc3R5bGU9Yy5zdHlsZXx8XCJub3JtYWxcIjt0aGlzLndlaWdodD1jLndlaWdodHx8XCJub3JtYWxcIjt0aGlzLnN0cmV0Y2g9Yy5zdHJldGNofHxcIm5vcm1hbFwifXZhciBDPW51bGwsRD1udWxsLEg9ISF3aW5kb3cuRm9udEZhY2U7ZnVuY3Rpb24gSSgpe2lmKG51bGw9PT1EKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3RyeXthLnN0eWxlLmZvbnQ9XCJjb25kZW5zZWQgMTAwcHggc2Fucy1zZXJpZlwifWNhdGNoKGIpe31EPVwiXCIhPT1hLnN0eWxlLmZvbnR9cmV0dXJuIER9ZnVuY3Rpb24gSihhLGIpe3JldHVyblthLnN0eWxlLGEud2VpZ2h0LEkoKT9hLnN0cmV0Y2g6XCJcIixcIjEwMHB4XCIsYl0uam9pbihcIiBcIil9XG5CLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxtPWF8fFwiQkVTYnN3eVwiLHg9Ynx8M0UzLEU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7aWYoSCl7dmFyIEs9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBlKCl7KG5ldyBEYXRlKS5nZXRUaW1lKCktRT49eD9iKCk6ZG9jdW1lbnQuZm9udHMubG9hZChKKGMsYy5mYW1pbHkpLG0pLnRoZW4oZnVuY3Rpb24oYyl7MTw9Yy5sZW5ndGg/YSgpOnNldFRpbWVvdXQoZSwyNSl9LGZ1bmN0aW9uKCl7YigpfSl9ZSgpfSksTD1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGMpe3NldFRpbWVvdXQoYyx4KX0pO1Byb21pc2UucmFjZShbTCxLXSkudGhlbihmdW5jdGlvbigpe2EoYyl9LGZ1bmN0aW9uKCl7YihjKX0pfWVsc2UgdihmdW5jdGlvbigpe2Z1bmN0aW9uIHEoKXt2YXIgYjtpZihiPS0xIT1mJiYtMSE9Z3x8LTEhPWYmJi0xIT1ofHwtMSE9ZyYmLTEhPVxuaCkoYj1mIT1nJiZmIT1oJiZnIT1oKXx8KG51bGw9PT1DJiYoYj0vQXBwbGVXZWJLaXRcXC8oWzAtOV0rKSg/OlxcLihbMC05XSspKS8uZXhlYyh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCksQz0hIWImJig1MzY+cGFyc2VJbnQoYlsxXSwxMCl8fDUzNj09PXBhcnNlSW50KGJbMV0sMTApJiYxMT49cGFyc2VJbnQoYlsyXSwxMCkpKSxiPUMmJihmPT1yJiZnPT1yJiZoPT1yfHxmPT10JiZnPT10JiZoPT10fHxmPT11JiZnPT11JiZoPT11KSksYj0hYjtiJiYobnVsbCE9PWQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpLGNsZWFyVGltZW91dChHKSxhKGMpKX1mdW5jdGlvbiBGKCl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktRT49eCludWxsIT09ZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCksYihjKTtlbHNle3ZhciBhPWRvY3VtZW50LmhpZGRlbjtpZighMD09PWF8fHZvaWQgMD09PWEpZj1lLmEub2Zmc2V0V2lkdGgsZz1uLmEub2Zmc2V0V2lkdGgsXG5oPXAuYS5vZmZzZXRXaWR0aCxxKCk7Rz1zZXRUaW1lb3V0KEYsNTApfX12YXIgZT1uZXcgdyhtKSxuPW5ldyB3KG0pLHA9bmV3IHcobSksZj0tMSxnPS0xLGg9LTEscj0tMSx0PS0xLHU9LTEsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLEc9MDtkLmRpcj1cImx0clwiO3koZSxKKGMsXCJzYW5zLXNlcmlmXCIpKTt5KG4sSihjLFwic2VyaWZcIikpO3kocCxKKGMsXCJtb25vc3BhY2VcIikpO2QuYXBwZW5kQ2hpbGQoZS5hKTtkLmFwcGVuZENoaWxkKG4uYSk7ZC5hcHBlbmRDaGlsZChwLmEpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCk7cj1lLmEub2Zmc2V0V2lkdGg7dD1uLmEub2Zmc2V0V2lkdGg7dT1wLmEub2Zmc2V0V2lkdGg7RigpO0EoZSxmdW5jdGlvbihhKXtmPWE7cSgpfSk7eShlLEooYywnXCInK2MuZmFtaWx5KydcIixzYW5zLXNlcmlmJykpO0EobixmdW5jdGlvbihhKXtnPWE7cSgpfSk7eShuLEooYywnXCInK2MuZmFtaWx5KydcIixzZXJpZicpKTtBKHAsZnVuY3Rpb24oYSl7aD1cbmE7cSgpfSk7eShwLEooYywnXCInK2MuZmFtaWx5KydcIixtb25vc3BhY2UnKSl9KX0pfTt3aW5kb3cuRm9udEZhY2VPYnNlcnZlcj1CO3dpbmRvdy5Gb250RmFjZU9ic2VydmVyLnByb3RvdHlwZS5jaGVjaz13aW5kb3cuRm9udEZhY2VPYnNlcnZlci5wcm90b3R5cGUubG9hZD1CLnByb3RvdHlwZS5sb2FkO1widW5kZWZpbmVkXCIhPT10eXBlb2YgbW9kdWxlJiYobW9kdWxlLmV4cG9ydHM9d2luZG93LkZvbnRGYWNlT2JzZXJ2ZXIpO30oKSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2xpcDtcblxuLyogY2xpcCBmZWF0dXJlcyBiZXR3ZWVuIHR3byBheGlzLXBhcmFsbGVsIGxpbmVzOlxuICogICAgIHwgICAgICAgIHxcbiAqICBfX198X19fICAgICB8ICAgICAvXG4gKiAvICAgfCAgIFxcX19fX3xfX19fL1xuICogICAgIHwgICAgICAgIHxcbiAqL1xuXG5mdW5jdGlvbiBjbGlwKGZlYXR1cmVzLCBzY2FsZSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIG1pbkFsbCwgbWF4QWxsKSB7XG5cbiAgICBrMSAvPSBzY2FsZTtcbiAgICBrMiAvPSBzY2FsZTtcblxuICAgIGlmIChtaW5BbGwgPj0gazEgJiYgbWF4QWxsIDw9IGsyKSByZXR1cm4gZmVhdHVyZXM7IC8vIHRyaXZpYWwgYWNjZXB0XG4gICAgZWxzZSBpZiAobWluQWxsID4gazIgfHwgbWF4QWxsIDwgazEpIHJldHVybiBudWxsOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgdmFyIGNsaXBwZWQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgIG1pbiwgbWF4O1xuXG4gICAgICAgIG1pbiA9IGZlYXR1cmUubWluW2F4aXNdO1xuICAgICAgICBtYXggPSBmZWF0dXJlLm1heFtheGlzXTtcblxuICAgICAgICBpZiAobWluID49IGsxICYmIG1heCA8PSBrMikgeyAvLyB0cml2aWFsIGFjY2VwdFxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGZlYXR1cmUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWluID4gazIgfHwgbWF4IDwgazEpIGNvbnRpbnVlOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgICAgIHZhciBzbGljZXMgPSB0eXBlID09PSAxID9cbiAgICAgICAgICAgICAgICBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIDpcbiAgICAgICAgICAgICAgICBjbGlwR2VvbWV0cnkoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCB0eXBlID09PSAzKTtcblxuICAgICAgICBpZiAoc2xpY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gaWYgYSBmZWF0dXJlIGdvdCBjbGlwcGVkLCBpdCB3aWxsIGxpa2VseSBnZXQgY2xpcHBlZCBvbiB0aGUgbmV4dCB6b29tIGxldmVsIGFzIHdlbGwsXG4gICAgICAgICAgICAvLyBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgYmJveGVzXG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goe1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBzbGljZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICB0YWdzOiBmZWF0dXJlc1tpXS50YWdzIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgbWluOiBmZWF0dXJlLm1pbixcbiAgICAgICAgICAgICAgICBtYXg6IGZlYXR1cmUubWF4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGVkLmxlbmd0aCA/IGNsaXBwZWQgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBjbGlwUG9pbnRzKGdlb21ldHJ5LCBrMSwgazIsIGF4aXMpIHtcbiAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGEgPSBnZW9tZXRyeVtpXSxcbiAgICAgICAgICAgIGFrID0gYVtheGlzXTtcblxuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG4gICAgfVxuICAgIHJldHVybiBzbGljZTtcbn1cblxuZnVuY3Rpb24gY2xpcEdlb21ldHJ5KGdlb21ldHJ5LCBrMSwgazIsIGF4aXMsIGludGVyc2VjdCwgY2xvc2VkKSB7XG5cbiAgICB2YXIgc2xpY2VzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgdmFyIGFrID0gMCxcbiAgICAgICAgICAgIGJrID0gMCxcbiAgICAgICAgICAgIGIgPSBudWxsLFxuICAgICAgICAgICAgcG9pbnRzID0gZ2VvbWV0cnlbaV0sXG4gICAgICAgICAgICBhcmVhID0gcG9pbnRzLmFyZWEsXG4gICAgICAgICAgICBkaXN0ID0gcG9pbnRzLmRpc3QsXG4gICAgICAgICAgICBsZW4gPSBwb2ludHMubGVuZ3RoLFxuICAgICAgICAgICAgYSwgaiwgbGFzdDtcblxuICAgICAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBhID0gYiB8fCBwb2ludHNbal07XG4gICAgICAgICAgICBiID0gcG9pbnRzW2ogKyAxXTtcbiAgICAgICAgICAgIGFrID0gYmsgfHwgYVtheGlzXTtcbiAgICAgICAgICAgIGJrID0gYltheGlzXTtcblxuICAgICAgICAgICAgaWYgKGFrIDwgazEpIHtcblxuICAgICAgICAgICAgICAgIGlmICgoYmsgPiBrMikpIHsgLy8gLS0tfC0tLS0tfC0tPlxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSksIGludGVyc2VjdChhLCBiLCBrMikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPj0gazEpIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSk7IC8vIC0tLXwtLT4gIHxcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChhayA+IGsyKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGJrIDwgazEpKSB7IC8vIDwtLXwtLS0tLXwtLS1cbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazIpLCBpbnRlcnNlY3QoYSwgYiwgazEpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJrIDw9IGsyKSBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMikpOyAvLyB8ICA8LS18LS0tXG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJrIDwgazEpIHsgLy8gPC0tfC0tLSAgfFxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPiBrMikgeyAvLyB8ICAtLS18LS0+XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB8IC0tPiB8XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgdGhlIGxhc3QgcG9pbnRcbiAgICAgICAgYSA9IHBvaW50c1tsZW4gLSAxXTtcbiAgICAgICAgYWsgPSBhW2F4aXNdO1xuICAgICAgICBpZiAoYWsgPj0gazEgJiYgYWsgPD0gazIpIHNsaWNlLnB1c2goYSk7XG5cbiAgICAgICAgLy8gY2xvc2UgdGhlIHBvbHlnb24gaWYgaXRzIGVuZHBvaW50cyBhcmUgbm90IHRoZSBzYW1lIGFmdGVyIGNsaXBwaW5nXG5cbiAgICAgICAgbGFzdCA9IHNsaWNlW3NsaWNlLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoY2xvc2VkICYmIGxhc3QgJiYgKHNsaWNlWzBdWzBdICE9PSBsYXN0WzBdIHx8IHNsaWNlWzBdWzFdICE9PSBsYXN0WzFdKSkgc2xpY2UucHVzaChzbGljZVswXSk7XG5cbiAgICAgICAgLy8gYWRkIHRoZSBmaW5hbCBzbGljZVxuICAgICAgICBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2xpY2VzO1xufVxuXG5mdW5jdGlvbiBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KSB7XG4gICAgaWYgKHNsaWNlLmxlbmd0aCkge1xuICAgICAgICAvLyB3ZSBkb24ndCByZWNhbGN1bGF0ZSB0aGUgYXJlYS9sZW5ndGggb2YgdGhlIHVuY2xpcHBlZCBnZW9tZXRyeSBiZWNhdXNlIHRoZSBjYXNlIHdoZXJlIGl0IGdvZXNcbiAgICAgICAgLy8gYmVsb3cgdGhlIHZpc2liaWxpdHkgdGhyZXNob2xkIGFzIGEgcmVzdWx0IG9mIGNsaXBwaW5nIGlzIHJhcmUsIHNvIHdlIGF2b2lkIGRvaW5nIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgICAgc2xpY2UuYXJlYSA9IGFyZWE7XG4gICAgICAgIHNsaWNlLmRpc3QgPSBkaXN0O1xuXG4gICAgICAgIHNsaWNlcy5wdXNoKHNsaWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG5cbnZhciBzaW1wbGlmeSA9IHJlcXVpcmUoJy4vc2ltcGxpZnknKTtcblxuLy8gY29udmVydHMgR2VvSlNPTiBmZWF0dXJlIGludG8gYW4gaW50ZXJtZWRpYXRlIHByb2plY3RlZCBKU09OIHZlY3RvciBmb3JtYXQgd2l0aCBzaW1wbGlmaWNhdGlvbiBkYXRhXG5cbmZ1bmN0aW9uIGNvbnZlcnQoZGF0YSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGZlYXR1cmVzID0gW107XG5cbiAgICBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEuZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBkYXRhLCB0b2xlcmFuY2UpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2luZ2xlIGdlb21ldHJ5IG9yIGEgZ2VvbWV0cnkgY29sbGVjdGlvblxuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge2dlb21ldHJ5OiBkYXRhfSwgdG9sZXJhbmNlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZmVhdHVyZSwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZ2VvbS50eXBlLFxuICAgICAgICBjb29yZHMgPSBnZW9tLmNvb3JkaW5hdGVzLFxuICAgICAgICB0YWdzID0gZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICBpLCBqLCByaW5ncztcblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIFtwcm9qZWN0UG9pbnQoY29vcmRzKV0pKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDEsIHByb2plY3QoY29vcmRzKSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMiwgW3Byb2plY3QoY29vcmRzLCB0b2xlcmFuY2UpXSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgcmluZ3MgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmluZ3MucHVzaChwcm9qZWN0KGNvb3Jkc1tpXSwgdG9sZXJhbmNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgdHlwZSA9PT0gJ1BvbHlnb24nID8gMyA6IDIsIHJpbmdzKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHJpbmdzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICByaW5ncy5wdXNoKHByb2plY3QoY29vcmRzW2ldW2pdLCB0b2xlcmFuY2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAzLCByaW5ncykpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnR2VvbWV0cnlDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9tLmdlb21ldHJpZXNbaV0sXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogdGFnc1xuICAgICAgICAgICAgfSwgdG9sZXJhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LicpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlKHRhZ3MsIHR5cGUsIGdlb21ldHJ5KSB7XG4gICAgdmFyIGZlYXR1cmUgPSB7XG4gICAgICAgIGdlb21ldHJ5OiBnZW9tZXRyeSxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdGFnczogdGFncyB8fCBudWxsLFxuICAgICAgICBtaW46IFsyLCAxXSwgLy8gaW5pdGlhbCBiYm94IHZhbHVlcztcbiAgICAgICAgbWF4OiBbLTEsIDBdICAvLyBub3RlIHRoYXQgY29vcmRzIGFyZSB1c3VhbGx5IGluIFswLi4xXSByYW5nZVxuICAgIH07XG4gICAgY2FsY0JCb3goZmVhdHVyZSk7XG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIHByb2plY3QobG9ubGF0cywgdG9sZXJhbmNlKSB7XG4gICAgdmFyIHByb2plY3RlZCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9ubGF0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwcm9qZWN0ZWQucHVzaChwcm9qZWN0UG9pbnQobG9ubGF0c1tpXSkpO1xuICAgIH1cbiAgICBpZiAodG9sZXJhbmNlKSB7XG4gICAgICAgIHNpbXBsaWZ5KHByb2plY3RlZCwgdG9sZXJhbmNlKTtcbiAgICAgICAgY2FsY1NpemUocHJvamVjdGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2plY3RlZDtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFBvaW50KHApIHtcbiAgICB2YXIgc2luID0gTWF0aC5zaW4ocFsxXSAqIE1hdGguUEkgLyAxODApLFxuICAgICAgICB4ID0gKHBbMF0gLyAzNjAgKyAwLjUpLFxuICAgICAgICB5ID0gKDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSSk7XG5cbiAgICB5ID0geSA8IC0xID8gLTEgOlxuICAgICAgICB5ID4gMSA/IDEgOiB5O1xuXG4gICAgcmV0dXJuIFt4LCB5LCAwXTtcbn1cblxuLy8gY2FsY3VsYXRlIGFyZWEgYW5kIGxlbmd0aCBvZiB0aGUgcG9seVxuZnVuY3Rpb24gY2FsY1NpemUocG9pbnRzKSB7XG4gICAgdmFyIGFyZWEgPSAwLFxuICAgICAgICBkaXN0ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBhLCBiOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBhID0gYiB8fCBwb2ludHNbaV07XG4gICAgICAgIGIgPSBwb2ludHNbaSArIDFdO1xuXG4gICAgICAgIGFyZWEgKz0gYVswXSAqIGJbMV0gLSBiWzBdICogYVsxXTtcblxuICAgICAgICAvLyB1c2UgTWFuaGF0dGFuIGRpc3RhbmNlIGluc3RlYWQgb2YgRXVjbGlkaWFuIG9uZSB0byBhdm9pZCBleHBlbnNpdmUgc3F1YXJlIHJvb3QgY29tcHV0YXRpb25cbiAgICAgICAgZGlzdCArPSBNYXRoLmFicyhiWzBdIC0gYVswXSkgKyBNYXRoLmFicyhiWzFdIC0gYVsxXSk7XG4gICAgfVxuICAgIHBvaW50cy5hcmVhID0gTWF0aC5hYnMoYXJlYSAvIDIpO1xuICAgIHBvaW50cy5kaXN0ID0gZGlzdDtcbn1cblxuLy8gY2FsY3VsYXRlIHRoZSBmZWF0dXJlIGJvdW5kaW5nIGJveCBmb3IgZmFzdGVyIGNsaXBwaW5nIGxhdGVyXG5mdW5jdGlvbiBjYWxjQkJveChmZWF0dXJlKSB7XG4gICAgdmFyIGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgbWluID0gZmVhdHVyZS5taW4sXG4gICAgICAgIG1heCA9IGZlYXR1cmUubWF4O1xuXG4gICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gMSkgY2FsY1JpbmdCQm94KG1pbiwgbWF4LCBnZW9tZXRyeSk7XG4gICAgZWxzZSBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSBjYWxjUmluZ0JCb3gobWluLCBtYXgsIGdlb21ldHJ5W2ldKTtcblxuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5mdW5jdGlvbiBjYWxjUmluZ0JCb3gobWluLCBtYXgsIHBvaW50cykge1xuICAgIGZvciAodmFyIGkgPSAwLCBwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHAgPSBwb2ludHNbaV07XG4gICAgICAgIG1pblswXSA9IE1hdGgubWluKHBbMF0sIG1pblswXSk7XG4gICAgICAgIG1heFswXSA9IE1hdGgubWF4KHBbMF0sIG1heFswXSk7XG4gICAgICAgIG1pblsxXSA9IE1hdGgubWluKHBbMV0sIG1pblsxXSk7XG4gICAgICAgIG1heFsxXSA9IE1hdGgubWF4KHBbMV0sIG1heFsxXSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdlb2pzb252dDtcblxudmFyIGNvbnZlcnQgPSByZXF1aXJlKCcuL2NvbnZlcnQnKSwgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXG4gICAgY2xpcCA9IHJlcXVpcmUoJy4vY2xpcCcpLCAgICAgICAvLyBzdHJpcGUgY2xpcHBpbmcgYWxnb3JpdGhtXG4gICAgd3JhcCA9IHJlcXVpcmUoJy4vd3JhcCcpLCAgICAgICAvLyBkYXRlIGxpbmUgcHJvY2Vzc2luZ1xuICAgIGNyZWF0ZVRpbGUgPSByZXF1aXJlKCcuL3RpbGUnKTsgLy8gZmluYWwgc2ltcGxpZmllZCB0aWxlIGdlbmVyYXRpb25cblxuXG5mdW5jdGlvbiBnZW9qc29udnQoZGF0YSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZSh0aGlzLm9wdGlvbnMpLCBvcHRpb25zKTtcblxuICAgIHZhciBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICBpZiAoZGVidWcpIGNvbnNvbGUudGltZSgncHJlcHJvY2VzcyBkYXRhJyk7XG5cbiAgICB2YXIgejIgPSAxIDw8IG9wdGlvbnMubWF4Wm9vbSwgLy8gMl56XG4gICAgICAgIGZlYXR1cmVzID0gY29udmVydChkYXRhLCBvcHRpb25zLnRvbGVyYW5jZSAvICh6MiAqIG9wdGlvbnMuZXh0ZW50KSk7XG5cbiAgICB0aGlzLnRpbGVzID0ge307XG4gICAgdGhpcy50aWxlQ29vcmRzID0gW107XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdwcmVwcm9jZXNzIGRhdGEnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ2luZGV4OiBtYXhab29tOiAlZCwgbWF4UG9pbnRzOiAlZCcsIG9wdGlvbnMuaW5kZXhNYXhab29tLCBvcHRpb25zLmluZGV4TWF4UG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICB0aGlzLnN0YXRzID0ge307XG4gICAgICAgIHRoaXMudG90YWwgPSAwO1xuICAgIH1cblxuICAgIGZlYXR1cmVzID0gd3JhcChmZWF0dXJlcywgb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCwgaW50ZXJzZWN0WCk7XG5cbiAgICAvLyBzdGFydCBzbGljaW5nIGZyb20gdGhlIHRvcCB0aWxlIGRvd25cbiAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSB0aGlzLnNwbGl0VGlsZShmZWF0dXJlcywgMCwgMCwgMCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgY29uc29sZS5sb2coJ2ZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCcsIHRoaXMudGlsZXNbMF0ubnVtRmVhdHVyZXMsIHRoaXMudGlsZXNbMF0ubnVtUG9pbnRzKTtcbiAgICAgICAgY29uc29sZS50aW1lRW5kKCdnZW5lcmF0ZSB0aWxlcycpO1xuICAgICAgICBjb25zb2xlLmxvZygndGlsZXMgZ2VuZXJhdGVkOicsIHRoaXMudG90YWwsIEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdHMpKTtcbiAgICB9XG59XG5cbkdlb0pTT05WVC5wcm90b3R5cGUub3B0aW9ucyA9IHtcbiAgICBtYXhab29tOiAxNCwgICAgICAgICAgICAvLyBtYXggem9vbSB0byBwcmVzZXJ2ZSBkZXRhaWwgb25cbiAgICBpbmRleE1heFpvb206IDUsICAgICAgICAvLyBtYXggem9vbSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIGluZGV4TWF4UG9pbnRzOiAxMDAwMDAsIC8vIG1heCBudW1iZXIgb2YgcG9pbnRzIHBlciB0aWxlIGluIHRoZSB0aWxlIGluZGV4XG4gICAgc29saWRDaGlsZHJlbjogZmFsc2UsICAgLy8gd2hldGhlciB0byB0aWxlIHNvbGlkIHNxdWFyZSB0aWxlcyBmdXJ0aGVyXG4gICAgdG9sZXJhbmNlOiAzLCAgICAgICAgICAgLy8gc2ltcGxpZmljYXRpb24gdG9sZXJhbmNlIChoaWdoZXIgbWVhbnMgc2ltcGxlcilcbiAgICBleHRlbnQ6IDQwOTYsICAgICAgICAgICAvLyB0aWxlIGV4dGVudFxuICAgIGJ1ZmZlcjogNjQsICAgICAgICAgICAgIC8vIHRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZVxuICAgIGRlYnVnOiAwICAgICAgICAgICAgICAgIC8vIGxvZ2dpbmcgbGV2ZWwgKDAsIDEgb3IgMilcbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlID0gZnVuY3Rpb24gKGZlYXR1cmVzLCB6LCB4LCB5LCBjeiwgY3gsIGN5KSB7XG5cbiAgICB2YXIgc3RhY2sgPSBbZmVhdHVyZXMsIHosIHgsIHldLFxuICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICAvLyBhdm9pZCByZWN1cnNpb24gYnkgdXNpbmcgYSBwcm9jZXNzaW5nIHF1ZXVlXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB5ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHggPSBzdGFjay5wb3AoKTtcbiAgICAgICAgeiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBmZWF0dXJlcyA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIHZhciB6MiA9IDEgPDwgeixcbiAgICAgICAgICAgIGlkID0gdG9JRCh6LCB4LCB5KSxcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSxcbiAgICAgICAgICAgIHRpbGVUb2xlcmFuY2UgPSB6ID09PSBvcHRpb25zLm1heFpvb20gPyAwIDogb3B0aW9ucy50b2xlcmFuY2UgLyAoejIgKiBvcHRpb25zLmV4dGVudCk7XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NyZWF0aW9uJyk7XG5cbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSA9IGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHoyLCB4LCB5LCB0aWxlVG9sZXJhbmNlLCB6ID09PSBvcHRpb25zLm1heFpvb20pO1xuICAgICAgICAgICAgdGhpcy50aWxlQ29vcmRzLnB1c2goe3o6IHosIHg6IHgsIHk6IHl9KTtcblxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGlsZSB6JWQtJWQtJWQgKGZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCwgc2ltcGxpZmllZDogJWQpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHosIHgsIHksIHRpbGUubnVtRmVhdHVyZXMsIHRpbGUubnVtUG9pbnRzLCB0aWxlLm51bVNpbXBsaWZpZWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2NyZWF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSAneicgKyB6O1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHNba2V5XSA9ICh0aGlzLnN0YXRzW2tleV0gfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWwrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIGdlb21ldHJ5IGluIHRpbGUgc28gdGhhdCB3ZSBjYW4gZHJpbGwgZG93biBsYXRlciBpZiB3ZSBzdG9wIG5vd1xuICAgICAgICB0aWxlLnNvdXJjZSA9IGZlYXR1cmVzO1xuXG4gICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHRoZSB0aWxlIGlzIHNvbGlkIGNsaXBwZWQgc3F1YXJlXG4gICAgICAgIGlmICghb3B0aW9ucy5zb2xpZENoaWxkcmVuICYmIGlzQ2xpcHBlZFNxdWFyZSh0aWxlLCBvcHRpb25zLmV4dGVudCwgb3B0aW9ucy5idWZmZXIpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBpdCdzIHRoZSBmaXJzdC1wYXNzIHRpbGluZ1xuICAgICAgICBpZiAoIWN6KSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIG1heCB6b29tLCBvciBpZiB0aGUgdGlsZSBpcyB0b28gc2ltcGxlXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5pbmRleE1heFpvb20gfHwgdGlsZS5udW1Qb2ludHMgPD0gb3B0aW9ucy5pbmRleE1heFBvaW50cykgY29udGludWU7XG5cbiAgICAgICAgLy8gaWYgYSBkcmlsbGRvd24gdG8gYSBzcGVjaWZpYyB0aWxlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB3ZSByZWFjaGVkIGJhc2Ugem9vbSBvciBvdXIgdGFyZ2V0IHRpbGUgem9vbVxuICAgICAgICAgICAgaWYgKHogPT09IG9wdGlvbnMubWF4Wm9vbSB8fCB6ID09PSBjeikgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIGl0J3Mgbm90IGFuIGFuY2VzdG9yIG9mIHRoZSB0YXJnZXQgdGlsZVxuICAgICAgICAgICAgdmFyIG0gPSAxIDw8IChjeiAtIHopO1xuICAgICAgICAgICAgaWYgKHggIT09IE1hdGguZmxvb3IoY3ggLyBtKSB8fCB5ICE9PSBNYXRoLmZsb29yKGN5IC8gbSkpIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2Ugc2xpY2UgZnVydGhlciBkb3duLCBubyBuZWVkIHRvIGtlZXAgc291cmNlIGdlb21ldHJ5XG4gICAgICAgIHRpbGUuc291cmNlID0gbnVsbDtcblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgLy8gdmFsdWVzIHdlJ2xsIHVzZSBmb3IgY2xpcHBpbmdcbiAgICAgICAgdmFyIGsxID0gMC41ICogb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudCxcbiAgICAgICAgICAgIGsyID0gMC41IC0gazEsXG4gICAgICAgICAgICBrMyA9IDAuNSArIGsxLFxuICAgICAgICAgICAgazQgPSAxICsgazEsXG4gICAgICAgICAgICB0bCwgYmwsIHRyLCBiciwgbGVmdCwgcmlnaHQ7XG5cbiAgICAgICAgdGwgPSBibCA9IHRyID0gYnIgPSBudWxsO1xuXG4gICAgICAgIGxlZnQgID0gY2xpcChmZWF0dXJlcywgejIsIHggLSBrMSwgeCArIGszLCAwLCBpbnRlcnNlY3RYLCB0aWxlLm1pblswXSwgdGlsZS5tYXhbMF0pO1xuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4ICsgazIsIHggKyBrNCwgMCwgaW50ZXJzZWN0WCwgdGlsZS5taW5bMF0sIHRpbGUubWF4WzBdKTtcblxuICAgICAgICBpZiAobGVmdCkge1xuICAgICAgICAgICAgdGwgPSBjbGlwKGxlZnQsIHoyLCB5IC0gazEsIHkgKyBrMywgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgICAgIGJsID0gY2xpcChsZWZ0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmlnaHQpIHtcbiAgICAgICAgICAgIHRyID0gY2xpcChyaWdodCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICAgICAgYnIgPSBjbGlwKHJpZ2h0LCB6MiwgeSArIGsyLCB5ICsgazQsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgaWYgKHRsKSBzdGFjay5wdXNoKHRsLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMik7XG4gICAgICAgIGlmIChibCkgc3RhY2sucHVzaChibCwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIgKyAxKTtcbiAgICAgICAgaWYgKHRyKSBzdGFjay5wdXNoKHRyLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMik7XG4gICAgICAgIGlmIChicikgc3RhY2sucHVzaChiciwgeiArIDEsIHggKiAyICsgMSwgeSAqIDIgKyAxKTtcbiAgICB9XG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLmdldFRpbGUgPSBmdW5jdGlvbiAoeiwgeCwgeSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBleHRlbnQgPSBvcHRpb25zLmV4dGVudCxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgdmFyIHoyID0gMSA8PCB6O1xuICAgIHggPSAoKHggJSB6MikgKyB6MikgJSB6MjsgLy8gd3JhcCB0aWxlIHggY29vcmRpbmF0ZVxuXG4gICAgdmFyIGlkID0gdG9JRCh6LCB4LCB5KTtcbiAgICBpZiAodGhpcy50aWxlc1tpZF0pIHJldHVybiB0cmFuc2Zvcm1UaWxlKHRoaXMudGlsZXNbaWRdLCBleHRlbnQpO1xuXG4gICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS5sb2coJ2RyaWxsaW5nIGRvd24gdG8geiVkLSVkLSVkJywgeiwgeCwgeSk7XG5cbiAgICB2YXIgejAgPSB6LFxuICAgICAgICB4MCA9IHgsXG4gICAgICAgIHkwID0geSxcbiAgICAgICAgcGFyZW50O1xuXG4gICAgd2hpbGUgKCFwYXJlbnQgJiYgejAgPiAwKSB7XG4gICAgICAgIHowLS07XG4gICAgICAgIHgwID0gTWF0aC5mbG9vcih4MCAvIDIpO1xuICAgICAgICB5MCA9IE1hdGguZmxvb3IoeTAgLyAyKTtcbiAgICAgICAgcGFyZW50ID0gdGhpcy50aWxlc1t0b0lEKHowLCB4MCwgeTApXTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZm91bmQgcGFyZW50IHRpbGUgeiVkLSVkLSVkJywgejAsIHgwLCB5MCk7XG5cbiAgICAvLyBpZiB3ZSBmb3VuZCBhIHBhcmVudCB0aWxlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGdlb21ldHJ5LCB3ZSBjYW4gZHJpbGwgZG93biBmcm9tIGl0XG4gICAgaWYgKHBhcmVudC5zb3VyY2UpIHtcbiAgICAgICAgaWYgKGlzQ2xpcHBlZFNxdWFyZShwYXJlbnQsIGV4dGVudCwgb3B0aW9ucy5idWZmZXIpKSByZXR1cm4gdHJhbnNmb3JtVGlsZShwYXJlbnQsIGV4dGVudCk7XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdkcmlsbGluZyBkb3duJyk7XG4gICAgICAgIHRoaXMuc3BsaXRUaWxlKHBhcmVudC5zb3VyY2UsIHowLCB4MCwgeTAsIHosIHgsIHkpO1xuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2RyaWxsaW5nIGRvd24nKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudGlsZXNbaWRdKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1UaWxlKHRoaXMudGlsZXNbaWRdLCBleHRlbnQpO1xufTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtVGlsZSh0aWxlLCBleHRlbnQpIHtcbiAgICBpZiAodGlsZS50cmFuc2Zvcm1lZCkgcmV0dXJuIHRpbGU7XG5cbiAgICB2YXIgejIgPSB0aWxlLnoyLFxuICAgICAgICB0eCA9IHRpbGUueCxcbiAgICAgICAgdHkgPSB0aWxlLnksXG4gICAgICAgIGksIGosIGs7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZS5mZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IHRpbGUuZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaisrKSBnZW9tW2pdID0gdHJhbnNmb3JtUG9pbnQoZ2VvbVtqXSwgZXh0ZW50LCB6MiwgdHgsIHR5KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb20ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcmluZyA9IGdlb21bal07XG4gICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHJpbmcubGVuZ3RoOyBrKyspIHJpbmdba10gPSB0cmFuc2Zvcm1Qb2ludChyaW5nW2tdLCBleHRlbnQsIHoyLCB0eCwgdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGlsZS50cmFuc2Zvcm1lZCA9IHRydWU7XG5cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnQocCwgZXh0ZW50LCB6MiwgdHgsIHR5KSB7XG4gICAgdmFyIHggPSBNYXRoLnJvdW5kKGV4dGVudCAqIChwWzBdICogejIgLSB0eCkpLFxuICAgICAgICB5ID0gTWF0aC5yb3VuZChleHRlbnQgKiAocFsxXSAqIHoyIC0gdHkpKTtcbiAgICByZXR1cm4gW3gsIHldO1xufVxuXG5mdW5jdGlvbiB0b0lEKHosIHgsIHkpIHtcbiAgICByZXR1cm4gKCgoMSA8PCB6KSAqIHkgKyB4KSAqIDMyKSArIHo7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdFgoYSwgYiwgeCkge1xuICAgIHJldHVybiBbeCwgKHggLSBhWzBdKSAqIChiWzFdIC0gYVsxXSkgLyAoYlswXSAtIGFbMF0pICsgYVsxXSwgMV07XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RZKGEsIGIsIHkpIHtcbiAgICByZXR1cm4gWyh5IC0gYVsxXSkgKiAoYlswXSAtIGFbMF0pIC8gKGJbMV0gLSBhWzFdKSArIGFbMF0sIHksIDFdO1xufVxuXG5mdW5jdGlvbiBleHRlbmQoZGVzdCwgc3JjKSB7XG4gICAgZm9yICh2YXIgaSBpbiBzcmMpIGRlc3RbaV0gPSBzcmNbaV07XG4gICAgcmV0dXJuIGRlc3Q7XG59XG5cbi8vIGNoZWNrcyB3aGV0aGVyIGEgdGlsZSBpcyBhIHdob2xlLWFyZWEgZmlsbCBhZnRlciBjbGlwcGluZzsgaWYgaXQgaXMsIHRoZXJlJ3Mgbm8gc2Vuc2Ugc2xpY2luZyBpdCBmdXJ0aGVyXG5mdW5jdGlvbiBpc0NsaXBwZWRTcXVhcmUodGlsZSwgZXh0ZW50LCBidWZmZXIpIHtcblxuICAgIHZhciBmZWF0dXJlcyA9IHRpbGUuc291cmNlO1xuICAgIGlmIChmZWF0dXJlcy5sZW5ndGggIT09IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbMF07XG4gICAgaWYgKGZlYXR1cmUudHlwZSAhPT0gMyB8fCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aCA+IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBsZW4gPSBmZWF0dXJlLmdlb21ldHJ5WzBdLmxlbmd0aDtcbiAgICBpZiAobGVuICE9PSA1KSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBwID0gdHJhbnNmb3JtUG9pbnQoZmVhdHVyZS5nZW9tZXRyeVswXVtpXSwgZXh0ZW50LCB0aWxlLnoyLCB0aWxlLngsIHRpbGUueSk7XG4gICAgICAgIGlmICgocFswXSAhPT0gLWJ1ZmZlciAmJiBwWzBdICE9PSBleHRlbnQgKyBidWZmZXIpIHx8XG4gICAgICAgICAgICAocFsxXSAhPT0gLWJ1ZmZlciAmJiBwWzFdICE9PSBleHRlbnQgKyBidWZmZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gc2ltcGxpZnk7XG5cbi8vIGNhbGN1bGF0ZSBzaW1wbGlmaWNhdGlvbiBkYXRhIHVzaW5nIG9wdGltaXplZCBEb3VnbGFzLVBldWNrZXIgYWxnb3JpdGhtXG5cbmZ1bmN0aW9uIHNpbXBsaWZ5KHBvaW50cywgdG9sZXJhbmNlKSB7XG5cbiAgICB2YXIgc3FUb2xlcmFuY2UgPSB0b2xlcmFuY2UgKiB0b2xlcmFuY2UsXG4gICAgICAgIGxlbiA9IHBvaW50cy5sZW5ndGgsXG4gICAgICAgIGZpcnN0ID0gMCxcbiAgICAgICAgbGFzdCA9IGxlbiAtIDEsXG4gICAgICAgIHN0YWNrID0gW10sXG4gICAgICAgIGksIG1heFNxRGlzdCwgc3FEaXN0LCBpbmRleDtcblxuICAgIC8vIGFsd2F5cyByZXRhaW4gdGhlIGVuZHBvaW50cyAoMSBpcyB0aGUgbWF4IHZhbHVlKVxuICAgIHBvaW50c1tmaXJzdF1bMl0gPSAxO1xuICAgIHBvaW50c1tsYXN0XVsyXSA9IDE7XG5cbiAgICAvLyBhdm9pZCByZWN1cnNpb24gYnkgdXNpbmcgYSBzdGFja1xuICAgIHdoaWxlIChsYXN0KSB7XG5cbiAgICAgICAgbWF4U3FEaXN0ID0gMDtcblxuICAgICAgICBmb3IgKGkgPSBmaXJzdCArIDE7IGkgPCBsYXN0OyBpKyspIHtcbiAgICAgICAgICAgIHNxRGlzdCA9IGdldFNxU2VnRGlzdChwb2ludHNbaV0sIHBvaW50c1tmaXJzdF0sIHBvaW50c1tsYXN0XSk7XG5cbiAgICAgICAgICAgIGlmIChzcURpc3QgPiBtYXhTcURpc3QpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgbWF4U3FEaXN0ID0gc3FEaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heFNxRGlzdCA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICBwb2ludHNbaW5kZXhdWzJdID0gbWF4U3FEaXN0OyAvLyBzYXZlIHRoZSBwb2ludCBpbXBvcnRhbmNlIGluIHNxdWFyZWQgcGl4ZWxzIGFzIGEgeiBjb29yZGluYXRlXG4gICAgICAgICAgICBzdGFjay5wdXNoKGZpcnN0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgZmlyc3QgPSBpbmRleDtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFzdCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgZmlyc3QgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gc3F1YXJlIGRpc3RhbmNlIGZyb20gYSBwb2ludCB0byBhIHNlZ21lbnRcbmZ1bmN0aW9uIGdldFNxU2VnRGlzdChwLCBhLCBiKSB7XG5cbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSxcbiAgICAgICAgcHggPSBwWzBdLCBweSA9IHBbMV0sXG4gICAgICAgIGR4ID0gYnggLSB4LFxuICAgICAgICBkeSA9IGJ5IC0geTtcblxuICAgIGlmIChkeCAhPT0gMCB8fCBkeSAhPT0gMCkge1xuXG4gICAgICAgIHZhciB0ID0gKChweCAtIHgpICogZHggKyAocHkgLSB5KSAqIGR5KSAvIChkeCAqIGR4ICsgZHkgKiBkeSk7XG5cbiAgICAgICAgaWYgKHQgPiAxKSB7XG4gICAgICAgICAgICB4ID0gYng7XG4gICAgICAgICAgICB5ID0gYnk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0ID4gMCkge1xuICAgICAgICAgICAgeCArPSBkeCAqIHQ7XG4gICAgICAgICAgICB5ICs9IGR5ICogdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGR4ID0gcHggLSB4O1xuICAgIGR5ID0gcHkgLSB5O1xuXG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZVRpbGU7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHoyLCB0eCwgdHksIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSkge1xuICAgIHZhciB0aWxlID0ge1xuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICAgIG51bVBvaW50czogMCxcbiAgICAgICAgbnVtU2ltcGxpZmllZDogMCxcbiAgICAgICAgbnVtRmVhdHVyZXM6IDAsXG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgeDogdHgsXG4gICAgICAgIHk6IHR5LFxuICAgICAgICB6MjogejIsXG4gICAgICAgIHRyYW5zZm9ybWVkOiBmYWxzZSxcbiAgICAgICAgbWluOiBbMiwgMV0sXG4gICAgICAgIG1heDogWy0xLCAwXVxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aWxlLm51bUZlYXR1cmVzKys7XG4gICAgICAgIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSk7XG5cbiAgICAgICAgdmFyIG1pbiA9IGZlYXR1cmVzW2ldLm1pbixcbiAgICAgICAgICAgIG1heCA9IGZlYXR1cmVzW2ldLm1heDtcblxuICAgICAgICBpZiAobWluWzBdIDwgdGlsZS5taW5bMF0pIHRpbGUubWluWzBdID0gbWluWzBdO1xuICAgICAgICBpZiAobWluWzFdIDwgdGlsZS5taW5bMV0pIHRpbGUubWluWzFdID0gbWluWzFdO1xuICAgICAgICBpZiAobWF4WzBdID4gdGlsZS5tYXhbMF0pIHRpbGUubWF4WzBdID0gbWF4WzBdO1xuICAgICAgICBpZiAobWF4WzFdID4gdGlsZS5tYXhbMV0pIHRpbGUubWF4WzFdID0gbWF4WzFdO1xuICAgIH1cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlLCB0b2xlcmFuY2UsIG5vU2ltcGxpZnkpIHtcblxuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgc2ltcGxpZmllZCA9IFtdLFxuICAgICAgICBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZSxcbiAgICAgICAgaSwgaiwgcmluZywgcDtcblxuICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzaW1wbGlmaWVkLnB1c2goZ2VvbVtpXSk7XG4gICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgdGlsZS5udW1TaW1wbGlmaWVkKys7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSB7XG5cbiAgICAgICAgLy8gc2ltcGxpZnkgYW5kIHRyYW5zZm9ybSBwcm9qZWN0ZWQgY29vcmRpbmF0ZXMgZm9yIHRpbGUgZ2VvbWV0cnlcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJpbmcgPSBnZW9tW2ldO1xuXG4gICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IHRpbnkgcG9seWxpbmVzICYgcG9seWdvbnNcbiAgICAgICAgICAgIGlmICghbm9TaW1wbGlmeSAmJiAoKHR5cGUgPT09IDIgJiYgcmluZy5kaXN0IDwgdG9sZXJhbmNlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PT0gMyAmJiByaW5nLmFyZWEgPCBzcVRvbGVyYW5jZSkpKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMgKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzaW1wbGlmaWVkUmluZyA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHAgPSByaW5nW2pdO1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgcG9pbnRzIHdpdGggaW1wb3J0YW5jZSA+IHRvbGVyYW5jZVxuICAgICAgICAgICAgICAgIGlmIChub1NpbXBsaWZ5IHx8IHBbMl0gPiBzcVRvbGVyYW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBzaW1wbGlmaWVkUmluZy5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGlsZS5udW1Qb2ludHMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKHNpbXBsaWZpZWRSaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaW1wbGlmaWVkLmxlbmd0aCkge1xuICAgICAgICB0aWxlLmZlYXR1cmVzLnB1c2goe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IHNpbXBsaWZpZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgdGFnczogZmVhdHVyZS50YWdzIHx8IG51bGxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2xpcCA9IHJlcXVpcmUoJy4vY2xpcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXA7XG5cbmZ1bmN0aW9uIHdyYXAoZmVhdHVyZXMsIGJ1ZmZlciwgaW50ZXJzZWN0WCkge1xuICAgIHZhciBtZXJnZWQgPSBmZWF0dXJlcyxcbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCAxLCAtMSAtIGJ1ZmZlciwgYnVmZmVyLCAgICAgMCwgaW50ZXJzZWN0WCwgLTEsIDIpLCAvLyBsZWZ0IHdvcmxkIGNvcHlcbiAgICAgICAgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCAxLCAgMSAtIGJ1ZmZlciwgMiArIGJ1ZmZlciwgMCwgaW50ZXJzZWN0WCwgLTEsIDIpOyAvLyByaWdodCB3b3JsZCBjb3B5XG5cbiAgICBpZiAobGVmdCB8fCByaWdodCkge1xuICAgICAgICBtZXJnZWQgPSBjbGlwKGZlYXR1cmVzLCAxLCAtYnVmZmVyLCAxICsgYnVmZmVyLCAwLCBpbnRlcnNlY3RYLCAtMSwgMik7IC8vIGNlbnRlciB3b3JsZCBjb3B5XG5cbiAgICAgICAgaWYgKGxlZnQpIG1lcmdlZCA9IHNoaWZ0RmVhdHVyZUNvb3JkcyhsZWZ0LCAxKS5jb25jYXQobWVyZ2VkKTsgLy8gbWVyZ2UgbGVmdCBpbnRvIGNlbnRlclxuICAgICAgICBpZiAocmlnaHQpIG1lcmdlZCA9IG1lcmdlZC5jb25jYXQoc2hpZnRGZWF0dXJlQ29vcmRzKHJpZ2h0LCAtMSkpOyAvLyBtZXJnZSByaWdodCBpbnRvIGNlbnRlclxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0RmVhdHVyZUNvb3JkcyhmZWF0dXJlcywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld0ZlYXR1cmVzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlO1xuXG4gICAgICAgIHZhciBuZXdHZW9tZXRyeTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5LCBvZmZzZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZmVhdHVyZS5nZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIG5ld0dlb21ldHJ5LnB1c2goc2hpZnRDb29yZHMoZmVhdHVyZS5nZW9tZXRyeVtqXSwgb2Zmc2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBuZXdGZWF0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiBuZXdHZW9tZXRyeSxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICB0YWdzOiBmZWF0dXJlLnRhZ3MsXG4gICAgICAgICAgICBtaW46IFtmZWF0dXJlLm1pblswXSArIG9mZnNldCwgZmVhdHVyZS5taW5bMV1dLFxuICAgICAgICAgICAgbWF4OiBbZmVhdHVyZS5tYXhbMF0gKyBvZmZzZXQsIGZlYXR1cmUubWF4WzFdXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0Q29vcmRzKHBvaW50cywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld1BvaW50cyA9IFtdO1xuICAgIG5ld1BvaW50cy5hcmVhID0gcG9pbnRzLmFyZWE7XG4gICAgbmV3UG9pbnRzLmRpc3QgPSBwb2ludHMuZGlzdDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1BvaW50cy5wdXNoKFtwb2ludHNbaV1bMF0gKyBvZmZzZXQsIHBvaW50c1tpXVsxXSwgcG9pbnRzW2ldWzJdXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdQb2ludHM7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGludmVydFxuXG4vKipcbiAqIEludmVydHMgYSBtYXQzXG4gKlxuICogQGFsaWFzIG1hdDMuaW52ZXJ0XG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbmZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl1cbiAgdmFyIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV1cbiAgdmFyIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF1cblxuICB2YXIgYjAxID0gYTIyICogYTExIC0gYTEyICogYTIxXG4gIHZhciBiMTEgPSAtYTIyICogYTEwICsgYTEyICogYTIwXG4gIHZhciBiMjEgPSBhMjEgKiBhMTAgLSBhMTEgKiBhMjBcblxuICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gIHZhciBkZXQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEgKyBhMDIgKiBiMjFcblxuICBpZiAoIWRldCkgcmV0dXJuIG51bGxcbiAgZGV0ID0gMS4wIC8gZGV0XG5cbiAgb3V0WzBdID0gYjAxICogZGV0XG4gIG91dFsxXSA9ICgtYTIyICogYTAxICsgYTAyICogYTIxKSAqIGRldFxuICBvdXRbMl0gPSAoYTEyICogYTAxIC0gYTAyICogYTExKSAqIGRldFxuICBvdXRbM10gPSBiMTEgKiBkZXRcbiAgb3V0WzRdID0gKGEyMiAqIGEwMCAtIGEwMiAqIGEyMCkgKiBkZXRcbiAgb3V0WzVdID0gKC1hMTIgKiBhMDAgKyBhMDIgKiBhMTApICogZGV0XG4gIG91dFs2XSA9IGIyMSAqIGRldFxuICBvdXRbN10gPSAoLWEyMSAqIGEwMCArIGEwMSAqIGEyMCkgKiBkZXRcbiAgb3V0WzhdID0gKGExMSAqIGEwMCAtIGEwMSAqIGExMCkgKiBkZXRcblxuICByZXR1cm4gb3V0XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IG5vcm1hbEZyb21NYXQ0XG5cbi8qKlxuKiBDYWxjdWxhdGVzIGEgM3gzIG5vcm1hbCBtYXRyaXggKHRyYW5zcG9zZSBpbnZlcnNlKSBmcm9tIHRoZSA0eDQgbWF0cml4XG4qXG4qIEBhbGlhcyBtYXQzLm5vcm1hbEZyb21NYXQ0XG4qIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiogQHBhcmFtIHttYXQ0fSBhIE1hdDQgdG8gZGVyaXZlIHRoZSBub3JtYWwgbWF0cml4IGZyb21cbipcbiogQHJldHVybnMge21hdDN9IG91dFxuKi9cbmZ1bmN0aW9uIG5vcm1hbEZyb21NYXQ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXVxuICB2YXIgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XVxuICB2YXIgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdXG4gIHZhciBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XVxuXG4gIHZhciBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTBcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMFxuICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwXG4gIHZhciBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTFcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMVxuICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyXG4gIHZhciBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzBcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMFxuICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwXG4gIHZhciBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzFcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMVxuICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyXG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICB2YXIgZGV0ID0gYjAwICogYjExXG4gICAgICAgICAgLSBiMDEgKiBiMTBcbiAgICAgICAgICArIGIwMiAqIGIwOVxuICAgICAgICAgICsgYjAzICogYjA4XG4gICAgICAgICAgLSBiMDQgKiBiMDdcbiAgICAgICAgICArIGIwNSAqIGIwNlxuXG4gIGlmICghZGV0KSByZXR1cm4gbnVsbFxuICBkZXQgPSAxLjAgLyBkZXRcblxuICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldFxuICBvdXRbMV0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldFxuICBvdXRbMl0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldFxuXG4gIG91dFszXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0XG4gIG91dFs0XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0XG4gIG91dFs1XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0XG5cbiAgb3V0WzZdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXRcbiAgb3V0WzddID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXRcbiAgb3V0WzhdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXRcblxuICByZXR1cm4gb3V0XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGNvcHk7XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICBvdXRbOV0gPSBhWzldO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gaWRlbnRpdHk7XG5cbi8qKlxuICogU2V0IGEgbWF0NCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9va0F0O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGxvb2stYXQgbWF0cml4IHdpdGggdGhlIGdpdmVuIGV5ZSBwb3NpdGlvbiwgZm9jYWwgcG9pbnQsIGFuZCB1cCBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHt2ZWMzfSBleWUgUG9zaXRpb24gb2YgdGhlIHZpZXdlclxuICogQHBhcmFtIHt2ZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XG4gKiBAcGFyYW0ge3ZlYzN9IHVwIHZlYzMgcG9pbnRpbmcgdXBcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gbG9va0F0KG91dCwgZXllLCBjZW50ZXIsIHVwKSB7XG4gICAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbixcbiAgICAgICAgZXlleCA9IGV5ZVswXSxcbiAgICAgICAgZXlleSA9IGV5ZVsxXSxcbiAgICAgICAgZXlleiA9IGV5ZVsyXSxcbiAgICAgICAgdXB4ID0gdXBbMF0sXG4gICAgICAgIHVweSA9IHVwWzFdLFxuICAgICAgICB1cHogPSB1cFsyXSxcbiAgICAgICAgY2VudGVyeCA9IGNlbnRlclswXSxcbiAgICAgICAgY2VudGVyeSA9IGNlbnRlclsxXSxcbiAgICAgICAgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICAgIGlmIChNYXRoLmFicyhleWV4IC0gY2VudGVyeCkgPCAwLjAwMDAwMSAmJlxuICAgICAgICBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCAwLjAwMDAwMSAmJlxuICAgICAgICBNYXRoLmFicyhleWV6IC0gY2VudGVyeikgPCAwLjAwMDAwMSkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHkob3V0KTtcbiAgICB9XG5cbiAgICB6MCA9IGV5ZXggLSBjZW50ZXJ4O1xuICAgIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gICAgejIgPSBleWV6IC0gY2VudGVyejtcblxuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQoejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyKTtcbiAgICB6MCAqPSBsZW47XG4gICAgejEgKj0gbGVuO1xuICAgIHoyICo9IGxlbjtcblxuICAgIHgwID0gdXB5ICogejIgLSB1cHogKiB6MTtcbiAgICB4MSA9IHVweiAqIHowIC0gdXB4ICogejI7XG4gICAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICAgIGxlbiA9IE1hdGguc3FydCh4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHgwID0gMDtcbiAgICAgICAgeDEgPSAwO1xuICAgICAgICB4MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeDAgKj0gbGVuO1xuICAgICAgICB4MSAqPSBsZW47XG4gICAgICAgIHgyICo9IGxlbjtcbiAgICB9XG5cbiAgICB5MCA9IHoxICogeDIgLSB6MiAqIHgxO1xuICAgIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gICAgeTIgPSB6MCAqIHgxIC0gejEgKiB4MDtcblxuICAgIGxlbiA9IE1hdGguc3FydCh5MCAqIHkwICsgeTEgKiB5MSArIHkyICogeTIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHkwID0gMDtcbiAgICAgICAgeTEgPSAwO1xuICAgICAgICB5MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeTAgKj0gbGVuO1xuICAgICAgICB5MSAqPSBsZW47XG4gICAgICAgIHkyICo9IGxlbjtcbiAgICB9XG5cbiAgICBvdXRbMF0gPSB4MDtcbiAgICBvdXRbMV0gPSB5MDtcbiAgICBvdXRbMl0gPSB6MDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IHgxO1xuICAgIG91dFs1XSA9IHkxO1xuICAgIG91dFs2XSA9IHoxO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0geDI7XG4gICAgb3V0WzldID0geTI7XG4gICAgb3V0WzEwXSA9IHoyO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAtKHgwICogZXlleCArIHgxICogZXlleSArIHgyICogZXlleik7XG4gICAgb3V0WzEzXSA9IC0oeTAgKiBleWV4ICsgeTEgKiBleWV5ICsgeTIgKiBleWV6KTtcbiAgICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICAgIG91dFsxNV0gPSAxO1xuXG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBtdWx0aXBseTtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQ0J3NcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdO1xuXG4gICAgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4XG4gICAgdmFyIGIwICA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdLCBiMyA9IGJbM107ICBcbiAgICBvdXRbMF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzFdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsyXSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbM10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbNF07IGIxID0gYls1XTsgYjIgPSBiWzZdOyBiMyA9IGJbN107XG4gICAgb3V0WzRdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs1XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbNl0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzddID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzhdOyBiMSA9IGJbOV07IGIyID0gYlsxMF07IGIzID0gYlsxMV07XG4gICAgb3V0WzhdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs5XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTBdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxMV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbMTJdOyBiMSA9IGJbMTNdOyBiMiA9IGJbMTRdOyBiMyA9IGJbMTVdO1xuICAgIG91dFsxMl0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzEzXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTRdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxNV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBwZXJzcGVjdGl2ZTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge251bWJlcn0gZm92eSBWZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgQXNwZWN0IHJhdGlvLiB0eXBpY2FsbHkgdmlld3BvcnQgd2lkdGgvaGVpZ2h0XG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBwZXJzcGVjdGl2ZShvdXQsIGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gICAgdmFyIGYgPSAxLjAgLyBNYXRoLnRhbihmb3Z5IC8gMiksXG4gICAgICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMF0gPSBmIC8gYXNwZWN0O1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gZjtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTFdID0gLTE7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9ICgyICogZmFyICogbmVhcikgKiBuZjtcbiAgICBvdXRbMTVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHNjYWxlO1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0NCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjM1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHt2ZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqKi9cbmZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV0sIHogPSB2WzJdO1xuXG4gICAgb3V0WzBdID0gYVswXSAqIHg7XG4gICAgb3V0WzFdID0gYVsxXSAqIHg7XG4gICAgb3V0WzJdID0gYVsyXSAqIHg7XG4gICAgb3V0WzNdID0gYVszXSAqIHg7XG4gICAgb3V0WzRdID0gYVs0XSAqIHk7XG4gICAgb3V0WzVdID0gYVs1XSAqIHk7XG4gICAgb3V0WzZdID0gYVs2XSAqIHk7XG4gICAgb3V0WzddID0gYVs3XSAqIHk7XG4gICAgb3V0WzhdID0gYVs4XSAqIHo7XG4gICAgb3V0WzldID0gYVs5XSAqIHo7XG4gICAgb3V0WzEwXSA9IGFbMTBdICogejtcbiAgICBvdXRbMTFdID0gYVsxMV0gKiB6O1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHRyYW5zbGF0ZTtcblxuLyoqXG4gKiBUcmFuc2xhdGUgYSBtYXQ0IGJ5IHRoZSBnaXZlbiB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiB0cmFuc2xhdGUob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXSwgeiA9IHZbMl0sXG4gICAgICAgIGEwMCwgYTAxLCBhMDIsIGEwMyxcbiAgICAgICAgYTEwLCBhMTEsIGExMiwgYTEzLFxuICAgICAgICBhMjAsIGEyMSwgYTIyLCBhMjM7XG5cbiAgICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgICAgIG91dFsxMl0gPSBhWzBdICogeCArIGFbNF0gKiB5ICsgYVs4XSAqIHogKyBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMV0gKiB4ICsgYVs1XSAqIHkgKyBhWzldICogeiArIGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVszXSAqIHggKyBhWzddICogeSArIGFbMTFdICogeiArIGFbMTVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGEwMCA9IGFbMF07IGEwMSA9IGFbMV07IGEwMiA9IGFbMl07IGEwMyA9IGFbM107XG4gICAgICAgIGExMCA9IGFbNF07IGExMSA9IGFbNV07IGExMiA9IGFbNl07IGExMyA9IGFbN107XG4gICAgICAgIGEyMCA9IGFbOF07IGEyMSA9IGFbOV07IGEyMiA9IGFbMTBdOyBhMjMgPSBhWzExXTtcblxuICAgICAgICBvdXRbMF0gPSBhMDA7IG91dFsxXSA9IGEwMTsgb3V0WzJdID0gYTAyOyBvdXRbM10gPSBhMDM7XG4gICAgICAgIG91dFs0XSA9IGExMDsgb3V0WzVdID0gYTExOyBvdXRbNl0gPSBhMTI7IG91dFs3XSA9IGExMztcbiAgICAgICAgb3V0WzhdID0gYTIwOyBvdXRbOV0gPSBhMjE7IG91dFsxMF0gPSBhMjI7IG91dFsxMV0gPSBhMjM7XG5cbiAgICAgICAgb3V0WzEyXSA9IGEwMCAqIHggKyBhMTAgKiB5ICsgYTIwICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYTAxICogeCArIGExMSAqIHkgKyBhMjEgKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhMDIgKiB4ICsgYTEyICogeSArIGEyMiAqIHogKyBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGEwMyAqIHggKyBhMTMgKiB5ICsgYTIzICogeiArIGFbMTVdO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcGFyc2VFcnJvcnNcblxuZnVuY3Rpb24gcGFyc2VFcnJvcnMobG9nKSB7XG4gIGxvZyA9IFN0cmluZyhsb2cpXG5cbiAgdmFyIGxvZ3MgPSBbXVxuICB2YXIgcmVzdWx0XG5cbiAgd2hpbGUgKHJlc3VsdCA9IGxvZy5tYXRjaCgvRVJST1JcXDooW15cXG5dKykvKSkge1xuICAgIGxvZyA9IGxvZy5zbGljZShyZXN1bHQuaW5kZXggKyAxKVxuXG4gICAgdmFyIGxpbmUgPSByZXN1bHRbMV0udHJpbSgpXG4gICAgdmFyIHNlcHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICB2YXIgZW1zZyA9IHNlcHMuc2xpY2UoMikuam9pbignOicpLnRyaW0oKVxuICAgIHZhciBmaWxlID0gcGFyc2VJbnQoc2Vwc1swXSwgMTApXG4gICAgdmFyIGxpbmUgPSBwYXJzZUludChzZXBzWzFdLCAxMClcblxuICAgIGxvZ3MucHVzaCh7XG4gICAgICAgIG1lc3NhZ2U6IGVtc2dcbiAgICAgICwgZmlsZTogZmlsZVxuICAgICAgLCBsaW5lOiBsaW5lXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBsb2dzXG59XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuIiwiLyohXG4gKiBEZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cblxuLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZ1xuLy8gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiAoaXNCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSB8fCAhIW9iai5faXNCdWZmZXIpXG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNCdWZmZXIob2JqLnNsaWNlKDAsIDApKVxufVxuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHlhbWwgPSByZXF1aXJlKCcuL2xpYi9qcy15YW1sLmpzJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB5YW1sO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBsb2FkZXIgPSByZXF1aXJlKCcuL2pzLXlhbWwvbG9hZGVyJyk7XG4vLyB2YXIgZHVtcGVyID0gcmVxdWlyZSgnLi9qcy15YW1sL2R1bXBlcicpO1xuXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZWQobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gJyArIG5hbWUgKyAnIGlzIGRlcHJlY2F0ZWQgYW5kIGNhbm5vdCBiZSB1c2VkLicpO1xuICB9O1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLlR5cGUgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvdHlwZScpO1xubW9kdWxlLmV4cG9ydHMuU2NoZW1hICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEnKTtcbm1vZHVsZS5leHBvcnRzLkZBSUxTQUZFX1NDSEVNQSAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlJyk7XG5tb2R1bGUuZXhwb3J0cy5KU09OX1NDSEVNQSAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9qc29uJyk7XG5tb2R1bGUuZXhwb3J0cy5DT1JFX1NDSEVNQSAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9jb3JlJyk7XG5tb2R1bGUuZXhwb3J0cy5ERUZBVUxUX1NBRkVfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xubW9kdWxlLmV4cG9ydHMubG9hZCAgICAgICAgICAgICAgICA9IGxvYWRlci5sb2FkO1xubW9kdWxlLmV4cG9ydHMubG9hZEFsbCAgICAgICAgICAgICA9IGxvYWRlci5sb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWQgICAgICAgICAgICA9IGxvYWRlci5zYWZlTG9hZDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsICAgICAgICAgPSBsb2FkZXIuc2FmZUxvYWRBbGw7XG4vLyBtb2R1bGUuZXhwb3J0cy5kdW1wICAgICAgICAgICAgICAgID0gZHVtcGVyLmR1bXA7XG4vLyBtb2R1bGUuZXhwb3J0cy5zYWZlRHVtcCAgICAgICAgICAgID0gZHVtcGVyLnNhZmVEdW1wO1xubW9kdWxlLmV4cG9ydHMuWUFNTEV4Y2VwdGlvbiAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9leGNlcHRpb24nKTtcblxuLy8gRGVwcmVjYXRlZCBzY2hlbWEgbmFtZXMgZnJvbSBKUy1ZQU1MIDIuMC54XG5tb2R1bGUuZXhwb3J0cy5NSU5JTUFMX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZmFpbHNhZmUnKTtcbm1vZHVsZS5leHBvcnRzLlNBRkVfU0NIRU1BICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X3NhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcblxuLy8gRGVwcmVjYXRlZCBmdW5jdGlvbnMgZnJvbSBKUy1ZQU1MIDEueC54XG5tb2R1bGUuZXhwb3J0cy5zY2FuICAgICAgICAgICA9IGRlcHJlY2F0ZWQoJ3NjYW4nKTtcbm1vZHVsZS5leHBvcnRzLnBhcnNlICAgICAgICAgID0gZGVwcmVjYXRlZCgncGFyc2UnKTtcbm1vZHVsZS5leHBvcnRzLmNvbXBvc2UgICAgICAgID0gZGVwcmVjYXRlZCgnY29tcG9zZScpO1xubW9kdWxlLmV4cG9ydHMuYWRkQ29uc3RydWN0b3IgPSBkZXByZWNhdGVkKCdhZGRDb25zdHJ1Y3RvcicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIGlzTm90aGluZyhzdWJqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIHN1YmplY3QgPT09ICd1bmRlZmluZWQnKSB8fCAoc3ViamVjdCA9PT0gbnVsbCk7XG59XG5cblxuZnVuY3Rpb24gaXNPYmplY3Qoc3ViamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBzdWJqZWN0ID09PSAnb2JqZWN0JykgJiYgKHN1YmplY3QgIT09IG51bGwpO1xufVxuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoc2VxdWVuY2UpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VxdWVuY2UpKSByZXR1cm4gc2VxdWVuY2U7XG4gIGVsc2UgaWYgKGlzTm90aGluZyhzZXF1ZW5jZSkpIHJldHVybiBbXTtcblxuICByZXR1cm4gWyBzZXF1ZW5jZSBdO1xufVxuXG5cbmZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIgaW5kZXgsIGxlbmd0aCwga2V5LCBzb3VyY2VLZXlzO1xuXG4gIGlmIChzb3VyY2UpIHtcbiAgICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGtleSA9IHNvdXJjZUtleXNbaW5kZXhdO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5cbmZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIGNvdW50KSB7XG4gIHZhciByZXN1bHQgPSAnJywgY3ljbGU7XG5cbiAgZm9yIChjeWNsZSA9IDA7IGN5Y2xlIDwgY291bnQ7IGN5Y2xlICs9IDEpIHtcbiAgICByZXN1bHQgKz0gc3RyaW5nO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5mdW5jdGlvbiBpc05lZ2F0aXZlWmVybyhudW1iZXIpIHtcbiAgcmV0dXJuIChudW1iZXIgPT09IDApICYmIChOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgPT09IDEgLyBudW1iZXIpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmlzTm90aGluZyAgICAgID0gaXNOb3RoaW5nO1xubW9kdWxlLmV4cG9ydHMuaXNPYmplY3QgICAgICAgPSBpc09iamVjdDtcbm1vZHVsZS5leHBvcnRzLnRvQXJyYXkgICAgICAgID0gdG9BcnJheTtcbm1vZHVsZS5leHBvcnRzLnJlcGVhdCAgICAgICAgID0gcmVwZWF0O1xubW9kdWxlLmV4cG9ydHMuaXNOZWdhdGl2ZVplcm8gPSBpc05lZ2F0aXZlWmVybztcbm1vZHVsZS5leHBvcnRzLmV4dGVuZCAgICAgICAgID0gZXh0ZW5kO1xuIiwiLy8gWUFNTCBlcnJvciBjbGFzcy4gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NDU4OTg0XG4vL1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBZQU1MRXhjZXB0aW9uKHJlYXNvbiwgbWFyaykge1xuICAvLyBTdXBlciBjb25zdHJ1Y3RvclxuICBFcnJvci5jYWxsKHRoaXMpO1xuXG4gIC8vIEluY2x1ZGUgc3RhY2sgdHJhY2UgaW4gZXJyb3Igb2JqZWN0XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIC8vIENocm9tZSBhbmQgTm9kZUpTXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gRkYsIElFIDEwKyBhbmQgU2FmYXJpIDYrLiBGYWxsYmFjayBmb3Igb3RoZXJzXG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2sgfHwgJyc7XG4gIH1cblxuICB0aGlzLm5hbWUgPSAnWUFNTEV4Y2VwdGlvbic7XG4gIHRoaXMucmVhc29uID0gcmVhc29uO1xuICB0aGlzLm1hcmsgPSBtYXJrO1xuICB0aGlzLm1lc3NhZ2UgPSAodGhpcy5yZWFzb24gfHwgJyh1bmtub3duIHJlYXNvbiknKSArICh0aGlzLm1hcmsgPyAnICcgKyB0aGlzLm1hcmsudG9TdHJpbmcoKSA6ICcnKTtcbn1cblxuXG4vLyBJbmhlcml0IGZyb20gRXJyb3JcbllBTUxFeGNlcHRpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuWUFNTEV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBZQU1MRXhjZXB0aW9uO1xuXG5cbllBTUxFeGNlcHRpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoY29tcGFjdCkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5uYW1lICsgJzogJztcblxuICByZXN1bHQgKz0gdGhpcy5yZWFzb24gfHwgJyh1bmtub3duIHJlYXNvbiknO1xuXG4gIGlmICghY29tcGFjdCAmJiB0aGlzLm1hcmspIHtcbiAgICByZXN1bHQgKz0gJyAnICsgdGhpcy5tYXJrLnRvU3RyaW5nKCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFlBTUxFeGNlcHRpb247XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qZXNsaW50LWRpc2FibGUgbWF4LWxlbixuby11c2UtYmVmb3JlLWRlZmluZSovXG5cbnZhciBjb21tb24gICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9jb21tb24nKTtcbnZhciBZQU1MRXhjZXB0aW9uICAgICAgID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcbnZhciBNYXJrICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9tYXJrJyk7XG52YXIgREVGQVVMVF9TQUZFX1NDSEVNQSA9IHJlcXVpcmUoJy4vc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xudmFyIERFRkFVTFRfRlVMTF9TQ0hFTUEgPSByZXF1aXJlKCcuL3NjaGVtYS9kZWZhdWx0X2Z1bGwnKTtcblxuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuXG52YXIgQ09OVEVYVF9GTE9XX0lOICAgPSAxO1xudmFyIENPTlRFWFRfRkxPV19PVVQgID0gMjtcbnZhciBDT05URVhUX0JMT0NLX0lOICA9IDM7XG52YXIgQ09OVEVYVF9CTE9DS19PVVQgPSA0O1xuXG5cbnZhciBDSE9NUElOR19DTElQICA9IDE7XG52YXIgQ0hPTVBJTkdfU1RSSVAgPSAyO1xudmFyIENIT01QSU5HX0tFRVAgID0gMztcblxuXG52YXIgUEFUVEVSTl9OT05fUFJJTlRBQkxFICAgICAgICAgPSAvW1xceDAwLVxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGXFx4N0YtXFx4ODRcXHg4Ni1cXHg5RlxcdUZGRkVcXHVGRkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXS87XG52YXIgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MgPSAvW1xceDg1XFx1MjAyOFxcdTIwMjldLztcbnZhciBQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUyAgICAgICA9IC9bLFxcW1xcXVxce1xcfV0vO1xudmFyIFBBVFRFUk5fVEFHX0hBTkRMRSAgICAgICAgICAgID0gL14oPzohfCEhfCFbYS16XFwtXSshKSQvaTtcbnZhciBQQVRURVJOX1RBR19VUkkgICAgICAgICAgICAgICA9IC9eKD86IXxbXixcXFtcXF1cXHtcXH1dKSg/OiVbMC05YS1mXXsyfXxbMC05YS16XFwtIztcXC9cXD86QCY9XFwrXFwkLF9cXC4hflxcKidcXChcXClcXFtcXF1dKSokL2k7XG5cblxuZnVuY3Rpb24gaXNfRU9MKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDBBLyogTEYgKi8pIHx8IChjID09PSAweDBELyogQ1IgKi8pO1xufVxuXG5mdW5jdGlvbiBpc19XSElURV9TUEFDRShjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwOS8qIFRhYiAqLykgfHwgKGMgPT09IDB4MjAvKiBTcGFjZSAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX1dTX09SX0VPTChjKSB7XG4gIHJldHVybiAoYyA9PT0gMHgwOS8qIFRhYiAqLykgfHxcbiAgICAgICAgIChjID09PSAweDIwLyogU3BhY2UgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgwQS8qIExGICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MEQvKiBDUiAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX0ZMT1dfSU5ESUNBVE9SKGMpIHtcbiAgcmV0dXJuIGMgPT09IDB4MkMvKiAsICovIHx8XG4gICAgICAgICBjID09PSAweDVCLyogWyAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg1RC8qIF0gKi8gfHxcbiAgICAgICAgIGMgPT09IDB4N0IvKiB7ICovIHx8XG4gICAgICAgICBjID09PSAweDdELyogfSAqLztcbn1cblxuZnVuY3Rpb24gZnJvbUhleENvZGUoYykge1xuICB2YXIgbGM7XG5cbiAgaWYgKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHtcbiAgICByZXR1cm4gYyAtIDB4MzA7XG4gIH1cblxuICAvKmVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UqL1xuICBsYyA9IGMgfCAweDIwO1xuXG4gIGlmICgoMHg2MS8qIGEgKi8gPD0gbGMpICYmIChsYyA8PSAweDY2LyogZiAqLykpIHtcbiAgICByZXR1cm4gbGMgLSAweDYxICsgMTA7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZWRIZXhMZW4oYykge1xuICBpZiAoYyA9PT0gMHg3OC8qIHggKi8pIHsgcmV0dXJuIDI7IH1cbiAgaWYgKGMgPT09IDB4NzUvKiB1ICovKSB7IHJldHVybiA0OyB9XG4gIGlmIChjID09PSAweDU1LyogVSAqLykgeyByZXR1cm4gODsgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZnJvbURlY2ltYWxDb2RlKGMpIHtcbiAgaWYgKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpIHtcbiAgICByZXR1cm4gYyAtIDB4MzA7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIHNpbXBsZUVzY2FwZVNlcXVlbmNlKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDMwLyogMCAqLykgPyAnXFx4MDAnIDpcbiAgICAgICAgKGMgPT09IDB4NjEvKiBhICovKSA/ICdcXHgwNycgOlxuICAgICAgICAoYyA9PT0gMHg2Mi8qIGIgKi8pID8gJ1xceDA4JyA6XG4gICAgICAgIChjID09PSAweDc0LyogdCAqLykgPyAnXFx4MDknIDpcbiAgICAgICAgKGMgPT09IDB4MDkvKiBUYWIgKi8pID8gJ1xceDA5JyA6XG4gICAgICAgIChjID09PSAweDZFLyogbiAqLykgPyAnXFx4MEEnIDpcbiAgICAgICAgKGMgPT09IDB4NzYvKiB2ICovKSA/ICdcXHgwQicgOlxuICAgICAgICAoYyA9PT0gMHg2Ni8qIGYgKi8pID8gJ1xceDBDJyA6XG4gICAgICAgIChjID09PSAweDcyLyogciAqLykgPyAnXFx4MEQnIDpcbiAgICAgICAgKGMgPT09IDB4NjUvKiBlICovKSA/ICdcXHgxQicgOlxuICAgICAgICAoYyA9PT0gMHgyMC8qIFNwYWNlICovKSA/ICcgJyA6XG4gICAgICAgIChjID09PSAweDIyLyogXCIgKi8pID8gJ1xceDIyJyA6XG4gICAgICAgIChjID09PSAweDJGLyogLyAqLykgPyAnLycgOlxuICAgICAgICAoYyA9PT0gMHg1Qy8qIFxcICovKSA/ICdcXHg1QycgOlxuICAgICAgICAoYyA9PT0gMHg0RS8qIE4gKi8pID8gJ1xceDg1JyA6XG4gICAgICAgIChjID09PSAweDVGLyogXyAqLykgPyAnXFx4QTAnIDpcbiAgICAgICAgKGMgPT09IDB4NEMvKiBMICovKSA/ICdcXHUyMDI4JyA6XG4gICAgICAgIChjID09PSAweDUwLyogUCAqLykgPyAnXFx1MjAyOScgOiAnJztcbn1cblxuZnVuY3Rpb24gY2hhckZyb21Db2RlcG9pbnQoYykge1xuICBpZiAoYyA8PSAweEZGRkYpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgfVxuICAvLyBFbmNvZGUgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyXG4gIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi0xNiNDb2RlX3BvaW50c19VLjJCMDEwMDAwX3RvX1UuMkIxMEZGRkZcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKChjIC0gMHgwMTAwMDApID4+IDEwKSArIDB4RDgwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjIC0gMHgwMTAwMDApICYgMHgwM0ZGKSArIDB4REMwMCk7XG59XG5cbnZhciBzaW1wbGVFc2NhcGVDaGVjayA9IG5ldyBBcnJheSgyNTYpOyAvLyBpbnRlZ2VyLCBmb3IgZmFzdCBhY2Nlc3NcbnZhciBzaW1wbGVFc2NhcGVNYXAgPSBuZXcgQXJyYXkoMjU2KTtcbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcbiAgc2ltcGxlRXNjYXBlQ2hlY2tbaV0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpKSA/IDEgOiAwO1xuICBzaW1wbGVFc2NhcGVNYXBbaV0gPSBzaW1wbGVFc2NhcGVTZXF1ZW5jZShpKTtcbn1cblxuXG5mdW5jdGlvbiBTdGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB0aGlzLmlucHV0ID0gaW5wdXQ7XG5cbiAgdGhpcy5maWxlbmFtZSAgPSBvcHRpb25zWydmaWxlbmFtZSddICB8fCBudWxsO1xuICB0aGlzLnNjaGVtYSAgICA9IG9wdGlvbnNbJ3NjaGVtYSddICAgIHx8IERFRkFVTFRfRlVMTF9TQ0hFTUE7XG4gIHRoaXMub25XYXJuaW5nID0gb3B0aW9uc1snb25XYXJuaW5nJ10gfHwgbnVsbDtcbiAgdGhpcy5sZWdhY3kgICAgPSBvcHRpb25zWydsZWdhY3knXSAgICB8fCBmYWxzZTtcbiAgdGhpcy5qc29uICAgICAgPSBvcHRpb25zWydqc29uJ10gICAgICB8fCBmYWxzZTtcbiAgdGhpcy5saXN0ZW5lciAgPSBvcHRpb25zWydsaXN0ZW5lciddICB8fCBudWxsO1xuXG4gIHRoaXMuaW1wbGljaXRUeXBlcyA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkSW1wbGljaXQ7XG4gIHRoaXMudHlwZU1hcCAgICAgICA9IHRoaXMuc2NoZW1hLmNvbXBpbGVkVHlwZU1hcDtcblxuICB0aGlzLmxlbmd0aCAgICAgPSBpbnB1dC5sZW5ndGg7XG4gIHRoaXMucG9zaXRpb24gICA9IDA7XG4gIHRoaXMubGluZSAgICAgICA9IDA7XG4gIHRoaXMubGluZVN0YXJ0ICA9IDA7XG4gIHRoaXMubGluZUluZGVudCA9IDA7XG5cbiAgdGhpcy5kb2N1bWVudHMgPSBbXTtcblxuICAvKlxuICB0aGlzLnZlcnNpb247XG4gIHRoaXMuY2hlY2tMaW5lQnJlYWtzO1xuICB0aGlzLnRhZ01hcDtcbiAgdGhpcy5hbmNob3JNYXA7XG4gIHRoaXMudGFnO1xuICB0aGlzLmFuY2hvcjtcbiAgdGhpcy5raW5kO1xuICB0aGlzLnJlc3VsdDsqL1xuXG59XG5cblxuZnVuY3Rpb24gZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSkge1xuICByZXR1cm4gbmV3IFlBTUxFeGNlcHRpb24oXG4gICAgbWVzc2FnZSxcbiAgICBuZXcgTWFyayhzdGF0ZS5maWxlbmFtZSwgc3RhdGUuaW5wdXQsIHN0YXRlLnBvc2l0aW9uLCBzdGF0ZS5saW5lLCAoc3RhdGUucG9zaXRpb24gLSBzdGF0ZS5saW5lU3RhcnQpKSk7XG59XG5cbmZ1bmN0aW9uIHRocm93RXJyb3Ioc3RhdGUsIG1lc3NhZ2UpIHtcbiAgdGhyb3cgZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIHRocm93V2FybmluZyhzdGF0ZSwgbWVzc2FnZSkge1xuICBpZiAoc3RhdGUub25XYXJuaW5nKSB7XG4gICAgc3RhdGUub25XYXJuaW5nLmNhbGwobnVsbCwgZ2VuZXJhdGVFcnJvcihzdGF0ZSwgbWVzc2FnZSkpO1xuICB9XG59XG5cblxudmFyIGRpcmVjdGl2ZUhhbmRsZXJzID0ge1xuXG4gIFlBTUw6IGZ1bmN0aW9uIGhhbmRsZVlhbWxEaXJlY3RpdmUoc3RhdGUsIG5hbWUsIGFyZ3MpIHtcblxuICAgIHZhciBtYXRjaCwgbWFqb3IsIG1pbm9yO1xuXG4gICAgaWYgKHN0YXRlLnZlcnNpb24gIT09IG51bGwpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiAlWUFNTCBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdZQU1MIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgb25lIGFyZ3VtZW50Jyk7XG4gICAgfVxuXG4gICAgbWF0Y2ggPSAvXihbMC05XSspXFwuKFswLTldKykkLy5leGVjKGFyZ3NbMF0pO1xuXG4gICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCBhcmd1bWVudCBvZiB0aGUgWUFNTCBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBtYWpvciA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgbWlub3IgPSBwYXJzZUludChtYXRjaFsyXSwgMTApO1xuXG4gICAgaWYgKG1ham9yICE9PSAxKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5hY2NlcHRhYmxlIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS52ZXJzaW9uID0gYXJnc1swXTtcbiAgICBzdGF0ZS5jaGVja0xpbmVCcmVha3MgPSAobWlub3IgPCAyKTtcblxuICAgIGlmIChtaW5vciAhPT0gMSAmJiBtaW5vciAhPT0gMikge1xuICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAndW5zdXBwb3J0ZWQgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCcpO1xuICAgIH1cbiAgfSxcblxuICBUQUc6IGZ1bmN0aW9uIGhhbmRsZVRhZ0RpcmVjdGl2ZShzdGF0ZSwgbmFtZSwgYXJncykge1xuXG4gICAgdmFyIGhhbmRsZSwgcHJlZml4O1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnVEFHIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cycpO1xuICAgIH1cblxuICAgIGhhbmRsZSA9IGFyZ3NbMF07XG4gICAgcHJlZml4ID0gYXJnc1sxXTtcblxuICAgIGlmICghUEFUVEVSTl9UQUdfSEFORExFLnRlc3QoaGFuZGxlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2lsbC1mb3JtZWQgdGFnIGhhbmRsZSAoZmlyc3QgYXJndW1lbnQpIG9mIHRoZSBUQUcgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnRhZ01hcCwgaGFuZGxlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RoZXJlIGlzIGEgcHJldmlvdXNseSBkZWNsYXJlZCBzdWZmaXggZm9yIFwiJyArIGhhbmRsZSArICdcIiB0YWcgaGFuZGxlJyk7XG4gICAgfVxuXG4gICAgaWYgKCFQQVRURVJOX1RBR19VUkkudGVzdChwcmVmaXgpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCB0YWcgcHJlZml4IChzZWNvbmQgYXJndW1lbnQpIG9mIHRoZSBUQUcgZGlyZWN0aXZlJyk7XG4gICAgfVxuXG4gICAgc3RhdGUudGFnTWFwW2hhbmRsZV0gPSBwcmVmaXg7XG4gIH1cbn07XG5cblxuZnVuY3Rpb24gY2FwdHVyZVNlZ21lbnQoc3RhdGUsIHN0YXJ0LCBlbmQsIGNoZWNrSnNvbikge1xuICB2YXIgX3Bvc2l0aW9uLCBfbGVuZ3RoLCBfY2hhcmFjdGVyLCBfcmVzdWx0O1xuXG4gIGlmIChzdGFydCA8IGVuZCkge1xuICAgIF9yZXN1bHQgPSBzdGF0ZS5pbnB1dC5zbGljZShzdGFydCwgZW5kKTtcblxuICAgIGlmIChjaGVja0pzb24pIHtcbiAgICAgIGZvciAoX3Bvc2l0aW9uID0gMCwgX2xlbmd0aCA9IF9yZXN1bHQubGVuZ3RoO1xuICAgICAgICAgICBfcG9zaXRpb24gPCBfbGVuZ3RoO1xuICAgICAgICAgICBfcG9zaXRpb24gKz0gMSkge1xuICAgICAgICBfY2hhcmFjdGVyID0gX3Jlc3VsdC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG4gICAgICAgIGlmICghKF9jaGFyYWN0ZXIgPT09IDB4MDkgfHxcbiAgICAgICAgICAgICAgKDB4MjAgPD0gX2NoYXJhY3RlciAmJiBfY2hhcmFjdGVyIDw9IDB4MTBGRkZGKSkpIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZXhwZWN0ZWQgdmFsaWQgSlNPTiBjaGFyYWN0ZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoUEFUVEVSTl9OT05fUFJJTlRBQkxFLnRlc3QoX3Jlc3VsdCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0aGUgc3RyZWFtIGNvbnRhaW5zIG5vbi1wcmludGFibGUgY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIHN0YXRlLnJlc3VsdCArPSBfcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlTWFwcGluZ3Moc3RhdGUsIGRlc3RpbmF0aW9uLCBzb3VyY2UsIG92ZXJyaWRhYmxlS2V5cykge1xuICB2YXIgc291cmNlS2V5cywga2V5LCBpbmRleCwgcXVhbnRpdHk7XG5cbiAgaWYgKCFjb21tb24uaXNPYmplY3Qoc291cmNlKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW5ub3QgbWVyZ2UgbWFwcGluZ3M7IHRoZSBwcm92aWRlZCBzb3VyY2Ugb2JqZWN0IGlzIHVuYWNjZXB0YWJsZScpO1xuICB9XG5cbiAgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cbiAgZm9yIChpbmRleCA9IDAsIHF1YW50aXR5ID0gc291cmNlS2V5cy5sZW5ndGg7IGluZGV4IDwgcXVhbnRpdHk7IGluZGV4ICs9IDEpIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2luZGV4XTtcblxuICAgIGlmICghX2hhc093blByb3BlcnR5LmNhbGwoZGVzdGluYXRpb24sIGtleSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIG92ZXJyaWRhYmxlS2V5c1trZXldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSkge1xuICB2YXIgaW5kZXgsIHF1YW50aXR5O1xuXG4gIGtleU5vZGUgPSBTdHJpbmcoa2V5Tm9kZSk7XG5cbiAgaWYgKF9yZXN1bHQgPT09IG51bGwpIHtcbiAgICBfcmVzdWx0ID0ge307XG4gIH1cblxuICBpZiAoa2V5VGFnID09PSAndGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVOb2RlKSkge1xuICAgICAgZm9yIChpbmRleCA9IDAsIHF1YW50aXR5ID0gdmFsdWVOb2RlLmxlbmd0aDsgaW5kZXggPCBxdWFudGl0eTsgaW5kZXggKz0gMSkge1xuICAgICAgICBtZXJnZU1hcHBpbmdzKHN0YXRlLCBfcmVzdWx0LCB2YWx1ZU5vZGVbaW5kZXhdLCBvdmVycmlkYWJsZUtleXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZU1hcHBpbmdzKHN0YXRlLCBfcmVzdWx0LCB2YWx1ZU5vZGUsIG92ZXJyaWRhYmxlS2V5cyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghc3RhdGUuanNvbiAmJlxuICAgICAgICAhX2hhc093blByb3BlcnR5LmNhbGwob3ZlcnJpZGFibGVLZXlzLCBrZXlOb2RlKSAmJlxuICAgICAgICBfaGFzT3duUHJvcGVydHkuY2FsbChfcmVzdWx0LCBrZXlOb2RlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0ZWQgbWFwcGluZyBrZXknKTtcbiAgICB9XG4gICAgX3Jlc3VsdFtrZXlOb2RlXSA9IHZhbHVlTm9kZTtcbiAgICBkZWxldGUgb3ZlcnJpZGFibGVLZXlzW2tleU5vZGVdO1xuICB9XG5cbiAgcmV0dXJuIF9yZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRMaW5lQnJlYWsoc3RhdGUpIHtcbiAgdmFyIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDBBLyogTEYgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDBELyogQ1IgKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgwQS8qIExGICovKSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYSBsaW5lIGJyZWFrIGlzIGV4cGVjdGVkJyk7XG4gIH1cblxuICBzdGF0ZS5saW5lICs9IDE7XG4gIHN0YXRlLmxpbmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xufVxuXG5mdW5jdGlvbiBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBhbGxvd0NvbW1lbnRzLCBjaGVja0luZGVudCkge1xuICB2YXIgbGluZUJyZWFrcyA9IDAsXG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoYWxsb3dDb21tZW50cyAmJiBjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIGRvIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfSB3aGlsZSAoY2ggIT09IDB4MEEvKiBMRiAqLyAmJiBjaCAhPT0gMHgwRC8qIENSICovICYmIGNoICE9PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBsaW5lQnJlYWtzKys7XG4gICAgICBzdGF0ZS5saW5lSW5kZW50ID0gMDtcblxuICAgICAgd2hpbGUgKGNoID09PSAweDIwLyogU3BhY2UgKi8pIHtcbiAgICAgICAgc3RhdGUubGluZUluZGVudCsrO1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjaGVja0luZGVudCAhPT0gLTEgJiYgbGluZUJyZWFrcyAhPT0gMCAmJiBzdGF0ZS5saW5lSW5kZW50IDwgY2hlY2tJbmRlbnQpIHtcbiAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICdkZWZpY2llbnQgaW5kZW50YXRpb24nKTtcbiAgfVxuXG4gIHJldHVybiBsaW5lQnJlYWtzO1xufVxuXG5mdW5jdGlvbiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbik7XG5cbiAgLy8gQ29uZGl0aW9uIHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgaXMgdGVzdGVkXG4gIC8vIGluIHBhcmVudCBvbiBlYWNoIGNhbGwsIGZvciBlZmZpY2llbmN5LiBObyBuZWVkcyB0byB0ZXN0IGhlcmUgYWdhaW4uXG4gIGlmICgoY2ggPT09IDB4MkQvKiAtICovIHx8IGNoID09PSAweDJFLyogLiAqLykgJiZcbiAgICAgIGNoID09PSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbiArIDEpICYmXG4gICAgICBjaCA9PT0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24gKyAyKSkge1xuXG4gICAgX3Bvc2l0aW9uICs9IDM7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gMCB8fCBpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIGNvdW50KSB7XG4gIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHN0YXRlLnJlc3VsdCArPSAnICc7XG4gIH0gZWxzZSBpZiAoY291bnQgPiAxKSB7XG4gICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGNvdW50IC0gMSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiByZWFkUGxhaW5TY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQsIHdpdGhpbkZsb3dDb2xsZWN0aW9uKSB7XG4gIHZhciBwcmVjZWRpbmcsXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICBjYXB0dXJlU3RhcnQsXG4gICAgICBjYXB0dXJlRW5kLFxuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQsXG4gICAgICBfbGluZSxcbiAgICAgIF9saW5lU3RhcnQsXG4gICAgICBfbGluZUluZGVudCxcbiAgICAgIF9raW5kID0gc3RhdGUua2luZCxcbiAgICAgIF9yZXN1bHQgPSBzdGF0ZS5yZXN1bHQsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChpc19XU19PUl9FT0woY2gpICAgICAgfHxcbiAgICAgIGlzX0ZMT1dfSU5ESUNBVE9SKGNoKSB8fFxuICAgICAgY2ggPT09IDB4MjMvKiAjICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNi8qICYgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDJBLyogKiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjEvKiAhICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg3Qy8qIHwgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDNFLyogPiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MjcvKiAnICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyMi8qIFwiICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNS8qICUgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDQwLyogQCAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4NjAvKiBgICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGNoID09PSAweDNGLyogPyAqLyB8fCBjaCA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICBpZiAoaXNfV1NfT1JfRU9MKGZvbGxvd2luZykgfHxcbiAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoZm9sbG93aW5nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fFxuICAgICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGZvbGxvd2luZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgcHJlY2VkaW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiAtIDEpO1xuXG4gICAgICBpZiAoaXNfV1NfT1JfRU9MKHByZWNlZGluZykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHx8XG4gICAgICAgICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihjaCkpIHtcbiAgICAgIGJyZWFrO1xuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBfbGluZSA9IHN0YXRlLmxpbmU7XG4gICAgICBfbGluZVN0YXJ0ID0gc3RhdGUubGluZVN0YXJ0O1xuICAgICAgX2xpbmVJbmRlbnQgPSBzdGF0ZS5saW5lSW5kZW50O1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIC0xKTtcblxuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPj0gbm9kZUluZGVudCkge1xuICAgICAgICBoYXNQZW5kaW5nQ29udGVudCA9IHRydWU7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucG9zaXRpb24gPSBjYXB0dXJlRW5kO1xuICAgICAgICBzdGF0ZS5saW5lID0gX2xpbmU7XG4gICAgICAgIHN0YXRlLmxpbmVTdGFydCA9IF9saW5lU3RhcnQ7XG4gICAgICAgIHN0YXRlLmxpbmVJbmRlbnQgPSBfbGluZUluZGVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1BlbmRpbmdDb250ZW50KSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBzdGF0ZS5saW5lIC0gX2xpbmUpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgaGFzUGVuZGluZ0NvbnRlbnQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uICsgMTtcbiAgICB9XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIH1cblxuICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCBmYWxzZSk7XG5cbiAgaWYgKHN0YXRlLnJlc3VsdCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9IF9raW5kO1xuICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIGNoLFxuICAgICAgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDI3LyogJyAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIHN0YXRlLnBvc2l0aW9uKys7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7XG4gICAgaWYgKGNoID09PSAweDI3LyogJyAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICBpZiAoY2ggPT09IDB4MjcvKiAnICovKSB7XG4gICAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBjYXB0dXJlRW5kLCB0cnVlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGZhbHNlLCBub2RlSW5kZW50KSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhcicpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgc2luZ2xlIHF1b3RlZCBzY2FsYXInKTtcbn1cblxuZnVuY3Rpb24gcmVhZERvdWJsZVF1b3RlZFNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2FwdHVyZVN0YXJ0LFxuICAgICAgY2FwdHVyZUVuZCxcbiAgICAgIGhleExlbmd0aCxcbiAgICAgIGhleFJlc3VsdCxcbiAgICAgIHRtcCxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDIyLyogXCIgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gJ3NjYWxhcic7XG4gIHN0YXRlLnJlc3VsdCA9ICcnO1xuICBzdGF0ZS5wb3NpdGlvbisrO1xuICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkge1xuICAgIGlmIChjaCA9PT0gMHgyMi8qIFwiICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDVDLyogXFwgKi8pIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpO1xuXG4gICAgICAgIC8vIFRPRE86IHJld29yayB0byBpbmxpbmUgZm4gd2l0aCBubyB0eXBlIGNhc3Q/XG4gICAgICB9IGVsc2UgaWYgKGNoIDwgMjU2ICYmIHNpbXBsZUVzY2FwZUNoZWNrW2NoXSkge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gc2ltcGxlRXNjYXBlTWFwW2NoXTtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgICAgfSBlbHNlIGlmICgodG1wID0gZXNjYXBlZEhleExlbihjaCkpID4gMCkge1xuICAgICAgICBoZXhMZW5ndGggPSB0bXA7XG4gICAgICAgIGhleFJlc3VsdCA9IDA7XG5cbiAgICAgICAgZm9yICg7IGhleExlbmd0aCA+IDA7IGhleExlbmd0aC0tKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICAgICAgaWYgKCh0bXAgPSBmcm9tSGV4Q29kZShjaCkpID49IDApIHtcbiAgICAgICAgICAgIGhleFJlc3VsdCA9IChoZXhSZXN1bHQgPDwgNCkgKyB0bXA7XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2V4cGVjdGVkIGhleGFkZWNpbWFsIGNoYXJhY3RlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjaGFyRnJvbUNvZGVwb2ludChoZXhSZXN1bHQpO1xuXG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmtub3duIGVzY2FwZSBzZXF1ZW5jZScpO1xuICAgICAgfVxuXG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIHRydWUpO1xuICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpKTtcbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIH0gZWxzZSBpZiAoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyJyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhcicpO1xufVxuXG5mdW5jdGlvbiByZWFkRmxvd0NvbGxlY3Rpb24oc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIHJlYWROZXh0ID0gdHJ1ZSxcbiAgICAgIF9saW5lLFxuICAgICAgX3RhZyAgICAgPSBzdGF0ZS50YWcsXG4gICAgICBfcmVzdWx0LFxuICAgICAgX2FuY2hvciAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICB0ZXJtaW5hdG9yLFxuICAgICAgaXNQYWlyLFxuICAgICAgaXNFeHBsaWNpdFBhaXIsXG4gICAgICBpc01hcHBpbmcsXG4gICAgICBvdmVycmlkYWJsZUtleXMgPSB7fSxcbiAgICAgIGtleU5vZGUsXG4gICAgICBrZXlUYWcsXG4gICAgICB2YWx1ZU5vZGUsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHg1Qi8qIFsgKi8pIHtcbiAgICB0ZXJtaW5hdG9yID0gMHg1RDsvKiBdICovXG4gICAgaXNNYXBwaW5nID0gZmFsc2U7XG4gICAgX3Jlc3VsdCA9IFtdO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDdCLyogeyAqLykge1xuICAgIHRlcm1pbmF0b3IgPSAweDdEOy8qIH0gKi9cbiAgICBpc01hcHBpbmcgPSB0cnVlO1xuICAgIF9yZXN1bHQgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gdGVybWluYXRvcikge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgc3RhdGUua2luZCA9IGlzTWFwcGluZyA/ICdtYXBwaW5nJyA6ICdzZXF1ZW5jZSc7XG4gICAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICghcmVhZE5leHQpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdtaXNzZWQgY29tbWEgYmV0d2VlbiBmbG93IGNvbGxlY3Rpb24gZW50cmllcycpO1xuICAgIH1cblxuICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgIGlzUGFpciA9IGlzRXhwbGljaXRQYWlyID0gZmFsc2U7XG5cbiAgICBpZiAoY2ggPT09IDB4M0YvKiA/ICovKSB7XG4gICAgICBmb2xsb3dpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSkge1xuICAgICAgICBpc1BhaXIgPSBpc0V4cGxpY2l0UGFpciA9IHRydWU7XG4gICAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAga2V5VGFnID0gc3RhdGUudGFnO1xuICAgIGtleU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKChpc0V4cGxpY2l0UGFpciB8fCBzdGF0ZS5saW5lID09PSBfbGluZSkgJiYgY2ggPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBpc1BhaXIgPSB0cnVlO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG4gICAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9GTE9XX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB2YWx1ZU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKGlzTWFwcGluZykge1xuICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSk7XG4gICAgfSBlbHNlIGlmIChpc1BhaXIpIHtcbiAgICAgIF9yZXN1bHQucHVzaChzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBudWxsLCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9yZXN1bHQucHVzaChrZXlOb2RlKTtcbiAgICB9XG5cbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDB4MkMvKiAsICovKSB7XG4gICAgICByZWFkTmV4dCA9IHRydWU7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYWROZXh0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgZmxvdyBjb2xsZWN0aW9uJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2FwdHVyZVN0YXJ0LFxuICAgICAgZm9sZGluZyxcbiAgICAgIGNob21waW5nICAgICAgID0gQ0hPTVBJTkdfQ0xJUCxcbiAgICAgIGRldGVjdGVkSW5kZW50ID0gZmFsc2UsXG4gICAgICB0ZXh0SW5kZW50ICAgICA9IG5vZGVJbmRlbnQsXG4gICAgICBlbXB0eUxpbmVzICAgICA9IDAsXG4gICAgICBhdE1vcmVJbmRlbnRlZCA9IGZhbHNlLFxuICAgICAgdG1wLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4N0MvKiB8ICovKSB7XG4gICAgZm9sZGluZyA9IGZhbHNlO1xuICB9IGVsc2UgaWYgKGNoID09PSAweDNFLyogPiAqLykge1xuICAgIGZvbGRpbmcgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAweDJCLyogKyAqLyB8fCBjaCA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICAgIGlmIChDSE9NUElOR19DTElQID09PSBjaG9tcGluZykge1xuICAgICAgICBjaG9tcGluZyA9IChjaCA9PT0gMHgyQi8qICsgKi8pID8gQ0hPTVBJTkdfS0VFUCA6IENIT01QSU5HX1NUUklQO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3JlcGVhdCBvZiBhIGNob21waW5nIG1vZGUgaWRlbnRpZmllcicpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICgodG1wID0gZnJvbURlY2ltYWxDb2RlKGNoKSkgPj0gMCkge1xuICAgICAgaWYgKHRtcCA9PT0gMCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGV4cGxpY2l0IGluZGVudGF0aW9uIHdpZHRoIG9mIGEgYmxvY2sgc2NhbGFyOyBpdCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9uZScpO1xuICAgICAgfSBlbHNlIGlmICghZGV0ZWN0ZWRJbmRlbnQpIHtcbiAgICAgICAgdGV4dEluZGVudCA9IG5vZGVJbmRlbnQgKyB0bXAgLSAxO1xuICAgICAgICBkZXRlY3RlZEluZGVudCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAncmVwZWF0IG9mIGFuIGluZGVudGF0aW9uIHdpZHRoIGlkZW50aWZpZXInKTtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKTtcblxuICAgIGlmIChjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgICB3aGlsZSAoIWlzX0VPTChjaCkgJiYgKGNoICE9PSAwKSk7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG4gICAgc3RhdGUubGluZUluZGVudCA9IDA7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgd2hpbGUgKCghZGV0ZWN0ZWRJbmRlbnQgfHwgc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpICYmXG4gICAgICAgICAgIChjaCA9PT0gMHgyMC8qIFNwYWNlICovKSkge1xuICAgICAgc3RhdGUubGluZUluZGVudCsrO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmICghZGV0ZWN0ZWRJbmRlbnQgJiYgc3RhdGUubGluZUluZGVudCA+IHRleHRJbmRlbnQpIHtcbiAgICAgIHRleHRJbmRlbnQgPSBzdGF0ZS5saW5lSW5kZW50O1xuICAgIH1cblxuICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICBlbXB0eUxpbmVzKys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBFbmQgb2YgdGhlIHNjYWxhci5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA8IHRleHRJbmRlbnQpIHtcblxuICAgICAgLy8gUGVyZm9ybSB0aGUgY2hvbXBpbmcuXG4gICAgICBpZiAoY2hvbXBpbmcgPT09IENIT01QSU5HX0tFRVApIHtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMpO1xuICAgICAgfSBlbHNlIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfQ0xJUCkge1xuICAgICAgICBpZiAoZGV0ZWN0ZWRJbmRlbnQpIHsgLy8gaS5lLiBvbmx5IGlmIHRoZSBzY2FsYXIgaXMgbm90IGVtcHR5LlxuICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBCcmVhayB0aGlzIGB3aGlsZWAgY3ljbGUgYW5kIGdvIHRvIHRoZSBmdW5jaXRvbidzIGVwaWxvZ3VlLlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gRm9sZGVkIHN0eWxlOiB1c2UgZmFuY3kgcnVsZXMgdG8gaGFuZGxlIGxpbmUgYnJlYWtzLlxuICAgIGlmIChmb2xkaW5nKSB7XG5cbiAgICAgIC8vIExpbmVzIHN0YXJ0aW5nIHdpdGggd2hpdGUgc3BhY2UgY2hhcmFjdGVycyAobW9yZS1pbmRlbnRlZCBsaW5lcykgYXJlIG5vdCBmb2xkZWQuXG4gICAgICBpZiAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMgKyAxKTtcblxuICAgICAgLy8gRW5kIG9mIG1vcmUtaW5kZW50ZWQgYmxvY2suXG4gICAgICB9IGVsc2UgaWYgKGF0TW9yZUluZGVudGVkKSB7XG4gICAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzICsgMSk7XG5cbiAgICAgIC8vIEp1c3Qgb25lIGxpbmUgYnJlYWsgLSBwZXJjZWl2ZSBhcyB0aGUgc2FtZSBsaW5lLlxuICAgICAgfSBlbHNlIGlmIChlbXB0eUxpbmVzID09PSAwKSB7XG4gICAgICAgIGlmIChkZXRlY3RlZEluZGVudCkgeyAvLyBpLmUuIG9ubHkgaWYgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgc29tZSBzY2FsYXIgY29udGVudC5cbiAgICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gJyAnO1xuICAgICAgICB9XG5cbiAgICAgIC8vIFNldmVyYWwgbGluZSBicmVha3MgLSBwZXJjZWl2ZSBhcyBkaWZmZXJlbnQgbGluZXMuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgICB9XG5cbiAgICAvLyBMaXRlcmFsIHN0eWxlOiBqdXN0IGFkZCBleGFjdCBudW1iZXIgb2YgbGluZSBicmVha3MgYmV0d2VlbiBjb250ZW50IGxpbmVzLlxuICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWRJbmRlbnQpIHtcbiAgICAgIC8vIElmIGN1cnJlbnQgbGluZSBpc24ndCB0aGUgZmlyc3Qgb25lIC0gY291bnQgbGluZSBicmVhayBmcm9tIHRoZSBsYXN0IGNvbnRlbnQgbGluZS5cbiAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIGNhc2Ugb2YgdGhlIGZpcnN0IGNvbnRlbnQgbGluZSAtIGNvdW50IG9ubHkgZW1wdHkgbGluZXMuXG4gICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgfVxuXG4gICAgZGV0ZWN0ZWRJbmRlbnQgPSB0cnVlO1xuICAgIGVtcHR5TGluZXMgPSAwO1xuICAgIGNhcHR1cmVTdGFydCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgd2hpbGUgKCFpc19FT0woY2gpICYmIChjaCAhPT0gMCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgZmFsc2UpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBfbGluZSxcbiAgICAgIF90YWcgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9hbmNob3IgICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIF9yZXN1bHQgICA9IFtdLFxuICAgICAgZm9sbG93aW5nLFxuICAgICAgZGV0ZWN0ZWQgID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBfcmVzdWx0O1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICB3aGlsZSAoY2ggIT09IDApIHtcblxuICAgIGlmIChjaCAhPT0gMHgyRC8qIC0gKi8pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgIGlmICghaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkge1xuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPD0gbm9kZUluZGVudCkge1xuICAgICAgICBfcmVzdWx0LnB1c2gobnVsbCk7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICBjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9CTE9DS19JTiwgZmFsc2UsIHRydWUpO1xuICAgIF9yZXN1bHQucHVzaChzdGF0ZS5yZXN1bHQpO1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSAmJiAoY2ggIT09IDApKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGluZGVudGF0aW9uIG9mIGEgc2VxdWVuY2UgZW50cnknKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBub2RlSW5kZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoZGV0ZWN0ZWQpIHtcbiAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgc3RhdGUua2luZCA9ICdzZXF1ZW5jZSc7XG4gICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlYWRCbG9ja01hcHBpbmcoc3RhdGUsIG5vZGVJbmRlbnQsIGZsb3dJbmRlbnQpIHtcbiAgdmFyIGZvbGxvd2luZyxcbiAgICAgIGFsbG93Q29tcGFjdCxcbiAgICAgIF9saW5lLFxuICAgICAgX3RhZyAgICAgICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9hbmNob3IgICAgICAgPSBzdGF0ZS5hbmNob3IsXG4gICAgICBfcmVzdWx0ICAgICAgID0ge30sXG4gICAgICBvdmVycmlkYWJsZUtleXMgPSB7fSxcbiAgICAgIGtleVRhZyAgICAgICAgPSBudWxsLFxuICAgICAga2V5Tm9kZSAgICAgICA9IG51bGwsXG4gICAgICB2YWx1ZU5vZGUgICAgID0gbnVsbCxcbiAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZSxcbiAgICAgIGRldGVjdGVkICAgICAgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IF9yZXN1bHQ7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcbiAgICBfbGluZSA9IHN0YXRlLmxpbmU7IC8vIFNhdmUgdGhlIGN1cnJlbnQgbGluZS5cblxuICAgIC8vXG4gICAgLy8gRXhwbGljaXQgbm90YXRpb24gY2FzZS4gVGhlcmUgYXJlIHR3byBzZXBhcmF0ZSBibG9ja3M6XG4gICAgLy8gZmlyc3QgZm9yIHRoZSBrZXkgKGRlbm90ZWQgYnkgXCI/XCIpIGFuZCBzZWNvbmQgZm9yIHRoZSB2YWx1ZSAoZGVub3RlZCBieSBcIjpcIilcbiAgICAvL1xuICAgIGlmICgoY2ggPT09IDB4M0YvKiA/ICovIHx8IGNoID09PSAweDNBLyogOiAqLykgJiYgaXNfV1NfT1JfRU9MKGZvbGxvd2luZykpIHtcblxuICAgICAgaWYgKGNoID09PSAweDNGLyogPyAqLykge1xuICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IHRydWU7XG4gICAgICAgIGFsbG93Q29tcGFjdCA9IHRydWU7XG5cbiAgICAgIH0gZWxzZSBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAvLyBpLmUuIDB4M0EvKiA6ICovID09PSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGV4cGxpY2l0IGtleS5cbiAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlO1xuICAgICAgICBhbGxvd0NvbXBhY3QgPSB0cnVlO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaW5jb21wbGV0ZSBleHBsaWNpdCBtYXBwaW5nIHBhaXI7IGEga2V5IG5vZGUgaXMgbWlzc2VkJyk7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDE7XG4gICAgICBjaCA9IGZvbGxvd2luZztcblxuICAgIC8vXG4gICAgLy8gSW1wbGljaXQgbm90YXRpb24gY2FzZS4gRmxvdy1zdHlsZSBub2RlIGFzIHRoZSBrZXkgZmlyc3QsIHRoZW4gXCI6XCIsIGFuZCB0aGUgdmFsdWUuXG4gICAgLy9cbiAgICB9IGVsc2UgaWYgKGNvbXBvc2VOb2RlKHN0YXRlLCBmbG93SW5kZW50LCBDT05URVhUX0ZMT1dfT1VULCBmYWxzZSwgdHJ1ZSkpIHtcblxuICAgICAgaWYgKHN0YXRlLmxpbmUgPT09IF9saW5lKSB7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaCA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgICBpZiAoIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGV4cGVjdGVkIGFmdGVyIHRoZSBrZXktdmFsdWUgc2VwYXJhdG9yIHdpdGhpbiBhIGJsb2NrIG1hcHBpbmcnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICAgICAgICAgICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGF0RXhwbGljaXRLZXkgPSBmYWxzZTtcbiAgICAgICAgICBhbGxvd0NvbXBhY3QgPSBmYWxzZTtcbiAgICAgICAgICBrZXlUYWcgPSBzdGF0ZS50YWc7XG4gICAgICAgICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcblxuICAgICAgICB9IGVsc2UgaWYgKGRldGVjdGVkKSB7XG4gICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2NhbiBub3QgcmVhZCBhbiBpbXBsaWNpdCBtYXBwaW5nIHBhaXI7IGEgY29sb24gaXMgbWlzc2VkJyk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgdGhlIHJlc3VsdCBvZiBgY29tcG9zZU5vZGVgLlxuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2NhbiBub3QgcmVhZCBhIGJsb2NrIG1hcHBpbmcgZW50cnk7IGEgbXVsdGlsaW5lIGtleSBtYXkgbm90IGJlIGFuIGltcGxpY2l0IGtleScpO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS50YWcgPSBfdGFnO1xuICAgICAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gS2VlcCB0aGUgcmVzdWx0IG9mIGBjb21wb3NlTm9kZWAuXG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7IC8vIFJlYWRpbmcgaXMgZG9uZS4gR28gdG8gdGhlIGVwaWxvZ3VlLlxuICAgIH1cblxuICAgIC8vXG4gICAgLy8gQ29tbW9uIHJlYWRpbmcgY29kZSBmb3IgYm90aCBleHBsaWNpdCBhbmQgaW1wbGljaXQgbm90YXRpb25zLlxuICAgIC8vXG4gICAgaWYgKHN0YXRlLmxpbmUgPT09IF9saW5lIHx8IHN0YXRlLmxpbmVJbmRlbnQgPiBub2RlSW5kZW50KSB7XG4gICAgICBpZiAoY29tcG9zZU5vZGUoc3RhdGUsIG5vZGVJbmRlbnQsIENPTlRFWFRfQkxPQ0tfT1VULCB0cnVlLCBhbGxvd0NvbXBhY3QpKSB7XG4gICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZU5vZGUgPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQgJiYgKGNoICE9PSAwKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2JhZCBpbmRlbnRhdGlvbiBvZiBhIG1hcHBpbmcgZW50cnknKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBub2RlSW5kZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvL1xuICAvLyBFcGlsb2d1ZS5cbiAgLy9cblxuICAvLyBTcGVjaWFsIGNhc2U6IGxhc3QgbWFwcGluZydzIG5vZGUgY29udGFpbnMgb25seSB0aGUga2V5IGluIGV4cGxpY2l0IG5vdGF0aW9uLlxuICBpZiAoYXRFeHBsaWNpdEtleSkge1xuICAgIHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIF9yZXN1bHQsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCBudWxsKTtcbiAgfVxuXG4gIC8vIEV4cG9zZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcuXG4gIGlmIChkZXRlY3RlZCkge1xuICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICBzdGF0ZS5raW5kID0gJ21hcHBpbmcnO1xuICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gZGV0ZWN0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWdQcm9wZXJ0eShzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uLFxuICAgICAgaXNWZXJiYXRpbSA9IGZhbHNlLFxuICAgICAgaXNOYW1lZCAgICA9IGZhbHNlLFxuICAgICAgdGFnSGFuZGxlLFxuICAgICAgdGFnTmFtZSxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDIxLyogISAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChzdGF0ZS50YWcgIT09IG51bGwpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgYSB0YWcgcHJvcGVydHknKTtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4M0MvKiA8ICovKSB7XG4gICAgaXNWZXJiYXRpbSA9IHRydWU7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4MjEvKiAhICovKSB7XG4gICAgaXNOYW1lZCA9IHRydWU7XG4gICAgdGFnSGFuZGxlID0gJyEhJztcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgfSBlbHNlIHtcbiAgICB0YWdIYW5kbGUgPSAnISc7XG4gIH1cblxuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICBpZiAoaXNWZXJiYXRpbSkge1xuICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgd2hpbGUgKGNoICE9PSAwICYmIGNoICE9PSAweDNFLyogPiAqLyk7XG5cbiAgICBpZiAoc3RhdGUucG9zaXRpb24gPCBzdGF0ZS5sZW5ndGgpIHtcbiAgICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZXhwZWN0ZWQgZW5kIG9mIHRoZSBzdHJlYW0gd2l0aGluIGEgdmVyYmF0aW0gdGFnJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkge1xuXG4gICAgICBpZiAoY2ggPT09IDB4MjEvKiAhICovKSB7XG4gICAgICAgIGlmICghaXNOYW1lZCkge1xuICAgICAgICAgIHRhZ0hhbmRsZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiAtIDEsIHN0YXRlLnBvc2l0aW9uICsgMSk7XG5cbiAgICAgICAgICBpZiAoIVBBVFRFUk5fVEFHX0hBTkRMRS50ZXN0KHRhZ0hhbmRsZSkpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICduYW1lZCB0YWcgaGFuZGxlIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVycycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlzTmFtZWQgPSB0cnVlO1xuICAgICAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIHN1ZmZpeCBjYW5ub3QgY29udGFpbiBleGNsYW1hdGlvbiBtYXJrcycpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICB0YWdOYW1lID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoUEFUVEVSTl9GTE9XX0lORElDQVRPUlMudGVzdCh0YWdOYW1lKSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZmxvdyBpbmRpY2F0b3IgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0YWdOYW1lICYmICFQQVRURVJOX1RBR19VUkkudGVzdCh0YWdOYW1lKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgbmFtZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnM6ICcgKyB0YWdOYW1lKTtcbiAgfVxuXG4gIGlmIChpc1ZlcmJhdGltKSB7XG4gICAgc3RhdGUudGFnID0gdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnRhZ01hcCwgdGFnSGFuZGxlKSkge1xuICAgIHN0YXRlLnRhZyA9IHN0YXRlLnRhZ01hcFt0YWdIYW5kbGVdICsgdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKHRhZ0hhbmRsZSA9PT0gJyEnKSB7XG4gICAgc3RhdGUudGFnID0gJyEnICsgdGFnTmFtZTtcblxuICB9IGVsc2UgaWYgKHRhZ0hhbmRsZSA9PT0gJyEhJykge1xuICAgIHN0YXRlLnRhZyA9ICd0YWc6eWFtbC5vcmcsMjAwMjonICsgdGFnTmFtZTtcblxuICB9IGVsc2Uge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmRlY2xhcmVkIHRhZyBoYW5kbGUgXCInICsgdGFnSGFuZGxlICsgJ1wiJyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVhZEFuY2hvclByb3BlcnR5KHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyNi8qICYgKi8pIHJldHVybiBmYWxzZTtcblxuICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mIGFuIGFuY2hvciBwcm9wZXJ0eScpO1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkgJiYgIWlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gX3Bvc2l0aW9uKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWUgb2YgYW4gYW5jaG9yIG5vZGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXInKTtcbiAgfVxuXG4gIHN0YXRlLmFuY2hvciA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVhZEFsaWFzKHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sIGFsaWFzLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MkEvKiAqICovKSByZXR1cm4gZmFsc2U7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICBfcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkgJiYgIWlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gX3Bvc2l0aW9uKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWUgb2YgYW4gYWxpYXMgbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlcicpO1xuICB9XG5cbiAgYWxpYXMgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoIXN0YXRlLmFuY2hvck1hcC5oYXNPd25Qcm9wZXJ0eShhbGlhcykpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5pZGVudGlmaWVkIGFsaWFzIFwiJyArIGFsaWFzICsgJ1wiJyk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bHQgPSBzdGF0ZS5hbmNob3JNYXBbYWxpYXNdO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb21wb3NlTm9kZShzdGF0ZSwgcGFyZW50SW5kZW50LCBub2RlQ29udGV4dCwgYWxsb3dUb1NlZWssIGFsbG93Q29tcGFjdCkge1xuICB2YXIgYWxsb3dCbG9ja1N0eWxlcyxcbiAgICAgIGFsbG93QmxvY2tTY2FsYXJzLFxuICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zLFxuICAgICAgaW5kZW50U3RhdHVzID0gMSwgLy8gMTogdGhpcz5wYXJlbnQsIDA6IHRoaXM9cGFyZW50LCAtMTogdGhpczxwYXJlbnRcbiAgICAgIGF0TmV3TGluZSAgPSBmYWxzZSxcbiAgICAgIGhhc0NvbnRlbnQgPSBmYWxzZSxcbiAgICAgIHR5cGVJbmRleCxcbiAgICAgIHR5cGVRdWFudGl0eSxcbiAgICAgIHR5cGUsXG4gICAgICBmbG93SW5kZW50LFxuICAgICAgYmxvY2tJbmRlbnQ7XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ29wZW4nLCBzdGF0ZSk7XG4gIH1cblxuICBzdGF0ZS50YWcgICAgPSBudWxsO1xuICBzdGF0ZS5hbmNob3IgPSBudWxsO1xuICBzdGF0ZS5raW5kICAgPSBudWxsO1xuICBzdGF0ZS5yZXN1bHQgPSBudWxsO1xuXG4gIGFsbG93QmxvY2tTdHlsZXMgPSBhbGxvd0Jsb2NrU2NhbGFycyA9IGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9XG4gICAgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0IHx8XG4gICAgQ09OVEVYVF9CTE9DS19JTiAgPT09IG5vZGVDb250ZXh0O1xuXG4gIGlmIChhbGxvd1RvU2Vlaykge1xuICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgIGF0TmV3TGluZSA9IHRydWU7XG5cbiAgICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IDE7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICBpbmRlbnRTdGF0dXMgPSAwO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEpIHtcbiAgICB3aGlsZSAocmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB8fCByZWFkQW5jaG9yUHJvcGVydHkoc3RhdGUpKSB7XG4gICAgICBpZiAoc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpKSB7XG4gICAgICAgIGF0TmV3TGluZSA9IHRydWU7XG4gICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGFsbG93QmxvY2tTdHlsZXM7XG5cbiAgICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgICBpbmRlbnRTdGF0dXMgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IC0xO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zKSB7XG4gICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gYXROZXdMaW5lIHx8IGFsbG93Q29tcGFjdDtcbiAgfVxuXG4gIGlmIChpbmRlbnRTdGF0dXMgPT09IDEgfHwgQ09OVEVYVF9CTE9DS19PVVQgPT09IG5vZGVDb250ZXh0KSB7XG4gICAgaWYgKENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQgfHwgQ09OVEVYVF9GTE9XX09VVCA9PT0gbm9kZUNvbnRleHQpIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsb3dJbmRlbnQgPSBwYXJlbnRJbmRlbnQgKyAxO1xuICAgIH1cblxuICAgIGJsb2NrSW5kZW50ID0gc3RhdGUucG9zaXRpb24gLSBzdGF0ZS5saW5lU3RhcnQ7XG5cbiAgICBpZiAoaW5kZW50U3RhdHVzID09PSAxKSB7XG4gICAgICBpZiAoYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmXG4gICAgICAgICAgKHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCkgfHxcbiAgICAgICAgICAgcmVhZEJsb2NrTWFwcGluZyhzdGF0ZSwgYmxvY2tJbmRlbnQsIGZsb3dJbmRlbnQpKSB8fFxuICAgICAgICAgIHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGFsbG93QmxvY2tTY2FsYXJzICYmIHJlYWRCbG9ja1NjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHx8XG4gICAgICAgICAgICByZWFkU2luZ2xlUXVvdGVkU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSB8fFxuICAgICAgICAgICAgcmVhZERvdWJsZVF1b3RlZFNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlYWRBbGlhcyhzdGF0ZSkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzdGF0ZS50YWcgIT09IG51bGwgfHwgc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYWxpYXMgbm9kZSBzaG91bGQgbm90IGhhdmUgYW55IHByb3BlcnRpZXMnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWFkUGxhaW5TY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19JTiA9PT0gbm9kZUNvbnRleHQpKSB7XG4gICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoc3RhdGUudGFnID09PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZS50YWcgPSAnPyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbmRlbnRTdGF0dXMgPT09IDApIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZTogYmxvY2sgc2VxdWVuY2VzIGFyZSBhbGxvd2VkIHRvIGhhdmUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbCBhcyB0aGUgcGFyZW50LlxuICAgICAgLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyNzk5Nzg0XG4gICAgICBoYXNDb250ZW50ID0gYWxsb3dCbG9ja0NvbGxlY3Rpb25zICYmIHJlYWRCbG9ja1NlcXVlbmNlKHN0YXRlLCBibG9ja0luZGVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCAmJiBzdGF0ZS50YWcgIT09ICchJykge1xuICAgIGlmIChzdGF0ZS50YWcgPT09ICc/Jykge1xuICAgICAgZm9yICh0eXBlSW5kZXggPSAwLCB0eXBlUXVhbnRpdHkgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgdHlwZUluZGV4IDwgdHlwZVF1YW50aXR5O1xuICAgICAgICAgICB0eXBlSW5kZXggKz0gMSkge1xuICAgICAgICB0eXBlID0gc3RhdGUuaW1wbGljaXRUeXBlc1t0eXBlSW5kZXhdO1xuXG4gICAgICAgIC8vIEltcGxpY2l0IHJlc29sdmluZyBpcyBub3QgYWxsb3dlZCBmb3Igbm9uLXNjYWxhciB0eXBlcywgYW5kICc/J1xuICAgICAgICAvLyBub24tc3BlY2lmaWMgdGFnIGlzIG9ubHkgYXNzaWduZWQgdG8gcGxhaW4gc2NhbGFycy4gU28sIGl0IGlzbid0XG4gICAgICAgIC8vIG5lZWRlZCB0byBjaGVjayBmb3IgJ2tpbmQnIGNvbmZvcm1pdHkuXG5cbiAgICAgICAgaWYgKHR5cGUucmVzb2x2ZShzdGF0ZS5yZXN1bHQpKSB7IC8vIGBzdGF0ZS5yZXN1bHRgIHVwZGF0ZWQgaW4gcmVzb2x2ZXIgaWYgbWF0Y2hlZFxuICAgICAgICAgIHN0YXRlLnJlc3VsdCA9IHR5cGUuY29uc3RydWN0KHN0YXRlLnJlc3VsdCk7XG4gICAgICAgICAgc3RhdGUudGFnID0gdHlwZS50YWc7XG4gICAgICAgICAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS50eXBlTWFwLCBzdGF0ZS50YWcpKSB7XG4gICAgICB0eXBlID0gc3RhdGUudHlwZU1hcFtzdGF0ZS50YWddO1xuXG4gICAgICBpZiAoc3RhdGUucmVzdWx0ICE9PSBudWxsICYmIHR5cGUua2luZCAhPT0gc3RhdGUua2luZCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITwnICsgc3RhdGUudGFnICsgJz4gdGFnOyBpdCBzaG91bGQgYmUgXCInICsgdHlwZS5raW5kICsgJ1wiLCBub3QgXCInICsgc3RhdGUua2luZCArICdcIicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXR5cGUucmVzb2x2ZShzdGF0ZS5yZXN1bHQpKSB7IC8vIGBzdGF0ZS5yZXN1bHRgIHVwZGF0ZWQgaW4gcmVzb2x2ZXIgaWYgbWF0Y2hlZFxuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2Fubm90IHJlc29sdmUgYSBub2RlIHdpdGggITwnICsgc3RhdGUudGFnICsgJz4gZXhwbGljaXQgdGFnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgPSB0eXBlLmNvbnN0cnVjdChzdGF0ZS5yZXN1bHQpO1xuICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3Vua25vd24gdGFnICE8JyArIHN0YXRlLnRhZyArICc+Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLmxpc3RlbmVyICE9PSBudWxsKSB7XG4gICAgc3RhdGUubGlzdGVuZXIoJ2Nsb3NlJywgc3RhdGUpO1xuICB9XG4gIHJldHVybiBzdGF0ZS50YWcgIT09IG51bGwgfHwgIHN0YXRlLmFuY2hvciAhPT0gbnVsbCB8fCBoYXNDb250ZW50O1xufVxuXG5mdW5jdGlvbiByZWFkRG9jdW1lbnQoc3RhdGUpIHtcbiAgdmFyIGRvY3VtZW50U3RhcnQgPSBzdGF0ZS5wb3NpdGlvbixcbiAgICAgIF9wb3NpdGlvbixcbiAgICAgIGRpcmVjdGl2ZU5hbWUsXG4gICAgICBkaXJlY3RpdmVBcmdzLFxuICAgICAgaGFzRGlyZWN0aXZlcyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgc3RhdGUudmVyc2lvbiA9IG51bGw7XG4gIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IHN0YXRlLmxlZ2FjeTtcbiAgc3RhdGUudGFnTWFwID0ge307XG4gIHN0YXRlLmFuY2hvck1hcCA9IHt9O1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiAwIHx8IGNoICE9PSAweDI1LyogJSAqLykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaGFzRGlyZWN0aXZlcyA9IHRydWU7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgZGlyZWN0aXZlTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICAgIGRpcmVjdGl2ZUFyZ3MgPSBbXTtcblxuICAgIGlmIChkaXJlY3RpdmVOYW1lLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdkaXJlY3RpdmUgbmFtZSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gb25lIGNoYXJhY3RlciBpbiBsZW5ndGgnKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICAgIGRvIHsgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pOyB9XG4gICAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfRU9MKGNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNfRU9MKGNoKSkgYnJlYWs7XG5cbiAgICAgIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgfVxuXG4gICAgICBkaXJlY3RpdmVBcmdzLnB1c2goc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbikpO1xuICAgIH1cblxuICAgIGlmIChjaCAhPT0gMCkgcmVhZExpbmVCcmVhayhzdGF0ZSk7XG5cbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoZGlyZWN0aXZlSGFuZGxlcnMsIGRpcmVjdGl2ZU5hbWUpKSB7XG4gICAgICBkaXJlY3RpdmVIYW5kbGVyc1tkaXJlY3RpdmVOYW1lXShzdGF0ZSwgZGlyZWN0aXZlTmFtZSwgZGlyZWN0aXZlQXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ3Vua25vd24gZG9jdW1lbnQgZGlyZWN0aXZlIFwiJyArIGRpcmVjdGl2ZU5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH1cblxuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPT09IDAgJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pICAgICA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKSA9PT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAyKSA9PT0gMHgyRC8qIC0gKi8pIHtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAzO1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICB9IGVsc2UgaWYgKGhhc0RpcmVjdGl2ZXMpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZGlyZWN0aXZlcyBlbmQgbWFyayBpcyBleHBlY3RlZCcpO1xuICB9XG5cbiAgY29tcG9zZU5vZGUoc3RhdGUsIHN0YXRlLmxpbmVJbmRlbnQgLSAxLCBDT05URVhUX0JMT0NLX09VVCwgZmFsc2UsIHRydWUpO1xuICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG5cbiAgaWYgKHN0YXRlLmNoZWNrTGluZUJyZWFrcyAmJlxuICAgICAgUEFUVEVSTl9OT05fQVNDSUlfTElORV9CUkVBS1MudGVzdChzdGF0ZS5pbnB1dC5zbGljZShkb2N1bWVudFN0YXJ0LCBzdGF0ZS5wb3NpdGlvbikpKSB7XG4gICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAnbm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50Jyk7XG4gIH1cblxuICBzdGF0ZS5kb2N1bWVudHMucHVzaChzdGF0ZS5yZXN1bHQpO1xuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcblxuICAgIGlmIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgyRS8qIC4gKi8pIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uICs9IDM7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5wb3NpdGlvbiA8IChzdGF0ZS5sZW5ndGggLSAxKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdlbmQgb2YgdGhlIHN0cmVhbSBvciBhIGRvY3VtZW50IHNlcGFyYXRvciBpcyBleHBlY3RlZCcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpIHtcbiAgaW5wdXQgPSBTdHJpbmcoaW5wdXQpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBpZiAoaW5wdXQubGVuZ3RoICE9PSAwKSB7XG5cbiAgICAvLyBBZGQgdGFpbGluZyBgXFxuYCBpZiBub3QgZXhpc3RzXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDB4MEEvKiBMRiAqLyAmJlxuICAgICAgICBpbnB1dC5jaGFyQ29kZUF0KGlucHV0Lmxlbmd0aCAtIDEpICE9PSAweDBELyogQ1IgKi8pIHtcbiAgICAgIGlucHV0ICs9ICdcXG4nO1xuICAgIH1cblxuICAgIC8vIFN0cmlwIEJPTVxuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICAgIGlucHV0ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN0YXRlID0gbmV3IFN0YXRlKGlucHV0LCBvcHRpb25zKTtcblxuICAvLyBVc2UgMCBhcyBzdHJpbmcgdGVybWluYXRvci4gVGhhdCBzaWduaWZpY2FudGx5IHNpbXBsaWZpZXMgYm91bmRzIGNoZWNrLlxuICBzdGF0ZS5pbnB1dCArPSAnXFwwJztcblxuICB3aGlsZSAoc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgPT09IDB4MjAvKiBTcGFjZSAqLykge1xuICAgIHN0YXRlLmxpbmVJbmRlbnQgKz0gMTtcbiAgICBzdGF0ZS5wb3NpdGlvbiArPSAxO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLnBvc2l0aW9uIDwgKHN0YXRlLmxlbmd0aCAtIDEpKSB7XG4gICAgcmVhZERvY3VtZW50KHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZS5kb2N1bWVudHM7XG59XG5cblxuZnVuY3Rpb24gbG9hZEFsbChpbnB1dCwgaXRlcmF0b3IsIG9wdGlvbnMpIHtcbiAgdmFyIGRvY3VtZW50cyA9IGxvYWREb2N1bWVudHMoaW5wdXQsIG9wdGlvbnMpLCBpbmRleCwgbGVuZ3RoO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBkb2N1bWVudHMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGl0ZXJhdG9yKGRvY3VtZW50c1tpbmRleF0pO1xuICB9XG59XG5cblxuZnVuY3Rpb24gbG9hZChpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgZG9jdW1lbnRzID0gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucyk7XG5cbiAgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAvKmVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCovXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChkb2N1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50c1swXTtcbiAgfVxuICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignZXhwZWN0ZWQgYSBzaW5nbGUgZG9jdW1lbnQgaW4gdGhlIHN0cmVhbSwgYnV0IGZvdW5kIG1vcmUnKTtcbn1cblxuXG5mdW5jdGlvbiBzYWZlTG9hZEFsbChpbnB1dCwgb3V0cHV0LCBvcHRpb25zKSB7XG4gIGxvYWRBbGwoaW5wdXQsIG91dHB1dCwgY29tbW9uLmV4dGVuZCh7IHNjaGVtYTogREVGQVVMVF9TQUZFX1NDSEVNQSB9LCBvcHRpb25zKSk7XG59XG5cblxuZnVuY3Rpb24gc2FmZUxvYWQoaW5wdXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxvYWQoaW5wdXQsIGNvbW1vbi5leHRlbmQoeyBzY2hlbWE6IERFRkFVTFRfU0FGRV9TQ0hFTUEgfSwgb3B0aW9ucykpO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzLmxvYWRBbGwgICAgID0gbG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLmxvYWQgICAgICAgID0gbG9hZDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkQWxsID0gc2FmZUxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCAgICA9IHNhZmVMb2FkO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cbmZ1bmN0aW9uIE1hcmsobmFtZSwgYnVmZmVyLCBwb3NpdGlvbiwgbGluZSwgY29sdW1uKSB7XG4gIHRoaXMubmFtZSAgICAgPSBuYW1lO1xuICB0aGlzLmJ1ZmZlciAgID0gYnVmZmVyO1xuICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247XG4gIHRoaXMubGluZSAgICAgPSBsaW5lO1xuICB0aGlzLmNvbHVtbiAgID0gY29sdW1uO1xufVxuXG5cbk1hcmsucHJvdG90eXBlLmdldFNuaXBwZXQgPSBmdW5jdGlvbiBnZXRTbmlwcGV0KGluZGVudCwgbWF4TGVuZ3RoKSB7XG4gIHZhciBoZWFkLCBzdGFydCwgdGFpbCwgZW5kLCBzbmlwcGV0O1xuXG4gIGlmICghdGhpcy5idWZmZXIpIHJldHVybiBudWxsO1xuXG4gIGluZGVudCA9IGluZGVudCB8fCA0O1xuICBtYXhMZW5ndGggPSBtYXhMZW5ndGggfHwgNzU7XG5cbiAgaGVhZCA9ICcnO1xuICBzdGFydCA9IHRoaXMucG9zaXRpb247XG5cbiAgd2hpbGUgKHN0YXJ0ID4gMCAmJiAnXFx4MDBcXHJcXG5cXHg4NVxcdTIwMjhcXHUyMDI5Jy5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChzdGFydCAtIDEpKSA9PT0gLTEpIHtcbiAgICBzdGFydCAtPSAxO1xuICAgIGlmICh0aGlzLnBvc2l0aW9uIC0gc3RhcnQgPiAobWF4TGVuZ3RoIC8gMiAtIDEpKSB7XG4gICAgICBoZWFkID0gJyAuLi4gJztcbiAgICAgIHN0YXJ0ICs9IDU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB0YWlsID0gJyc7XG4gIGVuZCA9IHRoaXMucG9zaXRpb247XG5cbiAgd2hpbGUgKGVuZCA8IHRoaXMuYnVmZmVyLmxlbmd0aCAmJiAnXFx4MDBcXHJcXG5cXHg4NVxcdTIwMjhcXHUyMDI5Jy5pbmRleE9mKHRoaXMuYnVmZmVyLmNoYXJBdChlbmQpKSA9PT0gLTEpIHtcbiAgICBlbmQgKz0gMTtcbiAgICBpZiAoZW5kIC0gdGhpcy5wb3NpdGlvbiA+IChtYXhMZW5ndGggLyAyIC0gMSkpIHtcbiAgICAgIHRhaWwgPSAnIC4uLiAnO1xuICAgICAgZW5kIC09IDU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBzbmlwcGV0ID0gdGhpcy5idWZmZXIuc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgcmV0dXJuIGNvbW1vbi5yZXBlYXQoJyAnLCBpbmRlbnQpICsgaGVhZCArIHNuaXBwZXQgKyB0YWlsICsgJ1xcbicgK1xuICAgICAgICAgY29tbW9uLnJlcGVhdCgnICcsIGluZGVudCArIHRoaXMucG9zaXRpb24gLSBzdGFydCArIGhlYWQubGVuZ3RoKSArICdeJztcbn07XG5cblxuTWFyay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhjb21wYWN0KSB7XG4gIHZhciBzbmlwcGV0LCB3aGVyZSA9ICcnO1xuXG4gIGlmICh0aGlzLm5hbWUpIHtcbiAgICB3aGVyZSArPSAnaW4gXCInICsgdGhpcy5uYW1lICsgJ1wiICc7XG4gIH1cblxuICB3aGVyZSArPSAnYXQgbGluZSAnICsgKHRoaXMubGluZSArIDEpICsgJywgY29sdW1uICcgKyAodGhpcy5jb2x1bW4gKyAxKTtcblxuICBpZiAoIWNvbXBhY3QpIHtcbiAgICBzbmlwcGV0ID0gdGhpcy5nZXRTbmlwcGV0KCk7XG5cbiAgICBpZiAoc25pcHBldCkge1xuICAgICAgd2hlcmUgKz0gJzpcXG4nICsgc25pcHBldDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd2hlcmU7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gTWFyaztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBtYXgtbGVuKi9cblxudmFyIGNvbW1vbiAgICAgICAgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIFlBTUxFeGNlcHRpb24gPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xudmFyIFR5cGUgICAgICAgICAgPSByZXF1aXJlKCcuL3R5cGUnKTtcblxuXG5mdW5jdGlvbiBjb21waWxlTGlzdChzY2hlbWEsIG5hbWUsIHJlc3VsdCkge1xuICB2YXIgZXhjbHVkZSA9IFtdO1xuXG4gIHNjaGVtYS5pbmNsdWRlLmZvckVhY2goZnVuY3Rpb24gKGluY2x1ZGVkU2NoZW1hKSB7XG4gICAgcmVzdWx0ID0gY29tcGlsZUxpc3QoaW5jbHVkZWRTY2hlbWEsIG5hbWUsIHJlc3VsdCk7XG4gIH0pO1xuXG4gIHNjaGVtYVtuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uIChjdXJyZW50VHlwZSkge1xuICAgIHJlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChwcmV2aW91c1R5cGUsIHByZXZpb3VzSW5kZXgpIHtcbiAgICAgIGlmIChwcmV2aW91c1R5cGUudGFnID09PSBjdXJyZW50VHlwZS50YWcpIHtcbiAgICAgICAgZXhjbHVkZS5wdXNoKHByZXZpb3VzSW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVzdWx0LnB1c2goY3VycmVudFR5cGUpO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0LmZpbHRlcihmdW5jdGlvbiAodHlwZSwgaW5kZXgpIHtcbiAgICByZXR1cm4gZXhjbHVkZS5pbmRleE9mKGluZGV4KSA9PT0gLTE7XG4gIH0pO1xufVxuXG5cbmZ1bmN0aW9uIGNvbXBpbGVNYXAoLyogbGlzdHMuLi4gKi8pIHtcbiAgdmFyIHJlc3VsdCA9IHt9LCBpbmRleCwgbGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3RUeXBlKHR5cGUpIHtcbiAgICByZXN1bHRbdHlwZS50YWddID0gdHlwZTtcbiAgfVxuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGFyZ3VtZW50c1tpbmRleF0uZm9yRWFjaChjb2xsZWN0VHlwZSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbmZ1bmN0aW9uIFNjaGVtYShkZWZpbml0aW9uKSB7XG4gIHRoaXMuaW5jbHVkZSAgPSBkZWZpbml0aW9uLmluY2x1ZGUgIHx8IFtdO1xuICB0aGlzLmltcGxpY2l0ID0gZGVmaW5pdGlvbi5pbXBsaWNpdCB8fCBbXTtcbiAgdGhpcy5leHBsaWNpdCA9IGRlZmluaXRpb24uZXhwbGljaXQgfHwgW107XG5cbiAgdGhpcy5pbXBsaWNpdC5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgaWYgKHR5cGUubG9hZEtpbmQgJiYgdHlwZS5sb2FkS2luZCAhPT0gJ3NjYWxhcicpIHtcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdUaGVyZSBpcyBhIG5vbi1zY2FsYXIgdHlwZSBpbiB0aGUgaW1wbGljaXQgbGlzdCBvZiBhIHNjaGVtYS4gSW1wbGljaXQgcmVzb2x2aW5nIG9mIHN1Y2ggdHlwZXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIHRoaXMuY29tcGlsZWRJbXBsaWNpdCA9IGNvbXBpbGVMaXN0KHRoaXMsICdpbXBsaWNpdCcsIFtdKTtcbiAgdGhpcy5jb21waWxlZEV4cGxpY2l0ID0gY29tcGlsZUxpc3QodGhpcywgJ2V4cGxpY2l0JywgW10pO1xuICB0aGlzLmNvbXBpbGVkVHlwZU1hcCAgPSBjb21waWxlTWFwKHRoaXMuY29tcGlsZWRJbXBsaWNpdCwgdGhpcy5jb21waWxlZEV4cGxpY2l0KTtcbn1cblxuXG5TY2hlbWEuREVGQVVMVCA9IG51bGw7XG5cblxuU2NoZW1hLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZVNjaGVtYSgpIHtcbiAgdmFyIHNjaGVtYXMsIHR5cGVzO1xuXG4gIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgIGNhc2UgMTpcbiAgICAgIHNjaGVtYXMgPSBTY2hlbWEuREVGQVVMVDtcbiAgICAgIHR5cGVzID0gYXJndW1lbnRzWzBdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDI6XG4gICAgICBzY2hlbWFzID0gYXJndW1lbnRzWzBdO1xuICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMV07XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgU2NoZW1hLmNyZWF0ZSBmdW5jdGlvbicpO1xuICB9XG5cbiAgc2NoZW1hcyA9IGNvbW1vbi50b0FycmF5KHNjaGVtYXMpO1xuICB0eXBlcyA9IGNvbW1vbi50b0FycmF5KHR5cGVzKTtcblxuICBpZiAoIXNjaGVtYXMuZXZlcnkoZnVuY3Rpb24gKHNjaGVtYSkgeyByZXR1cm4gc2NoZW1hIGluc3RhbmNlb2YgU2NoZW1hOyB9KSkge1xuICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdTcGVjaWZpZWQgbGlzdCBvZiBzdXBlciBzY2hlbWFzIChvciBhIHNpbmdsZSBTY2hlbWEgb2JqZWN0KSBjb250YWlucyBhIG5vbi1TY2hlbWEgb2JqZWN0LicpO1xuICB9XG5cbiAgaWYgKCF0eXBlcy5ldmVyeShmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIFR5cGU7IH0pKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1NwZWNpZmllZCBsaXN0IG9mIFlBTUwgdHlwZXMgKG9yIGEgc2luZ2xlIFR5cGUgb2JqZWN0KSBjb250YWlucyBhIG5vbi1UeXBlIG9iamVjdC4nKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2NoZW1hKHtcbiAgICBpbmNsdWRlOiBzY2hlbWFzLFxuICAgIGV4cGxpY2l0OiB0eXBlc1xuICB9KTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY2hlbWE7XG4iLCIvLyBTdGFuZGFyZCBZQU1MJ3MgQ29yZSBzY2hlbWEuXG4vLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDQ5MjNcbi8vXG4vLyBOT1RFOiBKUy1ZQU1MIGRvZXMgbm90IHN1cHBvcnQgc2NoZW1hLXNwZWNpZmljIHRhZyByZXNvbHV0aW9uIHJlc3RyaWN0aW9ucy5cbi8vIFNvLCBDb3JlIHNjaGVtYSBoYXMgbm8gZGlzdGluY3Rpb25zIGZyb20gSlNPTiBzY2hlbWEgaXMgSlMtWUFNTC5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2pzb24nKVxuICBdXG59KTtcbiIsIi8vIEpTLVlBTUwncyBkZWZhdWx0IHNjaGVtYSBmb3IgYGxvYWRgIGZ1bmN0aW9uLlxuLy8gSXQgaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy9cbi8vIFRoaXMgc2NoZW1hIGlzIGJhc2VkIG9uIEpTLVlBTUwncyBkZWZhdWx0IHNhZmUgc2NoZW1hIGFuZCBpbmNsdWRlc1xuLy8gSmF2YVNjcmlwdC1zcGVjaWZpYyB0eXBlczogISFqcy91bmRlZmluZWQsICEhanMvcmVnZXhwIGFuZCAhIWpzL2Z1bmN0aW9uLlxuLy9cbi8vIEFsc28gdGhpcyBzY2hlbWEgaXMgdXNlZCBhcyBkZWZhdWx0IGJhc2Ugc2NoZW1hIGF0IGBTY2hlbWEuY3JlYXRlYCBmdW5jdGlvbi5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gU2NoZW1hLkRFRkFVTFQgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vZGVmYXVsdF9zYWZlJylcbiAgXSxcbiAgZXhwbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL3VuZGVmaW5lZCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvcmVnZXhwJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy9mdW5jdGlvbicpXG4gIF1cbn0pO1xuIiwiLy8gSlMtWUFNTCdzIGRlZmF1bHQgc2NoZW1hIGZvciBgc2FmZUxvYWRgIGZ1bmN0aW9uLlxuLy8gSXQgaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy9cbi8vIFRoaXMgc2NoZW1hIGlzIGJhc2VkIG9uIHN0YW5kYXJkIFlBTUwncyBDb3JlIHNjaGVtYSBhbmQgaW5jbHVkZXMgbW9zdCBvZlxuLy8gZXh0cmEgdHlwZXMgZGVzY3JpYmVkIGF0IFlBTUwgdGFnIHJlcG9zaXRvcnkuIChodHRwOi8veWFtbC5vcmcvdHlwZS8pXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9jb3JlJylcbiAgXSxcbiAgaW1wbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL3RpbWVzdGFtcCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvbWVyZ2UnKVxuICBdLFxuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvYmluYXJ5JyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9vbWFwJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9wYWlycycpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvc2V0JylcbiAgXVxufSk7XG4iLCIvLyBTdGFuZGFyZCBZQU1MJ3MgRmFpbHNhZmUgc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODAyMzQ2XG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvc3RyJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9zZXEnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL21hcCcpXG4gIF1cbn0pO1xuIiwiLy8gU3RhbmRhcmQgWUFNTCdzIEpTT04gc2NoZW1hLlxuLy8gaHR0cDovL3d3dy55YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODAzMjMxXG4vL1xuLy8gTk9URTogSlMtWUFNTCBkb2VzIG5vdCBzdXBwb3J0IHNjaGVtYS1zcGVjaWZpYyB0YWcgcmVzb2x1dGlvbiByZXN0cmljdGlvbnMuXG4vLyBTbywgdGhpcyBzY2hlbWEgaXMgbm90IHN1Y2ggc3RyaWN0IGFzIGRlZmluZWQgaW4gdGhlIFlBTUwgc3BlY2lmaWNhdGlvbi5cbi8vIEl0IGFsbG93cyBudW1iZXJzIGluIGJpbmFyeSBub3RhaW9uLCB1c2UgYE51bGxgIGFuZCBgTlVMTGAgYXMgYG51bGxgLCBldGMuXG5cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBTY2hlbWEgPSByZXF1aXJlKCcuLi9zY2hlbWEnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9mYWlsc2FmZScpXG4gIF0sXG4gIGltcGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9udWxsJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9ib29sJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9pbnQnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2Zsb2F0JylcbiAgXVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBZQU1MRXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcblxudmFyIFRZUEVfQ09OU1RSVUNUT1JfT1BUSU9OUyA9IFtcbiAgJ2tpbmQnLFxuICAncmVzb2x2ZScsXG4gICdjb25zdHJ1Y3QnLFxuICAnaW5zdGFuY2VPZicsXG4gICdwcmVkaWNhdGUnLFxuICAncmVwcmVzZW50JyxcbiAgJ2RlZmF1bHRTdHlsZScsXG4gICdzdHlsZUFsaWFzZXMnXG5dO1xuXG52YXIgWUFNTF9OT0RFX0tJTkRTID0gW1xuICAnc2NhbGFyJyxcbiAgJ3NlcXVlbmNlJyxcbiAgJ21hcHBpbmcnXG5dO1xuXG5mdW5jdGlvbiBjb21waWxlU3R5bGVBbGlhc2VzKG1hcCkge1xuICB2YXIgcmVzdWx0ID0ge307XG5cbiAgaWYgKG1hcCAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgIG1hcFtzdHlsZV0uZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgcmVzdWx0W1N0cmluZyhhbGlhcyldID0gc3R5bGU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIFR5cGUodGFnLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoVFlQRV9DT05TVFJVQ1RPUl9PUFRJT05TLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVW5rbm93biBvcHRpb24gXCInICsgbmFtZSArICdcIiBpcyBtZXQgaW4gZGVmaW5pdGlvbiBvZiBcIicgKyB0YWcgKyAnXCIgWUFNTCB0eXBlLicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gVE9ETzogQWRkIHRhZyBmb3JtYXQgY2hlY2suXG4gIHRoaXMudGFnICAgICAgICAgID0gdGFnO1xuICB0aGlzLmtpbmQgICAgICAgICA9IG9wdGlvbnNbJ2tpbmQnXSAgICAgICAgIHx8IG51bGw7XG4gIHRoaXMucmVzb2x2ZSAgICAgID0gb3B0aW9uc1sncmVzb2x2ZSddICAgICAgfHwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgdGhpcy5jb25zdHJ1Y3QgICAgPSBvcHRpb25zWydjb25zdHJ1Y3QnXSAgICB8fCBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YTsgfTtcbiAgdGhpcy5pbnN0YW5jZU9mICAgPSBvcHRpb25zWydpbnN0YW5jZU9mJ10gICB8fCBudWxsO1xuICB0aGlzLnByZWRpY2F0ZSAgICA9IG9wdGlvbnNbJ3ByZWRpY2F0ZSddICAgIHx8IG51bGw7XG4gIHRoaXMucmVwcmVzZW50ICAgID0gb3B0aW9uc1sncmVwcmVzZW50J10gICAgfHwgbnVsbDtcbiAgdGhpcy5kZWZhdWx0U3R5bGUgPSBvcHRpb25zWydkZWZhdWx0U3R5bGUnXSB8fCBudWxsO1xuICB0aGlzLnN0eWxlQWxpYXNlcyA9IGNvbXBpbGVTdHlsZUFsaWFzZXMob3B0aW9uc1snc3R5bGVBbGlhc2VzJ10gfHwgbnVsbCk7XG5cbiAgaWYgKFlBTUxfTk9ERV9LSU5EUy5pbmRleE9mKHRoaXMua2luZCkgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1Vua25vd24ga2luZCBcIicgKyB0aGlzLmtpbmQgKyAnXCIgaXMgc3BlY2lmaWVkIGZvciBcIicgKyB0YWcgKyAnXCIgWUFNTCB0eXBlLicpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVHlwZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlKi9cblxuLy8gQSB0cmljayBmb3IgYnJvd3NlcmlmaWVkIHZlcnNpb24uXG4vLyBTaW5jZSB3ZSBtYWtlIGJyb3dzZXJpZmllciB0byBpZ25vcmUgYGJ1ZmZlcmAgbW9kdWxlLCBOb2RlQnVmZmVyIHdpbGwgYmUgdW5kZWZpbmVkXG52YXIgTm9kZUJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbnZhciBUeXBlICAgICAgID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5cbi8vIFsgNjQsIDY1LCA2NiBdIC0+IFsgcGFkZGluZywgQ1IsIExGIF1cbnZhciBCQVNFNjRfTUFQID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XFxuXFxyJztcblxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEJpbmFyeShkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGNvZGUsIGlkeCwgYml0bGVuID0gMCwgbWF4ID0gZGF0YS5sZW5ndGgsIG1hcCA9IEJBU0U2NF9NQVA7XG5cbiAgLy8gQ29udmVydCBvbmUgYnkgb25lLlxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBjb2RlID0gbWFwLmluZGV4T2YoZGF0YS5jaGFyQXQoaWR4KSk7XG5cbiAgICAvLyBTa2lwIENSL0xGXG4gICAgaWYgKGNvZGUgPiA2NCkgY29udGludWU7XG5cbiAgICAvLyBGYWlsIG9uIGlsbGVnYWwgY2hhcmFjdGVyc1xuICAgIGlmIChjb2RlIDwgMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYml0bGVuICs9IDY7XG4gIH1cblxuICAvLyBJZiB0aGVyZSBhcmUgYW55IGJpdHMgbGVmdCwgc291cmNlIHdhcyBjb3JydXB0ZWRcbiAgcmV0dXJuIChiaXRsZW4gJSA4KSA9PT0gMDtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEJpbmFyeShkYXRhKSB7XG4gIHZhciBpZHgsIHRhaWxiaXRzLFxuICAgICAgaW5wdXQgPSBkYXRhLnJlcGxhY2UoL1tcXHJcXG49XS9nLCAnJyksIC8vIHJlbW92ZSBDUi9MRiAmIHBhZGRpbmcgdG8gc2ltcGxpZnkgc2NhblxuICAgICAgbWF4ID0gaW5wdXQubGVuZ3RoLFxuICAgICAgbWFwID0gQkFTRTY0X01BUCxcbiAgICAgIGJpdHMgPSAwLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgLy8gQ29sbGVjdCBieSA2KjQgYml0cyAoMyBieXRlcylcblxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDQgPT09IDApICYmIGlkeCkge1xuICAgICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gMTYpICYgMHhGRik7XG4gICAgICByZXN1bHQucHVzaCgoYml0cyA+PiA4KSAmIDB4RkYpO1xuICAgICAgcmVzdWx0LnB1c2goYml0cyAmIDB4RkYpO1xuICAgIH1cblxuICAgIGJpdHMgPSAoYml0cyA8PCA2KSB8IG1hcC5pbmRleE9mKGlucHV0LmNoYXJBdChpZHgpKTtcbiAgfVxuXG4gIC8vIER1bXAgdGFpbFxuXG4gIHRhaWxiaXRzID0gKG1heCAlIDQpICogNjtcblxuICBpZiAodGFpbGJpdHMgPT09IDApIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxNikgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiA4KSAmIDB4RkYpO1xuICAgIHJlc3VsdC5wdXNoKGJpdHMgJiAweEZGKTtcbiAgfSBlbHNlIGlmICh0YWlsYml0cyA9PT0gMTgpIHtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxMCkgJiAweEZGKTtcbiAgICByZXN1bHQucHVzaCgoYml0cyA+PiAyKSAmIDB4RkYpO1xuICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxMikge1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDQpICYgMHhGRik7XG4gIH1cblxuICAvLyBXcmFwIGludG8gQnVmZmVyIGZvciBOb2RlSlMgYW5kIGxlYXZlIEFycmF5IGZvciBicm93c2VyXG4gIGlmIChOb2RlQnVmZmVyKSByZXR1cm4gbmV3IE5vZGVCdWZmZXIocmVzdWx0KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sQmluYXJ5KG9iamVjdCAvKiwgc3R5bGUqLykge1xuICB2YXIgcmVzdWx0ID0gJycsIGJpdHMgPSAwLCBpZHgsIHRhaWwsXG4gICAgICBtYXggPSBvYmplY3QubGVuZ3RoLFxuICAgICAgbWFwID0gQkFTRTY0X01BUDtcblxuICAvLyBDb252ZXJ0IGV2ZXJ5IHRocmVlIGJ5dGVzIHRvIDQgQVNDSUkgY2hhcmFjdGVycy5cblxuICBmb3IgKGlkeCA9IDA7IGlkeCA8IG1heDsgaWR4KyspIHtcbiAgICBpZiAoKGlkeCAlIDMgPT09IDApICYmIGlkeCkge1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTIpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDYpICYgMHgzRl07XG4gICAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgICB9XG5cbiAgICBiaXRzID0gKGJpdHMgPDwgOCkgKyBvYmplY3RbaWR4XTtcbiAgfVxuXG4gIC8vIER1bXAgdGFpbFxuXG4gIHRhaWwgPSBtYXggJSAzO1xuXG4gIGlmICh0YWlsID09PSAwKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxOCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwW2JpdHMgJiAweDNGXTtcbiAgfSBlbHNlIGlmICh0YWlsID09PSAyKSB7XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDQpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCAyKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9IGVsc2UgaWYgKHRhaWwgPT09IDEpIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA8PCA0KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICAgIHJlc3VsdCArPSBtYXBbNjRdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNCaW5hcnkob2JqZWN0KSB7XG4gIHJldHVybiBOb2RlQnVmZmVyICYmIE5vZGVCdWZmZXIuaXNCdWZmZXIob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxCaW5hcnksXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEJpbmFyeSxcbiAgcHJlZGljYXRlOiBpc0JpbmFyeSxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRZYW1sQmluYXJ5XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sQm9vbGVhbihkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoO1xuXG4gIHJldHVybiAobWF4ID09PSA0ICYmIChkYXRhID09PSAndHJ1ZScgfHwgZGF0YSA9PT0gJ1RydWUnIHx8IGRhdGEgPT09ICdUUlVFJykpIHx8XG4gICAgICAgICAobWF4ID09PSA1ICYmIChkYXRhID09PSAnZmFsc2UnIHx8IGRhdGEgPT09ICdGYWxzZScgfHwgZGF0YSA9PT0gJ0ZBTFNFJykpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sQm9vbGVhbihkYXRhKSB7XG4gIHJldHVybiBkYXRhID09PSAndHJ1ZScgfHxcbiAgICAgICAgIGRhdGEgPT09ICdUcnVlJyB8fFxuICAgICAgICAgZGF0YSA9PT0gJ1RSVUUnO1xufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4ob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgQm9vbGVhbl0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpib29sJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxCb29sZWFuLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxCb29sZWFuLFxuICBwcmVkaWNhdGU6IGlzQm9vbGVhbixcbiAgcmVwcmVzZW50OiB7XG4gICAgbG93ZXJjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAndHJ1ZScgOiAnZmFsc2UnOyB9LFxuICAgIHVwcGVyY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ1RSVUUnIDogJ0ZBTFNFJzsgfSxcbiAgICBjYW1lbGNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICdUcnVlJyA6ICdGYWxzZSc7IH1cbiAgfSxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBUeXBlICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBZQU1MX0ZMT0FUX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFxuICAnXig/OlstK10/KD86WzAtOV1bMC05X10qKVxcXFwuWzAtOV9dKig/OltlRV1bLStdWzAtOV0rKT8nICtcbiAgJ3xcXFxcLlswLTlfXSsoPzpbZUVdWy0rXVswLTldKyk/JyArXG4gICd8Wy0rXT9bMC05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pK1xcXFwuWzAtOV9dKicgK1xuICAnfFstK10/XFxcXC4oPzppbmZ8SW5mfElORiknICtcbiAgJ3xcXFxcLig/Om5hbnxOYU58TkFOKSkkJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sRmxvYXQoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICghWUFNTF9GTE9BVF9QQVRURVJOLnRlc3QoZGF0YSkpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbEZsb2F0KGRhdGEpIHtcbiAgdmFyIHZhbHVlLCBzaWduLCBiYXNlLCBkaWdpdHM7XG5cbiAgdmFsdWUgID0gZGF0YS5yZXBsYWNlKC9fL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICBzaWduICAgPSB2YWx1ZVswXSA9PT0gJy0nID8gLTEgOiAxO1xuICBkaWdpdHMgPSBbXTtcblxuICBpZiAoJystJy5pbmRleE9mKHZhbHVlWzBdKSA+PSAwKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJy5pbmYnKSB7XG4gICAgcmV0dXJuIChzaWduID09PSAxKSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICB9IGVsc2UgaWYgKHZhbHVlID09PSAnLm5hbicpIHtcbiAgICByZXR1cm4gTmFOO1xuXG4gIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignOicpID49IDApIHtcbiAgICB2YWx1ZS5zcGxpdCgnOicpLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgIGRpZ2l0cy51bnNoaWZ0KHBhcnNlRmxvYXQodiwgMTApKTtcbiAgICB9KTtcblxuICAgIHZhbHVlID0gMC4wO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IGQgKiBiYXNlO1xuICAgICAgYmFzZSAqPSA2MDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaWduICogdmFsdWU7XG5cbiAgfVxuICByZXR1cm4gc2lnbiAqIHBhcnNlRmxvYXQodmFsdWUsIDEwKTtcbn1cblxuXG52YXIgU0NJRU5USUZJQ19XSVRIT1VUX0RPVCA9IC9eWy0rXT9bMC05XStlLztcblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbEZsb2F0KG9iamVjdCwgc3R5bGUpIHtcbiAgdmFyIHJlcztcblxuICBpZiAoaXNOYU4ob2JqZWN0KSkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLm5hbic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy5OQU4nO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICcuTmFOJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZID09PSBvYmplY3QpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy5pbmYnO1xuICAgICAgY2FzZSAndXBwZXJjYXNlJzogcmV0dXJuICcuSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLkluZic7XG4gICAgfVxuICB9IGVsc2UgaWYgKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA9PT0gb2JqZWN0KSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICctLmluZic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy0uSU5GJztcbiAgICAgIGNhc2UgJ2NhbWVsY2FzZSc6IHJldHVybiAnLS5JbmYnO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb21tb24uaXNOZWdhdGl2ZVplcm8ob2JqZWN0KSkge1xuICAgIHJldHVybiAnLTAuMCc7XG4gIH1cblxuICByZXMgPSBvYmplY3QudG9TdHJpbmcoMTApO1xuXG4gIC8vIEpTIHN0cmluZ2lmaWVyIGNhbiBidWlsZCBzY2llbnRpZmljIGZvcm1hdCB3aXRob3V0IGRvdHM6IDVlLTEwMCxcbiAgLy8gd2hpbGUgWUFNTCByZXF1cmVzIGRvdDogNS5lLTEwMC4gRml4IGl0IHdpdGggc2ltcGxlIGhhY2tcblxuICByZXR1cm4gU0NJRU5USUZJQ19XSVRIT1VUX0RPVC50ZXN0KHJlcykgPyByZXMucmVwbGFjZSgnZScsICcuZScpIDogcmVzO1xufVxuXG5mdW5jdGlvbiBpc0Zsb2F0KG9iamVjdCkge1xuICByZXR1cm4gKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBOdW1iZXJdJykgJiZcbiAgICAgICAgIChvYmplY3QgJSAxICE9PSAwIHx8IGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEZsb2F0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxGbG9hdCxcbiAgcHJlZGljYXRlOiBpc0Zsb2F0LFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxGbG9hdCxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBUeXBlICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIGlzSGV4Q29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSkgfHxcbiAgICAgICAgICgoMHg0MS8qIEEgKi8gPD0gYykgJiYgKGMgPD0gMHg0Ni8qIEYgKi8pKSB8fFxuICAgICAgICAgKCgweDYxLyogYSAqLyA8PSBjKSAmJiAoYyA8PSAweDY2LyogZiAqLykpO1xufVxuXG5mdW5jdGlvbiBpc09jdENvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM3LyogNyAqLykpO1xufVxuXG5mdW5jdGlvbiBpc0RlY0NvZGUoYykge1xuICByZXR1cm4gKCgweDMwLyogMCAqLyA8PSBjKSAmJiAoYyA8PSAweDM5LyogOSAqLykpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbEludGVnZXIoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGluZGV4ID0gMCxcbiAgICAgIGhhc0RpZ2l0cyA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKCFtYXgpIHJldHVybiBmYWxzZTtcblxuICBjaCA9IGRhdGFbaW5kZXhdO1xuXG4gIC8vIHNpZ25cbiAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykge1xuICAgIGNoID0gZGF0YVsrK2luZGV4XTtcbiAgfVxuXG4gIGlmIChjaCA9PT0gJzAnKSB7XG4gICAgLy8gMFxuICAgIGlmIChpbmRleCArIDEgPT09IG1heCkgcmV0dXJuIHRydWU7XG4gICAgY2ggPSBkYXRhWysraW5kZXhdO1xuXG4gICAgLy8gYmFzZSAyLCBiYXNlIDgsIGJhc2UgMTZcblxuICAgIGlmIChjaCA9PT0gJ2InKSB7XG4gICAgICAvLyBiYXNlIDJcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICAgIGlmIChjaCAhPT0gJzAnICYmIGNoICE9PSAnMScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNEaWdpdHM7XG4gICAgfVxuXG5cbiAgICBpZiAoY2ggPT09ICd4Jykge1xuICAgICAgLy8gYmFzZSAxNlxuICAgICAgaW5kZXgrKztcblxuICAgICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFpc0hleENvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNEaWdpdHM7XG4gICAgfVxuXG4gICAgLy8gYmFzZSA4XG4gICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICBjaCA9IGRhdGFbaW5kZXhdO1xuICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc09jdENvZGUoZGF0YS5jaGFyQ29kZUF0KGluZGV4KSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNEaWdpdHM7XG4gIH1cblxuICAvLyBiYXNlIDEwIChleGNlcHQgMCkgb3IgYmFzZSA2MFxuXG4gIGZvciAoOyBpbmRleCA8IG1heDsgaW5kZXgrKykge1xuICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgIGlmIChjaCA9PT0gJzonKSBicmVhaztcbiAgICBpZiAoIWlzRGVjQ29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICB9XG5cbiAgaWYgKCFoYXNEaWdpdHMpIHJldHVybiBmYWxzZTtcblxuICAvLyBpZiAhYmFzZTYwIC0gZG9uZTtcbiAgaWYgKGNoICE9PSAnOicpIHJldHVybiB0cnVlO1xuXG4gIC8vIGJhc2U2MCBhbG1vc3Qgbm90IHVzZWQsIG5vIG5lZWRzIHRvIG9wdGltaXplXG4gIHJldHVybiAvXig6WzAtNV0/WzAtOV0pKyQvLnRlc3QoZGF0YS5zbGljZShpbmRleCkpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sSW50ZWdlcihkYXRhKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGEsIHNpZ24gPSAxLCBjaCwgYmFzZSwgZGlnaXRzID0gW107XG5cbiAgaWYgKHZhbHVlLmluZGV4T2YoJ18nKSAhPT0gLTEpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL18vZywgJycpO1xuICB9XG5cbiAgY2ggPSB2YWx1ZVswXTtcblxuICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7XG4gICAgaWYgKGNoID09PSAnLScpIHNpZ24gPSAtMTtcbiAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICAgIGNoID0gdmFsdWVbMF07XG4gIH1cblxuICBpZiAodmFsdWUgPT09ICcwJykgcmV0dXJuIDA7XG5cbiAgaWYgKGNoID09PSAnMCcpIHtcbiAgICBpZiAodmFsdWVbMV0gPT09ICdiJykgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgMik7XG4gICAgaWYgKHZhbHVlWzFdID09PSAneCcpIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDE2KTtcbiAgICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCA4KTtcbiAgfVxuXG4gIGlmICh2YWx1ZS5pbmRleE9mKCc6JykgIT09IC0xKSB7XG4gICAgdmFsdWUuc3BsaXQoJzonKS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgICBkaWdpdHMudW5zaGlmdChwYXJzZUludCh2LCAxMCkpO1xuICAgIH0pO1xuXG4gICAgdmFsdWUgPSAwO1xuICAgIGJhc2UgPSAxO1xuXG4gICAgZGlnaXRzLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgIHZhbHVlICs9IChkICogYmFzZSk7XG4gICAgICBiYXNlICo9IDYwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpZ24gKiB2YWx1ZTtcblxuICB9XG5cbiAgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgMTApO1xufVxuXG5mdW5jdGlvbiBpc0ludGVnZXIob2JqZWN0KSB7XG4gIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJlxuICAgICAgICAgKG9iamVjdCAlIDEgPT09IDAgJiYgIWNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6aW50Jywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxJbnRlZ2VyLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxJbnRlZ2VyLFxuICBwcmVkaWNhdGU6IGlzSW50ZWdlcixcbiAgcmVwcmVzZW50OiB7XG4gICAgYmluYXJ5OiAgICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICcwYicgKyBvYmplY3QudG9TdHJpbmcoMik7IH0sXG4gICAgb2N0YWw6ICAgICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICcwJyAgKyBvYmplY3QudG9TdHJpbmcoOCk7IH0sXG4gICAgZGVjaW1hbDogICAgIGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICAgICAgICBvYmplY3QudG9TdHJpbmcoMTApOyB9LFxuICAgIGhleGFkZWNpbWFsOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiAnMHgnICsgb2JqZWN0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2RlY2ltYWwnLFxuICBzdHlsZUFsaWFzZXM6IHtcbiAgICBiaW5hcnk6ICAgICAgWyAyLCAgJ2JpbicgXSxcbiAgICBvY3RhbDogICAgICAgWyA4LCAgJ29jdCcgXSxcbiAgICBkZWNpbWFsOiAgICAgWyAxMCwgJ2RlYycgXSxcbiAgICBoZXhhZGVjaW1hbDogWyAxNiwgJ2hleCcgXVxuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGVzcHJpbWE7XG5cbi8vIEJyb3dzZXJpZmllZCB2ZXJzaW9uIGRvZXMgbm90IGhhdmUgZXNwcmltYVxuLy9cbi8vIDEuIEZvciBub2RlLmpzIGp1c3QgcmVxdWlyZSBtb2R1bGUgYXMgZGVwc1xuLy8gMi4gRm9yIGJyb3dzZXIgdHJ5IHRvIHJlcXVpcmUgbXVkdWxlIHZpYSBleHRlcm5hbCBBTUQgc3lzdGVtLlxuLy8gICAgSWYgbm90IGZvdW5kIC0gdHJ5IHRvIGZhbGxiYWNrIHRvIHdpbmRvdy5lc3ByaW1hLiBJZiBub3Rcbi8vICAgIGZvdW5kIHRvbyAtIHRoZW4gZmFpbCB0byBwYXJzZS5cbi8vXG50cnkge1xuICAvLyB3b3JrYXJvdW5kIHRvIGV4Y2x1ZGUgcGFja2FnZSBmcm9tIGJyb3dzZXJpZnkgbGlzdC5cbiAgdmFyIF9yZXF1aXJlID0gcmVxdWlyZTtcbiAgZXNwcmltYSA9IF9yZXF1aXJlKCdlc3ByaW1hJyk7XG59IGNhdGNoIChfKSB7XG4gIC8qZ2xvYmFsIHdpbmRvdyAqL1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIGVzcHJpbWEgPSB3aW5kb3cuZXNwcmltYTtcbn1cblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24oZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgdmFyIHNvdXJjZSA9ICcoJyArIGRhdGEgKyAnKScsXG4gICAgICAgIGFzdCAgICA9IGVzcHJpbWEucGFyc2Uoc291cmNlLCB7IHJhbmdlOiB0cnVlIH0pO1xuXG4gICAgaWYgKGFzdC50eXBlICAgICAgICAgICAgICAgICAgICAhPT0gJ1Byb2dyYW0nICAgICAgICAgICAgIHx8XG4gICAgICAgIGFzdC5ib2R5Lmxlbmd0aCAgICAgICAgICAgICAhPT0gMSAgICAgICAgICAgICAgICAgICAgIHx8XG4gICAgICAgIGFzdC5ib2R5WzBdLnR5cGUgICAgICAgICAgICAhPT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnIHx8XG4gICAgICAgIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZSAhPT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRGdW5jdGlvbihkYXRhKSB7XG4gIC8qanNsaW50IGV2aWw6dHJ1ZSovXG5cbiAgdmFyIHNvdXJjZSA9ICcoJyArIGRhdGEgKyAnKScsXG4gICAgICBhc3QgICAgPSBlc3ByaW1hLnBhcnNlKHNvdXJjZSwgeyByYW5nZTogdHJ1ZSB9KSxcbiAgICAgIHBhcmFtcyA9IFtdLFxuICAgICAgYm9keTtcblxuICBpZiAoYXN0LnR5cGUgICAgICAgICAgICAgICAgICAgICE9PSAnUHJvZ3JhbScgICAgICAgICAgICAgfHxcbiAgICAgIGFzdC5ib2R5Lmxlbmd0aCAgICAgICAgICAgICAhPT0gMSAgICAgICAgICAgICAgICAgICAgIHx8XG4gICAgICBhc3QuYm9keVswXS50eXBlICAgICAgICAgICAgIT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyB8fFxuICAgICAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAnRnVuY3Rpb25FeHByZXNzaW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlc29sdmUgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGFzdC5ib2R5WzBdLmV4cHJlc3Npb24ucGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgcGFyYW1zLnB1c2gocGFyYW0ubmFtZSk7XG4gIH0pO1xuXG4gIGJvZHkgPSBhc3QuYm9keVswXS5leHByZXNzaW9uLmJvZHkucmFuZ2U7XG5cbiAgLy8gRXNwcmltYSdzIHJhbmdlcyBpbmNsdWRlIHRoZSBmaXJzdCAneycgYW5kIHRoZSBsYXN0ICd9JyBjaGFyYWN0ZXJzIG9uXG4gIC8vIGZ1bmN0aW9uIGV4cHJlc3Npb25zLiBTbyBjdXQgdGhlbSBvdXQuXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tbmV3LWZ1bmMqL1xuICByZXR1cm4gbmV3IEZ1bmN0aW9uKHBhcmFtcywgc291cmNlLnNsaWNlKGJvZHlbMF0gKyAxLCBib2R5WzFdIC0gMSkpO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRKYXZhc2NyaXB0RnVuY3Rpb24ob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbihvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy9mdW5jdGlvbicsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0RnVuY3Rpb24sXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdEZ1bmN0aW9uLFxuICBwcmVkaWNhdGU6IGlzRnVuY3Rpb24sXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdEZ1bmN0aW9uXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi8uLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIHJlZ2V4cCA9IGRhdGEsXG4gICAgICB0YWlsICAgPSAvXFwvKFtnaW1dKikkLy5leGVjKGRhdGEpLFxuICAgICAgbW9kaWZpZXJzID0gJyc7XG5cbiAgLy8gaWYgcmVnZXhwIHN0YXJ0cyB3aXRoICcvJyBpdCBjYW4gaGF2ZSBtb2RpZmllcnMgYW5kIG11c3QgYmUgcHJvcGVybHkgY2xvc2VkXG4gIC8vIGAvZm9vL2dpbWAgLSBtb2RpZmllcnMgdGFpbCBjYW4gYmUgbWF4aW11bSAzIGNoYXJzXG4gIGlmIChyZWdleHBbMF0gPT09ICcvJykge1xuICAgIGlmICh0YWlsKSBtb2RpZmllcnMgPSB0YWlsWzFdO1xuXG4gICAgaWYgKG1vZGlmaWVycy5sZW5ndGggPiAzKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gaWYgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCAvLCBpcyBzaG91bGQgYmUgcHJvcGVybHkgdGVybWluYXRlZFxuICAgIGlmIChyZWdleHBbcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxXSAhPT0gJy8nKSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdFJlZ0V4cChkYXRhKSB7XG4gIHZhciByZWdleHAgPSBkYXRhLFxuICAgICAgdGFpbCAgID0gL1xcLyhbZ2ltXSopJC8uZXhlYyhkYXRhKSxcbiAgICAgIG1vZGlmaWVycyA9ICcnO1xuXG4gIC8vIGAvZm9vL2dpbWAgLSB0YWlsIGNhbiBiZSBtYXhpbXVtIDQgY2hhcnNcbiAgaWYgKHJlZ2V4cFswXSA9PT0gJy8nKSB7XG4gICAgaWYgKHRhaWwpIG1vZGlmaWVycyA9IHRhaWxbMV07XG4gICAgcmVnZXhwID0gcmVnZXhwLnNsaWNlKDEsIHJlZ2V4cC5sZW5ndGggLSBtb2RpZmllcnMubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleHAsIG1vZGlmaWVycyk7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRSZWdFeHAob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHZhciByZXN1bHQgPSAnLycgKyBvYmplY3Quc291cmNlICsgJy8nO1xuXG4gIGlmIChvYmplY3QuZ2xvYmFsKSByZXN1bHQgKz0gJ2cnO1xuICBpZiAob2JqZWN0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJztcbiAgaWYgKG9iamVjdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy9yZWdleHAnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdFJlZ0V4cCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwLFxuICBwcmVkaWNhdGU6IGlzUmVnRXhwLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRSZWdFeHBcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkKCkge1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCovXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAndW5kZWZpbmVkJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6anMvdW5kZWZpbmVkJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRVbmRlZmluZWQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0SmF2YXNjcmlwdFVuZGVmaW5lZCxcbiAgcHJlZGljYXRlOiBpc1VuZGVmaW5lZCxcbiAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0VW5kZWZpbmVkXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCcsIHtcbiAga2luZDogJ21hcHBpbmcnLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9OyB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sTWVyZ2UoZGF0YSkge1xuICByZXR1cm4gZGF0YSA9PT0gJzw8JyB8fCBkYXRhID09PSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjptZXJnZScsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sTWVyZ2Vcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxOdWxsKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBtYXggPSBkYXRhLmxlbmd0aDtcblxuICByZXR1cm4gKG1heCA9PT0gMSAmJiBkYXRhID09PSAnficpIHx8XG4gICAgICAgICAobWF4ID09PSA0ICYmIChkYXRhID09PSAnbnVsbCcgfHwgZGF0YSA9PT0gJ051bGwnIHx8IGRhdGEgPT09ICdOVUxMJykpO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sTnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzTnVsbChvYmplY3QpIHtcbiAgcmV0dXJuIG9iamVjdCA9PT0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6bnVsbCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sTnVsbCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sTnVsbCxcbiAgcHJlZGljYXRlOiBpc051bGwsXG4gIHJlcHJlc2VudDoge1xuICAgIGNhbm9uaWNhbDogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ34nOyAgICB9LFxuICAgIGxvd2VyY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ251bGwnOyB9LFxuICAgIHVwcGVyY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ05VTEwnOyB9LFxuICAgIGNhbWVsY2FzZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ051bGwnOyB9XG4gIH0sXG4gIGRlZmF1bHRTdHlsZTogJ2xvd2VyY2FzZSdcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX3RvU3RyaW5nICAgICAgID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxPbWFwKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBvYmplY3RLZXlzID0gW10sIGluZGV4LCBsZW5ndGgsIHBhaXIsIHBhaXJLZXksIHBhaXJIYXNLZXksXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHBhaXIgPSBvYmplY3RbaW5kZXhdO1xuICAgIHBhaXJIYXNLZXkgPSBmYWxzZTtcblxuICAgIGlmIChfdG9TdHJpbmcuY2FsbChwYWlyKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAocGFpcktleSBpbiBwYWlyKSB7XG4gICAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwocGFpciwgcGFpcktleSkpIHtcbiAgICAgICAgaWYgKCFwYWlySGFzS2V5KSBwYWlySGFzS2V5ID0gdHJ1ZTtcbiAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFwYWlySGFzS2V5KSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAob2JqZWN0S2V5cy5pbmRleE9mKHBhaXJLZXkpID09PSAtMSkgb2JqZWN0S2V5cy5wdXNoKHBhaXJLZXkpO1xuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxPbWFwKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sT21hcCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sT21hcFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxQYWlycyhkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcblxuICB2YXIgaW5kZXgsIGxlbmd0aCwgcGFpciwga2V5cywgcmVzdWx0LFxuICAgICAgb2JqZWN0ID0gZGF0YTtcblxuICByZXN1bHQgPSBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCk7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG5cbiAgICBpZiAoX3RvU3RyaW5nLmNhbGwocGFpcikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSByZXR1cm4gZmFsc2U7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMocGFpcik7XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggIT09IDEpIHJldHVybiBmYWxzZTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sUGFpcnMoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuXG4gIHZhciBpbmRleCwgbGVuZ3RoLCBwYWlyLCBrZXlzLCByZXN1bHQsXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIHJlc3VsdCA9IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhwYWlyKTtcblxuICAgIHJlc3VsdFtpbmRleF0gPSBbIGtleXNbMF0sIHBhaXJba2V5c1swXV0gXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJywge1xuICBraW5kOiAnc2VxdWVuY2UnLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFBhaXJzLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxQYWlyc1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzZXEnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDogW107IH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sU2V0KGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBrZXksIG9iamVjdCA9IGRhdGE7XG5cbiAgZm9yIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgaWYgKG9iamVjdFtrZXldICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxTZXQoZGF0YSkge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c2V0Jywge1xuICBraW5kOiAnbWFwcGluZycsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sU2V0LFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxTZXRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6c3RyJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiAnJzsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgWUFNTF9USU1FU1RBTVBfUkVHRVhQID0gbmV3IFJlZ0V4cChcbiAgJ14oWzAtOV1bMC05XVswLTldWzAtOV0pJyAgICAgICAgICArIC8vIFsxXSB5ZWFyXG4gICctKFswLTldWzAtOV0/KScgICAgICAgICAgICAgICAgICAgKyAvLyBbMl0gbW9udGhcbiAgJy0oWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICArIC8vIFszXSBkYXlcbiAgJyg/Oig/OltUdF18WyBcXFxcdF0rKScgICAgICAgICAgICAgICsgLy8gLi4uXG4gICcoWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNF0gaG91clxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzVdIG1pbnV0ZVxuICAnOihbMC05XVswLTldKScgICAgICAgICAgICAgICAgICAgICsgLy8gWzZdIHNlY29uZFxuICAnKD86XFxcXC4oWzAtOV0qKSk/JyAgICAgICAgICAgICAgICAgKyAvLyBbN10gZnJhY3Rpb25cbiAgJyg/OlsgXFxcXHRdKihafChbLStdKShbMC05XVswLTldPyknICsgLy8gWzhdIHR6IFs5XSB0el9zaWduIFsxMF0gdHpfaG91clxuICAnKD86OihbMC05XVswLTldKSk/KSk/KT8kJyk7ICAgICAgICAgLy8gWzExXSB0el9taW51dGVcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoWUFNTF9USU1FU1RBTVBfUkVHRVhQLmV4ZWMoZGF0YSkgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxUaW1lc3RhbXAoZGF0YSkge1xuICB2YXIgbWF0Y2gsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbiA9IDAsXG4gICAgICBkZWx0YSA9IG51bGwsIHR6X2hvdXIsIHR6X21pbnV0ZSwgZGF0ZTtcblxuICBtYXRjaCA9IFlBTUxfVElNRVNUQU1QX1JFR0VYUC5leGVjKGRhdGEpO1xuXG4gIGlmIChtYXRjaCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdEYXRlIHJlc29sdmUgZXJyb3InKTtcblxuICAvLyBtYXRjaDogWzFdIHllYXIgWzJdIG1vbnRoIFszXSBkYXlcblxuICB5ZWFyID0gKyhtYXRjaFsxXSk7XG4gIG1vbnRoID0gKyhtYXRjaFsyXSkgLSAxOyAvLyBKUyBtb250aCBzdGFydHMgd2l0aCAwXG4gIGRheSA9ICsobWF0Y2hbM10pO1xuXG4gIGlmICghbWF0Y2hbNF0pIHsgLy8gbm8gaG91clxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5KSk7XG4gIH1cblxuICAvLyBtYXRjaDogWzRdIGhvdXIgWzVdIG1pbnV0ZSBbNl0gc2Vjb25kIFs3XSBmcmFjdGlvblxuXG4gIGhvdXIgPSArKG1hdGNoWzRdKTtcbiAgbWludXRlID0gKyhtYXRjaFs1XSk7XG4gIHNlY29uZCA9ICsobWF0Y2hbNl0pO1xuXG4gIGlmIChtYXRjaFs3XSkge1xuICAgIGZyYWN0aW9uID0gbWF0Y2hbN10uc2xpY2UoMCwgMyk7XG4gICAgd2hpbGUgKGZyYWN0aW9uLmxlbmd0aCA8IDMpIHsgLy8gbWlsbGktc2Vjb25kc1xuICAgICAgZnJhY3Rpb24gKz0gJzAnO1xuICAgIH1cbiAgICBmcmFjdGlvbiA9ICtmcmFjdGlvbjtcbiAgfVxuXG4gIC8vIG1hdGNoOiBbOF0gdHogWzldIHR6X3NpZ24gWzEwXSB0el9ob3VyIFsxMV0gdHpfbWludXRlXG5cbiAgaWYgKG1hdGNoWzldKSB7XG4gICAgdHpfaG91ciA9ICsobWF0Y2hbMTBdKTtcbiAgICB0el9taW51dGUgPSArKG1hdGNoWzExXSB8fCAwKTtcbiAgICBkZWx0YSA9ICh0el9ob3VyICogNjAgKyB0el9taW51dGUpICogNjAwMDA7IC8vIGRlbHRhIGluIG1pbGktc2Vjb25kc1xuICAgIGlmIChtYXRjaFs5XSA9PT0gJy0nKSBkZWx0YSA9IC1kZWx0YTtcbiAgfVxuXG4gIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhY3Rpb24pKTtcblxuICBpZiAoZGVsdGEpIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSAtIGRlbHRhKTtcblxuICByZXR1cm4gZGF0ZTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50WWFtbFRpbWVzdGFtcChvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgcmV0dXJuIG9iamVjdC50b0lTT1N0cmluZygpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbFRpbWVzdGFtcCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sVGltZXN0YW1wLFxuICBpbnN0YW5jZU9mOiBEYXRlLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxUaW1lc3RhbXBcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbi8vIHByaXZhdGUgcHJvcGVydHlcbnZhciBfa2V5U3RyID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuXG5cbi8vIHB1YmxpYyBtZXRob2QgZm9yIGVuY29kaW5nXG4vLyBleHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG4vLyAgICAgdmFyIG91dHB1dCA9IFtdO1xuLy8gICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzLCBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0O1xuLy8gICAgIHZhciBpID0gMCwgbGVuID0gaW5wdXQubGVuZ3RoLCByZW1haW5pbmdCeXRlcyA9IGxlbjtcblxuLy8gICAgIHZhciBpc0FycmF5ID0gdXRpbHMuZ2V0VHlwZU9mKGlucHV0KSAhPT0gXCJzdHJpbmdcIjtcbi8vICAgICB3aGlsZSAoaSA8IGlucHV0Lmxlbmd0aCkge1xuLy8gICAgICAgICByZW1haW5pbmdCeXRlcyA9IGxlbiAtIGk7XG5cbi8vICAgICAgICAgaWYgKCFpc0FycmF5KSB7XG4vLyAgICAgICAgICAgICBjaHIxID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuLy8gICAgICAgICAgICAgY2hyMiA9IGkgPCBsZW4gPyBpbnB1dC5jaGFyQ29kZUF0KGkrKykgOiAwO1xuLy8gICAgICAgICAgICAgY2hyMyA9IGkgPCBsZW4gPyBpbnB1dC5jaGFyQ29kZUF0KGkrKykgOiAwO1xuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgY2hyMSA9IGlucHV0W2krK107XG4vLyAgICAgICAgICAgICBjaHIyID0gaSA8IGxlbiA/IGlucHV0W2krK10gOiAwO1xuLy8gICAgICAgICAgICAgY2hyMyA9IGkgPCBsZW4gPyBpbnB1dFtpKytdIDogMDtcbi8vICAgICAgICAgfVxuXG4vLyAgICAgICAgIGVuYzEgPSBjaHIxID4+IDI7XG4vLyAgICAgICAgIGVuYzIgPSAoKGNocjEgJiAzKSA8PCA0KSB8IChjaHIyID4+IDQpO1xuLy8gICAgICAgICBlbmMzID0gcmVtYWluaW5nQnl0ZXMgPiAxID8gKCgoY2hyMiAmIDE1KSA8PCAyKSB8IChjaHIzID4+IDYpKSA6IDY0O1xuLy8gICAgICAgICBlbmM0ID0gcmVtYWluaW5nQnl0ZXMgPiAyID8gKGNocjMgJiA2MykgOiA2NDtcblxuLy8gICAgICAgICBvdXRwdXQucHVzaChfa2V5U3RyLmNoYXJBdChlbmMxKSArIF9rZXlTdHIuY2hhckF0KGVuYzIpICsgX2tleVN0ci5jaGFyQXQoZW5jMykgKyBfa2V5U3RyLmNoYXJBdChlbmM0KSk7XG5cbi8vICAgICB9XG5cbi8vICAgICByZXR1cm4gb3V0cHV0LmpvaW4oXCJcIik7XG4vLyB9O1xuXG4vLyBwdWJsaWMgbWV0aG9kIGZvciBkZWNvZGluZ1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzO1xuICAgIHZhciBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0O1xuICAgIHZhciBpID0gMCwgcmVzdWx0SW5kZXggPSAwO1xuXG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOVxcK1xcL1xcPV0vZywgXCJcIik7XG5cbiAgICB2YXIgdG90YWxMZW5ndGggPSBpbnB1dC5sZW5ndGggKiAzIC8gNDtcbiAgICBpZihpbnB1dC5jaGFyQXQoaW5wdXQubGVuZ3RoIC0gMSkgPT09IF9rZXlTdHIuY2hhckF0KDY0KSkge1xuICAgICAgICB0b3RhbExlbmd0aC0tO1xuICAgIH1cbiAgICBpZihpbnB1dC5jaGFyQXQoaW5wdXQubGVuZ3RoIC0gMikgPT09IF9rZXlTdHIuY2hhckF0KDY0KSkge1xuICAgICAgICB0b3RhbExlbmd0aC0tO1xuICAgIH1cbiAgICB2YXIgb3V0cHV0O1xuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dCA9IG5ldyBBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpIHtcblxuICAgICAgICBlbmMxID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jMiA9IF9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzMgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmM0ID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcblxuICAgICAgICBjaHIxID0gKGVuYzEgPDwgMikgfCAoZW5jMiA+PiA0KTtcbiAgICAgICAgY2hyMiA9ICgoZW5jMiAmIDE1KSA8PCA0KSB8IChlbmMzID4+IDIpO1xuICAgICAgICBjaHIzID0gKChlbmMzICYgMykgPDwgNikgfCBlbmM0O1xuXG4gICAgICAgIG91dHB1dFtyZXN1bHRJbmRleCsrXSA9IGNocjE7XG5cbiAgICAgICAgaWYgKGVuYzMgIT09IDY0KSB7XG4gICAgICAgICAgICBvdXRwdXRbcmVzdWx0SW5kZXgrK10gPSBjaHIyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmM0ICE9PSA2NCkge1xuICAgICAgICAgICAgb3V0cHV0W3Jlc3VsdEluZGV4KytdID0gY2hyMztcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBleHRlcm5hbCA9IHJlcXVpcmUoXCIuL2V4dGVybmFsXCIpO1xudmFyIERhdGFXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhV29ya2VyJyk7XG52YXIgRGF0YUxlbmd0aFByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlJyk7XG52YXIgQ3JjMzJQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0NyYzMyUHJvYmUnKTtcbnZhciBEYXRhTGVuZ3RoUHJvYmUgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUnKTtcblxuLyoqXG4gKiBSZXByZXNlbnQgYSBjb21wcmVzc2VkIG9iamVjdCwgd2l0aCBldmVyeXRoaW5nIG5lZWRlZCB0byBkZWNvbXByZXNzIGl0LlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge251bWJlcn0gY29tcHJlc3NlZFNpemUgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29tcHJlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB1bmNvbXByZXNzZWRTaXplIHRoZSBzaXplIG9mIHRoZSBkYXRhIGFmdGVyIGRlY29tcHJlc3Npb24uXG4gKiBAcGFyYW0ge251bWJlcn0gY3JjMzIgdGhlIGNyYzMyIG9mIHRoZSBkZWNvbXByZXNzZWQgZmlsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjb21wcmVzc2lvbiB0aGUgdHlwZSBvZiBjb21wcmVzc2lvbiwgc2VlIGxpYi9jb21wcmVzc2lvbnMuanMuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgY29tcHJlc3NlZCBkYXRhLlxuICovXG5mdW5jdGlvbiBDb21wcmVzc2VkT2JqZWN0KGNvbXByZXNzZWRTaXplLCB1bmNvbXByZXNzZWRTaXplLCBjcmMzMiwgY29tcHJlc3Npb24sIGRhdGEpIHtcbiAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gY29tcHJlc3NlZFNpemU7XG4gICAgdGhpcy51bmNvbXByZXNzZWRTaXplID0gdW5jb21wcmVzc2VkU2l6ZTtcbiAgICB0aGlzLmNyYzMyID0gY3JjMzI7XG4gICAgdGhpcy5jb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uO1xuICAgIHRoaXMuY29tcHJlc3NlZENvbnRlbnQgPSBkYXRhO1xufVxuXG5Db21wcmVzc2VkT2JqZWN0LnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB3b3JrZXIgdG8gZ2V0IHRoZSB1bmNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIGdldENvbnRlbnRXb3JrZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3b3JrZXIgPSBuZXcgRGF0YVdvcmtlcihleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUodGhpcy5jb21wcmVzc2VkQ29udGVudCkpXG4gICAgICAgIC5waXBlKHRoaXMuY29tcHJlc3Npb24udW5jb21wcmVzc1dvcmtlcigpKVxuICAgICAgICAucGlwZShuZXcgRGF0YUxlbmd0aFByb2JlKFwiZGF0YV9sZW5ndGhcIikpO1xuXG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgd29ya2VyLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuc3RyZWFtSW5mb1snZGF0YV9sZW5ndGgnXSAhPT0gdGhhdC51bmNvbXByZXNzZWRTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVnIDogdW5jb21wcmVzc2VkIGRhdGEgc2l6ZSBtaXNtYXRjaFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB3b3JrZXIgdG8gZ2V0IHRoZSBjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHJldHVybiB7R2VuZXJpY1dvcmtlcn0gdGhlIHdvcmtlci5cbiAgICAgKi9cbiAgICBnZXRDb21wcmVzc2VkV29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGFXb3JrZXIoZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29tcHJlc3NlZENvbnRlbnQpKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJjb21wcmVzc2VkU2l6ZVwiLCB0aGlzLmNvbXByZXNzZWRTaXplKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJ1bmNvbXByZXNzZWRTaXplXCIsIHRoaXMudW5jb21wcmVzc2VkU2l6ZSlcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwiY3JjMzJcIiwgdGhpcy5jcmMzMilcbiAgICAgICAgLndpdGhTdHJlYW1JbmZvKFwiY29tcHJlc3Npb25cIiwgdGhpcy5jb21wcmVzc2lvbilcbiAgICAgICAgO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ2hhaW4gdGhlIGdpdmVuIHdvcmtlciB3aXRoIG90aGVyIHdvcmtlcnMgdG8gY29tcHJlc3MgdGhlIGNvbnRlbnQgd2l0aCB0aGVcbiAqIGdpdmVuIGNvbXByZXNpb24uXG4gKiBAcGFyYW0ge0dlbmVyaWNXb3JrZXJ9IHVuY29tcHJlc3NlZFdvcmtlciB0aGUgd29ya2VyIHRvIHBpcGUuXG4gKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb24gdGhlIGNvbXByZXNzaW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbk9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlIHdoZW4gY29tcHJlc3NpbmcuXG4gKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgbmV3IHdvcmtlciBjb21wcmVzc2luZyB0aGUgY29udGVudC5cbiAqL1xuQ29tcHJlc3NlZE9iamVjdC5jcmVhdGVXb3JrZXJGcm9tID0gZnVuY3Rpb24gKHVuY29tcHJlc3NlZFdvcmtlciwgY29tcHJlc3Npb24sIGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIHJldHVybiB1bmNvbXByZXNzZWRXb3JrZXJcbiAgICAucGlwZShuZXcgQ3JjMzJQcm9iZSgpKVxuICAgIC5waXBlKG5ldyBEYXRhTGVuZ3RoUHJvYmUoXCJ1bmNvbXByZXNzZWRTaXplXCIpKVxuICAgIC5waXBlKGNvbXByZXNzaW9uLmNvbXByZXNzV29ya2VyKGNvbXByZXNzaW9uT3B0aW9ucykpXG4gICAgLnBpcGUobmV3IERhdGFMZW5ndGhQcm9iZShcImNvbXByZXNzZWRTaXplXCIpKVxuICAgIC53aXRoU3RyZWFtSW5mbyhcImNvbXByZXNzaW9uXCIsIGNvbXByZXNzaW9uKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcHJlc3NlZE9iamVjdDtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKFwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlclwiKTtcblxuZXhwb3J0cy5TVE9SRSA9IHtcbiAgICBtYWdpYzogXCJcXHgwMFxceDAwXCIsXG4gICAgLy8gY29tcHJlc3NXb3JrZXIgOiBmdW5jdGlvbiAoY29tcHJlc3Npb25PcHRpb25zKSB7XG4gICAgLy8gICAgIHJldHVybiBuZXcgR2VuZXJpY1dvcmtlcihcIlNUT1JFIGNvbXByZXNzaW9uXCIpO1xuICAgIC8vIH0sXG4gICAgdW5jb21wcmVzc1dvcmtlciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljV29ya2VyKFwiU1RPUkUgZGVjb21wcmVzc2lvblwiKTtcbiAgICB9XG59O1xuZXhwb3J0cy5ERUZMQVRFID0gcmVxdWlyZSgnLi9mbGF0ZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbi8qKlxuICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY29tZSBmcm9tIHBha28sIGZyb20gcGFrby9saWIvemxpYi9jcmMzMi5qc1xuICogcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLCBzZWUgcGFrbyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28vXG4gKi9cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgICB2YXIgYywgdGFibGUgPSBbXTtcblxuICAgIGZvcih2YXIgbiA9MDsgbiA8IDI1NjsgbisrKXtcbiAgICAgICAgYyA9IG47XG4gICAgICAgIGZvcih2YXIgayA9MDsgayA8IDg7IGsrKyl7XG4gICAgICAgICAgICBjID0gKChjJjEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICAgICAgfVxuICAgICAgICB0YWJsZVtuXSA9IGM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gICAgdmFyIHQgPSBjcmNUYWJsZSwgZW5kID0gcG9zICsgbGVuO1xuXG4gICAgY3JjID0gY3JjIF4gKC0xKTtcblxuICAgIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKyApIHtcbiAgICAgICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBidWZbaV0pICYgMHhGRl07XG4gICAgfVxuXG4gICAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cbi8vIFRoYXQncyBhbGwgZm9yIHRoZSBwYWtvIGZ1bmN0aW9ucy5cblxuLyoqXG4gKiBDb21wdXRlIHRoZSBjcmMzMiBvZiBhIHN0cmluZy5cbiAqIFRoaXMgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIHRoZSBmdW5jdGlvbiBjcmMzMiwgYnV0IGZvciBzdHJpbmdzLiBVc2luZyB0aGVcbiAqIHNhbWUgZnVuY3Rpb24gZm9yIHRoZSB0d28gdXNlIGNhc2VzIGxlYWRzIHRvIGhvcnJpYmxlIHBlcmZvcm1hbmNlcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBjcmMgdGhlIHN0YXJ0aW5nIHZhbHVlIG9mIHRoZSBjcmMuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gdXNlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0ge051bWJlcn0gcG9zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIGNyYzMyIGNvbXB1dGF0aW9uLlxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgY29tcHV0ZWQgY3JjMzIuXG4gKi9cbmZ1bmN0aW9uIGNyYzMyc3RyKGNyYywgc3RyLCBsZW4sIHBvcykge1xuICAgIHZhciB0ID0gY3JjVGFibGUsIGVuZCA9IHBvcyArIGxlbjtcblxuICAgIGNyYyA9IGNyYyBeICgtMSk7XG5cbiAgICBmb3IgKHZhciBpID0gcG9zOyBpIDwgZW5kOyBpKysgKSB7XG4gICAgICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gc3RyLmNoYXJDb2RlQXQoaSkpICYgMHhGRl07XG4gICAgfVxuXG4gICAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JjMzJ3cmFwcGVyKGlucHV0LCBjcmMpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFpbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgdmFyIGlzQXJyYXkgPSB1dGlscy5nZXRUeXBlT2YoaW5wdXQpICE9PSBcInN0cmluZ1wiO1xuXG4gICAgaWYoaXNBcnJheSkge1xuICAgICAgICByZXR1cm4gY3JjMzIoY3JjfDAsIGlucHV0LCBpbnB1dC5sZW5ndGgsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjcmMzMnN0cihjcmN8MCwgaW5wdXQsIGlucHV0Lmxlbmd0aCwgMCk7XG4gICAgfVxufTtcbi8vIHZpbTogc2V0IHNoaWZ0d2lkdGg9NCBzb2Z0dGFic3RvcD00OlxuIiwiJ3VzZSBzdHJpY3QnO1xuZXhwb3J0cy5iYXNlNjQgPSBmYWxzZTtcbmV4cG9ydHMuYmluYXJ5ID0gZmFsc2U7XG5leHBvcnRzLmRpciA9IGZhbHNlO1xuZXhwb3J0cy5jcmVhdGVGb2xkZXJzID0gdHJ1ZTtcbmV4cG9ydHMuZGF0ZSA9IG51bGw7XG5leHBvcnRzLmNvbXByZXNzaW9uID0gbnVsbDtcbmV4cG9ydHMuY29tcHJlc3Npb25PcHRpb25zID0gbnVsbDtcbmV4cG9ydHMuY29tbWVudCA9IG51bGw7XG5leHBvcnRzLnVuaXhQZXJtaXNzaW9ucyA9IG51bGw7XG5leHBvcnRzLmRvc1Blcm1pc3Npb25zID0gbnVsbDtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gdmFyIEVTNlByb21pc2UgPSByZXF1aXJlKFwiZXM2LXByb21pc2VcIikuUHJvbWlzZTtcblxuLyoqXG4gKiBMZXQgdGhlIHVzZXIgdXNlL2NoYW5nZSBzb21lIGltcGxlbWVudGF0aW9ucy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgUHJvbWlzZTogd2luZG93LlByb21pc2Vcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVVNFX1RZUEVEQVJSQVkgPSAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJiAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiYgKHR5cGVvZiBVaW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpO1xuXG52YXIgcGFrbyA9IHJlcXVpcmUoXCJwYWtvXCIpO1xudmFyIHV0aWxzID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoXCIuL3N0cmVhbS9HZW5lcmljV29ya2VyXCIpO1xuXG52YXIgQVJSQVlfVFlQRSA9IFVTRV9UWVBFREFSUkFZID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCI7XG5cbmV4cG9ydHMubWFnaWMgPSBcIlxceDA4XFx4MDBcIjtcblxuLyoqXG4gKiBDcmVhdGUgYSB3b3JrZXIgdGhhdCB1c2VzIHBha28gdG8gaW5mbGF0ZS9kZWZsYXRlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uIHRoZSBuYW1lIG9mIHRoZSBwYWtvIGZ1bmN0aW9uIHRvIGNhbGwgOiBlaXRoZXIgXCJEZWZsYXRlXCIgb3IgXCJJbmZsYXRlXCIuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiAoZGUpY29tcHJlc3NpbmcuXG4gKi9cbmZ1bmN0aW9uIEZsYXRlV29ya2VyKGFjdGlvbiwgb3B0aW9ucykge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkZsYXRlV29ya2VyL1wiICsgYWN0aW9uKTtcblxuICAgIHRoaXMuX3Bha28gPSBuZXcgcGFrb1thY3Rpb25dKHtcbiAgICAgICAgcmF3OnRydWUsXG4gICAgICAgIGxldmVsIDogb3B0aW9ucy5sZXZlbCB8fCAtMSAvLyBkZWZhdWx0IGNvbXByZXNzaW9uXG4gICAgfSk7XG4gICAgLy8gdGhlIGBtZXRhYCBvYmplY3QgZnJvbSB0aGUgbGFzdCBjaHVuayByZWNlaXZlZFxuICAgIC8vIHRoaXMgYWxsb3cgdGhpcyB3b3JrZXIgdG8gcGFzcyBhcm91bmQgbWV0YWRhdGFcbiAgICB0aGlzLm1ldGEgPSB7fTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9wYWtvLm9uRGF0YSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgc2VsZi5wdXNoKHtcbiAgICAgICAgICAgIGRhdGEgOiBkYXRhLFxuICAgICAgICAgICAgbWV0YSA6IHNlbGYubWV0YVxuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG51dGlscy5pbmhlcml0cyhGbGF0ZVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5GbGF0ZVdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5tZXRhID0gY2h1bmsubWV0YTtcbiAgICB0aGlzLl9wYWtvLnB1c2godXRpbHMudHJhbnNmb3JtVG8oQVJSQVlfVFlQRSwgY2h1bmsuZGF0YSksIGZhbHNlKTtcbn07XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmZsdXNoXG4gKi9cbkZsYXRlV29ya2VyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpO1xuICAgIHRoaXMuX3Bha28ucHVzaChbXSwgdHJ1ZSk7XG59O1xuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuY2xlYW5VcFxuICovXG5GbGF0ZVdvcmtlci5wcm90b3R5cGUuY2xlYW5VcCA9IGZ1bmN0aW9uICgpIHtcbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5jbGVhblVwLmNhbGwodGhpcyk7XG4gICAgdGhpcy5fcGFrbyA9IG51bGw7XG59O1xuXG5leHBvcnRzLmNvbXByZXNzV29ya2VyID0gZnVuY3Rpb24gKGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgRmxhdGVXb3JrZXIoXCJEZWZsYXRlXCIsIGNvbXByZXNzaW9uT3B0aW9ucyk7XG59O1xuZXhwb3J0cy51bmNvbXByZXNzV29ya2VyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgRmxhdGVXb3JrZXIoXCJJbmZsYXRlXCIsIHt9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gYSBvZiB6aXAgZmlsZSBpbiBqc1xuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEpTWmlwKCkge1xuICAgIC8vIGlmIHRoaXMgY29uc3RydWN0b3IgaXPCoHVzZWQgd2l0aG91dMKgYG5ld2AsIGl0wqBhZGRzIGBuZXdgIGJlZm9yZcKgaXRzZWxmOlxuICAgIGlmKCEodGhpcyBpbnN0YW5jZW9mIEpTWmlwKSkge1xuICAgICAgICByZXR1cm4gbmV3IEpTWmlwKCk7XG4gICAgfVxuXG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xuICAgIH1cblxuICAgIC8vIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWxlcyA6XG4gICAgLy8ge1xuICAgIC8vICAgXCJmb2xkZXIvXCIgOiB7Li4ufSxcbiAgICAvLyAgIFwiZm9sZGVyL2RhdGEudHh0XCIgOiB7Li4ufVxuICAgIC8vIH1cbiAgICB0aGlzLmZpbGVzID0ge307XG5cbiAgICB0aGlzLmNvbW1lbnQgPSBudWxsO1xuXG4gICAgLy8gV2hlcmUgd2UgYXJlIGluIHRoZSBoaWVyYXJjaHlcbiAgICB0aGlzLnJvb3QgPSBcIlwiO1xuICAgIHRoaXMuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG5ld09iaiA9IG5ldyBKU1ppcCgpO1xuICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpc1tpXSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgbmV3T2JqW2ldID0gdGhpc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3T2JqO1xuICAgIH07XG59XG5KU1ppcC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL29iamVjdCcpO1xuSlNaaXAucHJvdG90eXBlLmxvYWRBc3luYyA9IHJlcXVpcmUoJy4vbG9hZCcpO1xuSlNaaXAuc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuSlNaaXAuZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG5cbkpTWmlwLmxvYWRBc3luYyA9IGZ1bmN0aW9uIChjb250ZW50LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBKU1ppcCgpLmxvYWRBc3luYyhjb250ZW50LCBvcHRpb25zKTtcbn07XG5cbkpTWmlwLmV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG5tb2R1bGUuZXhwb3J0cyA9IEpTWmlwO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIFppcEVudHJpZXMgPSByZXF1aXJlKCcuL3ppcEVudHJpZXMnKTtcbnZhciBDcmMzMlByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vQ3JjMzJQcm9iZScpO1xudmFyIG5vZGVqc1V0aWxzID0gcmVxdWlyZShcIi4vbm9kZWpzVXRpbHNcIik7XG5cbi8qKlxuICogQ2hlY2sgdGhlIENSQzMyIG9mIGFuIGVudHJ5LlxuICogQHBhcmFtIHtaaXBFbnRyeX0gemlwRW50cnkgdGhlIHppcCBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm4ge1Byb21pc2V9IHRoZSByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrRW50cnlDUkMzMih6aXBFbnRyeSkge1xuICAgIHJldHVybiBuZXcgZXh0ZXJuYWwuUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciB3b3JrZXIgPSB6aXBFbnRyeS5kZWNvbXByZXNzZWQuZ2V0Q29udGVudFdvcmtlcigpLnBpcGUobmV3IENyYzMyUHJvYmUoKSk7XG4gICAgICAgIHdvcmtlci5vbihcImVycm9yXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAod29ya2VyLnN0cmVhbUluZm8uY3JjMzIgIT09IHppcEVudHJ5LmRlY29tcHJlc3NlZC5jcmMzMikge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogQ1JDMzIgbWlzbWF0Y2hcIikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bWUoKTtcbiAgICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkYXRhLCBvcHRpb25zKSB7XG4gICAgdmFyIHppcCA9IHRoaXM7XG4gICAgb3B0aW9ucyA9IHV0aWxzLmV4dGVuZChvcHRpb25zIHx8IHt9LCB7XG4gICAgICAgIGJhc2U2NDogZmFsc2UsXG4gICAgICAgIGNoZWNrQ1JDMzI6IGZhbHNlLFxuICAgICAgICBvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6IGZhbHNlLFxuICAgICAgICBjcmVhdGVGb2xkZXJzOiBmYWxzZSxcbiAgICAgICAgZGVjb2RlRmlsZU5hbWU6IHV0ZjgudXRmOGRlY29kZVxuICAgIH0pO1xuXG4gICAgaWYgKG5vZGVqc1V0aWxzLmlzTm9kZSAmJiBub2RlanNVdGlscy5pc1N0cmVhbShkYXRhKSkge1xuICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSlNaaXAgY2FuJ3QgYWNjZXB0IGEgc3RyZWFtIHdoZW4gbG9hZGluZyBhIHppcCBmaWxlLlwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHV0aWxzLnByZXBhcmVDb250ZW50KFwidGhlIGxvYWRlZCB6aXAgZmlsZVwiLCBkYXRhLCB0cnVlLCBvcHRpb25zLm9wdGltaXplZEJpbmFyeVN0cmluZywgb3B0aW9ucy5iYXNlNjQpXG4gICAgLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB2YXIgemlwRW50cmllcyA9IG5ldyBaaXBFbnRyaWVzKG9wdGlvbnMpO1xuICAgICAgICB6aXBFbnRyaWVzLmxvYWQoZGF0YSk7XG4gICAgICAgIHJldHVybiB6aXBFbnRyaWVzO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gY2hlY2tDUkMzMih6aXBFbnRyaWVzKSB7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IFtleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUoemlwRW50cmllcyldO1xuICAgICAgICB2YXIgZmlsZXMgPSB6aXBFbnRyaWVzLmZpbGVzO1xuICAgICAgICBpZiAob3B0aW9ucy5jaGVja0NSQzMyKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChjaGVja0VudHJ5Q1JDMzIoZmlsZXNbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gYWRkRmlsZXMocmVzdWx0cykge1xuICAgICAgICB2YXIgemlwRW50cmllcyA9IHJlc3VsdHMuc2hpZnQoKTtcbiAgICAgICAgdmFyIGZpbGVzID0gemlwRW50cmllcy5maWxlcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGlucHV0ID0gZmlsZXNbaV07XG4gICAgICAgICAgICB6aXAuZmlsZShpbnB1dC5maWxlTmFtZVN0ciwgaW5wdXQuZGVjb21wcmVzc2VkLCB7XG4gICAgICAgICAgICAgICAgYmluYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgIG9wdGltaXplZEJpbmFyeVN0cmluZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkYXRlOiBpbnB1dC5kYXRlLFxuICAgICAgICAgICAgICAgIGRpcjogaW5wdXQuZGlyLFxuICAgICAgICAgICAgICAgIGNvbW1lbnQgOiBpbnB1dC5maWxlQ29tbWVudFN0ci5sZW5ndGggPyBpbnB1dC5maWxlQ29tbWVudFN0ciA6IG51bGwsXG4gICAgICAgICAgICAgICAgdW5peFBlcm1pc3Npb25zIDogaW5wdXQudW5peFBlcm1pc3Npb25zLFxuICAgICAgICAgICAgICAgIGRvc1Blcm1pc3Npb25zIDogaW5wdXQuZG9zUGVybWlzc2lvbnMsXG4gICAgICAgICAgICAgICAgY3JlYXRlRm9sZGVyczogb3B0aW9ucy5jcmVhdGVGb2xkZXJzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoemlwRW50cmllcy56aXBDb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgemlwLmNvbW1lbnQgPSB6aXBFbnRyaWVzLnppcENvbW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gemlwO1xuICAgIH0pO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIEEgd29ya2VyIHRoYXQgdXNlIGEgbm9kZWpzIHN0cmVhbSBhcyBzb3VyY2UuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSBlbnRyeSBmb3IgdGhpcyBzdHJlYW0uXG4gKiBAcGFyYW0ge1JlYWRhYmxlfSBzdHJlYW0gdGhlIG5vZGVqcyBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlcihmaWxlbmFtZSwgc3RyZWFtKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiTm9kZWpzIHN0cmVhbSBpbnB1dCBhZGFwdGVyIGZvciBcIiArIGZpbGVuYW1lKTtcbiAgICB0aGlzLl91cHN0cmVhbUVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYmluZFN0cmVhbShzdHJlYW0pO1xufVxuXG51dGlscy5pbmhlcml0cyhOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIFByZXBhcmUgdGhlIHN0cmVhbSBhbmQgYmluZCB0aGUgY2FsbGJhY2tzIG9uIGl0LlxuICogRG8gdGhpcyBBU0FQIG9uIG5vZGUgMC4xMCAhIEEgbGF6eSBiaW5kaW5nIGRvZXNuJ3QgYWx3YXlzIHdvcmsuXG4gKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtIHRoZSBub2RlanMgc3RyZWFtIHRvIHVzZS5cbiAqL1xuTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyLnByb3RvdHlwZS5fYmluZFN0cmVhbSA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIHN0cmVhbVxuICAgIC5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIHNlbGYucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiBjaHVuayxcbiAgICAgICAgICAgIG1ldGEgOiB7XG4gICAgICAgICAgICAgICAgcGVyY2VudCA6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSlcbiAgICAub24oXCJlcnJvclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZihzZWxmLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZEVycm9yID0gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgIC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmKHNlbGYuaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHNlbGYuX3Vwc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcbk5vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoIUdlbmVyaWNXb3JrZXIucHJvdG90eXBlLnBhdXNlLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9zdHJlYW0ucGF1c2UoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmKHRoaXMuX3Vwc3RyZWFtRW5kZWQpIHtcbiAgICAgICAgdGhpcy5lbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtJykuUmVhZGFibGU7XG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudXRpbC5pbmhlcml0cyhOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyLCBSZWFkYWJsZSk7XG5cbi8qKlxuKiBBIG5vZGVqcyBzdHJlYW0gdXNpbmcgYSB3b3JrZXIgYXMgc291cmNlLlxuKiBAc2VlIHRoZSBTb3VyY2VXcmFwcGVyIGluIGh0dHA6Ly9ub2RlanMub3JnL2FwaS9zdHJlYW0uaHRtbFxuKiBAY29uc3RydWN0b3JcbiogQHBhcmFtIHtTdHJlYW1IZWxwZXJ9IGhlbHBlciB0aGUgaGVscGVyIHdyYXBwaW5nIHRoZSB3b3JrZXJcbiogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG5vZGVqcyBzdHJlYW0gb3B0aW9uc1xuKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYiB0aGUgdXBkYXRlIGNhbGxiYWNrLlxuKi9cbmZ1bmN0aW9uIE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIoaGVscGVyLCBvcHRpb25zLCB1cGRhdGVDYikge1xuICAgIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgdGhpcy5faGVscGVyID0gaGVscGVyO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGhlbHBlci5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGRhdGEsIG1ldGEpIHtcbiAgICAgICAgaWYgKCFzZWxmLnB1c2goZGF0YSkpIHtcbiAgICAgICAgICAgIHNlbGYuX2hlbHBlci5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHVwZGF0ZUNiKSB7XG4gICAgICAgICAgICB1cGRhdGVDYihtZXRhKTtcbiAgICAgICAgfVxuICAgIH0pXG4gICAgLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSlcbiAgICAub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLnB1c2gobnVsbCk7XG4gICAgfSk7XG59XG5cblxuTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlci5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9oZWxwZXIucmVzdW1lKCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhpcyBpcyBydW5uaW5nIGluIE5vZGVqcywgd2lsbCBiZSB1bmRlZmluZWQgaW4gYSBicm93c2VyLlxuICAgICAqIEluIGEgYnJvd3NlciwgYnJvd3NlcmlmeSB3b24ndCBpbmNsdWRlIHRoaXMgZmlsZSBhbmQgdGhlIHdob2xlIG1vZHVsZVxuICAgICAqIHdpbGwgYmUgcmVzb2x2ZWQgYW4gZW1wdHkgb2JqZWN0LlxuICAgICAqL1xuICAgIGlzTm9kZSA6IHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIsXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IG5vZGVqcyBCdWZmZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgdGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGVuY29kaW5nIHRoZSBlbmNvZGluZyB0byB1c2UuXG4gICAgICogQHJldHVybiB7QnVmZmVyfSBhIG5ldyBCdWZmZXIuXG4gICAgICovXG4gICAgbmV3QnVmZmVyIDogZnVuY3Rpb24oZGF0YSwgZW5jb2Rpbmcpe1xuICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcihkYXRhLCBlbmNvZGluZyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBGaW5kIG91dCBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGIgdGhlIG9iamVjdCB0byB0ZXN0LlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIEJ1ZmZlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzQnVmZmVyIDogZnVuY3Rpb24oYil7XG4gICAgICAgIHJldHVybiBCdWZmZXIuaXNCdWZmZXIoYik7XG4gICAgfSxcblxuICAgIGlzU3RyZWFtIDogZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLm9uID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBvYmoucGF1c2UgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIG9iai5yZXN1bWUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gdmFyIHV0ZjggPSByZXF1aXJlKCcuL3V0ZjgnKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuLy8gdmFyIFN0cmVhbUhlbHBlciA9IHJlcXVpcmUoJy4vc3RyZWFtL1N0cmVhbUhlbHBlcicpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xudmFyIENvbXByZXNzZWRPYmplY3QgPSByZXF1aXJlKCcuL2NvbXByZXNzZWRPYmplY3QnKTtcbnZhciBaaXBPYmplY3QgPSByZXF1aXJlKCcuL3ppcE9iamVjdCcpO1xuLy8gdmFyIGdlbmVyYXRlID0gcmVxdWlyZShcIi4vZ2VuZXJhdGVcIik7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKFwiLi9ub2RlanNVdGlsc1wiKTtcbnZhciBOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIgPSByZXF1aXJlKFwiLi9ub2RlanMvTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyXCIpO1xuXG5cbi8qKlxuICogQWRkIGEgZmlsZSBpbiB0aGUgY3VycmVudCBmb2xkZXIuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhIG9mIHRoZSBmaWxlXG4gKiBAcGFyYW0ge09iamVjdH0gbyB0aGUgb3B0aW9ucyBvZiB0aGUgZmlsZVxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgbmV3IGZpbGUuXG4gKi9cbnZhciBmaWxlQWRkID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgbykge1xuICAgIC8vIGJlIHN1cmUgc3ViIGZvbGRlcnMgZXhpc3RcbiAgICB2YXIgZGF0YVR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSksXG4gICAgICAgIHBhcmVudDtcblxuXG4gICAgLypcbiAgICAgKiBDb3JyZWN0IG9wdGlvbnMuXG4gICAgICovXG5cbiAgICBvID0gdXRpbHMuZXh0ZW5kKG8gfHwge30sIGRlZmF1bHRzKTtcbiAgICBvLmRhdGUgPSBvLmRhdGUgfHwgbmV3IERhdGUoKTtcbiAgICBpZiAoby5jb21wcmVzc2lvbiAhPT0gbnVsbCkge1xuICAgICAgICBvLmNvbXByZXNzaW9uID0gby5jb21wcmVzc2lvbi50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygby51bml4UGVybWlzc2lvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgby51bml4UGVybWlzc2lvbnMgPSBwYXJzZUludChvLnVuaXhQZXJtaXNzaW9ucywgOCk7XG4gICAgfVxuXG4gICAgLy8gVU5YX0lGRElSICAwMDQwMDAwIHNlZSB6aXBpbmZvLmNcbiAgICBpZiAoby51bml4UGVybWlzc2lvbnMgJiYgKG8udW5peFBlcm1pc3Npb25zICYgMHg0MDAwKSkge1xuICAgICAgICBvLmRpciA9IHRydWU7XG4gICAgfVxuICAgIC8vIEJpdCA0ICAgIERpcmVjdG9yeVxuICAgIGlmIChvLmRvc1Blcm1pc3Npb25zICYmIChvLmRvc1Blcm1pc3Npb25zICYgMHgwMDEwKSkge1xuICAgICAgICBvLmRpciA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG8uZGlyKSB7XG4gICAgICAgIG5hbWUgPSBmb3JjZVRyYWlsaW5nU2xhc2gobmFtZSk7XG4gICAgfVxuICAgIGlmIChvLmNyZWF0ZUZvbGRlcnMgJiYgKHBhcmVudCA9IHBhcmVudEZvbGRlcihuYW1lKSkpIHtcbiAgICAgICAgZm9sZGVyQWRkLmNhbGwodGhpcywgcGFyZW50LCB0cnVlKTtcbiAgICB9XG5cbiAgICB2YXIgaXNVbmljb2RlU3RyaW5nID0gZGF0YVR5cGUgPT09IFwic3RyaW5nXCIgJiYgby5iaW5hcnkgPT09IGZhbHNlICYmIG8uYmFzZTY0ID09PSBmYWxzZTtcbiAgICBvLmJpbmFyeSA9ICFpc1VuaWNvZGVTdHJpbmc7XG5cblxuICAgIHZhciBpc0NvbXByZXNzZWRFbXB0eSA9IChkYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCkgJiYgZGF0YS51bmNvbXByZXNzZWRTaXplID09PSAwO1xuXG4gICAgaWYgKGlzQ29tcHJlc3NlZEVtcHR5IHx8IG8uZGlyIHx8ICFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG8uYmFzZTY0ID0gZmFsc2U7XG4gICAgICAgIG8uYmluYXJ5ID0gdHJ1ZTtcbiAgICAgICAgZGF0YSA9IFwiXCI7XG4gICAgICAgIG8uY29tcHJlc3Npb24gPSBcIlNUT1JFXCI7XG4gICAgICAgIGRhdGFUeXBlID0gXCJzdHJpbmdcIjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIENvbnZlcnQgY29udGVudCB0byBmaXQuXG4gICAgICovXG5cbiAgICB2YXIgemlwT2JqZWN0Q29udGVudCA9IG51bGw7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0IHx8IGRhdGEgaW5zdGFuY2VvZiBHZW5lcmljV29ya2VyKSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSBkYXRhO1xuICAgIH0gZWxzZSBpZiAobm9kZWpzVXRpbHMuaXNOb2RlICYmIG5vZGVqc1V0aWxzLmlzU3RyZWFtKGRhdGEpKSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSBuZXcgTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyKG5hbWUsIGRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHppcE9iamVjdENvbnRlbnQgPSB1dGlscy5wcmVwYXJlQ29udGVudChuYW1lLCBkYXRhLCBvLmJpbmFyeSwgby5vcHRpbWl6ZWRCaW5hcnlTdHJpbmcsIG8uYmFzZTY0KTtcbiAgICB9XG5cbiAgICB2YXIgb2JqZWN0ID0gbmV3IFppcE9iamVjdChuYW1lLCB6aXBPYmplY3RDb250ZW50LCBvKTtcbiAgICB0aGlzLmZpbGVzW25hbWVdID0gb2JqZWN0O1xuICAgIC8qXG4gICAgVE9ETzogd2UgY2FuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGJlY2F1c2Ugd2UgaGF2ZSBhc3luYyBwcm9taXNlc1xuICAgICh3ZSBjYW4gaGF2ZSBhIHByb21pc2Ugb2YgYSBEYXRlKCkgZm9yIGV4YW1wbGUpIGJ1dCByZXR1cm5pbmcgYVxuICAgIHByb21pc2UgaXMgdXNlbGVzcyBiZWNhdXNlIGZpbGUobmFtZSwgZGF0YSkgcmV0dXJucyB0aGUgSlNaaXBcbiAgICBvYmplY3QgZm9yIGNoYWluaW5nLiBTaG91bGQgd2UgYnJlYWsgdGhhdCB0byBhbGxvdyB0aGUgdXNlclxuICAgIHRvIGNhdGNoIHRoZSBlcnJvciA/XG5cbiAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5yZXNvbHZlKHppcE9iamVjdENvbnRlbnQpXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuICAgICovXG59O1xuXG4vKipcbiAqIEZpbmQgdGhlIHBhcmVudCBmb2xkZXIgb2YgdGhlIHBhdGguXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIHBhdGggdG8gdXNlXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBwYXJlbnQgZm9sZGVyLCBvciBcIlwiXG4gKi9cbnZhciBwYXJlbnRGb2xkZXIgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgIGlmIChwYXRoLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICB2YXIgbGFzdFNsYXNoID0gcGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgIHJldHVybiAobGFzdFNsYXNoID4gMCkgPyBwYXRoLnN1YnN0cmluZygwLCBsYXN0U2xhc2gpIDogXCJcIjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCB3aXRoIGEgc2xhc2ggYXQgdGhlIGVuZC5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aCB0aGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHBhdGggd2l0aCBhIHRyYWlsaW5nIHNsYXNoLlxuICovXG52YXIgZm9yY2VUcmFpbGluZ1NsYXNoID0gZnVuY3Rpb24ocGF0aCkge1xuICAgIC8vIENoZWNrIHRoZSBuYW1lIGVuZHMgd2l0aCBhIC9cbiAgICBpZiAocGF0aC5zbGljZSgtMSkgIT09IFwiL1wiKSB7XG4gICAgICAgIHBhdGggKz0gXCIvXCI7IC8vIElFIGRvZXNuJ3QgbGlrZSBzdWJzdHIoLTEpXG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xufTtcblxuLyoqXG4gKiBBZGQgYSAoc3ViKSBmb2xkZXIgaW4gdGhlIGN1cnJlbnQgZm9sZGVyLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBmb2xkZXIncyBuYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBbY3JlYXRlRm9sZGVyc10gSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBjcmVhdGUgc3ViXG4gKiAgZm9sZGVycy4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXcgZm9sZGVyLlxuICovXG52YXIgZm9sZGVyQWRkID0gZnVuY3Rpb24obmFtZSwgY3JlYXRlRm9sZGVycykge1xuICAgIGNyZWF0ZUZvbGRlcnMgPSAodHlwZW9mIGNyZWF0ZUZvbGRlcnMgIT09ICd1bmRlZmluZWQnKSA/IGNyZWF0ZUZvbGRlcnMgOiBkZWZhdWx0cy5jcmVhdGVGb2xkZXJzO1xuXG4gICAgbmFtZSA9IGZvcmNlVHJhaWxpbmdTbGFzaChuYW1lKTtcblxuICAgIC8vIERvZXMgdGhpcyBmb2xkZXIgYWxyZWFkeSBleGlzdD9cbiAgICBpZiAoIXRoaXMuZmlsZXNbbmFtZV0pIHtcbiAgICAgICAgZmlsZUFkZC5jYWxsKHRoaXMsIG5hbWUsIG51bGwsIHtcbiAgICAgICAgICAgIGRpcjogdHJ1ZSxcbiAgICAgICAgICAgIGNyZWF0ZUZvbGRlcnM6IGNyZWF0ZUZvbGRlcnNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbGVzW25hbWVdO1xufTtcblxuLyoqXG4qIENyb3NzLXdpbmRvdywgY3Jvc3MtTm9kZS1jb250ZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBkZXRlY3Rpb25cbiogQHBhcmFtICB7T2JqZWN0fSAgb2JqZWN0IEFueXRoaW5nXG4qIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgICB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24sXG4qIGZhbHNlIG90aGVyd2lzZVxuKi9cbmZ1bmN0aW9uIGlzUmVnRXhwKG9iamVjdCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIjtcbn1cblxuLy8gcmV0dXJuIHRoZSBhY3R1YWwgcHJvdG90eXBlIG9mIEpTWmlwXG52YXIgb3V0ID0ge1xuICAgIC8qKlxuICAgICAqIEBzZWUgbG9hZEFzeW5jXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIENhbGwgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZWFjaCBlbnRyeSBhdCB0aGlzIGZvbGRlciBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiB0aGUgY2FsbGJhY2sgZnVuY3Rpb246XG4gICAgICogZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZmlsZSkgey4uLn1cbiAgICAgKiBJdCB0YWtlcyAyIGFyZ3VtZW50cyA6IHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgZmlsZS5cbiAgICAgKi9cbiAgICBmb3JFYWNoOiBmdW5jdGlvbihjYikge1xuICAgICAgICB2YXIgZmlsZW5hbWUsIHJlbGF0aXZlUGF0aCwgZmlsZTtcbiAgICAgICAgZm9yIChmaWxlbmFtZSBpbiB0aGlzLmZpbGVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsZXMuaGFzT3duUHJvcGVydHkoZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxlID0gdGhpcy5maWxlc1tmaWxlbmFtZV07XG4gICAgICAgICAgICByZWxhdGl2ZVBhdGggPSBmaWxlbmFtZS5zbGljZSh0aGlzLnJvb3QubGVuZ3RoLCBmaWxlbmFtZS5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKHJlbGF0aXZlUGF0aCAmJiBmaWxlbmFtZS5zbGljZSgwLCB0aGlzLnJvb3QubGVuZ3RoKSA9PT0gdGhpcy5yb290KSB7IC8vIHRoZSBmaWxlIGlzIGluIHRoZSBjdXJyZW50IHJvb3RcbiAgICAgICAgICAgICAgICBjYihyZWxhdGl2ZVBhdGgsIGZpbGUpOyAvLyBUT0RPIHJldmVyc2UgdGhlIHBhcmFtZXRlcnMgPyBuZWVkIHRvIGJlIGNsZWFuIEFORCBjb25zaXN0ZW50IHdpdGggdGhlIGZpbHRlciBzZWFyY2ggZm4uLi5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgbmVzdGVkIGZpbGVzL2ZvbGRlcnMgd2l0aCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNlYXJjaCB0aGUgcHJlZGljYXRlIHRvIHVzZSA6XG4gICAgICogZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZmlsZSkgey4uLn1cbiAgICAgKiBJdCB0YWtlcyAyIGFyZ3VtZW50cyA6IHRoZSByZWxhdGl2ZSBwYXRoIGFuZCB0aGUgZmlsZS5cbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgbWF0Y2hpbmcgZWxlbWVudHMuXG4gICAgICovXG4gICAgZmlsdGVyOiBmdW5jdGlvbihzZWFyY2gpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCwgZW50cnkpIHtcbiAgICAgICAgICAgIGlmIChzZWFyY2gocmVsYXRpdmVQYXRoLCBlbnRyeSkpIHsgLy8gdGhlIGZpbGUgbWF0Y2hlcyB0aGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGZpbGUgdG8gdGhlIHppcCBmaWxlLCBvciBzZWFyY2ggYSBmaWxlLlxuICAgICAqIEBwYXJhbSAgIHtzdHJpbmd8UmVnRXhwfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGFkZCAoaWYgZGF0YSBpcyBkZWZpbmVkKSxcbiAgICAgKiB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBmaW5kIChpZiBubyBkYXRhKSBvciBhIHJlZ2V4IHRvIG1hdGNoIGZpbGVzLlxuICAgICAqIEBwYXJhbSAgIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgIFRoZSBmaWxlIGRhdGEsIGVpdGhlciByYXcgb3IgYmFzZTY0IGVuY29kZWRcbiAgICAgKiBAcGFyYW0gICB7T2JqZWN0fSBvICAgICBGaWxlIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJuICB7SlNaaXB8T2JqZWN0fEFycmF5fSB0aGlzIEpTWmlwIG9iamVjdCAod2hlbiBhZGRpbmcgYSBmaWxlKSxcbiAgICAgKiBhIGZpbGUgKHdoZW4gc2VhcmNoaW5nIGJ5IHN0cmluZykgb3IgYW4gYXJyYXkgb2YgZmlsZXMgKHdoZW4gc2VhcmNoaW5nIGJ5IHJlZ2V4KS5cbiAgICAgKi9cbiAgICBmaWxlOiBmdW5jdGlvbihuYW1lLCBkYXRhLCBvKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoaXNSZWdFeHAobmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVnZXhwID0gbmFtZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhZmlsZS5kaXIgJiYgcmVnZXhwLnRlc3QocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyB0ZXh0XG4gICAgICAgICAgICAgICAgdmFyIG9iaiA9IHRoaXMuZmlsZXNbdGhpcy5yb290ICsgbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKG9iaiAmJiAhb2JqLmRpcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gbW9yZSB0aGFuIG9uZSBhcmd1bWVudCA6IHdlIGhhdmUgZGF0YSAhXG4gICAgICAgICAgICBuYW1lID0gdGhpcy5yb290ICsgbmFtZTtcbiAgICAgICAgICAgIGZpbGVBZGQuY2FsbCh0aGlzLCBuYW1lLCBkYXRhLCBvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSB6aXAgZmlsZSwgb3Igc2VhcmNoLlxuICAgICAqIEBwYXJhbSAgIHtTdHJpbmd8UmVnRXhwfSBhcmcgVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0byBhZGQsIG9yIGEgcmVnZXggdG8gc2VhcmNoIGZvbGRlcnMuXG4gICAgICogQHJldHVybiAge0pTWmlwfSBhbiBvYmplY3Qgd2l0aCB0aGUgbmV3IGRpcmVjdG9yeSBhcyB0aGUgcm9vdCwgb3IgYW4gYXJyYXkgY29udGFpbmluZyBtYXRjaGluZyBmb2xkZXJzLlxuICAgICAqL1xuICAgIGZvbGRlcjogZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIGlmICghYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1JlZ0V4cChhcmcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZGlyICYmIGFyZy50ZXN0KHJlbGF0aXZlUGF0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVsc2UsIG5hbWUgaXMgYSBuZXcgZm9sZGVyXG4gICAgICAgIHZhciBuYW1lID0gdGhpcy5yb290ICsgYXJnO1xuICAgICAgICB2YXIgbmV3Rm9sZGVyID0gZm9sZGVyQWRkLmNhbGwodGhpcywgbmFtZSk7XG5cbiAgICAgICAgLy8gQWxsb3cgY2hhaW5pbmcgYnkgcmV0dXJuaW5nIGEgbmV3IG9iamVjdCB3aXRoIHRoaXMgZm9sZGVyIGFzIHRoZSByb290XG4gICAgICAgIHZhciByZXQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJldC5yb290ID0gbmV3Rm9sZGVyLm5hbWU7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfS8vLFxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEgZmlsZSwgb3IgYSBkaXJlY3RvcnkgYW5kIGFsbCBzdWItZmlsZXMsIGZyb20gdGhlIHppcFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGRlbGV0ZVxuICAgICAqIEByZXR1cm4ge0pTWmlwfSB0aGlzIEpTWmlwIG9iamVjdFxuICAgICAqL1xuICAgIC8vIHJlbW92ZTogZnVuY3Rpb24obmFtZSkge1xuICAgIC8vICAgICBuYW1lID0gdGhpcy5yb290ICsgbmFtZTtcbiAgICAvLyAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVzW25hbWVdO1xuICAgIC8vICAgICBpZiAoIWZpbGUpIHtcbiAgICAvLyAgICAgICAgIC8vIExvb2sgZm9yIGFueSBmb2xkZXJzXG4gICAgLy8gICAgICAgICBpZiAobmFtZS5zbGljZSgtMSkgIT09IFwiL1wiKSB7XG4gICAgLy8gICAgICAgICAgICAgbmFtZSArPSBcIi9cIjtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIGZpbGUgPSB0aGlzLmZpbGVzW25hbWVdO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgaWYgKGZpbGUgJiYgIWZpbGUuZGlyKSB7XG4gICAgLy8gICAgICAgICAvLyBmaWxlXG4gICAgLy8gICAgICAgICBkZWxldGUgdGhpcy5maWxlc1tuYW1lXTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIC8vIG1heWJlIGEgZm9sZGVyLCBkZWxldGUgcmVjdXJzaXZlbHlcbiAgICAvLyAgICAgICAgIHZhciBraWRzID0gdGhpcy5maWx0ZXIoZnVuY3Rpb24ocmVsYXRpdmVQYXRoLCBmaWxlKSB7XG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuIGZpbGUubmFtZS5zbGljZSgwLCBuYW1lLmxlbmd0aCkgPT09IG5hbWU7XG4gICAgLy8gICAgICAgICB9KTtcbiAgICAvLyAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2lkcy5sZW5ndGg7IGkrKykge1xuICAgIC8vICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbGVzW2tpZHNbaV0ubmFtZV07XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICByZXR1cm4gdGhpcztcbiAgICAvLyB9LFxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIHppcCBmaWxlIDpcbiAgICAgKiAtIGNvbXByZXNzaW9uLCBcIlNUT1JFXCIgYnkgZGVmYXVsdC5cbiAgICAgKiAtIHR5cGUsIFwiYmFzZTY0XCIgYnkgZGVmYXVsdC4gVmFsdWVzIGFyZSA6IHN0cmluZywgYmFzZTY0LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlciwgYmxvYi5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd8VWludDhBcnJheXxBcnJheUJ1ZmZlcnxCdWZmZXJ8QmxvYn0gdGhlIHppcCBmaWxlXG4gICAgICovXG4gICAgLy8gZ2VuZXJhdGU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG4gICAgLy8gfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZSBhcyBhbiBpbnRlcm5hbCBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gZ2VuZXJhdGUgdGhlIHppcCBmaWxlIDpcbiAgICAgKiAtIGNvbXByZXNzaW9uLCBcIlNUT1JFXCIgYnkgZGVmYXVsdC5cbiAgICAgKiAtIHR5cGUsIFwiYmFzZTY0XCIgYnkgZGVmYXVsdC4gVmFsdWVzIGFyZSA6IHN0cmluZywgYmFzZTY0LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlciwgYmxvYi5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBzdHJlYW1lZCB6aXAgZmlsZS5cbiAgICAgKi9cbiAgICAvLyBnZW5lcmF0ZUludGVybmFsU3RyZWFtOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgLy8gICB2YXIgd29ya2VyLCBvcHRzID0ge307XG4gICAgLy8gICB0cnkge1xuICAgIC8vICAgICAgIG9wdHMgPSB1dGlscy5leHRlbmQob3B0aW9ucyB8fCB7fSwge1xuICAgIC8vICAgICAgICAgICBzdHJlYW1GaWxlczogZmFsc2UsXG4gICAgLy8gICAgICAgICAgIGNvbXByZXNzaW9uOiBcIlNUT1JFXCIsXG4gICAgLy8gICAgICAgICAgIGNvbXByZXNzaW9uT3B0aW9ucyA6IG51bGwsXG4gICAgLy8gICAgICAgICAgIHR5cGU6IFwiXCIsXG4gICAgLy8gICAgICAgICAgIHBsYXRmb3JtOiBcIkRPU1wiLFxuICAgIC8vICAgICAgICAgICBjb21tZW50OiBudWxsLFxuICAgIC8vICAgICAgICAgICBtaW1lVHlwZTogJ2FwcGxpY2F0aW9uL3ppcCcsXG4gICAgLy8gICAgICAgICAgIGVuY29kZUZpbGVOYW1lOiB1dGY4LnV0ZjhlbmNvZGVcbiAgICAvLyAgICAgICB9KTtcblxuICAgIC8vICAgICAgIG9wdHMudHlwZSA9IG9wdHMudHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIC8vICAgICAgIG9wdHMuY29tcHJlc3Npb24gPSBvcHRzLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAvLyAgICAgICAvLyBcImJpbmFyeXN0cmluZ1wiIGlzIHByZWZlcmVkIGJ1dCB0aGUgaW50ZXJuYWxzIHVzZSBcInN0cmluZ1wiLlxuICAgIC8vICAgICAgIGlmKG9wdHMudHlwZSA9PT0gXCJiaW5hcnlzdHJpbmdcIikge1xuICAgIC8vICAgICAgICAgb3B0cy50eXBlID0gXCJzdHJpbmdcIjtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICBpZiAoIW9wdHMudHlwZSkge1xuICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gb3V0cHV0IHR5cGUgc3BlY2lmaWVkLlwiKTtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICB1dGlscy5jaGVja1N1cHBvcnQob3B0cy50eXBlKTtcblxuICAgIC8vICAgICAgIC8vIGFjY2VwdCBub2RlanMgYHByb2Nlc3MucGxhdGZvcm1gXG4gICAgLy8gICAgICAgaWYoXG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdkYXJ3aW4nIHx8XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdmcmVlYnNkJyB8fFxuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID09PSAnbGludXgnIHx8XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdzdW5vcydcbiAgICAvLyAgICAgICApIHtcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9IFwiVU5JWFwiO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgICBpZiAob3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID0gXCJET1NcIjtcbiAgICAvLyAgICAgICB9XG5cbiAgICAvLyAgICAgICB2YXIgY29tbWVudCA9IG9wdHMuY29tbWVudCB8fCB0aGlzLmNvbW1lbnQgfHwgXCJcIjtcbiAgICAvLyAgICAgICB3b3JrZXIgPSBnZW5lcmF0ZS5nZW5lcmF0ZVdvcmtlcih0aGlzLCBvcHRzLCBjb21tZW50KTtcbiAgICAvLyAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyAgICAgd29ya2VyID0gbmV3IEdlbmVyaWNXb3JrZXIoXCJlcnJvclwiKTtcbiAgICAvLyAgICAgd29ya2VyLmVycm9yKGUpO1xuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuIG5ldyBTdHJlYW1IZWxwZXIod29ya2VyLCBvcHRzLnR5cGUgfHwgXCJzdHJpbmdcIiwgb3B0cy5taW1lVHlwZSk7XG4gICAgLy8gfSxcbiAgICAvLyAvKipcbiAgICAvLyAgKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGUgYXN5bmNocm9ub3VzbHkuXG4gICAgLy8gICogQHNlZSBnZW5lcmF0ZUludGVybmFsU3RyZWFtXG4gICAgLy8gICovXG4gICAgLy8gZ2VuZXJhdGVBc3luYzogZnVuY3Rpb24ob3B0aW9ucywgb25VcGRhdGUpIHtcbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShvcHRpb25zKS5hY2N1bXVsYXRlKG9uVXBkYXRlKTtcbiAgICAvLyB9LFxuICAgIC8vIC8qKlxuICAgIC8vICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZSBhc3luY2hyb25vdXNseS5cbiAgICAvLyAgKiBAc2VlIGdlbmVyYXRlSW50ZXJuYWxTdHJlYW1cbiAgICAvLyAgKi9cbiAgICAvLyBnZW5lcmF0ZU5vZGVTdHJlYW06IGZ1bmN0aW9uKG9wdGlvbnMsIG9uVXBkYXRlKSB7XG4gICAgLy8gICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIC8vICAgICBpZiAoIW9wdGlvbnMudHlwZSkge1xuICAgIC8vICAgICAgICAgb3B0aW9ucy50eXBlID0gXCJub2RlYnVmZmVyXCI7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShvcHRpb25zKS50b05vZGVqc1N0cmVhbShvblVwZGF0ZSk7XG4gICAgLy8gfVxufTtcbm1vZHVsZS5leHBvcnRzID0gb3V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERhdGFSZWFkZXIgPSByZXF1aXJlKCcuL0RhdGFSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIEFycmF5UmVhZGVyKGRhdGEpIHtcbiAgICBEYXRhUmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRkYXRhW2ldID0gZGF0YVtpXSAmIDB4RkY7XG5cdH1cbn1cbnV0aWxzLmluaGVyaXRzKEFycmF5UmVhZGVyLCBEYXRhUmVhZGVyKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmJ5dGVBdFxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUuYnl0ZUF0ID0gZnVuY3Rpb24oaSkge1xuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy56ZXJvICsgaV07XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmVcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlID0gZnVuY3Rpb24oc2lnKSB7XG4gICAgdmFyIHNpZzAgPSBzaWcuY2hhckNvZGVBdCgwKSxcbiAgICAgICAgc2lnMSA9IHNpZy5jaGFyQ29kZUF0KDEpLFxuICAgICAgICBzaWcyID0gc2lnLmNoYXJDb2RlQXQoMiksXG4gICAgICAgIHNpZzMgPSBzaWcuY2hhckNvZGVBdCgzKTtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSA0OyBpID49IDA7IC0taSkge1xuICAgICAgICBpZiAodGhpcy5kYXRhW2ldID09PSBzaWcwICYmIHRoaXMuZGF0YVtpICsgMV0gPT09IHNpZzEgJiYgdGhpcy5kYXRhW2kgKyAyXSA9PT0gc2lnMiAmJiB0aGlzLmRhdGFbaSArIDNdID09PSBzaWczKSB7XG4gICAgICAgICAgICByZXR1cm4gaSAtIHRoaXMuemVybztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmVcbiAqL1xuQXJyYXlSZWFkZXIucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZSA9IGZ1bmN0aW9uIChzaWcpIHtcbiAgICB2YXIgc2lnMCA9IHNpZy5jaGFyQ29kZUF0KDApLFxuICAgICAgICBzaWcxID0gc2lnLmNoYXJDb2RlQXQoMSksXG4gICAgICAgIHNpZzIgPSBzaWcuY2hhckNvZGVBdCgyKSxcbiAgICAgICAgc2lnMyA9IHNpZy5jaGFyQ29kZUF0KDMpLFxuICAgICAgICBkYXRhID0gdGhpcy5yZWFkRGF0YSg0KTtcbiAgICByZXR1cm4gc2lnMCA9PT0gZGF0YVswXSAmJiBzaWcxID09PSBkYXRhWzFdICYmIHNpZzIgPT09IGRhdGFbMl0gJiYgc2lnMyA9PT0gZGF0YVszXTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICBpZihzaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheVJlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIERhdGFSZWFkZXIoZGF0YSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7IC8vIHR5cGUgOiBzZWUgaW1wbGVtZW50YXRpb25cbiAgICB0aGlzLmxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIHRoaXMuemVybyA9IDA7XG59XG5EYXRhUmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGF0IHRoZSBvZmZzZXQgd2lsbCBub3QgZ28gdG9vIGZhci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2Zmc2V0IHRoZSBhZGRpdGlvbmFsIG9mZnNldCB0byBjaGVjay5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzLlxuICAgICAqL1xuICAgIGNoZWNrT2Zmc2V0OiBmdW5jdGlvbihvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5jaGVja0luZGV4KHRoaXMuaW5kZXggKyBvZmZzZXQpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCB0aGUgc3BlY2lmZWQgaW5kZXggd2lsbCBub3QgYmUgdG9vIGZhci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3SW5kZXggdGhlIGluZGV4IHRvIGNoZWNrLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5cbiAgICAgKi9cbiAgICBjaGVja0luZGV4OiBmdW5jdGlvbihuZXdJbmRleCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggPCB0aGlzLnplcm8gKyBuZXdJbmRleCB8fCBuZXdJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gXCIgKyB0aGlzLmxlbmd0aCArIFwiLCBhc2tlZCBpbmRleCA9IFwiICsgKG5ld0luZGV4KSArIFwiKS4gQ29ycnVwdGVkIHppcCA/XCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdJbmRleCBUaGUgbmV3IGluZGV4LlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgbmV3IGluZGV4IGlzIG91dCBvZiB0aGUgZGF0YS5cbiAgICAgKi9cbiAgICBzZXRJbmRleDogZnVuY3Rpb24obmV3SW5kZXgpIHtcbiAgICAgICAgdGhpcy5jaGVja0luZGV4KG5ld0luZGV4KTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG5ld0luZGV4O1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogU2tpcCB0aGUgbmV4dCBuIGJ5dGVzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIG5ldyBpbmRleCBpcyBvdXQgb2YgdGhlIGRhdGEuXG4gICAgICovXG4gICAgc2tpcDogZnVuY3Rpb24obikge1xuICAgICAgICB0aGlzLnNldEluZGV4KHRoaXMuaW5kZXggKyBuKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYnl0ZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpIHRoZSBpbmRleCB0byB1c2UuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSBhIGJ5dGUuXG4gICAgICovXG4gICAgYnl0ZUF0OiBmdW5jdGlvbihpKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmV4dCBudW1iZXIgd2l0aCBhIGdpdmVuIGJ5dGUgc2l6ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuXG4gICAgICogQHJldHVybiB7bnVtYmVyfSB0aGUgY29ycmVzcG9uZGluZyBudW1iZXIuXG4gICAgICovXG4gICAgcmVhZEludDogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgICAgIGZvciAoaSA9IHRoaXMuaW5kZXggKyBzaXplIC0gMTsgaSA+PSB0aGlzLmluZGV4OyBpLS0pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgKyB0aGlzLmJ5dGVBdChpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgc3RyaW5nIHdpdGggYSBnaXZlbiBieXRlIHNpemUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nLlxuICAgICAqL1xuICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsIHRoaXMucmVhZERhdGEoc2l6ZSkpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHJhdyBkYXRhIHdpdGhvdXQgY29udmVyc2lvbiwgPHNpemU+IGJ5dGVzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHRoZSByYXcgZGF0YSwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuXG4gICAgICovXG4gICAgcmVhZERhdGE6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9uc1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgYSB6aXAgc2lnbmF0dXJlICg0IGJ5dGVzKS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnIHRoZSBzaWduYXR1cmUgdG8gZmluZC5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cmVuY2UsIC0xIGlmIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBsYXN0SW5kZXhPZlNpZ25hdHVyZTogZnVuY3Rpb24oc2lnKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIHNpZ25hdHVyZSAoNCBieXRlcykgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGNvbXBhcmUgaXQgd2l0aCBzaWcuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNpZyB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIG1hdGNoZXMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICByZWFkQW5kQ2hlY2tTaWduYXR1cmU6IGZ1bmN0aW9uKHNpZykge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQgZGF0ZS5cbiAgICAgKiBAcmV0dXJuIHtEYXRlfSB0aGUgZGF0ZS5cbiAgICAgKi9cbiAgICByZWFkRGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkb3N0aW1lID0gdGhpcy5yZWFkSW50KDQpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoXG4gICAgICAgICgoZG9zdGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODAsIC8vIHllYXJcbiAgICAgICAgKChkb3N0aW1lID4+IDIxKSAmIDB4MGYpIC0gMSwgLy8gbW9udGhcbiAgICAgICAgKGRvc3RpbWUgPj4gMTYpICYgMHgxZiwgLy8gZGF5XG4gICAgICAgIChkb3N0aW1lID4+IDExKSAmIDB4MWYsIC8vIGhvdXJcbiAgICAgICAgKGRvc3RpbWUgPj4gNSkgJiAweDNmLCAvLyBtaW51dGVcbiAgICAgICAgKGRvc3RpbWUgJiAweDFmKSA8PCAxKSk7IC8vIHNlY29uZFxuICAgIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IERhdGFSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgVWludDhBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vVWludDhBcnJheVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gTm9kZUJ1ZmZlclJlYWRlcihkYXRhKSB7XG4gICAgVWludDhBcnJheVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xufVxudXRpbHMuaW5oZXJpdHMoTm9kZUJ1ZmZlclJlYWRlciwgVWludDhBcnJheVJlYWRlcik7XG5cbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWREYXRhXG4gKi9cbk5vZGVCdWZmZXJSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBOb2RlQnVmZmVyUmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIERhdGFSZWFkZXIgPSByZXF1aXJlKCcuL0RhdGFSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIFN0cmluZ1JlYWRlcihkYXRhKSB7XG4gICAgRGF0YVJlYWRlci5jYWxsKHRoaXMsIGRhdGEpO1xufVxudXRpbHMuaW5oZXJpdHMoU3RyaW5nUmVhZGVyLCBEYXRhUmVhZGVyKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLmJ5dGVBdFxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLmJ5dGVBdCA9IGZ1bmN0aW9uKGkpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy56ZXJvICsgaSk7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmVcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZSA9IGZ1bmN0aW9uKHNpZykge1xuICAgIHJldHVybiB0aGlzLmRhdGEubGFzdEluZGV4T2Yoc2lnKSAtIHRoaXMuemVybztcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmVcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5yZWFkQW5kQ2hlY2tTaWduYXR1cmUgPSBmdW5jdGlvbiAoc2lnKSB7XG4gICAgdmFyIGRhdGEgPSB0aGlzLnJlYWREYXRhKDQpO1xuICAgIHJldHVybiBzaWcgPT09IGRhdGE7XG59O1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuU3RyaW5nUmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIC8vIHRoaXMgd2lsbCB3b3JrIGJlY2F1c2UgdGhlIGNvbnN0cnVjdG9yIGFwcGxpZWQgdGhlIFwiJiAweGZmXCIgbWFzay5cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZ1JlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vQXJyYXlSZWFkZXInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIFVpbnQ4QXJyYXlSZWFkZXIoZGF0YSkge1xuICAgIEFycmF5UmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG59XG51dGlscy5pbmhlcml0cyhVaW50OEFycmF5UmVhZGVyLCBBcnJheVJlYWRlcik7XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5VaW50OEFycmF5UmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIGlmKHNpemUgPT09IDApIHtcbiAgICAgICAgLy8gaW4gSUUxMCwgd2hlbiB1c2luZyBzdWJhcnJheShpZHgsIGlkeCksIHdlIGdldCB0aGUgYXJyYXkgWzB4MDBdIGluc3RlYWQgb2YgW10uXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLnplcm8gKyB0aGlzLmluZGV4LCB0aGlzLnplcm8gKyB0aGlzLmluZGV4ICsgc2l6ZSk7XG4gICAgdGhpcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBVaW50OEFycmF5UmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuLi9zdXBwb3J0Jyk7XG52YXIgQXJyYXlSZWFkZXIgPSByZXF1aXJlKCcuL0FycmF5UmVhZGVyJyk7XG52YXIgU3RyaW5nUmVhZGVyID0gcmVxdWlyZSgnLi9TdHJpbmdSZWFkZXInKTtcbnZhciBOb2RlQnVmZmVyUmVhZGVyID0gcmVxdWlyZSgnLi9Ob2RlQnVmZmVyUmVhZGVyJyk7XG52YXIgVWludDhBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vVWludDhBcnJheVJlYWRlcicpO1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlYWRlciBhZGFwdGVkIHRvIHRoZSBkYXRhLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGRhdGEgdG8gcmVhZC5cbiAqIEByZXR1cm4ge0RhdGFSZWFkZXJ9IHRoZSBkYXRhIHJlYWRlci5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciB0eXBlID0gdXRpbHMuZ2V0VHlwZU9mKGRhdGEpO1xuICAgIHV0aWxzLmNoZWNrU3VwcG9ydCh0eXBlKTtcbiAgICBpZiAodHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAhc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RyaW5nUmVhZGVyKGRhdGEpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlQnVmZmVyUmVhZGVyKGRhdGEpO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheVJlYWRlcih1dGlscy50cmFuc2Zvcm1UbyhcInVpbnQ4YXJyYXlcIiwgZGF0YSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFycmF5UmVhZGVyKHV0aWxzLnRyYW5zZm9ybVRvKFwiYXJyYXlcIiwgZGF0YSkpO1xufTtcblxuLy8gdmltOiBzZXQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6XG4iLCIndXNlIHN0cmljdCc7XG5leHBvcnRzLkxPQ0FMX0ZJTEVfSEVBREVSID0gXCJQS1xceDAzXFx4MDRcIjtcbmV4cG9ydHMuQ0VOVFJBTF9GSUxFX0hFQURFUiA9IFwiUEtcXHgwMVxceDAyXCI7XG5leHBvcnRzLkNFTlRSQUxfRElSRUNUT1JZX0VORCA9IFwiUEtcXHgwNVxceDA2XCI7XG5leHBvcnRzLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IgPSBcIlBLXFx4MDZcXHgwN1wiO1xuZXhwb3J0cy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQgPSBcIlBLXFx4MDZcXHgwNlwiO1xuZXhwb3J0cy5EQVRBX0RFU0NSSVBUT1IgPSBcIlBLXFx4MDdcXHgwOFwiO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBBIHdvcmtlciB3aGljaCBjb252ZXJ0IGNodW5rcyB0byBhIHNwZWNpZmllZCB0eXBlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gZGVzdFR5cGUgdGhlIGRlc3RpbmF0aW9uIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIENvbnZlcnRXb3JrZXIoZGVzdFR5cGUpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJDb252ZXJ0V29ya2VyIHRvIFwiICsgZGVzdFR5cGUpO1xuICAgIHRoaXMuZGVzdFR5cGUgPSBkZXN0VHlwZTtcbn1cbnV0aWxzLmluaGVyaXRzKENvbnZlcnRXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuQ29udmVydFdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5wdXNoKHtcbiAgICAgICAgZGF0YSA6IHV0aWxzLnRyYW5zZm9ybVRvKHRoaXMuZGVzdFR5cGUsIGNodW5rLmRhdGEpLFxuICAgICAgICBtZXRhIDogY2h1bmsubWV0YVxuICAgIH0pO1xufTtcbm1vZHVsZS5leHBvcnRzID0gQ29udmVydFdvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcbnZhciBjcmMzMiA9IHJlcXVpcmUoJy4uL2NyYzMyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIEEgd29ya2VyIHdoaWNoIGNhbGN1bGF0ZSB0aGUgY3JjMzIgb2YgdGhlIGRhdGEgZmxvd2luZyB0aHJvdWdoLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIENyYzMyUHJvYmUoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiQ3JjMzJQcm9iZVwiKTtcbn1cbnV0aWxzLmluaGVyaXRzKENyYzMyUHJvYmUsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuQ3JjMzJQcm9iZS5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgdGhpcy5zdHJlYW1JbmZvLmNyYzMyID0gY3JjMzIoY2h1bmsuZGF0YSwgdGhpcy5zdHJlYW1JbmZvLmNyYzMyIHx8IDApO1xuICAgIHRoaXMucHVzaChjaHVuayk7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBDcmMzMlByb2JlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBBIHdvcmtlciB3aGljaCBjYWxjdWxhdGUgdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZGF0YSBmbG93aW5nIHRocm91Z2guXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wTmFtZSB0aGUgbmFtZSB1c2VkIHRvIGV4cG9zZSB0aGUgbGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIERhdGFMZW5ndGhQcm9iZShwcm9wTmFtZSkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkRhdGFMZW5ndGhQcm9iZSBmb3IgXCIgKyBwcm9wTmFtZSk7XG4gICAgdGhpcy5wcm9wTmFtZSA9IHByb3BOYW1lO1xuICAgIHRoaXMud2l0aFN0cmVhbUluZm8ocHJvcE5hbWUsIDApO1xufVxudXRpbHMuaW5oZXJpdHMoRGF0YUxlbmd0aFByb2JlLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cbkRhdGFMZW5ndGhQcm9iZS5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgaWYoY2h1bmspIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXSB8fCAwO1xuICAgICAgICB0aGlzLnN0cmVhbUluZm9bdGhpcy5wcm9wTmFtZV0gPSBsZW5ndGggKyBjaHVuay5kYXRhLmxlbmd0aDtcbiAgICB9XG4gICAgR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rLmNhbGwodGhpcywgY2h1bmspO1xufTtcbm1vZHVsZS5leHBvcnRzID0gRGF0YUxlbmd0aFByb2JlO1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xuXG4vLyB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNodW5rc1xuLy8gVE9ETyBleHBvc2UgdGhpcyBhcyBhIHB1YmxpYyB2YXJpYWJsZVxudmFyIERFRkFVTFRfQkxPQ0tfU0laRSA9IDE2ICogMTAyNDtcblxuLyoqXG4gKiBBIHdvcmtlciB0aGF0IHJlYWRzIGEgY29udGVudCBhbmQgZW1pdHMgY2h1bmtzLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1Byb21pc2V9IGRhdGFQIHRoZSBwcm9taXNlIG9mIHRoZSBkYXRhIHRvIHNwbGl0XG4gKi9cbmZ1bmN0aW9uIERhdGFXb3JrZXIoZGF0YVApIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJEYXRhV29ya2VyXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmRhdGFJc1JlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5pbmRleCA9IDA7XG4gICAgdGhpcy5tYXggPSAwO1xuICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgdGhpcy50eXBlID0gXCJcIjtcblxuICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgIGRhdGFQLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgc2VsZi5kYXRhSXNSZWFkeSA9IHRydWU7XG4gICAgICAgIHNlbGYuZGF0YSA9IGRhdGE7XG4gICAgICAgIHNlbGYubWF4ID0gZGF0YSAmJiBkYXRhLmxlbmd0aCB8fCAwO1xuICAgICAgICBzZWxmLnR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSk7XG4gICAgICAgIGlmKCFzZWxmLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICBzZWxmLl90aWNrQW5kUmVwZWF0KCk7XG4gICAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgIH0pO1xufVxuXG51dGlscy5pbmhlcml0cyhEYXRhV29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuY2xlYW5VcFxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5jbGVhblVwID0gZnVuY3Rpb24gKCkge1xuICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKTtcbiAgICB0aGlzLmRhdGEgPSBudWxsO1xufTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucmVzdW1lXG4gKi9cbkRhdGFXb3JrZXIucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdGlja1NjaGVkdWxlZCAmJiB0aGlzLmRhdGFJc1JlYWR5KSB7XG4gICAgICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICB1dGlscy5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LCBbXSwgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VyIGEgdGljayBhIHNjaGVkdWxlIGFuIG90aGVyIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi5cbiAqL1xuRGF0YVdvcmtlci5wcm90b3R5cGUuX3RpY2tBbmRSZXBlYXQgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl90aWNrU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgaWYodGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl90aWNrKCk7XG4gICAgaWYoIXRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICB1dGlscy5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LCBbXSwgdGhpcyk7XG4gICAgICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgIH1cbn07XG5cbi8qKlxuICogUmVhZCBhbmQgcHVzaCBhIGNodW5rLlxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5fdGljayA9IGZ1bmN0aW9uKCkge1xuXG4gICAgaWYodGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBzaXplID0gREVGQVVMVF9CTE9DS19TSVpFO1xuICAgIHZhciBkYXRhID0gbnVsbCwgbmV4dEluZGV4ID0gTWF0aC5taW4odGhpcy5tYXgsIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICBpZiAodGhpcy5pbmRleCA+PSB0aGlzLm1heCkge1xuICAgICAgICAvLyBFT0ZcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmRhdGEuc3Vic3RyaW5nKHRoaXMuaW5kZXgsIG5leHRJbmRleCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ1aW50OGFycmF5XCI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLmluZGV4LCBuZXh0SW5kZXgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgICAgIGNhc2UgXCJub2RlYnVmZmVyXCI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zbGljZSh0aGlzLmluZGV4LCBuZXh0SW5kZXgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleCA9IG5leHRJbmRleDtcbiAgICAgICAgcmV0dXJuIHRoaXMucHVzaCh7XG4gICAgICAgICAgICBkYXRhIDogZGF0YSxcbiAgICAgICAgICAgIG1ldGEgOiB7XG4gICAgICAgICAgICAgICAgcGVyY2VudCA6IHRoaXMubWF4ID8gdGhpcy5pbmRleCAvIHRoaXMubWF4ICogMTAwIDogMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQSB3b3JrZXIgdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHBhc3NpbmcgY2h1bmtzIHRvIHRoZSBuZXh0IG9uZS4gVGhpcyBpcyBsaWtlXG4gKiBhIG5vZGVqcyBzdHJlYW0gYnV0IHdpdGggc29tZSBkaWZmZXJlbmNlcy4gT24gdGhlIGdvb2Qgc2lkZSA6XG4gKiAtIGl0IHdvcmtzIG9uIElFIDYtOSB3aXRob3V0IGFueSBpc3N1ZSAvIHBvbHlmaWxsXG4gKiAtIGl0IHdlaWdodHMgbGVzcyB0aGFuIHRoZSBmdWxsIGRlcGVuZGVuY2llcyBidW5kbGVkIHdpdGggYnJvd3NlcmlmeVxuICogLSBpdCBmb3J3YXJkcyBlcnJvcnMgKG5vIG5lZWQgdG8gZGVjbGFyZSBhbiBlcnJvciBoYW5kbGVyIEVWRVJZV0hFUkUpXG4gKlxuICogQSBjaHVuayBpcyBhbiBvYmplY3Qgd2l0aCAyIGF0dHJpYnV0ZXMgOiBgbWV0YWAgYW5kIGBkYXRhYC4gVGhlIGZvcm1lciBpcyBhblxuICogb2JqZWN0IGNvbnRhaW5pbmcgYW55dGhpbmcgKGBwZXJjZW50YCBmb3IgZXhhbXBsZSksIHNlZSBlYWNoIHdvcmtlciBmb3IgbW9yZVxuICogZGV0YWlscy4gVGhlIGxhdHRlciBpcyB0aGUgcmVhbCBkYXRhIChTdHJpbmcsIFVpbnQ4QXJyYXksIGV0YykuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgc3RyZWFtIChtYWlubHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzKVxuICovXG5mdW5jdGlvbiBHZW5lcmljV29ya2VyKG5hbWUpIHtcbiAgICAvLyB0aGUgbmFtZSBvZiB0aGUgd29ya2VyXG4gICAgdGhpcy5uYW1lID0gbmFtZSB8fCBcImRlZmF1bHRcIjtcbiAgICAvLyBhbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgd29ya2VycyBjaGFpblxuICAgIHRoaXMuc3RyZWFtSW5mbyA9IHt9O1xuICAgIC8vIGFuIGVycm9yIHdoaWNoIGhhcHBlbmVkIHdoZW4gdGhlIHdvcmtlciB3YXMgcGF1c2VkXG4gICAgdGhpcy5nZW5lcmF0ZWRFcnJvciA9IG51bGw7XG4gICAgLy8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgdG8gYmUgbWVyZ2VkIGJ5IHRoaXMgd29ya2VyIGludG8gdGhlIGdlbmVyYWwgbWV0YWRhdGFcbiAgICB0aGlzLmV4dHJhU3RyZWFtSW5mbyA9IHt9O1xuICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBwYXVzZWQgKGFuZCBzaG91bGQgbm90IGRvIGFueXRoaW5nKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG4gICAgLy8gdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIGZpbmlzaGVkIChhbmQgc2hvdWxkIG5vdCBkbyBhbnl0aGluZyksIGZhbHNlIG90aGVyd2lzZVxuICAgIHRoaXMuaXNGaW5pc2hlZCA9IGZhbHNlO1xuICAgIC8vIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBsb2NrZWQgdG8gcHJldmVudCBmdXJ0aGVyIHN0cnVjdHVyZSB1cGRhdGVzIChwaXBlKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgdGhpcy5pc0xvY2tlZCA9IGZhbHNlO1xuICAgIC8vIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSB7XG4gICAgICAgICdkYXRhJzpbXSxcbiAgICAgICAgJ2VuZCc6W10sXG4gICAgICAgICdlcnJvcic6W11cbiAgICB9O1xuICAgIC8vIHRoZSBwcmV2aW91cyB3b3JrZXIsIGlmIGFueVxuICAgIHRoaXMucHJldmlvdXMgPSBudWxsO1xufVxuXG5HZW5lcmljV29ya2VyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBQdXNoIGEgY2h1bmsgdG8gdGhlIG5leHQgd29ya2Vycy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2h1bmsgdGhlIGNodW5rIHRvIHB1c2hcbiAgICAgKi9cbiAgICBwdXNoIDogZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgIHRoaXMuZW1pdChcImRhdGFcIiwgY2h1bmspO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRW5kIHRoZSBzdHJlYW0uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgZW5kZWQgdGhlIHdvcmtlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGVuZCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIpO1xuICAgICAgICAgICAgdGhpcy5jbGVhblVwKCk7XG4gICAgICAgICAgICB0aGlzLmlzRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEVuZCB0aGUgc3RyZWFtIHdpdGggYW4gZXJyb3IuXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZSB0aGUgZXJyb3Igd2hpY2ggY2F1c2VkIHRoZSBwcmVtYXR1cmUgZW5kLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBjYWxsIGVuZGVkIHRoZSB3b3JrZXIgd2l0aCBhbiBlcnJvciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGVycm9yIDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5pc1BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWRFcnJvciA9IGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzRmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlKTtcblxuICAgICAgICAgICAgLy8gaW4gdGhlIHdvcmtlcnMgY2hhaW4gZXhwbG9kZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgY2hhaW4sXG4gICAgICAgICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgd2lsbCBnbyBkb3dud2FyZCBidXQgd2UgYWxzbyBuZWVkIHRvIG5vdGlmeVxuICAgICAgICAgICAgLy8gd29ya2VycyB1cHdhcmQgdGhhdCB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvci5cbiAgICAgICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNsZWFuVXAoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNhbGxiYWNrIG9uIGFuIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCAoZGF0YSwgZW5kLCBlcnJvcilcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWRcbiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgY3VycmVudCBvYmplY3QgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIG9uIDogZnVuY3Rpb24gKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVyc1tuYW1lXS5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDbGVhbiBhbnkgcmVmZXJlbmNlcyB3aGVuIGEgd29ya2VyIGlzIGVuZGluZy5cbiAgICAgKi9cbiAgICBjbGVhblVwIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0cmVhbUluZm8gPSB0aGlzLmdlbmVyYXRlZEVycm9yID0gdGhpcy5leHRyYVN0cmVhbUluZm8gPSBudWxsO1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgYW4gZXZlbnQuIFRoaXMgd2lsbCBjYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2sgd2l0aCB0aGUgcHJvdmlkZWQgYXJnLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCAoZGF0YSwgZW5kLCBlcnJvcilcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYXJnIHRoZSBhcmd1bWVudCB0byBjYWxsIHRoZSBjYWxsYmFjayB3aXRoLlxuICAgICAqL1xuICAgIGVtaXQgOiBmdW5jdGlvbiAobmFtZSwgYXJnKSB7XG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbbmFtZV0pIHtcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9saXN0ZW5lcnNbbmFtZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnNbbmFtZV1baV0uY2FsbCh0aGlzLCBhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGFpbiBhIHdvcmtlciB3aXRoIGFuIG90aGVyLlxuICAgICAqIEBwYXJhbSB7V29ya2VyfSBuZXh0IHRoZSB3b3JrZXIgcmVjZWl2aW5nIGV2ZW50cyBmcm9tIHRoZSBjdXJyZW50IG9uZS5cbiAgICAgKiBAcmV0dXJuIHt3b3JrZXJ9IHRoZSBuZXh0IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgcGlwZSA6IGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXh0LnJlZ2lzdGVyUHJldmlvdXModGhpcyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTYW1lIGFzIGBwaXBlYCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAgICAqIFVzaW5nIGFuIEFQSSB3aXRoIGBwaXBlKG5leHQpYCBpcyB2ZXJ5IGVhc3kuXG4gICAgICogSW1wbGVtZW50aW5nIHRoZSBBUEkgd2l0aCB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgbmV4dCBvbmUgcmVnaXN0ZXJpbmdcbiAgICAgKiBhIHNvdXJjZSBpcyBlYXNpZXIsIHNlZSB0aGUgWmlwRmlsZVdvcmtlci5cbiAgICAgKiBAcGFyYW0ge1dvcmtlcn0gcHJldmlvdXMgdGhlIHByZXZpb3VzIHdvcmtlciwgc2VuZGluZyBldmVudHMgdG8gdGhpcyBvbmVcbiAgICAgKiBAcmV0dXJuIHtXb3JrZXJ9IHRoZSBjdXJyZW50IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgcmVnaXN0ZXJQcmV2aW91cyA6IGZ1bmN0aW9uIChwcmV2aW91cykge1xuICAgICAgICBpZiAodGhpcy5pc0xvY2tlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0cmVhbSAnXCIgKyB0aGlzICsgXCInIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaGFyaW5nIHRoZSBzdHJlYW1JbmZvLi4uXG4gICAgICAgIHRoaXMuc3RyZWFtSW5mbyA9IHByZXZpb3VzLnN0cmVhbUluZm87XG4gICAgICAgIC8vIC4uLiBhbmQgYWRkaW5nIG91ciBvd24gYml0c1xuICAgICAgICB0aGlzLm1lcmdlU3RyZWFtSW5mbygpO1xuICAgICAgICB0aGlzLnByZXZpb3VzID0gIHByZXZpb3VzO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHByZXZpb3VzLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgICAgICBzZWxmLnByb2Nlc3NDaHVuayhjaHVuayk7XG4gICAgICAgIH0pO1xuICAgICAgICBwcmV2aW91cy5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5lbmQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHByZXZpb3VzLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBzZWxmLmVycm9yKGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgc3RyZWFtIHNvIGl0IGRvZXNuJ3Qgc2VuZCBldmVudHMgYW55bW9yZS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCBwYXVzZWQgdGhlIHdvcmtlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHBhdXNlIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZih0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlc3VtZSBhIHBhdXNlZCBzdHJlYW0uXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgcmVzdW1lZCB0aGUgd29ya2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcmVzdW1lIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZighdGhpcy5pc1BhdXNlZCB8fCB0aGlzLmlzRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gaWYgdHJ1ZSwgdGhlIHdvcmtlciB0cmllZCB0byByZXN1bWUgYnV0IGZhaWxlZFxuICAgICAgICB2YXIgd2l0aEVycm9yID0gZmFsc2U7XG4gICAgICAgIGlmKHRoaXMuZ2VuZXJhdGVkRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IodGhpcy5nZW5lcmF0ZWRFcnJvcik7XG4gICAgICAgICAgICB3aXRoRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMucmVzdW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXdpdGhFcnJvcjtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEZsdXNoIGFueSByZW1haW5pbmcgYnl0ZXMgYXMgdGhlIHN0cmVhbSBpcyBlbmRpbmcuXG4gICAgICovXG4gICAgZmx1c2ggOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIGEgY2h1bmsuIFRoaXMgaXMgdXN1YWxseSB0aGUgbWV0aG9kIG92ZXJyaWRkZW4uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNodW5rIHRoZSBjaHVuayB0byBwcm9jZXNzLlxuICAgICAqL1xuICAgIHByb2Nlc3NDaHVuayA6IGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgICAgIHRoaXMucHVzaChjaHVuayk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBZGQgYSBrZXkvdmFsdWUgdG8gYmUgYWRkZWQgaW4gdGhlIHdvcmtlcnMgY2hhaW4gc3RyZWFtSW5mbyBvbmNlIGFjdGl2YXRlZC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgdG8gdXNlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIHRoZSBhc3NvY2lhdGVkIHZhbHVlXG4gICAgICogQHJldHVybiB7V29ya2VyfSB0aGUgY3VycmVudCB3b3JrZXIgZm9yIGNoYWluYWJpbGl0eVxuICAgICAqL1xuICAgIHdpdGhTdHJlYW1JbmZvIDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHRyYVN0cmVhbUluZm9ba2V5XSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm1lcmdlU3RyZWFtSW5mbygpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIE1lcmdlIHRoaXMgd29ya2VyJ3Mgc3RyZWFtSW5mbyBpbnRvIHRoZSBjaGFpbidzIHN0cmVhbUluZm8uXG4gICAgICovXG4gICAgbWVyZ2VTdHJlYW1JbmZvIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IodmFyIGtleSBpbiB0aGlzLmV4dHJhU3RyZWFtSW5mbykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmV4dHJhU3RyZWFtSW5mby5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUluZm9ba2V5XSA9IHRoaXMuZXh0cmFTdHJlYW1JbmZvW2tleV07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTG9jayB0aGUgc3RyZWFtIHRvIHByZXZlbnQgZnVydGhlciB1cGRhdGVzIG9uIHRoZSB3b3JrZXJzIGNoYWluLlxuICAgICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIGFsbCBjYWxscyB0byBwaXBlIHdpbGwgZmFpbC5cbiAgICAgKi9cbiAgICBsb2NrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9ja2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3RyZWFtICdcIiArIHRoaXMgKyBcIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzTG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMubG9jaygpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogUHJldHR5IHByaW50IHRoZSB3b3JrZXJzIGNoYWluLlxuICAgICAqL1xuICAgIHRvU3RyaW5nIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbWUgPSBcIldvcmtlciBcIiArIHRoaXMubmFtZTtcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzICsgXCIgLT4gXCIgKyBtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gR2VuZXJpY1dvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBDb252ZXJ0V29ya2VyID0gcmVxdWlyZSgnLi9Db252ZXJ0V29ya2VyJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4uL2Jhc2U2NCcpO1xudmFyIE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIgPSByZXF1aXJlKCcuLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcicpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4uL2V4dGVybmFsXCIpO1xuXG4vKipcbiAqIEFwcGx5IHRoZSBmaW5hbCB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZGF0YS4gSWYgdGhlIHVzZXIgd2FudHMgYSBCbG9iIGZvclxuICogZXhhbXBsZSwgaXQncyBlYXNpZXIgdG8gd29yayB3aXRoIGFuIFU4aW50QXJyYXkgYW5kIGZpbmFsbHkgZG8gdGhlXG4gKiBBcnJheUJ1ZmZlci9CbG9iIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgbmFtZSBvZiB0aGUgZmluYWwgdHlwZVxuICogQHBhcmFtIHtTdHJpbmd8VWludDhBcnJheXxCdWZmZXJ9IGNvbnRlbnQgdGhlIGNvbnRlbnQgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1N0cmluZ30gbWltZVR5cGUgdGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgaWYgYXBwbGljYWJsZS5cbiAqIEByZXR1cm4ge1N0cmluZ3xVaW50OEFycmF5fEFycmF5QnVmZmVyfEJ1ZmZlcnxCbG9ifSB0aGUgY29udGVudCBpbiB0aGUgcmlnaHQgZm9ybWF0LlxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1aaXBPdXRwdXQodHlwZSwgY29udGVudCwgbWltZVR5cGUpIHtcbiAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICBjYXNlIFwiYmxvYlwiIDpcbiAgICAgICAgICAgIHJldHVybiB1dGlscy5uZXdCbG9iKHV0aWxzLnRyYW5zZm9ybVRvKFwiYXJyYXlidWZmZXJcIiwgY29udGVudCksIG1pbWVUeXBlKTtcbiAgICAgICAgY2FzZSBcImJhc2U2NFwiIDpcbiAgICAgICAgICAgIHJldHVybiBiYXNlNjQuZW5jb2RlKGNvbnRlbnQpO1xuICAgICAgICBkZWZhdWx0IDpcbiAgICAgICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1Ubyh0eXBlLCBjb250ZW50KTtcbiAgICB9XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGUgYW4gYXJyYXkgb2YgZGF0YSBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBkYXRhIGluIHRoZSBnaXZlbiBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl9IGRhdGFBcnJheSB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgZGF0YSBjaHVua3MgdG8gY29uY2F0ZW5hdGVcbiAqIEByZXR1cm4ge1N0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIGNvbmNhdGVuYXRlZCBkYXRhXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhc2tlZCB0eXBlIGlzIHVuc3VwcG9ydGVkXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdCAodHlwZSwgZGF0YUFycmF5KSB7XG4gICAgdmFyIGksIGluZGV4ID0gMCwgcmVzID0gbnVsbCwgdG90YWxMZW5ndGggPSAwO1xuICAgIGZvcihpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b3RhbExlbmd0aCArPSBkYXRhQXJyYXlbaV0ubGVuZ3RoO1xuICAgIH1cbiAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICByZXR1cm4gZGF0YUFycmF5LmpvaW4oXCJcIik7XG4gICAgICAgICAgY2FzZSBcImFycmF5XCI6XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgZGF0YUFycmF5KTtcbiAgICAgICAgY2FzZSBcInVpbnQ4YXJyYXlcIjpcbiAgICAgICAgICAgIHJlcyA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlcy5zZXQoZGF0YUFycmF5W2ldLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgaW5kZXggKz0gZGF0YUFycmF5W2ldLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIGNhc2UgXCJub2RlYnVmZmVyXCI6XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChkYXRhQXJyYXkpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29uY2F0IDogdW5zdXBwb3J0ZWQgdHlwZSAnXCIgICsgdHlwZSArIFwiJ1wiKTtcbiAgICB9XG59XG5cbi8qKlxuICogTGlzdGVuIGEgU3RyZWFtSGVscGVyLCBhY2N1bXVsYXRlIGl0cyBjb250ZW50IGFuZCBjb25jYXRlbmF0ZSBpdCBpbnRvIGFcbiAqIGNvbXBsZXRlIGJsb2NrLlxuICogQHBhcmFtIHtTdHJlYW1IZWxwZXJ9IGhlbHBlciB0aGUgaGVscGVyIHRvIHVzZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZUNhbGxiYWNrIGEgY2FsbGJhY2sgY2FsbGVkIG9uIGVhY2ggdXBkYXRlLiBDYWxsZWRcbiAqIHdpdGggb25lIGFyZyA6XG4gKiAtIHRoZSBtZXRhZGF0YSBsaW5rZWQgdG8gdGhlIHVwZGF0ZSByZWNlaXZlZC5cbiAqIEByZXR1cm4gUHJvbWlzZSB0aGUgcHJvbWlzZSBmb3IgdGhlIGFjY3VtdWxhdGlvbi5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZShoZWxwZXIsIHVwZGF0ZUNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3Qpe1xuICAgICAgICB2YXIgZGF0YUFycmF5ID0gW107XG4gICAgICAgIHZhciBjaHVua1R5cGUgPSBoZWxwZXIuX2ludGVybmFsVHlwZSxcbiAgICAgICAgICAgIHJlc3VsdFR5cGUgPSBoZWxwZXIuX291dHB1dFR5cGUsXG4gICAgICAgICAgICBtaW1lVHlwZSA9IGhlbHBlci5fbWltZVR5cGU7XG4gICAgICAgIGhlbHBlclxuICAgICAgICAub24oJ2RhdGEnLCBmdW5jdGlvbiAoZGF0YSwgbWV0YSkge1xuICAgICAgICAgICAgZGF0YUFycmF5LnB1c2goZGF0YSk7XG4gICAgICAgICAgICBpZih1cGRhdGVDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUNhbGxiYWNrKG1ldGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBkYXRhQXJyYXkgPSBbXTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ2VuZCcsIGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJhbnNmb3JtWmlwT3V0cHV0KHJlc3VsdFR5cGUsIGNvbmNhdChjaHVua1R5cGUsIGRhdGFBcnJheSksIG1pbWVUeXBlKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YUFycmF5ID0gW107XG4gICAgICAgIH0pXG4gICAgICAgIC5yZXN1bWUoKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBbiBoZWxwZXIgdG8gZWFzaWx5IHVzZSB3b3JrZXJzIG91dHNpZGUgb2YgSlNaaXAuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7V29ya2VyfSB3b3JrZXIgdGhlIHdvcmtlciB0byB3cmFwXG4gKiBAcGFyYW0ge1N0cmluZ30gb3V0cHV0VHlwZSB0aGUgdHlwZSBvZiBkYXRhIGV4cGVjdGVkIGJ5IHRoZSB1c2VcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lVHlwZSB0aGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBpZiBhcHBsaWNhYmxlLlxuICovXG5mdW5jdGlvbiBTdHJlYW1IZWxwZXIod29ya2VyLCBvdXRwdXRUeXBlLCBtaW1lVHlwZSkge1xuICAgIHZhciBpbnRlcm5hbFR5cGUgPSBvdXRwdXRUeXBlO1xuICAgIHN3aXRjaChvdXRwdXRUeXBlKSB7XG4gICAgICAgIGNhc2UgXCJibG9iXCI6XG4gICAgICAgIGNhc2UgXCJhcnJheWJ1ZmZlclwiOlxuICAgICAgICAgICAgaW50ZXJuYWxUeXBlID0gXCJ1aW50OGFycmF5XCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XG4gICAgICAgICAgICBpbnRlcm5hbFR5cGUgPSBcInN0cmluZ1wiO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICAvLyB0aGUgdHlwZSB1c2VkIGludGVybmFsbHlcbiAgICAgICAgdGhpcy5faW50ZXJuYWxUeXBlID0gaW50ZXJuYWxUeXBlO1xuICAgICAgICAvLyB0aGUgdHlwZSB1c2VkIHRvIG91dHB1dCByZXN1bHRzXG4gICAgICAgIHRoaXMuX291dHB1dFR5cGUgPSBvdXRwdXRUeXBlO1xuICAgICAgICAvLyB0aGUgbWltZSB0eXBlXG4gICAgICAgIHRoaXMuX21pbWVUeXBlID0gbWltZVR5cGU7XG4gICAgICAgIHV0aWxzLmNoZWNrU3VwcG9ydChpbnRlcm5hbFR5cGUpO1xuICAgICAgICB0aGlzLl93b3JrZXIgPSB3b3JrZXIucGlwZShuZXcgQ29udmVydFdvcmtlcihpbnRlcm5hbFR5cGUpKTtcbiAgICAgICAgLy8gdGhlIGxhc3Qgd29ya2VycyBjYW4gYmUgcmV3aXJlZCB3aXRob3V0IGlzc3VlcyBidXQgd2UgbmVlZCB0b1xuICAgICAgICAvLyBwcmV2ZW50IGFueSB1cGRhdGVzIG9uIHByZXZpb3VzIHdvcmtlcnMuXG4gICAgICAgIHdvcmtlci5sb2NrKCk7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG5ldyBHZW5lcmljV29ya2VyKFwiZXJyb3JcIik7XG4gICAgICAgIHRoaXMuX3dvcmtlci5lcnJvcihlKTtcbiAgICB9XG59XG5cblN0cmVhbUhlbHBlci5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogTGlzdGVuIGEgU3RyZWFtSGVscGVyLCBhY2N1bXVsYXRlIGl0cyBjb250ZW50IGFuZCBjb25jYXRlbmF0ZSBpdCBpbnRvIGFcbiAgICAgKiBjb21wbGV0ZSBibG9jay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYiB0aGUgdXBkYXRlIGNhbGxiYWNrLlxuICAgICAqIEByZXR1cm4gUHJvbWlzZSB0aGUgcHJvbWlzZSBmb3IgdGhlIGFjY3VtdWxhdGlvbi5cbiAgICAgKi9cbiAgICBhY2N1bXVsYXRlIDogZnVuY3Rpb24gKHVwZGF0ZUNiKSB7XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRlKHRoaXMsIHVwZGF0ZUNiKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxpc3RlbmVyIG9uIGFuIGV2ZW50IHRyaWdnZXJlZCBvbiBhIHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZ0IHRoZSBuYW1lIG9mIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIHRoZSBsaXN0ZW5lclxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIGN1cnJlbnQgaGVscGVyLlxuICAgICAqL1xuICAgIG9uIDogZnVuY3Rpb24gKGV2dCwgZm4pIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGlmKGV2dCA9PT0gXCJkYXRhXCIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5vbihldnQsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgICAgIGZuLmNhbGwoc2VsZiwgY2h1bmsuZGF0YSwgY2h1bmsubWV0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5vbihldnQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB1dGlscy5kZWxheShmbiwgYXJndW1lbnRzLCBzZWxmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVzdW1lIHRoZSBmbG93IG9mIGNodW5rcy5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBjdXJyZW50IGhlbHBlci5cbiAgICAgKi9cbiAgICByZXN1bWUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHV0aWxzLmRlbGF5KHRoaXMuX3dvcmtlci5yZXN1bWUsIFtdLCB0aGlzLl93b3JrZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFBhdXNlIHRoZSBmbG93IG9mIGNodW5rcy5cbiAgICAgKiBAcmV0dXJuIHtTdHJlYW1IZWxwZXJ9IHRoZSBjdXJyZW50IGhlbHBlci5cbiAgICAgKi9cbiAgICBwYXVzZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fd29ya2VyLnBhdXNlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgbm9kZWpzIHN0cmVhbSBmb3IgdGhpcyBoZWxwZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2IgdGhlIHVwZGF0ZSBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJuIHtOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyfSB0aGUgbm9kZWpzIHN0cmVhbS5cbiAgICAgKi9cbiAgICB0b05vZGVqc1N0cmVhbSA6IGZ1bmN0aW9uICh1cGRhdGVDYikge1xuICAgICAgICB1dGlscy5jaGVja1N1cHBvcnQoXCJub2Rlc3RyZWFtXCIpO1xuICAgICAgICBpZiAodGhpcy5fb3V0cHV0VHlwZSAhPT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgICAgIC8vIGFuIG9iamVjdCBzdHJlYW0gY29udGFpbmluZyBibG9iL2FycmF5YnVmZmVyL3VpbnQ4YXJyYXkvc3RyaW5nXG4gICAgICAgICAgICAvLyBpcyBzdHJhbmdlIGFuZCBJIGRvbid0IGtub3cgaWYgaXQgd291bGQgYmUgdXNlZnVsLlxuICAgICAgICAgICAgLy8gSSB5b3UgZmluZCB0aGlzIGNvbW1lbnQgYW5kIGhhdmUgYSBnb29kIHVzZWNhc2UsIHBsZWFzZSBvcGVuIGFcbiAgICAgICAgICAgIC8vIGJ1ZyByZXBvcnQgIVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuX291dHB1dFR5cGUgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbWV0aG9kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyKHRoaXMsIHtcbiAgICAgICAgICAgIG9iamVjdE1vZGUgOiB0aGlzLl9vdXRwdXRUeXBlICE9PSBcIm5vZGVidWZmZXJcIlxuICAgICAgICB9LCB1cGRhdGVDYik7XG4gICAgfVxufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmVhbUhlbHBlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5iYXNlNjQgPSB0cnVlO1xuZXhwb3J0cy5hcnJheSA9IHRydWU7XG5leHBvcnRzLnN0cmluZyA9IHRydWU7XG5leHBvcnRzLmFycmF5YnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBVaW50OEFycmF5ICE9PSBcInVuZGVmaW5lZFwiO1xuZXhwb3J0cy5ub2RlYnVmZmVyID0gdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIjtcbi8vIGNvbnRhaW5zIHRydWUgaWYgSlNaaXAgY2FuIHJlYWQvZ2VuZXJhdGUgVWludDhBcnJheSwgZmFsc2Ugb3RoZXJ3aXNlLlxuZXhwb3J0cy51aW50OGFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09IFwidW5kZWZpbmVkXCI7XG5cbmlmICh0eXBlb2YgQXJyYXlCdWZmZXIgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBleHBvcnRzLmJsb2IgPSBmYWxzZTtcbn1cbmVsc2Uge1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gICAgdHJ5IHtcbiAgICAgICAgZXhwb3J0cy5ibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHtcbiAgICAgICAgICAgIHR5cGU6IFwiYXBwbGljYXRpb24vemlwXCJcbiAgICAgICAgfSkuc2l6ZSA9PT0gMDtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBCdWlsZGVyID0gd2luZG93LkJsb2JCdWlsZGVyIHx8IHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlciB8fCB3aW5kb3cuTW96QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1TQmxvYkJ1aWxkZXI7XG4gICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7XG4gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidWZmZXIpO1xuICAgICAgICAgICAgZXhwb3J0cy5ibG9iID0gYnVpbGRlci5nZXRCbG9iKCdhcHBsaWNhdGlvbi96aXAnKS5zaXplID09PSAwO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBleHBvcnRzLmJsb2IgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0cy5ub2Rlc3RyZWFtID0gISFyZXF1aXJlKFwiLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlclwiKS5wcm90b3R5cGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKCcuL25vZGVqc1V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0dlbmVyaWNXb3JrZXInKTtcblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjb21lIGZyb20gcGFrbywgZnJvbSBwYWtvL2xpYi91dGlscy9zdHJpbmdzXG4gKiByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBwYWtvIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyBBcnJheSgyNTYpO1xuZm9yICh2YXIgaT0wOyBpPDI1NjsgaSsrKSB7XG4gIF91dGY4bGVuW2ldID0gKGkgPj0gMjUyID8gNiA6IGkgPj0gMjQ4ID8gNSA6IGkgPj0gMjQwID8gNCA6IGkgPj0gMjI0ID8gMyA6IGkgPj0gMTkyID8gMiA6IDEpO1xufVxuX3V0ZjhsZW5bMjU0XT1fdXRmOGxlblsyNTRdPTE7IC8vIEludmFsaWQgc2VxdWVuY2Ugc3RhcnRcblxuLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxudmFyIHN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICAgIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICAgICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcysxIDwgc3RyX2xlbikpIHtcbiAgICAgICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MrMSk7XG4gICAgICAgICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgICAgICAgICAgbV9wb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICAgIH1cblxuICAgIC8vIGFsbG9jYXRlIGJ1ZmZlclxuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnVmX2xlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYnVmID0gbmV3IEFycmF5KGJ1Zl9sZW4pO1xuICAgIH1cblxuICAgIC8vIGNvbnZlcnRcbiAgICBmb3IgKGk9MCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgICAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zKzEgPCBzdHJfbGVuKSkge1xuICAgICAgICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcysxKTtcbiAgICAgICAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgICAgICAgICBtX3BvcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gYztcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgIC8qIHR3byBieXRlcyAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSAweEMwIHwgKGMgPj4+IDYpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHhmMCB8IChjID4+PiAxOCk7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gMTIgJiAweDNmKTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIENhbGN1bGF0ZSBtYXggcG9zc2libGUgcG9zaXRpb24gaW4gdXRmOCBidWZmZXIsXG4vLyB0aGF0IHdpbGwgbm90IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlXG4vLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLlxuLy9cbi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheVxuLy8gbWF4ICAgLSBsZW5ndGggbGltaXQgKG1hbmRhdG9yeSk7XG52YXIgdXRmOGJvcmRlciA9IGZ1bmN0aW9uKGJ1ZiwgbWF4KSB7XG4gICAgdmFyIHBvcztcblxuICAgIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICAgIGlmIChtYXggPiBidWYubGVuZ3RoKSB7IG1heCA9IGJ1Zi5sZW5ndGg7IH1cblxuICAgIC8vIGdvIGJhY2sgZnJvbSBsYXN0IHBvc2l0aW9uLCB1bnRpbCBzdGFydCBvZiBzZXF1ZW5jZSBmb3VuZFxuICAgIHBvcyA9IG1heC0xO1xuICAgIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gICAgLy8gRnVja3VwIC0gdmVyeSBzbWFsbCBhbmQgYnJva2VuIHNlcXVlbmNlLFxuICAgIC8vIHJldHVybiBtYXgsIGJlY2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LlxuICAgIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAgIC8vIElmIHdlIGNhbWUgdG8gc3RhcnQgb2YgYnVmZmVyIC0gdGhhdCBtZWFucyB2dWZmZXIgaXMgdG9vIHNtYWxsLFxuICAgIC8vIHJldHVybiBtYXggdG9vLlxuICAgIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gICAgcmV0dXJuIChwb3MgKyBfdXRmOGxlbltidWZbcG9zXV0gPiBtYXgpID8gcG9zIDogbWF4O1xufTtcblxuLy8gY29udmVydCBhcnJheSB0byBzdHJpbmdcbnZhciBidWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICAgIHZhciBzdHIsIGksIG91dCwgYywgY19sZW47XG4gICAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG5cbiAgICAvLyBSZXNlcnZlIG1heCBwb3NzaWJsZSBsZW5ndGggKDIgd29yZHMgcGVyIGNoYXIpXG4gICAgLy8gTkI6IGJ5IHVua25vd24gcmVhc29ucywgQXJyYXkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZm9yXG4gICAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgICB2YXIgdXRmMTZidWYgPSBuZXcgQXJyYXkobGVuKjIpO1xuXG4gICAgZm9yIChvdXQ9MCwgaT0wOyBpPGxlbjspIHtcbiAgICAgICAgYyA9IGJ1ZltpKytdO1xuICAgICAgICAvLyBxdWljayBwcm9jZXNzIGFzY2lpXG4gICAgICAgIGlmIChjIDwgMHg4MCkgeyB1dGYxNmJ1ZltvdXQrK10gPSBjOyBjb250aW51ZTsgfVxuXG4gICAgICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgICAgIC8vIHNraXAgNSAmIDYgYnl0ZSBjb2Rlc1xuICAgICAgICBpZiAoY19sZW4gPiA0KSB7IHV0ZjE2YnVmW291dCsrXSA9IDB4ZmZmZDsgaSArPSBjX2xlbi0xOyBjb250aW51ZTsgfVxuXG4gICAgICAgIC8vIGFwcGx5IG1hc2sgb24gZmlyc3QgYnl0ZVxuICAgICAgICBjICY9IGNfbGVuID09PSAyID8gMHgxZiA6IGNfbGVuID09PSAzID8gMHgwZiA6IDB4MDc7XG4gICAgICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICAgICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuKSB7XG4gICAgICAgICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTtcbiAgICAgICAgICAgIGNfbGVuLS07XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgICAgIGlmIChjX2xlbiA+IDEpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBjb250aW51ZTsgfVxuXG4gICAgICAgIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNocmlua0J1Zih1dGYxNmJ1Ziwgb3V0KVxuICAgIGlmICh1dGYxNmJ1Zi5sZW5ndGggIT09IG91dCkge1xuICAgICAgICBpZih1dGYxNmJ1Zi5zdWJhcnJheSkge1xuICAgICAgICAgICAgdXRmMTZidWYgPSB1dGYxNmJ1Zi5zdWJhcnJheSgwLCBvdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXRmMTZidWYubGVuZ3RoID0gb3V0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdXRmMTZidWYpO1xuICAgIHJldHVybiB1dGlscy5hcHBseUZyb21DaGFyQ29kZSh1dGYxNmJ1Zik7XG59O1xuXG5cbi8vIFRoYXQncyBhbGwgZm9yIHRoZSBwYWtvIGZ1bmN0aW9ucy5cblxuXG4vKipcbiAqIFRyYW5zZm9ybSBhIGphdmFzY3JpcHQgc3RyaW5nIGludG8gYW4gYXJyYXkgKHR5cGVkIGlmIHBvc3NpYmxlKSBvZiBieXRlcyxcbiAqIFVURi04IGVuY29kZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJpbmcgdG8gZW5jb2RlXG4gKiBAcmV0dXJuIHtBcnJheXxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIFVURi04IGVuY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnRzLnV0ZjhlbmNvZGUgPSBmdW5jdGlvbiB1dGY4ZW5jb2RlKHN0cikge1xuICAgIGlmIChzdXBwb3J0Lm5vZGVidWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihzdHIsIFwidXRmLThcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZzJidWYoc3RyKTtcbn07XG5cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSBieXRlcyBhcnJheSAob3IgYSByZXByZXNlbnRhdGlvbikgcmVwcmVzZW50aW5nIGFuIFVURi04IGVuY29kZWRcbiAqIHN0cmluZyBpbnRvIGEgamF2YXNjcmlwdCBzdHJpbmcuXG4gKiBAcGFyYW0ge0FycmF5fFVpbnQ4QXJyYXl8QnVmZmVyfSBidWYgdGhlIGRhdGEgZGUgZGVjb2RlXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSBkZWNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0cy51dGY4ZGVjb2RlID0gZnVuY3Rpb24gdXRmOGRlY29kZShidWYpIHtcbiAgICBpZiAoc3VwcG9ydC5ub2RlYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiB1dGlscy50cmFuc2Zvcm1UbyhcIm5vZGVidWZmZXJcIiwgYnVmKS50b1N0cmluZyhcInV0Zi04XCIpO1xuICAgIH1cblxuICAgIGJ1ZiA9IHV0aWxzLnRyYW5zZm9ybVRvKHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiLCBidWYpO1xuXG4gICAgcmV0dXJuIGJ1ZjJzdHJpbmcoYnVmKTtcbn07XG5cbi8qKlxuICogQSB3b3JrZXIgdG8gZGVjb2RlIHV0ZjggZW5jb2RlZCBiaW5hcnkgY2h1bmtzIGludG8gc3RyaW5nIGNodW5rcy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBVdGY4RGVjb2RlV29ya2VyKCkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcInV0Zi04IGRlY29kZVwiKTtcbiAgICAvLyB0aGUgbGFzdCBieXRlcyBpZiBhIGNodW5rIGRpZG4ndCBlbmQgd2l0aCBhIGNvbXBsZXRlIGNvZGVwb2ludC5cbiAgICB0aGlzLmxlZnRPdmVyID0gbnVsbDtcbn1cbnV0aWxzLmluaGVyaXRzKFV0ZjhEZWNvZGVXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuVXRmOERlY29kZVdvcmtlci5wcm90b3R5cGUucHJvY2Vzc0NodW5rID0gZnVuY3Rpb24gKGNodW5rKSB7XG5cbiAgICB2YXIgZGF0YSA9IHV0aWxzLnRyYW5zZm9ybVRvKHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiLCBjaHVuay5kYXRhKTtcblxuICAgIC8vIDFzdCBzdGVwLCByZS11c2Ugd2hhdCdzIGxlZnQgb2YgdGhlIHByZXZpb3VzIGNodW5rXG4gICAgaWYgKHRoaXMubGVmdE92ZXIgJiYgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpIHtcbiAgICAgICAgaWYoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNEYXRhID0gZGF0YTtcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShwcmV2aW91c0RhdGEubGVuZ3RoICsgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpO1xuICAgICAgICAgICAgZGF0YS5zZXQodGhpcy5sZWZ0T3ZlciwgMCk7XG4gICAgICAgICAgICBkYXRhLnNldChwcmV2aW91c0RhdGEsIHRoaXMubGVmdE92ZXIubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLmxlZnRPdmVyLmNvbmNhdChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlZnRPdmVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEJvdW5kYXJ5ID0gdXRmOGJvcmRlcihkYXRhKTtcbiAgICB2YXIgdXNhYmxlRGF0YSA9IGRhdGE7XG4gICAgaWYgKG5leHRCb3VuZGFyeSAhPT0gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICAgICAgdXNhYmxlRGF0YSA9IGRhdGEuc3ViYXJyYXkoMCwgbmV4dEJvdW5kYXJ5KTtcbiAgICAgICAgICAgIHRoaXMubGVmdE92ZXIgPSBkYXRhLnN1YmFycmF5KG5leHRCb3VuZGFyeSwgZGF0YS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXNhYmxlRGF0YSA9IGRhdGEuc2xpY2UoMCwgbmV4dEJvdW5kYXJ5KTtcbiAgICAgICAgICAgIHRoaXMubGVmdE92ZXIgPSBkYXRhLnNsaWNlKG5leHRCb3VuZGFyeSwgZGF0YS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKHtcbiAgICAgICAgZGF0YSA6IGV4cG9ydHMudXRmOGRlY29kZSh1c2FibGVEYXRhKSxcbiAgICAgICAgbWV0YSA6IGNodW5rLm1ldGFcbiAgICB9KTtcbn07XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLmZsdXNoXG4gKi9cblV0ZjhEZWNvZGVXb3JrZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKHRoaXMubGVmdE92ZXIgJiYgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGEgOiBleHBvcnRzLnV0ZjhkZWNvZGUodGhpcy5sZWZ0T3ZlciksXG4gICAgICAgICAgICBtZXRhIDoge31cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubGVmdE92ZXIgPSBudWxsO1xuICAgIH1cbn07XG5leHBvcnRzLlV0ZjhEZWNvZGVXb3JrZXIgPSBVdGY4RGVjb2RlV29ya2VyO1xuXG4vKipcbiAqIEEgd29ya2VyIHRvIGVuZGNvZGUgc3RyaW5nIGNodW5rcyBpbnRvIHV0ZjggZW5jb2RlZCBiaW5hcnkgY2h1bmtzLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFV0ZjhFbmNvZGVXb3JrZXIoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwidXRmLTggZW5jb2RlXCIpO1xufVxudXRpbHMuaW5oZXJpdHMoVXRmOEVuY29kZVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5VdGY4RW5jb2RlV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLnB1c2goe1xuICAgICAgICBkYXRhIDogZXhwb3J0cy51dGY4ZW5jb2RlKGNodW5rLmRhdGEpLFxuICAgICAgICBtZXRhIDogY2h1bmsubWV0YVxuICAgIH0pO1xufTtcbmV4cG9ydHMuVXRmOEVuY29kZVdvcmtlciA9IFV0ZjhFbmNvZGVXb3JrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnLi9iYXNlNjQnKTtcbnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoJy4vbm9kZWpzVXRpbHMnKTtcbnZhciBhc2FwID0gcmVxdWlyZSgnYXNhcCcpO1xudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG5cblxuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIHRoYXQgcGFzcyBhcyBhIFwiYmluYXJ5IHN0cmluZ1wiOiBpdCBzaG91bGQgcmVwcmVzZW50IGEgYnl0ZVxuICogYXJyYXkgYnV0IG1heSBoYXZlID4gMjU1IGNoYXIgY29kZXMuIEJlIHN1cmUgdG8gdGFrZSBvbmx5IHRoZSBmaXJzdCBieXRlXG4gKiBhbmQgcmV0dXJucyB0aGUgYnl0ZSBhcnJheS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHtBcnJheXxVaW50OEFycmF5fSB0aGUgc3RyaW5nIGluIGEgYmluYXJ5IGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nMmJpbmFyeShzdHIpIHtcbiAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHN0ci5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2Uoc3RyLCByZXN1bHQpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBibG9iIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgYW5kIHRoZSBnaXZlbiB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ9IHBhcnQgdGhlIGNvbnRlbnQgdG8gcHV0IGluIHRoZSBibG9iLiBETyBOT1QgdXNlXG4gKiBhbiBVaW50OEFycmF5IGJlY2F1c2UgdGhlIHN0b2NrIGJyb3dzZXIgb2YgYW5kcm9pZCA0IHdvbid0IGFjY2VwdCBpdCAoaXRcbiAqIHdpbGwgYmUgc2lsZW50bHkgY29udmVydGVkIHRvIGEgc3RyaW5nLCBcIltvYmplY3QgVWludDhBcnJheV1cIikuXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgbWltZSB0eXBlIG9mIHRoZSBibG9iLlxuICogQHJldHVybiB7QmxvYn0gdGhlIGNyZWF0ZWQgYmxvYi5cbiAqL1xuZXhwb3J0cy5uZXdCbG9iID0gZnVuY3Rpb24ocGFydCwgdHlwZSkge1xuICAgIGV4cG9ydHMuY2hlY2tTdXBwb3J0KFwiYmxvYlwiKTtcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIEJsb2IgY29uc3RydWN0b3JcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtwYXJ0XSwge1xuICAgICAgICAgICAgdHlwZTogdHlwZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZGVwcmVjYXRlZCwgYnJvd3NlciBvbmx5LCBvbGQgd2F5XG4gICAgICAgICAgICB2YXIgQnVpbGRlciA9IHdpbmRvdy5CbG9iQnVpbGRlciB8fCB3aW5kb3cuV2ViS2l0QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1vekJsb2JCdWlsZGVyIHx8IHdpbmRvdy5NU0Jsb2JCdWlsZGVyO1xuICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpO1xuICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocGFydCk7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5nZXRCbG9iKHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgIC8vIHdlbGwsIGZ1Y2sgPyFcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZyA6IGNhbid0IGNvbnN0cnVjdCB0aGUgQmxvYi5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cblxufTtcbi8qKlxuICogVGhlIGlkZW50aXR5IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0IHRoZSBpbnB1dC5cbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIHNhbWUgaW5wdXQuXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0O1xufVxuXG4vKipcbiAqIEZpbGwgaW4gYW4gYXJyYXkgd2l0aCBhIHN0cmluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB1c2UuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gZmlsbCBpbiAod2lsbCBiZSBtdXRhdGVkKS5cbiAqIEByZXR1cm4ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgdXBkYXRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9BcnJheUxpa2Uoc3RyLCBhcnJheSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGFycmF5W2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG5cbi8qKlxuICogQW4gaGVscGVyIGZvciB0aGUgZnVuY3Rpb24gYXJyYXlMaWtlVG9TdHJpbmcuXG4gKiBUaGlzIGNvbnRhaW5zIHN0YXRpYyBpbmZvcm1hdGlvbnMgYW5kIGZ1bmN0aW9ucyB0aGF0XG4gKiBjYW4gYmUgb3B0aW1pemVkIGJ5IHRoZSBicm93c2VyIEpJVCBjb21waWxlci5cbiAqL1xudmFyIGFycmF5VG9TdHJpbmdIZWxwZXIgPSB7XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIGFuIGFycmF5IG9mIGludCBpbnRvIGEgc3RyaW5nLCBjaHVuayBieSBjaHVuay5cbiAgICAgKiBTZWUgdGhlIHBlcmZvcm1hbmNlcyBub3RlcyBvbiBhcnJheUxpa2VUb1N0cmluZy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gdHJhbnNmb3JtLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGNodW5rIHRoZSBjaHVuayBzaXplLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdGluZyBzdHJpbmcuXG4gICAgICogQHRocm93cyBFcnJvciBpZiB0aGUgY2h1bmsgaXMgdG9vIGJpZyBmb3IgdGhlIHN0YWNrLlxuICAgICAqL1xuICAgIHN0cmluZ2lmeUJ5Q2h1bms6IGZ1bmN0aW9uKGFycmF5LCB0eXBlLCBjaHVuaykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW10sIGsgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIC8vIHNob3J0Y3V0XG4gICAgICAgIGlmIChsZW4gPD0gY2h1bmspIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoayA8IGxlbikge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwiYXJyYXlcIiB8fCB0eXBlID09PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkuc2xpY2UoaywgTWF0aC5taW4oayArIGNodW5rLCBsZW4pKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheS5zdWJhcnJheShrLCBNYXRoLm1pbihrICsgY2h1bmssIGxlbikpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrICs9IGNodW5rO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQuam9pbihcIlwiKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENhbGwgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBldmVyeSBpdGVtIGluIHRoZSBhcnJheS5cbiAgICAgKiBUaGlzIGlzIHRoZSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggZ2VuZXJhdGUgQSBMT1Qgb2YgaW50ZXJtZWRpYXRlIHN0cmluZy5cbiAgICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gZXZlcnl0aGluZyBlbHNlIGZhaWwuXG4gICAgICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXkgdGhlIGFycmF5IHRvIHRyYW5zZm9ybS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSByZXN1bHQuXG4gICAgICovXG4gICAgc3RyaW5naWZ5QnlDaGFyOiBmdW5jdGlvbihhcnJheSl7XG4gICAgICAgIHZhciByZXN1bHRTdHIgPSBcIlwiO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycmF5W2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0U3RyO1xuICAgIH0sXG4gICAgYXBwbHlDYW5CZVVzZWQgOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0cnVlIGlmIHRoZSBicm93c2VyIGFjY2VwdHMgdG8gdXNlIFN0cmluZy5mcm9tQ2hhckNvZGUgb24gVWludDhBcnJheVxuICAgICAgICAgKi9cbiAgICAgICAgdWludDhhcnJheSA6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0LnVpbnQ4YXJyYXkgJiYgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSkubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRydWUgaWYgdGhlIGJyb3dzZXIgYWNjZXB0cyB0byB1c2UgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBub2RlanMgQnVmZmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgbm9kZWJ1ZmZlciA6IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0Lm5vZGVidWZmZXIgJiYgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBub2RlanNVdGlscy5uZXdCdWZmZXIoMSkpLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICB9XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhbiBhcnJheS1saWtlIG9iamVjdCB0byBhIHN0cmluZy5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZVRvU3RyaW5nKGFycmF5KSB7XG4gICAgLy8gUGVyZm9ybWFuY2VzIG5vdGVzIDpcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkpIGlzIHRoZSBmYXN0ZXN0LCBzZWVcbiAgICAvLyBzZWUgaHR0cDovL2pzcGVyZi5jb20vY29udmVydGluZy1hLXVpbnQ4YXJyYXktdG8tYS1zdHJpbmcvMlxuICAgIC8vIGJ1dCB0aGUgc3RhY2sgaXMgbGltaXRlZCAoYW5kIHdlIGNhbiBnZXQgaHVnZSBhcnJheXMgISkuXG4gICAgLy9cbiAgICAvLyByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhcnJheVtpXSk7IGdlbmVyYXRlIHRvbyBtYW55IHN0cmluZ3MgIVxuICAgIC8vXG4gICAgLy8gVGhpcyBjb2RlIGlzIGluc3BpcmVkIGJ5IGh0dHA6Ly9qc3BlcmYuY29tL2FycmF5YnVmZmVyLXRvLXN0cmluZy1hcHBseS1wZXJmb3JtYW5jZS8yXG4gICAgLy8gVE9ETyA6IHdlIG5vdyBoYXZlIHdvcmtlcnMgdGhhdCBzcGxpdCB0aGUgd29yay4gRG8gd2Ugc3RpbGwgbmVlZCB0aGF0ID9cbiAgICB2YXIgY2h1bmsgPSA2NTUzNixcbiAgICAgICAgdHlwZSA9IGV4cG9ydHMuZ2V0VHlwZU9mKGFycmF5KSxcbiAgICAgICAgY2FuVXNlQXBwbHkgPSB0cnVlO1xuICAgIGlmICh0eXBlID09PSBcInVpbnQ4YXJyYXlcIikge1xuICAgICAgICBjYW5Vc2VBcHBseSA9IGFycmF5VG9TdHJpbmdIZWxwZXIuYXBwbHlDYW5CZVVzZWQudWludDhhcnJheTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwibm9kZWJ1ZmZlclwiKSB7XG4gICAgICAgIGNhblVzZUFwcGx5ID0gYXJyYXlUb1N0cmluZ0hlbHBlci5hcHBseUNhbkJlVXNlZC5ub2RlYnVmZmVyO1xuICAgIH1cblxuICAgIGlmIChjYW5Vc2VBcHBseSkge1xuICAgICAgICB3aGlsZSAoY2h1bmsgPiAxKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvU3RyaW5nSGVscGVyLnN0cmluZ2lmeUJ5Q2h1bmsoYXJyYXksIHR5cGUsIGNodW5rKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjaHVuayA9IE1hdGguZmxvb3IoY2h1bmsgLyAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5vIGFwcGx5IG9yIGNodW5rIGVycm9yIDogc2xvdyBhbmQgcGFpbmZ1bCBhbGdvcml0aG1cbiAgICAvLyBkZWZhdWx0IGJyb3dzZXIgb24gYW5kcm9pZCA0LipcbiAgICByZXR1cm4gYXJyYXlUb1N0cmluZ0hlbHBlci5zdHJpbmdpZnlCeUNoYXIoYXJyYXkpO1xufVxuXG5leHBvcnRzLmFwcGx5RnJvbUNoYXJDb2RlID0gYXJyYXlMaWtlVG9TdHJpbmc7XG5cblxuLyoqXG4gKiBDb3B5IHRoZSBkYXRhIGZyb20gYW4gYXJyYXktbGlrZSB0byBhbiBvdGhlciBhcnJheS1saWtlLlxuICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXlGcm9tIHRoZSBvcmlnaW4gYXJyYXkuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheVRvIHRoZSBkZXN0aW5hdGlvbiBhcnJheSB3aGljaCB3aWxsIGJlIG11dGF0ZWQuXG4gKiBAcmV0dXJuIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gdGhlIHVwZGF0ZWQgZGVzdGluYXRpb24gYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TGlrZVRvQXJyYXlMaWtlKGFycmF5RnJvbSwgYXJyYXlUbykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlGcm9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFycmF5VG9baV0gPSBhcnJheUZyb21baV07XG4gICAgfVxuICAgIHJldHVybiBhcnJheVRvO1xufVxuXG4vLyBhIG1hdHJpeCBjb250YWluaW5nIGZ1bmN0aW9ucyB0byB0cmFuc2Zvcm0gZXZlcnl0aGluZyBpbnRvIGV2ZXJ5dGhpbmcuXG52YXIgdHJhbnNmb3JtID0ge307XG5cbi8vIHN0cmluZyB0byA/XG50cmFuc2Zvcm1bXCJzdHJpbmdcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogaWRlbnRpdHksXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVtcInN0cmluZ1wiXVtcInVpbnQ4YXJyYXlcIl0oaW5wdXQpLmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBVaW50OEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbm9kZWpzVXRpbHMubmV3QnVmZmVyKGlucHV0Lmxlbmd0aCkpO1xuICAgIH1cbn07XG5cbi8vIGFycmF5IHRvID9cbnRyYW5zZm9ybVtcImFycmF5XCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogaWRlbnRpdHksXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKG5ldyBVaW50OEFycmF5KGlucHV0KSkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShpbnB1dCk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihpbnB1dCk7XG4gICAgfVxufTtcblxuLy8gYXJyYXlidWZmZXIgdG8gP1xudHJhbnNmb3JtW1wiYXJyYXlidWZmZXJcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvU3RyaW5nKG5ldyBVaW50OEFycmF5KGlucHV0KSk7XG4gICAgfSxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShuZXcgVWludDhBcnJheShpbnB1dCksIG5ldyBBcnJheShpbnB1dC5ieXRlTGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGlkZW50aXR5LFxuICAgIFwidWludDhhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaW5wdXQpO1xuICAgIH0sXG4gICAgXCJub2RlYnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBub2RlanNVdGlscy5uZXdCdWZmZXIobmV3IFVpbnQ4QXJyYXkoaW5wdXQpKTtcbiAgICB9XG59O1xuXG4vLyB1aW50OGFycmF5IHRvID9cbnRyYW5zZm9ybVtcInVpbnQ4YXJyYXlcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogYXJyYXlMaWtlVG9TdHJpbmcsXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0LmJ1ZmZlcjtcbiAgICB9LFxuICAgIFwidWludDhhcnJheVwiOiBpZGVudGl0eSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihpbnB1dCk7XG4gICAgfVxufTtcblxuLy8gbm9kZWJ1ZmZlciB0byA/XG50cmFuc2Zvcm1bXCJub2RlYnVmZmVyXCJdID0ge1xuICAgIFwic3RyaW5nXCI6IGFycmF5TGlrZVRvU3RyaW5nLFxuICAgIFwiYXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKGlucHV0LCBuZXcgQXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1bXCJub2RlYnVmZmVyXCJdW1widWludDhhcnJheVwiXShpbnB1dCkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShpbnB1dCwgbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogaWRlbnRpdHlcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIGlucHV0IGludG8gYW55IHR5cGUuXG4gKiBUaGUgc3VwcG9ydGVkIG91dHB1dCB0eXBlIGFyZSA6IHN0cmluZywgYXJyYXksIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLCBub2RlYnVmZmVyLlxuICogSWYgbm8gb3V0cHV0IHR5cGUgaXMgc3BlY2lmaWVkLCB0aGUgdW5tb2RpZmllZCBpbnB1dCB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIHtTdHJpbmd9IG91dHB1dFR5cGUgdGhlIG91dHB1dCB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGlucHV0IHRoZSBpbnB1dCB0byBjb252ZXJ0LlxuICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIG91dHB1dCB0eXBlLlxuICovXG5leHBvcnRzLnRyYW5zZm9ybVRvID0gZnVuY3Rpb24ob3V0cHV0VHlwZSwgaW5wdXQpIHtcbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgIC8vIHVuZGVmaW5lZCwgbnVsbCwgZXRjXG4gICAgICAgIC8vIGFuIGVtcHR5IHN0cmluZyB3b24ndCBoYXJtLlxuICAgICAgICBpbnB1dCA9IFwiXCI7XG4gICAgfVxuICAgIGlmICghb3V0cHV0VHlwZSkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIGV4cG9ydHMuY2hlY2tTdXBwb3J0KG91dHB1dFR5cGUpO1xuICAgIHZhciBpbnB1dFR5cGUgPSBleHBvcnRzLmdldFR5cGVPZihpbnB1dCk7XG4gICAgdmFyIHJlc3VsdCA9IHRyYW5zZm9ybVtpbnB1dFR5cGVdW291dHB1dFR5cGVdKGlucHV0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGlucHV0LlxuICogVGhlIHR5cGUgd2lsbCBiZSBpbiBhIGZvcm1hdCB2YWxpZCBmb3IgSlNaaXAudXRpbHMudHJhbnNmb3JtVG8gOiBzdHJpbmcsIGFycmF5LCB1aW50OGFycmF5LCBhcnJheWJ1ZmZlci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCB0aGUgaW5wdXQgdG8gaWRlbnRpZnkuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSAobG93ZXJjYXNlKSB0eXBlIG9mIHRoZSBpbnB1dC5cbiAqL1xuZXhwb3J0cy5nZXRUeXBlT2YgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgfVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSBcIltvYmplY3QgQXJyYXldXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlciAmJiBub2RlanNVdGlscy5pc0J1ZmZlcihpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIFwibm9kZWJ1ZmZlclwiO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5ICYmIGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gXCJ1aW50OGFycmF5XCI7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0LmFycmF5YnVmZmVyICYmIGlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIFwiYXJyYXlidWZmZXJcIjtcbiAgICB9XG59O1xuXG4vKipcbiAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgdG8gY2hlY2suXG4gKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgdHlwZS5cbiAqL1xuZXhwb3J0cy5jaGVja1N1cHBvcnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgdmFyIHN1cHBvcnRlZCA9IHN1cHBvcnRbdHlwZS50b0xvd2VyQ2FzZSgpXTtcbiAgICBpZiAoIXN1cHBvcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZSArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybVwiKTtcbiAgICB9XG59O1xuXG5leHBvcnRzLk1BWF9WQUxVRV8xNkJJVFMgPSA2NTUzNTtcbmV4cG9ydHMuTUFYX1ZBTFVFXzMyQklUUyA9IC0xOyAvLyB3ZWxsLCBcIlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcIiBpcyBwYXJzZWQgYXMgLTFcblxuLyoqXG4gKiBQcmV0dGlmeSBhIHN0cmluZyByZWFkIGFzIGJpbmFyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byBwcmV0dGlmeS5cbiAqIEByZXR1cm4ge3N0cmluZ30gYSBwcmV0dHkgc3RyaW5nLlxuICovXG5leHBvcnRzLnByZXR0eSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciByZXMgPSAnJyxcbiAgICAgICAgY29kZSwgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgKHN0ciB8fCBcIlwiKS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIHJlcyArPSAnXFxcXHgnICsgKGNvZGUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyBjb2RlLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBEZWZlciB0aGUgY2FsbCBvZiBhIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGZ1bmN0aW9uIHRvIGNhbGwgYXN5bmNocm9ub3VzbHkuXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIHRoZSBhcmd1bWVudHMgdG8gZ2l2ZSB0byB0aGUgY2FsbGJhY2suXG4gKi9cbmV4cG9ydHMuZGVsYXkgPSBmdW5jdGlvbihjYWxsYmFjaywgYXJncywgc2VsZikge1xuICAgIGFzYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICBjYWxsYmFjay5hcHBseShzZWxmIHx8IG51bGwsIGFyZ3MgfHwgW10pO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBFeHRlbmRzIGEgcHJvdG90eXBlIHdpdGggYW4gb3RoZXIsIHdpdGhvdXQgY2FsbGluZyBhIGNvbnN0cnVjdG9yIHdpdGhcbiAqIHNpZGUgZWZmZWN0cy4gSW5zcGlyZWQgYnkgbm9kZWpzJyBgdXRpbHMuaW5oZXJpdHNgXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdG9yIHRoZSBjb25zdHJ1Y3RvciB0byBhdWdtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdXBlckN0b3IgdGhlIHBhcmVudCBjb25zdHJ1Y3RvciB0byB1c2VcbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IGZ1bmN0aW9uIChjdG9yLCBzdXBlckN0b3IpIHtcbiAgICB2YXIgT2JqID0gZnVuY3Rpb24oKSB7fTtcbiAgICBPYmoucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBPYmooKTtcbn07XG5cbi8qKlxuICogTWVyZ2UgdGhlIG9iamVjdHMgcGFzc2VkIGFzIHBhcmFtZXRlcnMgaW50byBhIG5ldyBvbmUuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsuLi5PYmplY3R9IHZhcl9hcmdzIEFsbCBvYmplY3RzIHRvIG1lcmdlLlxuICogQHJldHVybiB7T2JqZWN0fSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgZGF0YSBvZiB0aGUgb3RoZXJzLlxuICovXG5leHBvcnRzLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHQgPSB7fSwgaSwgYXR0cjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IC8vIGFyZ3VtZW50cyBpcyBub3QgZW51bWVyYWJsZSBpbiBzb21lIGJyb3dzZXJzXG4gICAgICAgIGZvciAoYXR0ciBpbiBhcmd1bWVudHNbaV0pIHtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0uaGFzT3duUHJvcGVydHkoYXR0cikgJiYgdHlwZW9mIHJlc3VsdFthdHRyXSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdFthdHRyXSA9IGFyZ3VtZW50c1tpXVthdHRyXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYXJiaXRyYXJ5IGNvbnRlbnQgaW50byBhIFByb21pc2UuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBhIG5hbWUgZm9yIHRoZSBjb250ZW50IGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGEgdGhlIGNvbnRlbnQgdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNCaW5hcnkgdHJ1ZSBpZiB0aGUgY29udGVudCBpcyBub3QgYW4gdW5pY29kZSBzdHJpbmdcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNPcHRpbWl6ZWRCaW5hcnlTdHJpbmcgdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRlbnQgb25seSBoYXMgb25lIGJ5dGUgcGVyIGNoYXJhY3Rlci5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNCYXNlNjQgdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRlbnQgaXMgZW5jb2RlZCB3aXRoIGJhc2U2NC5cbiAqIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSBpbiBhIGZvcm1hdCB1c2FibGUgYnkgSlNaaXAuXG4gKi9cbmV4cG9ydHMucHJlcGFyZUNvbnRlbnQgPSBmdW5jdGlvbihuYW1lLCBpbnB1dERhdGEsIGlzQmluYXJ5LCBpc09wdGltaXplZEJpbmFyeVN0cmluZywgaXNCYXNlNjQpIHtcblxuICAgIHZhciBwcm9taXNlID0gbnVsbDtcbiAgICBpZiAoc3VwcG9ydC5ibG9iICYmIGlucHV0RGF0YSBpbnN0YW5jZW9mIEJsb2IgJiYgdHlwZW9mIEZpbGVSZWFkZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcHJvbWlzZSA9IG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZS50YXJnZXQuZXJyb3IpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpbnB1dERhdGEpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiBkYXRhIGlzIGFscmVhZHkgYSBwcm9taXNlLCB0aGlzIGZsYXR0ZW4gaXQuXG4gICAgICAgIHByb21pc2UgPSBleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUoaW5wdXREYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgdmFyIGRhdGFUeXBlID0gZXhwb3J0cy5nZXRUeXBlT2YoZGF0YSk7XG5cbiAgICAgICAgaWYgKCFkYXRhVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4dGVybmFsLlByb21pc2UucmVqZWN0KFxuICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcIlRoZSBkYXRhIG9mICdcIiArIG5hbWUgKyBcIicgaXMgaW4gYW4gdW5zdXBwb3J0ZWQgZm9ybWF0ICFcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIDogaXQncyB3YXkgZWFzaWVyIHRvIHdvcmsgd2l0aCBVaW50OEFycmF5IHRoYW4gd2l0aCBBcnJheUJ1ZmZlclxuICAgICAgICBpZiAoZGF0YVR5cGUgPT09IFwiYXJyYXlidWZmZXJcIikge1xuICAgICAgICAgICAgZGF0YSA9IGV4cG9ydHMudHJhbnNmb3JtVG8oXCJ1aW50OGFycmF5XCIsIGRhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBpZiAoaXNCYXNlNjQpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gYmFzZTY0LmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzQmluYXJ5KSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW1pemVkQmluYXJ5U3RyaW5nID09PSB0cnVlIG1lYW5zIHRoYXQgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBmaWx0ZXJlZCB3aXRoIGEgMHhGRiBtYXNrXG4gICAgICAgICAgICAgICAgaWYgKGlzT3B0aW1pemVkQmluYXJ5U3RyaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdHJpbmcsIG5vdCBpbiBhIGJhc2U2NCBmb3JtYXQuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJlIHN1cmUgdGhhdCB0aGlzIGlzIGEgY29ycmVjdCBcImJpbmFyeSBzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3RyaW5nMmJpbmFyeShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHJlYWRlckZvciA9IHJlcXVpcmUoJy4vcmVhZGVyL3JlYWRlckZvcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHNpZyA9IHJlcXVpcmUoJy4vc2lnbmF0dXJlJyk7XG52YXIgWmlwRW50cnkgPSByZXF1aXJlKCcuL3ppcEVudHJ5Jyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbi8vICBjbGFzcyBaaXBFbnRyaWVzIHt7e1xuLyoqXG4gKiBBbGwgdGhlIGVudHJpZXMgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gbG9hZE9wdGlvbnMgT3B0aW9ucyBmb3IgbG9hZGluZyB0aGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBaaXBFbnRyaWVzKGxvYWRPcHRpb25zKSB7XG4gICAgdGhpcy5maWxlcyA9IFtdO1xuICAgIHRoaXMubG9hZE9wdGlvbnMgPSBsb2FkT3B0aW9ucztcbn1cblppcEVudHJpZXMucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENoZWNrIHRoYXQgdGhlIHJlYWRlciBpcyBvbiB0aGUgc3BlZmljaWVkIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRTaWduYXR1cmUgdGhlIGV4cGVjdGVkIHNpZ25hdHVyZS5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgaXQgaXMgYW4gb3RoZXIgc2lnbmF0dXJlLlxuICAgICAqL1xuICAgIGNoZWNrU2lnbmF0dXJlOiBmdW5jdGlvbihleHBlY3RlZFNpZ25hdHVyZSkge1xuICAgICAgICBpZiAoIXRoaXMucmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZShleHBlY3RlZFNpZ25hdHVyZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZGVyLmluZGV4IC09IDQ7XG4gICAgICAgICAgICB2YXIgc2lnbmF0dXJlID0gdGhpcy5yZWFkZXIucmVhZFN0cmluZyg0KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgb3IgYnVnIDogdW5leHBlY3RlZCBzaWduYXR1cmUgXCIgKyBcIihcIiArIHV0aWxzLnByZXR0eShzaWduYXR1cmUpICsgXCIsIGV4cGVjdGVkIFwiICsgdXRpbHMucHJldHR5KGV4cGVjdGVkU2lnbmF0dXJlKSArIFwiKVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHNpZ25hdHVyZSBpcyBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFza2VkSW5kZXggdGhlIGluZGV4IHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlIHRvIGV4cGVjdC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBzaWduYXR1cmUgaXMgaGVyZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzU2lnbmF0dXJlOiBmdW5jdGlvbihhc2tlZEluZGV4LCBleHBlY3RlZFNpZ25hdHVyZSkge1xuICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gdGhpcy5yZWFkZXIuaW5kZXg7XG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGFza2VkSW5kZXgpO1xuICAgICAgICB2YXIgc2lnbmF0dXJlID0gdGhpcy5yZWFkZXIucmVhZFN0cmluZyg0KTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHNpZ25hdHVyZSA9PT0gZXhwZWN0ZWRTaWduYXR1cmU7XG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGN1cnJlbnRJbmRleCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgdGhlIGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIHJlYWRCbG9ja0VuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZGlza051bWJlciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHMgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJTaXplID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcblxuICAgICAgICB0aGlzLnppcENvbW1lbnRMZW5ndGggPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICAvLyB3YXJuaW5nIDogdGhlIGVuY29kaW5nIGRlcGVuZHMgb2YgdGhlIHN5c3RlbSBsb2NhbGVcbiAgICAgICAgLy8gT24gYSBsaW51eCBtYWNoaW5lIHdpdGggTEFORz1lbl9VUy51dGY4LCB0aGlzIGZpZWxkIGlzIHV0ZjggZW5jb2RlZC5cbiAgICAgICAgLy8gT24gYSB3aW5kb3dzIG1hY2hpbmUsIHRoaXMgZmllbGQgaXMgZW5jb2RlZCB3aXRoIHRoZSBsb2NhbGl6ZWQgd2luZG93cyBjb2RlIHBhZ2UuXG4gICAgICAgIHZhciB6aXBDb21tZW50ID0gdGhpcy5yZWFkZXIucmVhZERhdGEodGhpcy56aXBDb21tZW50TGVuZ3RoKTtcbiAgICAgICAgdmFyIGRlY29kZVBhcmFtVHlwZSA9IHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiO1xuICAgICAgICAvLyBUbyBnZXQgY29uc2lzdGVudCBiZWhhdmlvciB3aXRoIHRoZSBnZW5lcmF0aW9uIHBhcnQsIHdlIHdpbGwgYXNzdW1lIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyB1dGY4IGVuY29kZWQgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UuXG4gICAgICAgIHZhciBkZWNvZGVDb250ZW50ID0gdXRpbHMudHJhbnNmb3JtVG8oZGVjb2RlUGFyYW1UeXBlLCB6aXBDb21tZW50KTtcbiAgICAgICAgdGhpcy56aXBDb21tZW50ID0gdGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShkZWNvZGVDb250ZW50KTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiB0aGUgWmlwIDY0IGNlbnRyYWwgZGlyZWN0b3J5LlxuICAgICAqIE5vdCBtZXJnZWQgd2l0aCB0aGUgbWV0aG9kIHJlYWRFbmRPZkNlbnRyYWwgOlxuICAgICAqIFRoZSBlbmQgb2YgY2VudHJhbCBjYW4gY29leGlzdCB3aXRoIGl0cyBaaXA2NCBicm90aGVyLFxuICAgICAqIEkgZG9uJ3Qgd2FudCB0byByZWFkIHRoZSB3cm9uZyBudW1iZXIgb2YgYnl0ZXMgIVxuICAgICAqL1xuICAgIHJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLnJlYWRlci5za2lwKDQpO1xuICAgICAgICAvLyB0aGlzLnZlcnNpb25NYWRlQnkgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDIpO1xuICAgICAgICAvLyB0aGlzLnZlcnNpb25OZWVkZWQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmRpc2tOdW1iZXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2sgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyU2l6ZSA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpck9mZnNldCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG5cbiAgICAgICAgdGhpcy56aXA2NEV4dGVuc2libGVEYXRhID0ge307XG4gICAgICAgIHZhciBleHRyYURhdGFTaXplID0gdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUgLSA0NCxcbiAgICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWU7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGV4dHJhRGF0YVNpemUpIHtcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoID0gdGhpcy5yZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZSA9IHRoaXMucmVhZGVyLnJlYWREYXRhKGV4dHJhRmllbGRMZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy56aXA2NEV4dGVuc2libGVEYXRhW2V4dHJhRmllbGRJZF0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGV4dHJhRmllbGRWYWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW5kIG9mIHRoZSBaaXAgNjQgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvci5cbiAgICAgKi9cbiAgICByZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmRpc2tXaXRoWmlwNjRDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmRpc2tzQ291bnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICBpZiAodGhpcy5kaXNrc0NvdW50ID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVsdGktdm9sdW1lcyB6aXAgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGxvY2FsIGZpbGVzLCBiYXNlZCBvbiB0aGUgb2Zmc2V0IHJlYWQgaW4gdGhlIGNlbnRyYWwgcGFydC5cbiAgICAgKi9cbiAgICByZWFkTG9jYWxGaWxlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpLCBmaWxlO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbaV07XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChmaWxlLmxvY2FsSGVhZGVyT2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbiAgICAgICAgICAgIGZpbGUucmVhZExvY2FsUGFydCh0aGlzLnJlYWRlcik7XG4gICAgICAgICAgICBmaWxlLmhhbmRsZVVURjgoKTtcbiAgICAgICAgICAgIGZpbGUucHJvY2Vzc0F0dHJpYnV0ZXMoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZENlbnRyYWxEaXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZmlsZTtcblxuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLmNlbnRyYWxEaXJPZmZzZXQpO1xuICAgICAgICB3aGlsZSAodGhpcy5yZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlKHNpZy5DRU5UUkFMX0ZJTEVfSEVBREVSKSkge1xuICAgICAgICAgICAgZmlsZSA9IG5ldyBaaXBFbnRyeSh7XG4gICAgICAgICAgICAgICAgemlwNjQ6IHRoaXMuemlwNjRcbiAgICAgICAgICAgIH0sIHRoaXMubG9hZE9wdGlvbnMpO1xuICAgICAgICAgICAgZmlsZS5yZWFkQ2VudHJhbFBhcnQodGhpcy5yZWFkZXIpO1xuICAgICAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2VudHJhbERpclJlY29yZHMgIT09IHRoaXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jZW50cmFsRGlyUmVjb3JkcyAhPT0gMCAmJiB0aGlzLmZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGV4cGVjdGVkIHNvbWUgcmVjb3JkcyBidXQgY291bGRuJ3QgZmluZCBBTlkuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyByZWFsbHkgc3VzcGljaW91cywgYXMgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCBvciBidWc6IGV4cGVjdGVkIFwiICsgdGhpcy5jZW50cmFsRGlyUmVjb3JkcyArIFwiIHJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdCBcIiArIHRoaXMuZmlsZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgc29tZSByZWNvcmRzIGJ1dCBub3QgYWxsLlxuICAgICAgICAgICAgICAgIC8vIFNvbWV0aGluZyBpcyB3cm9uZyBidXQgd2UgZ290IHNvbWV0aGluZyBmb3IgdGhlIHVzZXI6IG5vIGVycm9yIGhlcmUuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKFwiZXhwZWN0ZWRcIiwgdGhpcy5jZW50cmFsRGlyUmVjb3JkcywgXCJyZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3RcIiwgdGhpcy5maWxlcy5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZEVuZE9mQ2VudHJhbDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZW50IGlzIGEgdHJ1bmNhdGVkIHppcCBvciBjb21wbGV0ZSBnYXJiYWdlLlxuICAgICAgICAgICAgLy8gQSBcIkxPQ0FMX0ZJTEVfSEVBREVSXCIgaXMgbm90IHJlcXVpcmVkIGF0IHRoZSBiZWdpbm5pbmcgKGF1dG9cbiAgICAgICAgICAgIC8vIGV4dHJhY3RpYmxlIHppcCBmb3IgZXhhbXBsZSkgYnV0IGl0IGNhbiBnaXZlIGEgZ29vZCBoaW50LlxuICAgICAgICAgICAgLy8gSWYgYW4gYWpheCByZXF1ZXN0IHdhcyB1c2VkIHdpdGhvdXQgcmVzcG9uc2VUeXBlLCB3ZSB3aWxsIGFsc29cbiAgICAgICAgICAgIC8vIGdldCB1bnJlYWRhYmxlIGRhdGEuXG4gICAgICAgICAgICB2YXIgaXNHYXJiYWdlID0gIXRoaXMuaXNTaWduYXR1cmUoMCwgc2lnLkxPQ0FMX0ZJTEVfSEVBREVSKTtcblxuICAgICAgICAgICAgaWYgKGlzR2FyYmFnZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IDogaXMgdGhpcyBhIHppcCBmaWxlID8gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklmIGl0IGlzLCBzZWUgaHR0cDovL3N0dWsuZ2l0aHViLmlvL2pzemlwL2RvY3VtZW50YXRpb24vaG93dG8vcmVhZF96aXAuaHRtbFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgob2Zmc2V0KTtcbiAgICAgICAgdmFyIGVuZE9mQ2VudHJhbERpck9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgdGhpcy5yZWFkQmxvY2tFbmRPZkNlbnRyYWwoKTtcblxuXG4gICAgICAgIC8qIGV4dHJhY3QgZnJvbSB0aGUgemlwIHNwZWMgOlxuICAgICAgICAgICAgNCkgIElmIG9uZSBvZiB0aGUgZmllbGRzIGluIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICByZWNvcmQgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVxdWlyZWQgZGF0YSwgdGhlIGZpZWxkXG4gICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNldCB0byAtMSAoMHhGRkZGIG9yIDB4RkZGRkZGRkYpIGFuZCB0aGVcbiAgICAgICAgICAgICAgICBaSVA2NCBmb3JtYXQgcmVjb3JkIHNob3VsZCBiZSBjcmVhdGVkLlxuICAgICAgICAgICAgNSkgIFRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkIGFuZCB0aGVcbiAgICAgICAgICAgICAgICBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciByZWNvcmQgbXVzdFxuICAgICAgICAgICAgICAgIHJlc2lkZSBvbiB0aGUgc2FtZSBkaXNrIHdoZW4gc3BsaXR0aW5nIG9yIHNwYW5uaW5nXG4gICAgICAgICAgICAgICAgYW4gYXJjaGl2ZS5cbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLmRpc2tOdW1iZXIgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLnppcDY0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIFdhcm5pbmcgOiB0aGUgemlwNjQgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZCwgYnV0IE9OTFkgaWYgdGhlIDY0Yml0cyBpbnRlZ2VyIHJlYWQgZnJvbVxuICAgICAgICAgICAgdGhlIHppcCBmaWxlIGNhbiBmaXQgaW50byBhIDMyYml0cyBpbnRlZ2VyLiBUaGlzIGNhbm5vdCBiZSBzb2x2ZWQgOiBKYXZhc2NyaXB0IHJlcHJlc2VudHNcbiAgICAgICAgICAgIGFsbCBudW1iZXJzIGFzIDY0LWJpdCBkb3VibGUgcHJlY2lzaW9uIElFRUUgNzU0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMuXG4gICAgICAgICAgICBTbywgd2UgaGF2ZSA1M2JpdHMgZm9yIGludGVnZXJzIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMgdHJlYXQgZXZlcnl0aGluZyBhcyAzMmJpdHMuXG4gICAgICAgICAgICBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvQml0d2lzZV9PcGVyYXRvcnNcbiAgICAgICAgICAgIGFuZCBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRUNNQS0yNjIucGRmIHNlY3Rpb24gOC41XG4gICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAvLyBzaG91bGQgbG9vayBmb3IgYSB6aXA2NCBFT0NEIGxvY2F0b3JcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKTtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNhbid0IGZpbmQgdGhlIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgob2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3IoKTtcblxuICAgICAgICAgICAgLy8gbm93IHRoZSB6aXA2NCBFT0NEIHJlY29yZFxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2lnbmF0dXJlKHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciwgc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCkpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgbm90IHdoZXJlIGV4cGVjdGVkLlwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIgPSB0aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY2FuJ3QgZmluZCB0aGUgWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcik7XG4gICAgICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICAgICAgdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5jZW50cmFsRGlyT2Zmc2V0ICsgdGhpcy5jZW50cmFsRGlyU2l6ZTtcbiAgICAgICAgaWYgKHRoaXMuemlwNjQpIHtcbiAgICAgICAgICAgIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0ICs9IDIwOyAvLyBlbmQgb2YgY2VudHJhbCBkaXIgNjQgbG9jYXRvclxuICAgICAgICAgICAgZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQgKz0gMTIgLyogc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBsZWFkaW5nIDEyIGJ5dGVzICovICsgdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXh0cmFCeXRlcyA9IGVuZE9mQ2VudHJhbERpck9mZnNldCAtIGV4cGVjdGVkRW5kT2ZDZW50cmFsRGlyT2Zmc2V0O1xuXG4gICAgICAgIGlmIChleHRyYUJ5dGVzID4gMCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKGV4dHJhQnl0ZXMsIFwiZXh0cmEgYnl0ZXMgYXQgYmVnaW5uaW5nIG9yIHdpdGhpbiB6aXBmaWxlXCIpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaWduYXR1cmUoZW5kT2ZDZW50cmFsRGlyT2Zmc2V0LCBzaWcuQ0VOVFJBTF9GSUxFX0hFQURFUikpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgb2Zmc2V0cyBzZWVtIHdyb25nLCBidXQgd2UgaGF2ZSBzb21ldGhpbmcgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuXG4gICAgICAgICAgICAgICAgLy8gU2/igKYgd2Uga2VlcCBpdC5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIG9mZnNldCBpcyB3cm9uZywgdXBkYXRlIHRoZSBcInplcm9cIiBvZiB0aGUgcmVhZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIGlmIGRhdGEgaGFzIGJlZW4gcHJlcGVuZGVkIChjcnggZmlsZXMgZm9yIGV4YW1wbGUpXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkZXIuemVybyA9IGV4dHJhQnl0ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXA6IG1pc3NpbmcgXCIgKyBNYXRoLmFicyhleHRyYUJ5dGVzKSArIFwiIGJ5dGVzLlwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcHJlcGFyZVJlYWRlcjogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlckZvcihkYXRhKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgYSB6aXAgZmlsZSBhbmQgY3JlYXRlIFppcEVudHJpZXMuXG4gICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGJpbmFyeSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgemlwIGZpbGUuXG4gICAgICovXG4gICAgbG9hZDogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB0aGlzLnByZXBhcmVSZWFkZXIoZGF0YSk7XG4gICAgICAgIHRoaXMucmVhZEVuZE9mQ2VudHJhbCgpO1xuICAgICAgICB0aGlzLnJlYWRDZW50cmFsRGlyKCk7XG4gICAgICAgIHRoaXMucmVhZExvY2FsRmlsZXMoKTtcbiAgICB9XG59O1xuLy8gfX19IGVuZCBvZiBaaXBFbnRyaWVzXG5tb2R1bGUuZXhwb3J0cyA9IFppcEVudHJpZXM7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVhZGVyRm9yID0gcmVxdWlyZSgnLi9yZWFkZXIvcmVhZGVyRm9yJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgQ29tcHJlc3NlZE9iamVjdCA9IHJlcXVpcmUoJy4vY29tcHJlc3NlZE9iamVjdCcpO1xudmFyIGNyYzMyZm4gPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIGNvbXByZXNzaW9ucyA9IHJlcXVpcmUoJy4vY29tcHJlc3Npb25zJyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuXG52YXIgTUFERV9CWV9ET1MgPSAweDAwO1xudmFyIE1BREVfQllfVU5JWCA9IDB4MDM7XG5cbi8qKlxuICogRmluZCBhIGNvbXByZXNzaW9uIHJlZ2lzdGVyZWQgaW4gSlNaaXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcHJlc3Npb25NZXRob2QgdGhlIG1ldGhvZCBtYWdpYyB0byBmaW5kLlxuICogQHJldHVybiB7T2JqZWN0fG51bGx9IHRoZSBKU1ppcCBjb21wcmVzc2lvbiBvYmplY3QsIG51bGwgaWYgbm9uZSBmb3VuZC5cbiAqL1xudmFyIGZpbmRDb21wcmVzc2lvbiA9IGZ1bmN0aW9uKGNvbXByZXNzaW9uTWV0aG9kKSB7XG4gICAgZm9yICh2YXIgbWV0aG9kIGluIGNvbXByZXNzaW9ucykge1xuICAgICAgICBpZiAoIWNvbXByZXNzaW9ucy5oYXNPd25Qcm9wZXJ0eShtZXRob2QpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHJlc3Npb25zW21ldGhvZF0ubWFnaWMgPT09IGNvbXByZXNzaW9uTWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcHJlc3Npb25zW21ldGhvZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG4vLyBjbGFzcyBaaXBFbnRyeSB7e3tcbi8qKlxuICogQW4gZW50cnkgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9mIHRoZSBjdXJyZW50IGZpbGUuXG4gKiBAcGFyYW0ge09iamVjdH0gbG9hZE9wdGlvbnMgT3B0aW9ucyBmb3IgbG9hZGluZyB0aGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBaaXBFbnRyeShvcHRpb25zLCBsb2FkT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5sb2FkT3B0aW9ucyA9IGxvYWRPcHRpb25zO1xufVxuWmlwRW50cnkucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIHNheSBpZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZmlsZSBpcyBlbmNyeXB0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc0VuY3J5cHRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGJpdCAxIGlzIHNldFxuICAgICAgICByZXR1cm4gKHRoaXMuYml0RmxhZyAmIDB4MDAwMSkgPT09IDB4MDAwMTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIHNheSBpZiB0aGUgZmlsZSBoYXMgdXRmLTggZmlsZW5hbWUvY29tbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBmaWxlbmFtZS9jb21tZW50IGlzIGluIHV0Zi04LCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgdXNlVVRGODogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIGJpdCAxMSBpcyBzZXRcbiAgICAgICAgcmV0dXJuICh0aGlzLmJpdEZsYWcgJiAweDA4MDApID09PSAweDA4MDA7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBsb2NhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkTG9jYWxQYXJ0OiBmdW5jdGlvbihyZWFkZXIpIHtcbiAgICAgICAgdmFyIGNvbXByZXNzaW9uLCBsb2NhbEV4dHJhRmllbGRzTGVuZ3RoO1xuXG4gICAgICAgIC8vIHdlIGFscmVhZHkga25vdyBldmVyeXRoaW5nIGZyb20gdGhlIGNlbnRyYWwgZGlyICFcbiAgICAgICAgLy8gSWYgdGhlIGNlbnRyYWwgZGlyIGRhdGEgYXJlIGZhbHNlLCB3ZSBhcmUgZG9vbWVkLlxuICAgICAgICAvLyBPbiB0aGUgYnJpZ2h0IHNpZGUsIHRoZSBsb2NhbCBwYXJ0IGlzIHNjYXJ5ICA6IHppcDY0LCBkYXRhIGRlc2NyaXB0b3JzLCBib3RoLCBldGMuXG4gICAgICAgIC8vIFRoZSBsZXNzIGRhdGEgd2UgZ2V0IGhlcmUsIHRoZSBtb3JlIHJlbGlhYmxlIHRoaXMgc2hvdWxkIGJlLlxuICAgICAgICAvLyBMZXQncyBza2lwIHRoZSB3aG9sZSBoZWFkZXIgYW5kIGRhc2ggdG8gdGhlIGRhdGEgIVxuICAgICAgICByZWFkZXIuc2tpcCgyMik7XG4gICAgICAgIC8vIGluIHNvbWUgemlwIGNyZWF0ZWQgb24gd2luZG93cywgdGhlIGZpbGVuYW1lIHN0b3JlZCBpbiB0aGUgY2VudHJhbCBkaXIgY29udGFpbnMgXFwgaW5zdGVhZCBvZiAvLlxuICAgICAgICAvLyBTdHJhbmdlbHksIHRoZSBmaWxlbmFtZSBoZXJlIGlzIE9LLlxuICAgICAgICAvLyBJIHdvdWxkIGxvdmUgdG8gdHJlYXQgdGhlc2UgemlwIGZpbGVzIGFzIGNvcnJ1cHRlZCAoc2VlIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL0ZBUS5odG1sI2JhY2tzbGFzaGVzXG4gICAgICAgIC8vIG9yIEFQUE5PVEUjNC40LjE3LjEsIFwiQWxsIHNsYXNoZXMgTVVTVCBiZSBmb3J3YXJkIHNsYXNoZXMgJy8nXCIpIGJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2YgYmFkIHppcCBnZW5lcmF0b3JzLi4uXG4gICAgICAgIC8vIFNlYXJjaCBcInVuemlwIG1pc21hdGNoaW5nIFwibG9jYWxcIiBmaWxlbmFtZSBjb250aW51aW5nIHdpdGggXCJjZW50cmFsXCIgZmlsZW5hbWUgdmVyc2lvblwiIG9uXG4gICAgICAgIC8vIHRoZSBpbnRlcm5ldC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSSB0aGluayBJIHNlZSB0aGUgbG9naWMgaGVyZSA6IHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGRpc3BsYXlcbiAgICAgICAgLy8gY29udGVudCBhbmQgdGhlIGxvY2FsIGRpcmVjdG9yeSBpcyB1c2VkIHRvIGV4dHJhY3QgdGhlIGZpbGVzLiBNaXhpbmcgLyBhbmQgXFxcbiAgICAgICAgLy8gbWF5IGJlIHVzZWQgdG8gZGlzcGxheSBcXCB0byB3aW5kb3dzIHVzZXJzIGFuZCB1c2UgLyB3aGVuIGV4dHJhY3RpbmcgdGhlIGZpbGVzLlxuICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIGxlYWQgYWxzbyB0byBzb21lIGlzc3VlcyA6IGh0dHA6Ly9zZWNsaXN0cy5vcmcvZnVsbGRpc2Nsb3N1cmUvMjAwOS9TZXAvMzk0XG4gICAgICAgIHRoaXMuZmlsZU5hbWVMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgbG9jYWxFeHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpOyAvLyBjYW4ndCBiZSBzdXJlIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgY2VudHJhbCBkaXJcbiAgICAgICAgLy8gdGhlIGZpbGVOYW1lIGlzIHN0b3JlZCBhcyBiaW5hcnkgZGF0YSwgdGhlIGhhbmRsZVVURjggbWV0aG9kIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBlbmNvZGluZy5cbiAgICAgICAgdGhpcy5maWxlTmFtZSA9IHJlYWRlci5yZWFkRGF0YSh0aGlzLmZpbGVOYW1lTGVuZ3RoKTtcbiAgICAgICAgcmVhZGVyLnNraXAobG9jYWxFeHRyYUZpZWxkc0xlbmd0aCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3NlZFNpemUgPT09IC0xIHx8IHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZyBvciBjb3JydXB0ZWQgemlwIDogZGlkbid0IGdldCBlbm91Z2ggaW5mb3JtYXRpb25zIGZyb20gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IFwiICsgXCIoY29tcHJlc3NlZFNpemUgPT09IC0xIHx8IHVuY29tcHJlc3NlZFNpemUgPT09IC0xKVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXByZXNzaW9uID0gZmluZENvbXByZXNzaW9uKHRoaXMuY29tcHJlc3Npb25NZXRob2QpO1xuICAgICAgICBpZiAoY29tcHJlc3Npb24gPT09IG51bGwpIHsgLy8gbm8gY29tcHJlc3Npb24gZm91bmRcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjb21wcmVzc2lvbiBcIiArIHV0aWxzLnByZXR0eSh0aGlzLmNvbXByZXNzaW9uTWV0aG9kKSArIFwiIHVua25vd24gKGlubmVyIGZpbGUgOiBcIiArIHV0aWxzLnRyYW5zZm9ybVRvKFwic3RyaW5nXCIsIHRoaXMuZmlsZU5hbWUpICsgXCIpXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVjb21wcmVzc2VkID0gbmV3IENvbXByZXNzZWRPYmplY3QodGhpcy5jb21wcmVzc2VkU2l6ZSwgdGhpcy51bmNvbXByZXNzZWRTaXplLCB0aGlzLmNyYzMyLCBjb21wcmVzc2lvbiwgcmVhZGVyLnJlYWREYXRhKHRoaXMuY29tcHJlc3NlZFNpemUpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkQ2VudHJhbFBhcnQ6IGZ1bmN0aW9uKHJlYWRlcikge1xuICAgICAgICB0aGlzLnZlcnNpb25NYWRlQnkgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgcmVhZGVyLnNraXAoMik7XG4gICAgICAgIC8vIHRoaXMudmVyc2lvbk5lZWRlZCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmJpdEZsYWcgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5jb21wcmVzc2lvbk1ldGhvZCA9IHJlYWRlci5yZWFkU3RyaW5nKDIpO1xuICAgICAgICB0aGlzLmRhdGUgPSByZWFkZXIucmVhZERhdGUoKTtcbiAgICAgICAgdGhpcy5jcmMzMiA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB2YXIgZmlsZU5hbWVMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5leHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmZpbGVDb21tZW50TGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza051bWJlclN0YXJ0ID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy5sb2NhbEhlYWRlck9mZnNldCA9IHJlYWRlci5yZWFkSW50KDQpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzRW5jcnlwdGVkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuY3J5cHRlZCB6aXAgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aWxsIGJlIHJlYWQgaW4gdGhlIGxvY2FsIHBhcnQsIHNlZSB0aGUgY29tbWVudHMgdGhlcmVcbiAgICAgICAgcmVhZGVyLnNraXAoZmlsZU5hbWVMZW5ndGgpO1xuICAgICAgICB0aGlzLnJlYWRFeHRyYUZpZWxkcyhyZWFkZXIpO1xuICAgICAgICB0aGlzLnBhcnNlWklQNjRFeHRyYUZpZWxkKHJlYWRlcik7XG4gICAgICAgIHRoaXMuZmlsZUNvbW1lbnQgPSByZWFkZXIucmVhZERhdGEodGhpcy5maWxlQ29tbWVudExlbmd0aCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgYW5kIGdldCB0aGUgdW5peC9kb3MgcGVybWlzc2lvbnMuXG4gICAgICovXG4gICAgcHJvY2Vzc0F0dHJpYnV0ZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSBudWxsO1xuICAgICAgICB0aGlzLmRvc1Blcm1pc3Npb25zID0gbnVsbDtcbiAgICAgICAgdmFyIG1hZGVCeSA9IHRoaXMudmVyc2lvbk1hZGVCeSA+PiA4O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgdGhlIERPUyBkaXJlY3RvcnkgZmxhZyBzZXQuXG4gICAgICAgIC8vIFdlIGxvb2sgZm9yIGl0IGluIHRoZSBET1MgYW5kIFVOSVggcGVybWlzc2lvbnNcbiAgICAgICAgLy8gYnV0IHNvbWUgdW5rbm93biBwbGF0Zm9ybSBjb3VsZCBzZXQgaXQgYXMgYSBjb21wYXRpYmlsaXR5IGZsYWcuXG4gICAgICAgIHRoaXMuZGlyID0gdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgwMDEwID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgIGlmKG1hZGVCeSA9PT0gTUFERV9CWV9ET1MpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IDYgYml0cyAoMCB0byA1KVxuICAgICAgICAgICAgdGhpcy5kb3NQZXJtaXNzaW9ucyA9IHRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyAmIDB4M0Y7XG4gICAgICAgIH1cblxuICAgICAgICBpZihtYWRlQnkgPT09IE1BREVfQllfVU5JWCkge1xuICAgICAgICAgICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSAodGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4RkZGRjtcbiAgICAgICAgICAgIC8vIHRoZSBvY3RhbCBwZXJtaXNzaW9ucyBhcmUgaW4gKHRoaXMudW5peFBlcm1pc3Npb25zICYgMHgwMUZGKS50b1N0cmluZyg4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZhaWwgc2FmZSA6IGlmIHRoZSBuYW1lIGVuZHMgd2l0aCBhIC8gaXQgcHJvYmFibHkgbWVhbnMgYSBmb2xkZXJcbiAgICAgICAgaWYgKCF0aGlzLmRpciAmJiB0aGlzLmZpbGVOYW1lU3RyLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgICAgICAgICB0aGlzLmRpciA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgdGhlIFpJUDY0IGV4dHJhIGZpZWxkIGFuZCBtZXJnZSB0aGUgaW5mbyBpbiB0aGUgY3VycmVudCBaaXBFbnRyeS5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICBwYXJzZVpJUDY0RXh0cmFGaWVsZDogZnVuY3Rpb24ocmVhZGVyKSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLmV4dHJhRmllbGRzWzB4MDAwMV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNob3VsZCBiZSBzb21ldGhpbmcsIHByZXBhcmluZyB0aGUgZXh0cmEgcmVhZGVyXG4gICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih0aGlzLmV4dHJhRmllbGRzWzB4MDAwMV0udmFsdWUpO1xuXG4gICAgICAgIC8vIEkgcmVhbGx5IGhvcGUgdGhhdCB0aGVzZSA2NGJpdHMgaW50ZWdlciBjYW4gZml0IGluIDMyIGJpdHMgaW50ZWdlciwgYmVjYXVzZSBqc1xuICAgICAgICAvLyB3b24ndCBsZXQgdXMgaGF2ZSBtb3JlLlxuICAgICAgICBpZiAodGhpcy51bmNvbXByZXNzZWRTaXplID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLnVuY29tcHJlc3NlZFNpemUgPSBleHRyYVJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbXByZXNzZWRTaXplID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXByZXNzZWRTaXplID0gZXh0cmFSZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sb2NhbEhlYWRlck9mZnNldCA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUykge1xuICAgICAgICAgICAgdGhpcy5sb2NhbEhlYWRlck9mZnNldCA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGlza051bWJlclN0YXJ0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2tOdW1iZXJTdGFydCA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGNlbnRyYWwgcGFydCBvZiBhIHppcCBmaWxlIGFuZCBhZGQgdGhlIGluZm8gaW4gdGhpcyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtEYXRhUmVhZGVyfSByZWFkZXIgdGhlIHJlYWRlciB0byB1c2UuXG4gICAgICovXG4gICAgcmVhZEV4dHJhRmllbGRzOiBmdW5jdGlvbihyZWFkZXIpIHtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRlci5pbmRleCArIHRoaXMuZXh0cmFGaWVsZHNMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkSWQsXG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoLFxuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5leHRyYUZpZWxkcykge1xuICAgICAgICAgICAgdGhpcy5leHRyYUZpZWxkcyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHJlYWRlci5pbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgZXh0cmFGaWVsZElkID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWUgPSByZWFkZXIucmVhZERhdGEoZXh0cmFGaWVsZExlbmd0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuZXh0cmFGaWVsZHNbZXh0cmFGaWVsZElkXSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXh0cmFGaWVsZFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBBcHBseSBhbiBVVEY4IHRyYW5zZm9ybWF0aW9uIGlmIG5lZWRlZC5cbiAgICAgKi9cbiAgICBoYW5kbGVVVEY4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGRlY29kZVBhcmFtVHlwZSA9IHN1cHBvcnQudWludDhhcnJheSA/IFwidWludDhhcnJheVwiIDogXCJhcnJheVwiO1xuICAgICAgICBpZiAodGhpcy51c2VVVEY4KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVTdHIgPSB1dGY4LnV0ZjhkZWNvZGUodGhpcy5maWxlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLmZpbGVDb21tZW50U3RyID0gdXRmOC51dGY4ZGVjb2RlKHRoaXMuZmlsZUNvbW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHVwYXRoID0gdGhpcy5maW5kRXh0cmFGaWVsZFVuaWNvZGVQYXRoKCk7XG4gICAgICAgICAgICBpZiAodXBhdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVOYW1lU3RyID0gdXBhdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFTQ0lJIHRleHQgb3IgdW5zdXBwb3J0ZWQgY29kZSBwYWdlXG4gICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lQnl0ZUFycmF5ID0gIHV0aWxzLnRyYW5zZm9ybVRvKGRlY29kZVBhcmFtVHlwZSwgdGhpcy5maWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZVN0ciA9IHRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoZmlsZU5hbWVCeXRlQXJyYXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdWNvbW1lbnQgPSB0aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQoKTtcbiAgICAgICAgICAgIGlmICh1Y29tbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB1Y29tbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQVNDSUkgdGV4dCBvciB1bnN1cHBvcnRlZCBjb2RlIHBhZ2VcbiAgICAgICAgICAgICAgICB2YXIgY29tbWVudEJ5dGVBcnJheSA9ICB1dGlscy50cmFuc2Zvcm1UbyhkZWNvZGVQYXJhbVR5cGUsIHRoaXMuZmlsZUNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB0aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKGNvbW1lbnRCeXRlQXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIHVuaWNvZGUgcGF0aCBkZWNsYXJlZCBpbiB0aGUgZXh0cmEgZmllbGQsIGlmIGFueS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmljb2RlIHBhdGgsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdXBhdGhGaWVsZCA9IHRoaXMuZXh0cmFGaWVsZHNbMHg3MDc1XTtcbiAgICAgICAgaWYgKHVwYXRoRmllbGQpIHtcbiAgICAgICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih1cGF0aEZpZWxkLnZhbHVlKTtcblxuICAgICAgICAgICAgLy8gd3JvbmcgdmVyc2lvblxuICAgICAgICAgICAgaWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGNyYyBvZiB0aGUgZmlsZW5hbWUgY2hhbmdlZCwgdGhpcyBmaWVsZCBpcyBvdXQgb2YgZGF0ZS5cbiAgICAgICAgICAgIGlmIChjcmMzMmZuKHRoaXMuZmlsZU5hbWUpICE9PSBleHRyYVJlYWRlci5yZWFkSW50KDQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1dGY4LnV0ZjhkZWNvZGUoZXh0cmFSZWFkZXIucmVhZERhdGEodXBhdGhGaWVsZC5sZW5ndGggLSA1KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIHVuaWNvZGUgY29tbWVudCBkZWNsYXJlZCBpbiB0aGUgZXh0cmEgZmllbGQsIGlmIGFueS5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRoZSB1bmljb2RlIGNvbW1lbnQsIG51bGwgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdWNvbW1lbnRGaWVsZCA9IHRoaXMuZXh0cmFGaWVsZHNbMHg2Mzc1XTtcbiAgICAgICAgaWYgKHVjb21tZW50RmllbGQpIHtcbiAgICAgICAgICAgIHZhciBleHRyYVJlYWRlciA9IHJlYWRlckZvcih1Y29tbWVudEZpZWxkLnZhbHVlKTtcblxuICAgICAgICAgICAgLy8gd3JvbmcgdmVyc2lvblxuICAgICAgICAgICAgaWYgKGV4dHJhUmVhZGVyLnJlYWRJbnQoMSkgIT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGNyYyBvZiB0aGUgY29tbWVudCBjaGFuZ2VkLCB0aGlzIGZpZWxkIGlzIG91dCBvZiBkYXRlLlxuICAgICAgICAgICAgaWYgKGNyYzMyZm4odGhpcy5maWxlQ29tbWVudCkgIT09IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHV0ZjgudXRmOGRlY29kZShleHRyYVJlYWRlci5yZWFkRGF0YSh1Y29tbWVudEZpZWxkLmxlbmd0aCAtIDUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBaaXBFbnRyeTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFN0cmVhbUhlbHBlciA9IHJlcXVpcmUoJy4vc3RyZWFtL1N0cmVhbUhlbHBlcicpO1xudmFyIERhdGFXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhV29ya2VyJyk7XG52YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIENvbXByZXNzZWRPYmplY3QgPSByZXF1aXJlKCcuL2NvbXByZXNzZWRPYmplY3QnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIEEgc2ltcGxlIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlIGluIHRoZSB6aXAgZmlsZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBkYXRhXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyBvZiB0aGUgZmlsZVxuICovXG52YXIgWmlwT2JqZWN0ID0gZnVuY3Rpb24obmFtZSwgZGF0YSwgb3B0aW9ucykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kaXIgPSBvcHRpb25zLmRpcjtcbiAgICB0aGlzLmRhdGUgPSBvcHRpb25zLmRhdGU7XG4gICAgdGhpcy5jb21tZW50ID0gb3B0aW9ucy5jb21tZW50O1xuICAgIHRoaXMudW5peFBlcm1pc3Npb25zID0gb3B0aW9ucy51bml4UGVybWlzc2lvbnM7XG4gICAgdGhpcy5kb3NQZXJtaXNzaW9ucyA9IG9wdGlvbnMuZG9zUGVybWlzc2lvbnM7XG5cbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl9kYXRhQmluYXJ5ID0gb3B0aW9ucy5iaW5hcnk7XG4gICAgLy8ga2VlcCBvbmx5IHRoZSBjb21wcmVzc2lvblxuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgY29tcHJlc3Npb24gOiBvcHRpb25zLmNvbXByZXNzaW9uLFxuICAgICAgICBjb21wcmVzc2lvbk9wdGlvbnMgOiBvcHRpb25zLmNvbXByZXNzaW9uT3B0aW9uc1xuICAgIH07XG59O1xuXG5aaXBPYmplY3QucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBpbnRlcm5hbCBzdHJlYW0gZm9yIHRoZSBjb250ZW50IG9mIHRoaXMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIGVhY2ggY2h1bmsuXG4gICAgICogQHJldHVybiBTdHJlYW1IZWxwZXIgdGhlIHN0cmVhbS5cbiAgICAgKi9cbiAgICBpbnRlcm5hbFN0cmVhbTogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIG91dHB1dFR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhciBhc2tVbmljb2RlU3RyaW5nID0gb3V0cHV0VHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBvdXRwdXRUeXBlID09PSBcInRleHRcIjtcbiAgICAgICAgaWYgKG91dHB1dFR5cGUgPT09IFwiYmluYXJ5c3RyaW5nXCIgfHwgb3V0cHV0VHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBcInN0cmluZ1wiO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9kZWNvbXByZXNzV29ya2VyKCk7XG5cbiAgICAgICAgdmFyIGlzVW5pY29kZVN0cmluZyA9ICF0aGlzLl9kYXRhQmluYXJ5O1xuXG4gICAgICAgIGlmIChpc1VuaWNvZGVTdHJpbmcgJiYgIWFza1VuaWNvZGVTdHJpbmcpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5waXBlKG5ldyB1dGY4LlV0ZjhFbmNvZGVXb3JrZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuaWNvZGVTdHJpbmcgJiYgYXNrVW5pY29kZVN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOERlY29kZVdvcmtlcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU3RyZWFtSGVscGVyKHJlc3VsdCwgb3V0cHV0VHlwZSwgXCJcIik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmUgdGhlIGNvbnRlbnQgaW4gdGhlIGFza2VkIHR5cGUuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIHJlc3VsdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblVwZGF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCBpbnRlcm5hbCB1cGRhdGUuXG4gICAgICogQHJldHVybiBQcm9taXNlIHRoZSBwcm9taXNlIG9mIHRoZSByZXN1bHQuXG4gICAgICovXG4gICAgYXN5bmM6IGZ1bmN0aW9uICh0eXBlLCBvblVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFN0cmVhbSh0eXBlKS5hY2N1bXVsYXRlKG9uVXBkYXRlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZSB0aGUgY29udGVudCBhcyBhIG5vZGVqcyBzdHJlYW0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgZWFjaCBjaHVuay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblVwZGF0ZSBhIGZ1bmN0aW9uIHRvIGNhbGwgb24gZWFjaCBpbnRlcm5hbCB1cGRhdGUuXG4gICAgICogQHJldHVybiBTdHJlYW0gdGhlIHN0cmVhbS5cbiAgICAgKi9cbiAgICBub2RlU3RyZWFtOiBmdW5jdGlvbiAodHlwZSwgb25VcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxTdHJlYW0odHlwZSB8fCBcIm5vZGVidWZmZXJcIikudG9Ob2RlanNTdHJlYW0ob25VcGRhdGUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB3b3JrZXIgZm9yIHRoZSBjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb24gdGhlIGNvbXByZXNzaW9uIG9iamVjdCB0byB1c2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbXByZXNzaW9uT3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBjb21wcmVzc2luZy5cbiAgICAgKiBAcmV0dXJuIFdvcmtlciB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIC8vIF9jb21wcmVzc1dvcmtlcjogZnVuY3Rpb24gKGNvbXByZXNzaW9uLCBjb21wcmVzc2lvbk9wdGlvbnMpIHtcbiAgICAvLyAgICAgaWYgKFxuICAgIC8vICAgICAgICAgdGhpcy5fZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QgJiZcbiAgICAvLyAgICAgICAgIHRoaXMuX2RhdGEuY29tcHJlc3Npb24ubWFnaWMgPT09IGNvbXByZXNzaW9uLm1hZ2ljXG4gICAgLy8gICAgICkge1xuICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0Q29tcHJlc3NlZFdvcmtlcigpO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTtcbiAgICAvLyAgICAgICAgIGlmKCF0aGlzLl9kYXRhQmluYXJ5KSB7XG4gICAgLy8gICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOEVuY29kZVdvcmtlcigpKTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIHJldHVybiBDb21wcmVzc2VkT2JqZWN0LmNyZWF0ZVdvcmtlckZyb20ocmVzdWx0LCBjb21wcmVzc2lvbiwgY29tcHJlc3Npb25PcHRpb25zKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH0sXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgd29ya2VyIGZvciB0aGUgZGVjb21wcmVzc2VkIGNvbnRlbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJuIFdvcmtlciB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIF9kZWNvbXByZXNzV29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdldENvbnRlbnRXb3JrZXIoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kYXRhIGluc3RhbmNlb2YgR2VuZXJpY1dvcmtlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGFXb3JrZXIodGhpcy5fZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgcmVtb3ZlZE1ldGhvZHMgPSBbXCJhc1RleHRcIiwgXCJhc0JpbmFyeVwiLCBcImFzTm9kZUJ1ZmZlclwiLCBcImFzVWludDhBcnJheVwiLCBcImFzQXJyYXlCdWZmZXJcIl07XG52YXIgcmVtb3ZlZEZuID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuXCIpO1xufTtcblxuZm9yKHZhciBpID0gMDsgaSA8IHJlbW92ZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgWmlwT2JqZWN0LnByb3RvdHlwZVtyZW1vdmVkTWV0aG9kc1tpXV0gPSByZW1vdmVkRm47XG59XG5tb2R1bGUuZXhwb3J0cyA9IFppcE9iamVjdDtcbiIsIi8vIFRvcCBsZXZlbCBmaWxlIGlzIGp1c3QgYSBtaXhpbiBvZiBzdWJtb2R1bGVzICYgY29uc3RhbnRzXG4ndXNlIHN0cmljdCc7XG5cbnZhciBhc3NpZ24gICAgPSByZXF1aXJlKCcuL2xpYi91dGlscy9jb21tb24nKS5hc3NpZ247XG5cbnZhciBkZWZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9kZWZsYXRlJyk7XG52YXIgaW5mbGF0ZSAgID0gcmVxdWlyZSgnLi9saWIvaW5mbGF0ZScpO1xudmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vbGliL3psaWIvY29uc3RhbnRzJyk7XG5cbnZhciBwYWtvID0ge307XG5cbmFzc2lnbihwYWtvLCBkZWZsYXRlLCBpbmZsYXRlLCBjb25zdGFudHMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBha287XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHpsaWJfZGVmbGF0ZSA9IHJlcXVpcmUoJy4vemxpYi9kZWZsYXRlJyk7XG52YXIgdXRpbHMgICAgICAgID0gcmVxdWlyZSgnLi91dGlscy9jb21tb24nKTtcbnZhciBzdHJpbmdzICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL3N0cmluZ3MnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcblxudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbnZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuXG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cbnZhciBaX0RFRkFVTFRfU1RSQVRFR1kgICAgPSAwO1xuXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qKlxuICogY2xhc3MgRGVmbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2RlZmxhdGVdXSxcbiAqIFtbZGVmbGF0ZVJhd11dIGFuZCBbW2d6aXBdXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIERlZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0RlZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRlbi5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5XG4gKlxuICogQ29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbRGVmbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbRGVmbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pICBvciBpZiB5b3VcbiAqIHB1c2ggYSBjaHVuayB3aXRoIGV4cGxpY2l0IGZsdXNoIChjYWxsIFtbRGVmbGF0ZSNwdXNoXV0gd2l0aFxuICogYFpfU1lOQ19GTFVTSGAgcGFyYW0pLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUuZXJyIC0+IE51bWJlclxuICpcbiAqIEVycm9yIGNvZGUgYWZ0ZXIgZGVmbGF0ZSBmaW5pc2hlZC4gMCAoWl9PSykgb24gc3VjY2Vzcy5cbiAqIFlvdSB3aWxsIG5vdCBuZWVkIGl0IGluIHJlYWwgbGlmZSwgYmVjYXVzZSBkZWZsYXRlIGVycm9yc1xuICogYXJlIHBvc3NpYmxlIG9ubHkgb24gd3Jvbmcgb3B0aW9ucyBvciBiYWQgYG9uRGF0YWAgLyBgb25FbmRgXG4gKiBjdXN0b20gaGFuZGxlcnMuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tEZWZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBEZWZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGRlZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgbGV2ZWxgXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgbWVtTGV2ZWxgXG4gKiAtIGBzdHJhdGVneWBcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGRlZmxhdGVcbiAqIC0gYGd6aXBgIChCb29sZWFuKSAtIGNyZWF0ZSBnemlwIHdyYXBwZXJcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIFwiYmluYXJ5IHN0cmluZ1wiXG4gKiAgICAoZWFjaCBjaGFyIGNvZGUgWzAuLjI1NV0pXG4gKiAtIGBoZWFkZXJgIChPYmplY3QpIC0gY3VzdG9tIGhlYWRlciBmb3IgZ3ppcFxuICogICAtIGB0ZXh0YCAoQm9vbGVhbikgLSB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0XG4gKiAgIC0gYHRpbWVgIChOdW1iZXIpIC0gbW9kaWZpY2F0aW9uIHRpbWUsIHVuaXggdGltZXN0YW1wXG4gKiAgIC0gYG9zYCAoTnVtYmVyKSAtIG9wZXJhdGlvbiBzeXN0ZW0gY29kZVxuICogICAtIGBleHRyYWAgKEFycmF5KSAtIGFycmF5IG9mIGJ5dGVzIHdpdGggZXh0cmEgZGF0YSAobWF4IDY1NTM2KVxuICogICAtIGBuYW1lYCAoU3RyaW5nKSAtIGZpbGUgbmFtZSAoYmluYXJ5IHN0cmluZylcbiAqICAgLSBgY29tbWVudGAgKFN0cmluZykgLSBjb21tZW50IChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBoY3JjYCAoQm9vbGVhbikgLSB0cnVlIGlmIGhlYWRlciBjcmMgc2hvdWxkIGJlIGFkZGVkXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGNodW5rMSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSlcbiAqICAgLCBjaHVuazIgPSBVaW50OEFycmF5KFsxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOV0pO1xuICpcbiAqIHZhciBkZWZsYXRlID0gbmV3IHBha28uRGVmbGF0ZSh7IGxldmVsOiAzfSk7XG4gKlxuICogZGVmbGF0ZS5wdXNoKGNodW5rMSwgZmFsc2UpO1xuICogZGVmbGF0ZS5wdXNoKGNodW5rMiwgdHJ1ZSk7ICAvLyB0cnVlIC0+IGxhc3QgY2h1bmtcbiAqXG4gKiBpZiAoZGVmbGF0ZS5lcnIpIHsgdGhyb3cgbmV3IEVycm9yKGRlZmxhdGUuZXJyKTsgfVxuICpcbiAqIGNvbnNvbGUubG9nKGRlZmxhdGUucmVzdWx0KTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gRGVmbGF0ZShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWZsYXRlKSkgcmV0dXJuIG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIHRoaXMub3B0aW9ucyA9IHV0aWxzLmFzc2lnbih7XG4gICAgbGV2ZWw6IFpfREVGQVVMVF9DT01QUkVTU0lPTixcbiAgICBtZXRob2Q6IFpfREVGTEFURUQsXG4gICAgY2h1bmtTaXplOiAxNjM4NCxcbiAgICB3aW5kb3dCaXRzOiAxNSxcbiAgICBtZW1MZXZlbDogOCxcbiAgICBzdHJhdGVneTogWl9ERUZBVUxUX1NUUkFURUdZLFxuICAgIHRvOiAnJ1xuICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICB2YXIgb3B0ID0gdGhpcy5vcHRpb25zO1xuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+IDApKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmIChvcHQuZ3ppcCAmJiAob3B0LndpbmRvd0JpdHMgPiAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAxNjtcbiAgfVxuXG4gIHRoaXMuZXJyICAgID0gMDsgICAgICAvLyBlcnJvciBjb2RlLCBpZiBoYXBwZW5zICgwID0gWl9PSylcbiAgdGhpcy5tc2cgICAgPSAnJzsgICAgIC8vIGVycm9yIG1lc3NhZ2VcbiAgdGhpcy5lbmRlZCAgPSBmYWxzZTsgIC8vIHVzZWQgdG8gYXZvaWQgbXVsdGlwbGUgb25FbmQoKSBjYWxsc1xuICB0aGlzLmNodW5rcyA9IFtdOyAgICAgLy8gY2h1bmtzIG9mIGNvbXByZXNzZWQgZGF0YVxuXG4gIHRoaXMuc3RybSA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUluaXQyKFxuICAgIHRoaXMuc3RybSxcbiAgICBvcHQubGV2ZWwsXG4gICAgb3B0Lm1ldGhvZCxcbiAgICBvcHQud2luZG93Qml0cyxcbiAgICBvcHQubWVtTGV2ZWwsXG4gICAgb3B0LnN0cmF0ZWd5XG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gWl9PSykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gIH1cblxuICBpZiAob3B0LmhlYWRlcikge1xuICAgIHpsaWJfZGVmbGF0ZS5kZWZsYXRlU2V0SGVhZGVyKHRoaXMuc3RybSwgb3B0LmhlYWRlcik7XG4gIH1cblxuICBpZiAob3B0LmRpY3Rpb25hcnkpIHtcbiAgICB2YXIgZGljdDtcbiAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgaWYgKHR5cGVvZiBvcHQuZGljdGlvbmFyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguXG4gICAgICBkaWN0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKG9wdC5kaWN0aW9uYXJ5KTtcbiAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwob3B0LmRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICBkaWN0ID0gbmV3IFVpbnQ4QXJyYXkob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWN0ID0gb3B0LmRpY3Rpb25hcnk7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSwgZGljdCk7XG5cbiAgICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICAgIH1cblxuICAgIHRoaXMuX2RpY3Rfc2V0ID0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIERlZmxhdGUjcHVzaChkYXRhWywgbW9kZV0pIC0+IEJvb2xlYW5cbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxBcnJheUJ1ZmZlcnxTdHJpbmcpOiBpbnB1dCBkYXRhLiBTdHJpbmdzIHdpbGwgYmVcbiAqICAgY29udmVydGVkIHRvIHV0ZjggYnl0ZSBzZXF1ZW5jZS5cbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFuc2ggWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBkZWZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tEZWZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBjb21wcmVzc2VkIGNodW5rcy4gUmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzcy4gVGhlIGxhc3QgZGF0YSBibG9jayBtdXN0IGhhdmVcbiAqIG1vZGUgWl9GSU5JU0ggKG9yIGB0cnVlYCkuIFRoYXQgd2lsbCBmbHVzaCBpbnRlcm5hbCBwZW5kaW5nIGJ1ZmZlcnMgYW5kIGNhbGxcbiAqIFtbRGVmbGF0ZSNvbkVuZF1dLiBGb3IgaW50ZXJpbSBleHBsaWNpdCBmbHVzaGVzICh3aXRob3V0IGVuZGluZyB0aGUgc3RyZWFtKSB5b3VcbiAqIGNhbiB1c2UgbW9kZSBaX1NZTkNfRkxVU0gsIGtlZXBpbmcgdGhlIGNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbRGVmbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGFycmF5IGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuRGVmbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gWl9GSU5JU0ggOiBaX05PX0ZMVVNIKTtcblxuICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBJZiB3ZSBuZWVkIHRvIGNvbXByZXNzIHRleHQsIGNoYW5nZSBlbmNvZGluZyB0byB1dGY4LlxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZShzdHJtLCBfbW9kZSk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgIT09IFpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBaX0ZJTklTSCB8fCBfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSkpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMub25EYXRhKHN0cmluZ3MuYnVmMmJpbnN0cmluZyh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gd2hpbGUgKChzdHJtLmF2YWlsX2luID4gMCB8fCBzdHJtLmF2YWlsX291dCA9PT0gMCkgJiYgc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQpO1xuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IFpfRklOSVNIKSB7XG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChaX09LKTtcbiAgICBzdHJtLmF2YWlsX291dCA9IDA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBvdXB1dCBkYXRhLiBUeXBlIG9mIGFycmF5IGRlcGVuZHNcbiAqICAgb24ganMgZW5naW5lIHN1cHBvcnQuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsIGVhY2ggY2h1bmtcbiAqICAgd2lsbCBiZSBzdHJpbmcuXG4gKlxuICogQnkgZGVmYXVsdCwgc3RvcmVzIGRhdGEgYmxvY2tzIGluIGBjaHVua3NbXWAgcHJvcGVydHkgYW5kIGdsdWVcbiAqIHRob3NlIGluIGBvbkVuZGAuIE92ZXJyaWRlIHRoaXMgaGFuZGxlciwgaWYgeW91IG5lZWQgYW5vdGhlciBiZWhhdmlvdXIuXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5vbkRhdGEgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG59O1xuXG5cbi8qKlxuICogRGVmbGF0ZSNvbkVuZChzdGF0dXMpIC0+IFZvaWRcbiAqIC0gc3RhdHVzIChOdW1iZXIpOiBkZWZsYXRlIHN0YXR1cy4gMCAoWl9PSykgb24gc3VjY2VzcyxcbiAqICAgb3RoZXIgaWYgbm90LlxuICpcbiAqIENhbGxlZCBvbmNlIGFmdGVyIHlvdSB0ZWxsIGRlZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHV0aWxzLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpO1xuICAgIH1cbiAgfVxuICB0aGlzLmNodW5rcyA9IFtdO1xuICB0aGlzLmVyciA9IHN0YXR1cztcbiAgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnO1xufTtcblxuXG4vKipcbiAqIGRlZmxhdGUoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIENvbXByZXNzIGBkYXRhYCB3aXRoIGRlZmxhdGUgYWxnb3JpdGhtIGFuZCBgb3B0aW9uc2AuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gbGV2ZWxcbiAqIC0gd2luZG93Qml0c1xuICogLSBtZW1MZXZlbFxuICogLSBzdHJhdGVneVxuICogLSBkaWN0aW9uYXJ5XG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgZGF0YSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSk7XG4gKlxuICogY29uc29sZS5sb2cocGFrby5kZWZsYXRlKGRhdGEpKTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgZGVmbGF0b3IgPSBuZXcgRGVmbGF0ZShvcHRpb25zKTtcblxuICBkZWZsYXRvci5wdXNoKGlucHV0LCB0cnVlKTtcblxuICAvLyBUaGF0IHdpbGwgbmV2ZXIgaGFwcGVucywgaWYgeW91IGRvbid0IGNoZWF0IHdpdGggb3B0aW9ucyA6KVxuICBpZiAoZGVmbGF0b3IuZXJyKSB7IHRocm93IGRlZmxhdG9yLm1zZzsgfVxuXG4gIHJldHVybiBkZWZsYXRvci5yZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBkZWZsYXRlUmF3KGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gZGVmbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiBnemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGRlZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2RlZmxhdGVdXSwgYnV0IGNyZWF0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCBvZlxuICogZGVmbGF0ZSBvbmUuXG4gKiovXG5mdW5jdGlvbiBnemlwKGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLmd6aXAgPSB0cnVlO1xuICByZXR1cm4gZGVmbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuZXhwb3J0cy5EZWZsYXRlID0gRGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZSA9IGRlZmxhdGU7XG5leHBvcnRzLmRlZmxhdGVSYXcgPSBkZWZsYXRlUmF3O1xuZXhwb3J0cy5nemlwID0gZ3ppcDtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9pbmZsYXRlID0gcmVxdWlyZSgnLi96bGliL2luZmxhdGUnKTtcbnZhciB1dGlscyAgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL2NvbW1vbicpO1xudmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIGMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9jb25zdGFudHMnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xudmFyIEdaaGVhZGVyICAgICA9IHJlcXVpcmUoJy4vemxpYi9nemhlYWRlcicpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIGNsYXNzIEluZmxhdGVcbiAqXG4gKiBHZW5lcmljIEpTLXN0eWxlIHdyYXBwZXIgZm9yIHpsaWIgY2FsbHMuIElmIHlvdSBkb24ndCBuZWVkXG4gKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNlIG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tpbmZsYXRlXV1cbiAqIGFuZCBbW2luZmxhdGVSYXddXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIGluZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0luZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRlbi5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLnJlc3VsdCAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICpcbiAqIFVuY29tcHJlc3NlZCByZXN1bHQsIGdlbmVyYXRlZCBieSBkZWZhdWx0IFtbSW5mbGF0ZSNvbkRhdGFdXVxuICogYW5kIFtbSW5mbGF0ZSNvbkVuZF1dIGhhbmRsZXJzLiBGaWxsZWQgYWZ0ZXIgeW91IHB1c2ggbGFzdCBjaHVua1xuICogKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoIGBaX0ZJTklTSGAgLyBgdHJ1ZWAgcGFyYW0pIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tJbmZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBpbmZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogU2hvdWxkIGJlIGNoZWNrZWQgaWYgYnJva2VuIGRhdGEgcG9zc2libGUuXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5tc2cgLT4gU3RyaW5nXG4gKlxuICogRXJyb3IgbWVzc2FnZSwgaWYgW1tJbmZsYXRlLmVycl1dICE9IDBcbiAqKi9cblxuXG4vKipcbiAqIG5ldyBJbmZsYXRlKG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIENyZWF0ZXMgbmV3IGluZmxhdG9yIGluc3RhbmNlIHdpdGggc3BlY2lmaWVkIHBhcmFtcy4gVGhyb3dzIGV4Y2VwdGlvblxuICogb24gYmFkIHBhcmFtcy4gU3VwcG9ydGVkIG9wdGlvbnM6XG4gKlxuICogLSBgd2luZG93Qml0c2BcbiAqIC0gYGRpY3Rpb25hcnlgXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UuXG4gKlxuICogQWRkaXRpb25hbCBvcHRpb25zLCBmb3IgaW50ZXJuYWwgbmVlZHM6XG4gKlxuICogLSBgY2h1bmtTaXplYCAtIHNpemUgb2YgZ2VuZXJhdGVkIGRhdGEgY2h1bmtzICgxNksgYnkgZGVmYXVsdClcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gZG8gcmF3IGluZmxhdGVcbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICogQnkgZGVmYXVsdCwgd2hlbiBubyBvcHRpb25zIHNldCwgYXV0b2RldGVjdCBkZWZsYXRlL2d6aXAgZGF0YSBmb3JtYXQgdmlhXG4gKiB3cmFwcGVyIGhlYWRlci5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGluZmxhdGUgPSBuZXcgcGFrby5JbmZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBpbmZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBpbmZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChpbmZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoaW5mbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coaW5mbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBJbmZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGUpKSByZXR1cm4gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDAsXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgLy8gRm9yY2Ugd2luZG93IHNpemUgZm9yIGByYXdgIGRhdGEsIGlmIG5vdCBzZXQgZGlyZWN0bHksXG4gIC8vIGJlY2F1c2Ugd2UgaGF2ZSBubyBoZWFkZXIgZm9yIGF1dG9kZXRlY3QuXG4gIGlmIChvcHQucmF3ICYmIChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgICBpZiAob3B0LndpbmRvd0JpdHMgPT09IDApIHsgb3B0LndpbmRvd0JpdHMgPSAtMTU7IH1cbiAgfVxuXG4gIC8vIElmIGB3aW5kb3dCaXRzYCBub3QgZGVmaW5lZCAoYW5kIG1vZGUgbm90IHJhdykgLSBzZXQgYXV0b2RldGVjdCBmbGFnIGZvciBnemlwL2RlZmxhdGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+PSAwKSAmJiAob3B0LndpbmRvd0JpdHMgPCAxNikgJiZcbiAgICAgICEob3B0aW9ucyAmJiBvcHRpb25zLndpbmRvd0JpdHMpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgKz0gMzI7XG4gIH1cblxuICAvLyBHemlwIGhlYWRlciBoYXMgbm8gaW5mbyBhYm91dCB3aW5kb3dzIHNpemUsIHdlIGNhbiBkbyBhdXRvZGV0ZWN0IG9ubHlcbiAgLy8gZm9yIGRlZmxhdGUuIFNvLCBpZiB3aW5kb3cgc2l6ZSBub3Qgc2V0LCBmb3JjZSBpdCB0byBtYXggd2hlbiBnemlwIHBvc3NpYmxlXG4gIGlmICgob3B0LndpbmRvd0JpdHMgPiAxNSkgJiYgKG9wdC53aW5kb3dCaXRzIDwgNDgpKSB7XG4gICAgLy8gYml0IDMgKDE2KSAtPiBnemlwcGVkIGRhdGFcbiAgICAvLyBiaXQgNCAoMzIpIC0+IGF1dG9kZXRlY3QgZ3ppcC9kZWZsYXRlXG4gICAgaWYgKChvcHQud2luZG93Qml0cyAmIDE1KSA9PT0gMCkge1xuICAgICAgb3B0LndpbmRvd0JpdHMgfD0gMTU7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtICAgPSBuZXcgWlN0cmVhbSgpO1xuICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gMDtcblxuICB2YXIgc3RhdHVzICA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC53aW5kb3dCaXRzXG4gICk7XG5cbiAgaWYgKHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIHRoaXMuaGVhZGVyID0gbmV3IEdaaGVhZGVyKCk7XG5cbiAgemxpYl9pbmZsYXRlLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLCB0aGlzLmhlYWRlcik7XG59XG5cbi8qKlxuICogSW5mbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGFcbiAqIC0gbW9kZSAoTnVtYmVyfEJvb2xlYW4pOiAwLi42IGZvciBjb3JyZXNwb25kaW5nIFpfTk9fRkxVU0guLlpfVFJFRSBtb2Rlcy5cbiAqICAgU2VlIGNvbnN0YW50cy4gU2tpcHBlZCBvciBgZmFsc2VgIG1lYW5zIFpfTk9fRkxVU0gsIGB0cnVlYCBtZWFuc2ggWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBpbmZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tJbmZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBvdXRwdXQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZVxuICogbW9kZSBaX0ZJTklTSCAob3IgYHRydWVgKS4gVGhhdCB3aWxsIGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tJbmZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdVxuICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgZGVjb21wcmVzc2lvbiBjb250ZXh0LlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0luZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIGBVaW50OEFycmF5YCBvbiBpbnB1dCBmb3IgYmVzdCBzcGVlZCAob3V0cHV0XG4gKiBmb3JtYXQgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSkuIEFsc28sIGRvbid0IHNraXAgbGFzdCBwYXJhbSBhbmQgYWx3YXlzXG4gKiB1c2UgdGhlIHNhbWUgdHlwZSBpbiB5b3VyIGNvZGUgKGJvb2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuXG4gKlxuICogRm9yIHJlZ3VsYXIgYEFycmF5YC1zIG1ha2Ugc3VyZSBhbGwgZWxlbWVudHMgYXJlIFswLi4yNTVdLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBwdXNoKGNodW5rLCBmYWxzZSk7IC8vIHB1c2ggb25lIG9mIGRhdGEgY2h1bmtzXG4gKiAuLi5cbiAqIHB1c2goY2h1bmssIHRydWUpOyAgLy8gcHVzaCBsYXN0IGNodW5rXG4gKiBgYGBcbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkge1xuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgdmFyIGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7XG4gIHZhciBkaWN0aW9uYXJ5ID0gdGhpcy5vcHRpb25zLmRpY3Rpb25hcnk7XG4gIHZhciBzdGF0dXMsIF9tb2RlO1xuICB2YXIgbmV4dF9vdXRfdXRmOCwgdGFpbCwgdXRmOHN0cjtcbiAgdmFyIGRpY3Q7XG5cbiAgLy8gRmxhZyB0byBwcm9wZXJseSBwcm9jZXNzIFpfQlVGX0VSUk9SIG9uIHRlc3RpbmcgaW5mbGF0ZSBjYWxsXG4gIC8vIHdoZW4gd2UgY2hlY2sgdGhhdCBhbGwgb3V0cHV0IGRhdGEgd2FzIGZsdXNoZWQuXG4gIHZhciBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG5cbiAgaWYgKHRoaXMuZW5kZWQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IGMuWl9GSU5JU0ggOiBjLlpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIE9ubHkgYmluYXJ5IHN0cmluZ3MgY2FuIGJlIGRlY29tcHJlc3NlZCBvbiBwcmFjdGljZVxuICAgIHN0cm0uaW5wdXQgPSBzdHJpbmdzLmJpbnN0cmluZzJidWYoZGF0YSk7XG4gIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChkYXRhKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgIHN0cm0uaW5wdXQgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJtLmlucHV0ID0gZGF0YTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiA9IDA7XG4gIHN0cm0uYXZhaWxfaW4gPSBzdHJtLmlucHV0Lmxlbmd0aDtcblxuICBkbyB7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBzdHJtLm91dHB1dCA9IG5ldyB1dGlscy5CdWY4KGNodW5rU2l6ZSk7XG4gICAgICBzdHJtLm5leHRfb3V0ID0gMDtcbiAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplO1xuICAgIH1cblxuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlKHN0cm0sIGMuWl9OT19GTFVTSCk7ICAgIC8qIG5vIGJhZCByZXR1cm4gdmFsdWUgKi9cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9ORUVEX0RJQ1QgJiYgZGljdGlvbmFyeSkge1xuICAgICAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICAgICAgaWYgKHR5cGVvZiBkaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBkaWN0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKGRpY3Rpb25hcnkpO1xuICAgICAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRpY3Rpb25hcnkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShkaWN0aW9uYXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpY3QgPSBkaWN0aW9uYXJ5O1xuICAgICAgfVxuXG4gICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IGMuWl9CVUZfRVJST1IgJiYgYWxsb3dCdWZFcnJvciA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdHVzID0gYy5aX09LO1xuICAgICAgYWxsb3dCdWZFcnJvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gYy5aX09LKSB7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RybS5uZXh0X291dCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQgfHwgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgKF9tb2RlID09PSBjLlpfRklOSVNIIHx8IF9tb2RlID09PSBjLlpfU1lOQ19GTFVTSCkpKSB7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcblxuICAgICAgICAgIG5leHRfb3V0X3V0ZjggPSBzdHJpbmdzLnV0Zjhib3JkZXIoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpO1xuXG4gICAgICAgICAgdGFpbCA9IHN0cm0ubmV4dF9vdXQgLSBuZXh0X291dF91dGY4O1xuICAgICAgICAgIHV0ZjhzdHIgPSBzdHJpbmdzLmJ1ZjJzdHJpbmcoc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgpO1xuXG4gICAgICAgICAgLy8gbW92ZSB0YWlsXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHRhaWw7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemUgLSB0YWlsO1xuICAgICAgICAgIGlmICh0YWlsKSB7IHV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LCBzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCwgdGFpbCwgMCk7IH1cblxuICAgICAgICAgIHRoaXMub25EYXRhKHV0ZjhzdHIpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXaGVuIG5vIG1vcmUgaW5wdXQgZGF0YSwgd2Ugc2hvdWxkIGNoZWNrIHRoYXQgaW50ZXJuYWwgaW5mbGF0ZSBidWZmZXJzXG4gICAgLy8gYXJlIGZsdXNoZWQuIFRoZSBvbmx5IHdheSB0byBkbyBpdCB3aGVuIGF2YWlsX291dCA9IDAgLSBydW4gb25lIG1vcmVcbiAgICAvLyBpbmZsYXRlIHBhc3MuIEJ1dCBpZiBvdXRwdXQgZGF0YSBub3QgZXhpc3RzLCBpbmZsYXRlIHJldHVybiBaX0JVRl9FUlJPUi5cbiAgICAvLyBIZXJlIHdlIHNldCBmbGFnIHRvIHByb2Nlc3MgdGhpcyBlcnJvciBwcm9wZXJseS5cbiAgICAvL1xuICAgIC8vIE5PVEUuIERlZmxhdGUgZG9lcyBub3QgcmV0dXJuIGVycm9yIGluIHRoaXMgY2FzZSBhbmQgZG9lcyBub3QgbmVlZHMgc3VjaFxuICAgIC8vIGxvZ2ljLlxuICAgIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gdHJ1ZTtcbiAgICB9XG5cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IGMuWl9TVFJFQU1fRU5EKTtcblxuICBpZiAoc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCkge1xuICAgIF9tb2RlID0gYy5aX0ZJTklTSDtcbiAgfVxuXG4gIC8vIEZpbmFsaXplIG9uIHRoZSBsYXN0IGNodW5rLlxuICBpZiAoX21vZGUgPT09IGMuWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBjLlpfT0s7XG4gIH1cblxuICAvLyBjYWxsYmFjayBpbnRlcmltIHJlc3VsdHMgaWYgWl9TWU5DX0ZMVVNILlxuICBpZiAoX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSB7XG4gICAgdGhpcy5vbkVuZChjLlpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGluZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIGVpdGhlciBhZnRlciB5b3UgdGVsbCBpbmZsYXRlIHRoYXQgdGhlIGlucHV0IHN0cmVhbSBpc1xuICogY29tcGxldGUgKFpfRklOSVNIKSBvciBzaG91bGQgYmUgZmx1c2hlZCAoWl9TWU5DX0ZMVVNIKVxuICogb3IgaWYgYW4gZXJyb3IgaGFwcGVuZWQuIEJ5IGRlZmF1bHQgLSBqb2luIGNvbGxlY3RlZCBjaHVua3MsXG4gKiBmcmVlIG1lbW9yeSBhbmQgZmlsbCBgcmVzdWx0c2AgLyBgZXJyYCBwcm9wZXJ0aWVzLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gIC8vIE9uIHN1Y2Nlc3MgLSBqb2luXG4gIGlmIChzdGF0dXMgPT09IGMuWl9PSykge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBHbHVlICYgY29udmVydCBoZXJlLCB1bnRpbCB3ZSB0ZWFjaCBwYWtvIHRvIHNlbmRcbiAgICAgIC8vIHV0ZjggYWxsaWduZWQgc3RyaW5ncyB0byBvbkRhdGFcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogaW5mbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBEZWNvbXByZXNzIGBkYXRhYCB3aXRoIGluZmxhdGUvdW5nemlwIGFuZCBgb3B0aW9uc2AuIEF1dG9kZXRlY3RcbiAqIGZvcm1hdCB2aWEgd3JhcHBlciBoZWFkZXIgYnkgZGVmYXVsdC4gVGhhdCdzIHdoeSB3ZSBkb24ndCBwcm92aWRlXG4gKiBzZXBhcmF0ZSBgdW5nemlwYCBtZXRob2QuXG4gKlxuICogU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuICpcbiAqIC0gd2luZG93Qml0c1xuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIFN1Z2FyIChvcHRpb25zKTpcbiAqXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIHNheSB0aGF0IHdlIHdvcmsgd2l0aCByYXcgc3RyZWFtLCBpZiB5b3UgZG9uJ3Qgd2lzaCB0byBzcGVjaWZ5XG4gKiAgIG5lZ2F0aXZlIHdpbmRvd0JpdHMgaW1wbGljaXRseS5cbiAqIC0gYHRvYCAoU3RyaW5nKSAtIGlmIGVxdWFsIHRvICdzdHJpbmcnLCB0aGVuIHJlc3VsdCB3aWxsIGJlIGNvbnZlcnRlZFxuICogICBmcm9tIHV0ZjggdG8gdXRmMTYgKGphdmFzY3JpcHQpIHN0cmluZy4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCxcbiAqICAgY2h1bmsgbGVuZ3RoIGNhbiBkaWZmZXIgZnJvbSBgY2h1bmtTaXplYCwgZGVwZW5kaW5nIG9uIGNvbnRlbnQuXG4gKlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBpbnB1dCA9IHBha28uZGVmbGF0ZShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIG91dHB1dDtcbiAqXG4gKiB0cnkge1xuICogICBvdXRwdXQgPSBwYWtvLmluZmxhdGUoaW5wdXQpO1xuICogfSBjYXRjaCAoZXJyKVxuICogICBjb25zb2xlLmxvZyhlcnIpO1xuICogfVxuICogYGBgXG4gKiovXG5mdW5jdGlvbiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBpbmZsYXRvciA9IG5ldyBJbmZsYXRlKG9wdGlvbnMpO1xuXG4gIGluZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChpbmZsYXRvci5lcnIpIHsgdGhyb3cgaW5mbGF0b3IubXNnOyB9XG5cbiAgcmV0dXJuIGluZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGluZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tpbmZsYXRlXV0sIGJ1dCBjcmVhdGVzIHJhdyBkYXRhLCB3aXRob3V0IHdyYXBwZXJcbiAqIChoZWFkZXIgYW5kIGFkbGVyMzIgY3JjKS5cbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGVSYXcoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMucmF3ID0gdHJ1ZTtcbiAgcmV0dXJuIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpO1xufVxuXG5cbi8qKlxuICogdW5nemlwKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIEp1c3Qgc2hvcnRjdXQgdG8gW1tpbmZsYXRlXV0sIGJlY2F1c2UgaXQgYXV0b2RldGVjdHMgZm9ybWF0XG4gKiBieSBoZWFkZXIuY29udGVudC4gRG9uZSBmb3IgY29udmVuaWVuY2UuXG4gKiovXG5cblxuZXhwb3J0cy5JbmZsYXRlID0gSW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVSYXcgPSBpbmZsYXRlUmF3O1xuZXhwb3J0cy51bmd6aXAgID0gaW5mbGF0ZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgVFlQRURfT0sgPSAgKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKTtcblxuXG5leHBvcnRzLmFzc2lnbiA9IGZ1bmN0aW9uIChvYmogLypmcm9tMSwgZnJvbTIsIGZyb20zLCAuLi4qLykge1xuICB2YXIgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHdoaWxlIChzb3VyY2VzLmxlbmd0aCkge1xuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7XG4gICAgaWYgKCFzb3VyY2UpIHsgY29udGludWU7IH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzb3VyY2UgKyAnbXVzdCBiZSBub24tb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcCBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgb2JqW3BdID0gc291cmNlW3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG5cbi8vIHJlZHVjZSBidWZmZXIgc2l6ZSwgYXZvaWRpbmcgbWVtIGNvcHlcbmV4cG9ydHMuc2hyaW5rQnVmID0gZnVuY3Rpb24gKGJ1Ziwgc2l6ZSkge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gc2l6ZSkgeyByZXR1cm4gYnVmOyB9XG4gIGlmIChidWYuc3ViYXJyYXkpIHsgcmV0dXJuIGJ1Zi5zdWJhcnJheSgwLCBzaXplKTsgfVxuICBidWYubGVuZ3RoID0gc2l6ZTtcbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxudmFyIGZuVHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBpZiAoc3JjLnN1YmFycmF5ICYmIGRlc3Quc3ViYXJyYXkpIHtcbiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNfb2Zmcywgc3JjX29mZnMgKyBsZW4pLCBkZXN0X29mZnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBvcmRpbmFyeSBhcnJheVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHZhciBpLCBsLCBsZW4sIHBvcywgY2h1bmssIHJlc3VsdDtcblxuICAgIC8vIGNhbGN1bGF0ZSBkYXRhIGxlbmd0aFxuICAgIGxlbiA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGxlbiArPSBjaHVua3NbaV0ubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIGpvaW4gY2h1bmtzXG4gICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICBwb3MgPSAwO1xuICAgIGZvciAoaSA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjaHVuayA9IGNodW5rc1tpXTtcbiAgICAgIHJlc3VsdC5zZXQoY2h1bmssIHBvcyk7XG4gICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBmblVudHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gICAgfVxuICB9LFxuICAvLyBKb2luIGFycmF5IG9mIGNodW5rcyB0byBzaW5nbGUgYXJyYXkuXG4gIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uIChjaHVua3MpIHtcbiAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBjaHVua3MpO1xuICB9XG59O1xuXG5cbi8vIEVuYWJsZS9EaXNhYmxlIHR5cGVkIGFycmF5cyB1c2UsIGZvciB0ZXN0aW5nXG4vL1xuZXhwb3J0cy5zZXRUeXBlZCA9IGZ1bmN0aW9uIChvbikge1xuICBpZiAob24pIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gVWludDhBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjE2ID0gVWludDE2QXJyYXk7XG4gICAgZXhwb3J0cy5CdWYzMiA9IEludDMyQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5UeXBlZCk7XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5CdWY4ICA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5VbnR5cGVkKTtcbiAgfVxufTtcblxuZXhwb3J0cy5zZXRUeXBlZChUWVBFRF9PSyk7XG4iLCIvLyBTdHJpbmcgZW5jb2RlL2RlY29kZSBoZWxwZXJzXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi9jb21tb24nKTtcblxuXG4vLyBRdWljayBjaGVjayBpZiB3ZSBjYW4gdXNlIGZhc3QgYXJyYXkgdG8gYmluIHN0cmluZyBjb252ZXJzaW9uXG4vL1xuLy8gLSBhcHBseShBcnJheSkgY2FuIGZhaWwgb24gQW5kcm9pZCAyLjJcbi8vIC0gYXBwbHkoVWludDhBcnJheSkgY2FuIGZhaWwgb24gaU9TIDUuMSBTYWZhcnlcbi8vXG52YXIgU1RSX0FQUExZX09LID0gdHJ1ZTtcbnZhciBTVFJfQVBQTFlfVUlBX09LID0gdHJ1ZTtcblxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBbIDAgXSk7IH0gY2F0Y2ggKF9fKSB7IFNUUl9BUFBMWV9PSyA9IGZhbHNlOyB9XG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KDEpKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX1VJQV9PSyA9IGZhbHNlOyB9XG5cblxuLy8gVGFibGUgd2l0aCB1dGY4IGxlbmd0aHMgKGNhbGN1bGF0ZWQgYnkgZmlyc3QgYnl0ZSBvZiBzZXF1ZW5jZSlcbi8vIE5vdGUsIHRoYXQgNSAmIDYtYnl0ZSB2YWx1ZXMgYW5kIHNvbWUgNC1ieXRlIHZhbHVlcyBjYW4gbm90IGJlIHJlcHJlc2VudGVkIGluIEpTLFxuLy8gYmVjYXVzZSBtYXggcG9zc2libGUgY29kZXBvaW50IGlzIDB4MTBmZmZmXG52YXIgX3V0ZjhsZW4gPSBuZXcgdXRpbHMuQnVmOCgyNTYpO1xuZm9yICh2YXIgcSA9IDA7IHEgPCAyNTY7IHErKykge1xuICBfdXRmOGxlbltxXSA9IChxID49IDI1MiA/IDYgOiBxID49IDI0OCA/IDUgOiBxID49IDI0MCA/IDQgOiBxID49IDIyNCA/IDMgOiBxID49IDE5MiA/IDIgOiAxKTtcbn1cbl91dGY4bGVuWzI1NF0gPSBfdXRmOGxlblsyNTRdID0gMTsgLy8gSW52YWxpZCBzZXF1ZW5jZSBzdGFydFxuXG5cbi8vIGNvbnZlcnQgc3RyaW5nIHRvIGFycmF5ICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiwgYywgYzIsIG1fcG9zLCBpLCBzdHJfbGVuID0gc3RyLmxlbmd0aCwgYnVmX2xlbiA9IDA7XG5cbiAgLy8gY291bnQgYmluYXJ5IHNpemVcbiAgZm9yIChtX3BvcyA9IDA7IG1fcG9zIDwgc3RyX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgYnVmX2xlbiArPSBjIDwgMHg4MCA/IDEgOiBjIDwgMHg4MDAgPyAyIDogYyA8IDB4MTAwMDAgPyAzIDogNDtcbiAgfVxuXG4gIC8vIGFsbG9jYXRlIGJ1ZmZlclxuICBidWYgPSBuZXcgdXRpbHMuQnVmOChidWZfbGVuKTtcblxuICAvLyBjb252ZXJ0XG4gIGZvciAoaSA9IDAsIG1fcG9zID0gMDsgaSA8IGJ1Zl9sZW47IG1fcG9zKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHtcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTtcbiAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgIG1fcG9zKys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgIGJ1ZltpKytdID0gYztcbiAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgLyogdHdvIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4QzAgfCAoYyA+Pj4gNik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIC8qIHRocmVlIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4RTAgfCAoYyA+Pj4gMTIpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhmMCB8IChjID4+PiAxOCk7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gMTIgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWY7XG59O1xuXG4vLyBIZWxwZXIgKHVzZWQgaW4gMiBwbGFjZXMpXG5mdW5jdGlvbiBidWYyYmluc3RyaW5nKGJ1ZiwgbGVuKSB7XG4gIC8vIHVzZSBmYWxsYmFjayBmb3IgYmlnIGFycmF5cyB0byBhdm9pZCBzdGFjayBvdmVyZmxvd1xuICBpZiAobGVuIDwgNjU1MzcpIHtcbiAgICBpZiAoKGJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfVUlBX09LKSB8fCAoIWJ1Zi5zdWJhcnJheSAmJiBTVFJfQVBQTFlfT0spKSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB1dGlscy5zaHJpbmtCdWYoYnVmLCBsZW4pKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuLy8gQ29udmVydCBieXRlIGFycmF5IHRvIGJpbmFyeSBzdHJpbmdcbmV4cG9ydHMuYnVmMmJpbnN0cmluZyA9IGZ1bmN0aW9uIChidWYpIHtcbiAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcoYnVmLCBidWYubGVuZ3RoKTtcbn07XG5cblxuLy8gQ29udmVydCBiaW5hcnkgc3RyaW5nICh0eXBlZCwgd2hlbiBwb3NzaWJsZSlcbmV4cG9ydHMuYmluc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgdmFyIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KHN0ci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gYnVmLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYnVmW2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxuLy8gY29udmVydCBhcnJheSB0byBzdHJpbmdcbmV4cG9ydHMuYnVmMnN0cmluZyA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgaSwgb3V0LCBjLCBjX2xlbjtcbiAgdmFyIGxlbiA9IG1heCB8fCBidWYubGVuZ3RoO1xuXG4gIC8vIFJlc2VydmUgbWF4IHBvc3NpYmxlIGxlbmd0aCAoMiB3b3JkcyBwZXIgY2hhcilcbiAgLy8gTkI6IGJ5IHVua25vd24gcmVhc29ucywgQXJyYXkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZm9yXG4gIC8vICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5IHRoYW4gVWludDE2QXJyYXkuXG4gIHZhciB1dGYxNmJ1ZiA9IG5ldyBBcnJheShsZW4gKiAyKTtcblxuICBmb3IgKG91dCA9IDAsIGkgPSAwOyBpIDwgbGVuOykge1xuICAgIGMgPSBidWZbaSsrXTtcbiAgICAvLyBxdWljayBwcm9jZXNzIGFzY2lpXG4gICAgaWYgKGMgPCAweDgwKSB7IHV0ZjE2YnVmW291dCsrXSA9IGM7IGNvbnRpbnVlOyB9XG5cbiAgICBjX2xlbiA9IF91dGY4bGVuW2NdO1xuICAgIC8vIHNraXAgNSAmIDYgYnl0ZSBjb2Rlc1xuICAgIGlmIChjX2xlbiA+IDQpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBpICs9IGNfbGVuIC0gMTsgY29udGludWU7IH1cblxuICAgIC8vIGFwcGx5IG1hc2sgb24gZmlyc3QgYnl0ZVxuICAgIGMgJj0gY19sZW4gPT09IDIgPyAweDFmIDogY19sZW4gPT09IDMgPyAweDBmIDogMHgwNztcbiAgICAvLyBqb2luIHRoZSByZXN0XG4gICAgd2hpbGUgKGNfbGVuID4gMSAmJiBpIDwgbGVuKSB7XG4gICAgICBjID0gKGMgPDwgNikgfCAoYnVmW2krK10gJiAweDNmKTtcbiAgICAgIGNfbGVuLS07XG4gICAgfVxuXG4gICAgLy8gdGVybWluYXRlZCBieSBlbmQgb2Ygc3RyaW5nP1xuICAgIGlmIChjX2xlbiA+IDEpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBjb250aW51ZTsgfVxuXG4gICAgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSBjO1xuICAgIH0gZWxzZSB7XG4gICAgICBjIC09IDB4MTAwMDA7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGQ4MDAgfCAoKGMgPj4gMTApICYgMHgzZmYpO1xuICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkYzAwIHwgKGMgJiAweDNmZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZjJiaW5zdHJpbmcodXRmMTZidWYsIG91dCk7XG59O1xuXG5cbi8vIENhbGN1bGF0ZSBtYXggcG9zc2libGUgcG9zaXRpb24gaW4gdXRmOCBidWZmZXIsXG4vLyB0aGF0IHdpbGwgbm90IGJyZWFrIHNlcXVlbmNlLiBJZiB0aGF0J3Mgbm90IHBvc3NpYmxlXG4vLyAtICh2ZXJ5IHNtYWxsIGxpbWl0cykgcmV0dXJuIG1heCBzaXplIGFzIGlzLlxuLy9cbi8vIGJ1ZltdIC0gdXRmOCBieXRlcyBhcnJheVxuLy8gbWF4ICAgLSBsZW5ndGggbGltaXQgKG1hbmRhdG9yeSk7XG5leHBvcnRzLnV0Zjhib3JkZXIgPSBmdW5jdGlvbiAoYnVmLCBtYXgpIHtcbiAgdmFyIHBvcztcblxuICBtYXggPSBtYXggfHwgYnVmLmxlbmd0aDtcbiAgaWYgKG1heCA+IGJ1Zi5sZW5ndGgpIHsgbWF4ID0gYnVmLmxlbmd0aDsgfVxuXG4gIC8vIGdvIGJhY2sgZnJvbSBsYXN0IHBvc2l0aW9uLCB1bnRpbCBzdGFydCBvZiBzZXF1ZW5jZSBmb3VuZFxuICBwb3MgPSBtYXggLSAxO1xuICB3aGlsZSAocG9zID49IDAgJiYgKGJ1Zltwb3NdICYgMHhDMCkgPT09IDB4ODApIHsgcG9zLS07IH1cblxuICAvLyBGdWNrdXAgLSB2ZXJ5IHNtYWxsIGFuZCBicm9rZW4gc2VxdWVuY2UsXG4gIC8vIHJldHVybiBtYXgsIGJlY2F1c2Ugd2Ugc2hvdWxkIHJldHVybiBzb21ldGhpbmcgYW55d2F5LlxuICBpZiAocG9zIDwgMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgLy8gSWYgd2UgY2FtZSB0byBzdGFydCBvZiBidWZmZXIgLSB0aGF0IG1lYW5zIHZ1ZmZlciBpcyB0b28gc21hbGwsXG4gIC8vIHJldHVybiBtYXggdG9vLlxuICBpZiAocG9zID09PSAwKSB7IHJldHVybiBtYXg7IH1cblxuICByZXR1cm4gKHBvcyArIF91dGY4bGVuW2J1Zltwb3NdXSA+IG1heCkgPyBwb3MgOiBtYXg7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiBhZGxlcjMyIHRha2VzIDEyJSBmb3IgbGV2ZWwgMCBhbmQgMiUgZm9yIGxldmVsIDYuXG4vLyBJdCBkb2Vzbid0IHdvcnRoIHRvIG1ha2UgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25hIGFzIGluIG9yaWdpbmFsLlxuLy8gU21hbGwgc2l6ZSBpcyBwcmVmZXJhYmxlLlxuXG5mdW5jdGlvbiBhZGxlcjMyKGFkbGVyLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciBzMSA9IChhZGxlciAmIDB4ZmZmZikgfDAsXG4gICAgICBzMiA9ICgoYWRsZXIgPj4+IDE2KSAmIDB4ZmZmZikgfDAsXG4gICAgICBuID0gMDtcblxuICB3aGlsZSAobGVuICE9PSAwKSB7XG4gICAgLy8gU2V0IGxpbWl0IH4gdHdpY2UgbGVzcyB0aGFuIDU1NTIsIHRvIGtlZXBcbiAgICAvLyBzMiBpbiAzMS1iaXRzLCBiZWNhdXNlIHdlIGZvcmNlIHNpZ25lZCBpbnRzLlxuICAgIC8vIGluIG90aGVyIGNhc2UgJT0gd2lsbCBmYWlsLlxuICAgIG4gPSBsZW4gPiAyMDAwID8gMjAwMCA6IGxlbjtcbiAgICBsZW4gLT0gbjtcblxuICAgIGRvIHtcbiAgICAgIHMxID0gKHMxICsgYnVmW3BvcysrXSkgfDA7XG4gICAgICBzMiA9IChzMiArIHMxKSB8MDtcbiAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgczEgJT0gNjU1MjE7XG4gICAgczIgJT0gNjU1MjE7XG4gIH1cblxuICByZXR1cm4gKHMxIHwgKHMyIDw8IDE2KSkgfDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBhZGxlcjMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbiAgWl9OT19GTFVTSDogICAgICAgICAwLFxuICBaX1BBUlRJQUxfRkxVU0g6ICAgIDEsXG4gIFpfU1lOQ19GTFVTSDogICAgICAgMixcbiAgWl9GVUxMX0ZMVVNIOiAgICAgICAzLFxuICBaX0ZJTklTSDogICAgICAgICAgIDQsXG4gIFpfQkxPQ0s6ICAgICAgICAgICAgNSxcbiAgWl9UUkVFUzogICAgICAgICAgICA2LFxuXG4gIC8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAgKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gICovXG4gIFpfT0s6ICAgICAgICAgICAgICAgMCxcbiAgWl9TVFJFQU1fRU5EOiAgICAgICAxLFxuICBaX05FRURfRElDVDogICAgICAgIDIsXG4gIFpfRVJSTk86ICAgICAgICAgICAtMSxcbiAgWl9TVFJFQU1fRVJST1I6ICAgIC0yLFxuICBaX0RBVEFfRVJST1I6ICAgICAgLTMsXG4gIC8vWl9NRU1fRVJST1I6ICAgICAtNCxcbiAgWl9CVUZfRVJST1I6ICAgICAgIC01LFxuICAvL1pfVkVSU0lPTl9FUlJPUjogLTYsXG5cbiAgLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4gIFpfTk9fQ09NUFJFU1NJT046ICAgICAgICAgMCxcbiAgWl9CRVNUX1NQRUVEOiAgICAgICAgICAgICAxLFxuICBaX0JFU1RfQ09NUFJFU1NJT046ICAgICAgIDksXG4gIFpfREVGQVVMVF9DT01QUkVTU0lPTjogICAtMSxcblxuXG4gIFpfRklMVEVSRUQ6ICAgICAgICAgICAgICAgMSxcbiAgWl9IVUZGTUFOX09OTFk6ICAgICAgICAgICAyLFxuICBaX1JMRTogICAgICAgICAgICAgICAgICAgIDMsXG4gIFpfRklYRUQ6ICAgICAgICAgICAgICAgICAgNCxcbiAgWl9ERUZBVUxUX1NUUkFURUdZOiAgICAgICAwLFxuXG4gIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbiAgWl9CSU5BUlk6ICAgICAgICAgICAgICAgICAwLFxuICBaX1RFWFQ6ICAgICAgICAgICAgICAgICAgIDEsXG4gIC8vWl9BU0NJSTogICAgICAgICAgICAgICAgMSwgLy8gPSBaX1RFWFQgKGRlcHJlY2F0ZWQpXG4gIFpfVU5LTk9XTjogICAgICAgICAgICAgICAgMixcblxuICAvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbiAgWl9ERUZMQVRFRDogICAgICAgICAgICAgICA4XG4gIC8vWl9OVUxMOiAgICAgICAgICAgICAgICAgbnVsbCAvLyBVc2UgLTEgb3IgbnVsbCBpbmxpbmUsIGRlcGVuZGluZyBvbiB2YXIgdHlwZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogd2UgY2FuJ3QgZ2V0IHNpZ25pZmljYW50IHNwZWVkIGJvb3N0IGhlcmUuXG4vLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzXG4vLyBhbmQgYXJyYXkgdG9vbHMgZGVwZW5kZW5jaWVzLlxuXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgMjU2OyBuKyspIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykge1xuICAgICAgYyA9ICgoYyAmIDEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciB0ID0gY3JjVGFibGUsXG4gICAgICBlbmQgPSBwb3MgKyBsZW47XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjcmMzMjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciB0cmVlcyAgID0gcmVxdWlyZSgnLi90cmVlcycpO1xudmFyIGFkbGVyMzIgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIG1zZyAgICAgPSByZXF1aXJlKCcuL21lc3NhZ2VzJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xudmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xuLy92YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG4vL3ZhciBaX05FRURfRElDVCAgICAgPSAyO1xuLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7XG52YXIgWl9TVFJFQU1fRVJST1IgID0gLTI7XG52YXIgWl9EQVRBX0VSUk9SICAgID0gLTM7XG4vL3ZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG5cbi8qIGNvbXByZXNzaW9uIGxldmVscyAqL1xuLy92YXIgWl9OT19DT01QUkVTU0lPTiAgICAgID0gMDtcbi8vdmFyIFpfQkVTVF9TUEVFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0JFU1RfQ09NUFJFU1NJT04gICAgPSA5O1xudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG5cbnZhciBaX0ZJTFRFUkVEICAgICAgICAgICAgPSAxO1xudmFyIFpfSFVGRk1BTl9PTkxZICAgICAgICA9IDI7XG52YXIgWl9STEUgICAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbi8vdmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG4vL3ZhciBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy92YXIgWl9BU0NJSSAgICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgTUFYX01FTV9MRVZFTCA9IDk7XG4vKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi9cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9NRU1fTEVWRUwgPSA4O1xuXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG52YXIgTF9DT0RFUyAgICAgICA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUztcbi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xudmFyIEhFQVBfU0laRSAgICAgPSAyICogTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xudmFyIE1BWF9CSVRTICA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBNSU5fTUFUQ0ggPSAzO1xudmFyIE1BWF9NQVRDSCA9IDI1ODtcbnZhciBNSU5fTE9PS0FIRUFEID0gKE1BWF9NQVRDSCArIE1JTl9NQVRDSCArIDEpO1xuXG52YXIgUFJFU0VUX0RJQ1QgPSAweDIwO1xuXG52YXIgSU5JVF9TVEFURSA9IDQyO1xudmFyIEVYVFJBX1NUQVRFID0gNjk7XG52YXIgTkFNRV9TVEFURSA9IDczO1xudmFyIENPTU1FTlRfU1RBVEUgPSA5MTtcbnZhciBIQ1JDX1NUQVRFID0gMTAzO1xudmFyIEJVU1lfU1RBVEUgPSAxMTM7XG52YXIgRklOSVNIX1NUQVRFID0gNjY2O1xuXG52YXIgQlNfTkVFRF9NT1JFICAgICAgPSAxOyAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi9cbnZhciBCU19CTE9DS19ET05FICAgICA9IDI7IC8qIGJsb2NrIGZsdXNoIHBlcmZvcm1lZCAqL1xudmFyIEJTX0ZJTklTSF9TVEFSVEVEID0gMzsgLyogZmluaXNoIHN0YXJ0ZWQsIG5lZWQgb25seSBtb3JlIG91dHB1dCBhdCBuZXh0IGRlZmxhdGUgKi9cbnZhciBCU19GSU5JU0hfRE9ORSAgICA9IDQ7IC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi9cblxudmFyIE9TX0NPREUgPSAweDAzOyAvLyBVbml4IDopIC4gRG9uJ3QgZGV0ZWN0LCB1c2UgdGhpcyBkZWZhdWx0LlxuXG5mdW5jdGlvbiBlcnIoc3RybSwgZXJyb3JDb2RlKSB7XG4gIHN0cm0ubXNnID0gbXNnW2Vycm9yQ29kZV07XG4gIHJldHVybiBlcnJvckNvZGU7XG59XG5cbmZ1bmN0aW9uIHJhbmsoZikge1xuICByZXR1cm4gKChmKSA8PCAxKSAtICgoZikgPiA0ID8gOSA6IDApO1xufVxuXG5mdW5jdGlvbiB6ZXJvKGJ1ZikgeyB2YXIgbGVuID0gYnVmLmxlbmd0aDsgd2hpbGUgKC0tbGVuID49IDApIHsgYnVmW2xlbl0gPSAwOyB9IH1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzXG4gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0XG4gKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+b3V0cHV0IGJ1ZmZlciBhbmQgY29weWluZyBpbnRvIGl0LlxuICogKFNlZSBhbHNvIHJlYWRfYnVmKCkpLlxuICovXG5mdW5jdGlvbiBmbHVzaF9wZW5kaW5nKHN0cm0pIHtcbiAgdmFyIHMgPSBzdHJtLnN0YXRlO1xuXG4gIC8vX3RyX2ZsdXNoX2JpdHMocyk7XG4gIHZhciBsZW4gPSBzLnBlbmRpbmc7XG4gIGlmIChsZW4gPiBzdHJtLmF2YWlsX291dCkge1xuICAgIGxlbiA9IHN0cm0uYXZhaWxfb3V0O1xuICB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHMucGVuZGluZ19idWYsIHMucGVuZGluZ19vdXQsIGxlbiwgc3RybS5uZXh0X291dCk7XG4gIHN0cm0ubmV4dF9vdXQgKz0gbGVuO1xuICBzLnBlbmRpbmdfb3V0ICs9IGxlbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gbGVuO1xuICBzdHJtLmF2YWlsX291dCAtPSBsZW47XG4gIHMucGVuZGluZyAtPSBsZW47XG4gIGlmIChzLnBlbmRpbmcgPT09IDApIHtcbiAgICBzLnBlbmRpbmdfb3V0ID0gMDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocywgbGFzdCkge1xuICB0cmVlcy5fdHJfZmx1c2hfYmxvY2socywgKHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSksIHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0LCBsYXN0KTtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIGZsdXNoX3BlbmRpbmcocy5zdHJtKTtcbn1cblxuXG5mdW5jdGlvbiBwdXRfYnl0ZShzLCBiKSB7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci5cbiAqIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzdGF0ZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpblxuICogcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIHB1dFNob3J0TVNCKHMsIGIpIHtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7XG4vLyAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKGIgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiICYgMHhmZjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLCB1cGRhdGUgdGhlIGFkbGVyMzJcbiAqIGFuZCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIEFsbCBkZWZsYXRlKCkgaW5wdXQgZ29lcyB0aHJvdWdoXG4gKiB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdCB0byBhdm9pZFxuICogYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPmlucHV0IGJ1ZmZlciBhbmQgY29weWluZyBmcm9tIGl0LlxuICogKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRfYnVmKHN0cm0sIGJ1Ziwgc3RhcnQsIHNpemUpIHtcbiAgdmFyIGxlbiA9IHN0cm0uYXZhaWxfaW47XG5cbiAgaWYgKGxlbiA+IHNpemUpIHsgbGVuID0gc2l6ZTsgfVxuICBpZiAobGVuID09PSAwKSB7IHJldHVybiAwOyB9XG5cbiAgc3RybS5hdmFpbF9pbiAtPSBsZW47XG5cbiAgLy8gem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7XG4gIHV0aWxzLmFycmF5U2V0KGJ1Ziwgc3RybS5pbnB1dCwgc3RybS5uZXh0X2luLCBsZW4sIHN0YXJ0KTtcbiAgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMSkge1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBlbHNlIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDIpIHtcbiAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiArPSBsZW47XG4gIHN0cm0udG90YWxfaW4gKz0gbGVuO1xuXG4gIHJldHVybiBsZW47XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmRcbiAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCxcbiAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXNcbiAqIGdhcmJhZ2UuXG4gKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50XG4gKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLlxuICovXG5mdW5jdGlvbiBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkge1xuICB2YXIgY2hhaW5fbGVuZ3RoID0gcy5tYXhfY2hhaW5fbGVuZ3RoOyAgICAgIC8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqL1xuICB2YXIgc2NhbiA9IHMuc3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovXG4gIHZhciBtYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi9cbiAgdmFyIGJlc3RfbGVuID0gcy5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqL1xuICB2YXIgbmljZV9tYXRjaCA9IHMubmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqL1xuICB2YXIgbGltaXQgPSAocy5zdHJzdGFydCA+IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSA/XG4gICAgICBzLnN0cnN0YXJ0IC0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgOiAwLypOSUwqLztcblxuICB2YXIgX3dpbiA9IHMud2luZG93OyAvLyBzaG9ydGN1dFxuXG4gIHZhciB3bWFzayA9IHMud19tYXNrO1xuICB2YXIgcHJldiAgPSBzLnByZXY7XG5cbiAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSxcbiAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC5cbiAgICovXG5cbiAgdmFyIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gIHZhciBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgdmFyIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG5cbiAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuXG4gICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICAvLyBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgXCJDb2RlIHRvbyBjbGV2ZXJcIik7XG5cbiAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi9cbiAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7XG4gICAgY2hhaW5fbGVuZ3RoID4+PSAyO1xuICB9XG4gIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnlcbiAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuXG4gICAqL1xuICBpZiAobmljZV9tYXRjaCA+IHMubG9va2FoZWFkKSB7IG5pY2VfbWF0Y2ggPSBzLmxvb2thaGVhZDsgfVxuXG4gIC8vIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsIFwibmVlZCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIC8vIEFzc2VydChjdXJfbWF0Y2ggPCBzLT5zdHJzdGFydCwgXCJubyBmdXR1cmVcIik7XG4gICAgbWF0Y2ggPSBjdXJfbWF0Y2g7XG5cbiAgICAvKiBTa2lwIHRvIG5leHQgbWF0Y2ggaWYgdGhlIG1hdGNoIGxlbmd0aCBjYW5ub3QgaW5jcmVhc2VcbiAgICAgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyLiAgTm90ZSB0aGF0IHRoZSBjaGVja3MgYmVsb3dcbiAgICAgKiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IG9jY3VyIG9jY2FzaW9uYWxseSBmb3IgcGVyZm9ybWFuY2VcbiAgICAgKiByZWFzb25zLiAgVGhlcmVmb3JlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdpbGwgYmUgYWNjZXNzZWQsIGFuZFxuICAgICAqIGNvbmRpdGlvbmFsIGp1bXBzIHdpbGwgYmUgbWFkZSB0aGF0IGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMuXG4gICAgICogSG93ZXZlciB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBsaW1pdGVkIHRvIHRoZSBsb29rYWhlYWQsIHNvXG4gICAgICogdGhlIG91dHB1dCBvZiBkZWZsYXRlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZXMuXG4gICAgICovXG5cbiAgICBpZiAoX3dpblttYXRjaCArIGJlc3RfbGVuXSAgICAgIT09IHNjYW5fZW5kICB8fFxuICAgICAgICBfd2luW21hdGNoICsgYmVzdF9sZW4gLSAxXSAhPT0gc2Nhbl9lbmQxIHx8XG4gICAgICAgIF93aW5bbWF0Y2hdICAgICAgICAgICAgICAgICE9PSBfd2luW3NjYW5dIHx8XG4gICAgICAgIF93aW5bKyttYXRjaF0gICAgICAgICAgICAgICE9PSBfd2luW3NjYW4gKyAxXSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGVcbiAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKVxuICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5XG4gICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdFxuICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LlxuICAgICAqL1xuICAgIHNjYW4gKz0gMjtcbiAgICBtYXRjaCsrO1xuICAgIC8vIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsIFwibWF0Y2hbMl0/XCIpO1xuXG4gICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjtcbiAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC5cbiAgICAgKi9cbiAgICBkbyB7XG4gICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICB9IHdoaWxlIChfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG5cbiAgICAvLyBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG5cbiAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDtcblxuICAgIGlmIChsZW4gPiBiZXN0X2xlbikge1xuICAgICAgcy5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDtcbiAgICAgIGJlc3RfbGVuID0gbGVuO1xuICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc2Nhbl9lbmQxICA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gICAgICBzY2FuX2VuZCAgID0gX3dpbltzY2FuICsgYmVzdF9sZW5dO1xuICAgIH1cbiAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0ICYmIC0tY2hhaW5fbGVuZ3RoICE9PSAwKTtcblxuICBpZiAoYmVzdF9sZW4gPD0gcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gYmVzdF9sZW47XG4gIH1cbiAgcmV0dXJuIHMubG9va2FoZWFkO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC5cbiAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC5cbiAqXG4gKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQURcbiAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFEXG4gKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmVcbiAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sXG4gKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS5cbiAqL1xuZnVuY3Rpb24gZmlsbF93aW5kb3cocykge1xuICB2YXIgX3dfc2l6ZSA9IHMud19zaXplO1xuICB2YXIgcCwgbiwgbSwgbW9yZSwgc3RyO1xuXG4gIC8vQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsIFwiYWxyZWFkeSBlbm91Z2ggbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICBtb3JlID0gcy53aW5kb3dfc2l6ZSAtIHMubG9va2FoZWFkIC0gcy5zdHJzdGFydDtcblxuICAgIC8vIEpTIGludHMgaGF2ZSAzMiBiaXQsIGJsb2NrIGJlbG93IG5vdCBuZWVkZWRcbiAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqL1xuICAgIC8vaWYgKHNpemVvZihpbnQpIDw9IDIpIHtcbiAgICAvLyAgICBpZiAobW9yZSA9PSAwICYmIHMtPnN0cnN0YXJ0ID09IDAgJiYgcy0+bG9va2FoZWFkID09IDApIHtcbiAgICAvLyAgICAgICAgbW9yZSA9IHdzaXplO1xuICAgIC8vXG4gICAgLy8gIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkge1xuICAgIC8vICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWZcbiAgICAvLyAgICAgICAgICogc3Ryc3RhcnQgPT0gMCAmJiBsb29rYWhlYWQgPT0gMSAoaW5wdXQgZG9uZSBhIGJ5dGUgYXQgdGltZSlcbiAgICAvLyAgICAgICAgICovXG4gICAgLy8gICAgICAgIG1vcmUtLTtcbiAgICAvLyAgICB9XG4gICAgLy99XG5cblxuICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsXG4gICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCA+PSBfd19zaXplICsgKF93X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuXG4gICAgICB1dGlscy5hcnJheVNldChzLndpbmRvdywgcy53aW5kb3csIF93X3NpemUsIF93X3NpemUsIDApO1xuICAgICAgcy5tYXRjaF9zdGFydCAtPSBfd19zaXplO1xuICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplO1xuICAgICAgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi9cbiAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTtcblxuICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzXG4gICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDBcbiAgICAgICB0byBrZWVwIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RlbnQgaWYgd2Ugc3dpdGNoIGJhY2sgdG8gbGV2ZWwgPiAwXG4gICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mXG4gICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLilcbiAgICAgICAqL1xuXG4gICAgICBuID0gcy5oYXNoX3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMuaGVhZFstLXBdO1xuICAgICAgICBzLmhlYWRbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG4gPSBfd19zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLnByZXZbLS1wXTtcbiAgICAgICAgcy5wcmV2W3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0XG4gICAgICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuXG4gICAgICAgICAqL1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbW9yZSArPSBfd19zaXplO1xuICAgIH1cbiAgICBpZiAocy5zdHJtLmF2YWlsX2luID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzpcbiAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJlxuICAgICAqICAgIG1vcmUgPT0gd2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydFxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKVxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMlxuICAgICAqIEluIHRoZSBCSUdfTUVNIG9yIE1NQVAgY2FzZSAobm90IHlldCBzdXBwb3J0ZWQpLFxuICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmXG4gICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC5cbiAgICAgKiBPdGhlcndpc2UsIHdpbmRvd19zaXplID09IDIqV1NJWkUgc28gbW9yZSA+PSAyLlxuICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi5cbiAgICAgKi9cbiAgICAvL0Fzc2VydChtb3JlID49IDIsIFwibW9yZSA8IDJcIik7XG4gICAgbiA9IHJlYWRfYnVmKHMuc3RybSwgcy53aW5kb3csIHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCwgbW9yZSk7XG4gICAgcy5sb29rYWhlYWQgKz0gbjtcblxuICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0ID49IE1JTl9NQVRDSCkge1xuICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0O1xuICAgICAgcy5pbnNfaCA9IHMud2luZG93W3N0cl07XG5cbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgMV0pICYgcy5oYXNoX21hc2s7XG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgIENhbGwgdXBkYXRlX2hhc2goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4vLyNlbmRpZlxuICAgICAgd2hpbGUgKHMuaW5zZXJ0KSB7XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgICBzdHIrKztcbiAgICAgICAgcy5pbnNlcnQtLTtcbiAgICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPCBNSU5fTUFUQ0gpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsXG4gICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLlxuICAgICAqL1xuXG4gIH0gd2hpbGUgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLnN0cm0uYXZhaWxfaW4gIT09IDApO1xuXG4gIC8qIElmIHRoZSBXSU5fSU5JVCBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgaGF2ZSBuZXZlciBiZWVuXG4gICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZlxuICAgKiB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgKG9yIHVuaW5pdGlhbGlzZWQgYXMgSnVsaWFuIHdyaXRlcykgYnl0ZXMgYnlcbiAgICogdGhlIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMuICBVcGRhdGUgdGhlIGhpZ2ggd2F0ZXIgbWFyayBmb3IgdGhlIG5leHRcbiAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAqIHJvdXRpbmVzIGFsbG93IHNjYW5uaW5nIHRvIHN0cnN0YXJ0ICsgTUFYX01BVENILCBpZ25vcmluZyBsb29rYWhlYWQuXG4gICAqL1xuLy8gIGlmIChzLmhpZ2hfd2F0ZXIgPCBzLndpbmRvd19zaXplKSB7XG4vLyAgICB2YXIgY3VyciA9IHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZDtcbi8vICAgIHZhciBpbml0ID0gMDtcbi8vXG4vLyAgICBpZiAocy5oaWdoX3dhdGVyIDwgY3Vycikge1xuLy8gICAgICAvKiBQcmV2aW91cyBoaWdoIHdhdGVyIG1hcmsgYmVsb3cgY3VycmVudCBkYXRhIC0tIHplcm8gV0lOX0lOSVRcbi8vICAgICAgICogYnl0ZXMgb3IgdXAgdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gcy53aW5kb3dfc2l6ZSAtIGN1cnI7XG4vLyAgICAgIGlmIChpbml0ID4gV0lOX0lOSVQpXG4vLyAgICAgICAgaW5pdCA9IFdJTl9JTklUO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBjdXJyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgPSBjdXJyICsgaW5pdDtcbi8vICAgIH1cbi8vICAgIGVsc2UgaWYgKHMtPmhpZ2hfd2F0ZXIgPCAodWxnKWN1cnIgKyBXSU5fSU5JVCkge1xuLy8gICAgICAvKiBIaWdoIHdhdGVyIG1hcmsgYXQgb3IgYWJvdmUgY3VycmVudCBkYXRhLCBidXQgYmVsb3cgY3VycmVudCBkYXRhXG4vLyAgICAgICAqIHBsdXMgV0lOX0lOSVQgLS0gemVybyBvdXQgdG8gY3VycmVudCBkYXRhIHBsdXMgV0lOX0lOSVQsIG9yIHVwXG4vLyAgICAgICAqIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLlxuLy8gICAgICAgKi9cbi8vICAgICAgaW5pdCA9ICh1bGcpY3VyciArIFdJTl9JTklUIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgaWYgKGluaXQgPiBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXIpXG4vLyAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcjtcbi8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgcy0+aGlnaF93YXRlciwgKHVuc2lnbmVkKWluaXQpO1xuLy8gICAgICBzLT5oaWdoX3dhdGVyICs9IGluaXQ7XG4vLyAgICB9XG4vLyAgfVxuLy9cbi8vICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQsXG4vLyAgICBcIm5vdCBlbm91Z2ggcm9vbSBmb3Igc2VhcmNoXCIpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgd2l0aG91dCBjb21wcmVzc2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuXG4gKiB0aGUgY3VycmVudCBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IHNpbmNlXG4gKiB1bmNvbXByZXNzaWJsZSBkYXRhIGlzIHByb2JhYmx5IG5vdCB1c2VmdWwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZFxuICogb25seSBmb3IgdGhlIGxldmVsPTAgY29tcHJlc3Npb24gb3B0aW9uLlxuICogTk9URTogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGF2b2lkIGV4dHJhIGNvcHlpbmcgZnJvbVxuICogd2luZG93IHRvIHBlbmRpbmdfYnVmLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3N0b3JlZChzLCBmbHVzaCkge1xuICAvKiBTdG9yZWQgYmxvY2tzIGFyZSBsaW1pdGVkIHRvIDB4ZmZmZiBieXRlcywgcGVuZGluZ19idWYgaXMgbGltaXRlZFxuICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjpcbiAgICovXG4gIHZhciBtYXhfYmxvY2tfc2l6ZSA9IDB4ZmZmZjtcblxuICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7XG4gICAgbWF4X2Jsb2NrX3NpemUgPSBzLnBlbmRpbmdfYnVmX3NpemUgLSA1O1xuICB9XG5cbiAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IDEpIHtcblxuICAgICAgLy9Bc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHxcbiAgICAgIC8vICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsIFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIGlmICghKHMuc3Ryc3RhcnQgPCBzLndfc2l6ZSArIChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIHx8XG4vLyAgICAgICAgcy5ibG9ja19zdGFydCA+PSBzLndfc2l6ZSkpIHtcbi8vICAgICAgICB0aHJvdyAgbmV3IEVycm9yKFwic2xpZGUgdG9vIGxhdGVcIik7XG4vLyAgICAgIH1cblxuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDAgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cblxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG4gICAgLy9Bc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsIFwiYmxvY2sgZ29uZVwiKTtcbi8vICAgIGlmIChzLmJsb2NrX3N0YXJ0IDwgMCkgdGhyb3cgbmV3IEVycm9yKFwiYmxvY2sgZ29uZVwiKTtcblxuICAgIHMuc3Ryc3RhcnQgKz0gcy5sb29rYWhlYWQ7XG4gICAgcy5sb29rYWhlYWQgPSAwO1xuXG4gICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovXG4gICAgdmFyIG1heF9zdGFydCA9IHMuYmxvY2tfc3RhcnQgKyBtYXhfYmxvY2tfc2l6ZTtcblxuICAgIGlmIChzLnN0cnN0YXJ0ID09PSAwIHx8IHMuc3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7XG4gICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqL1xuICAgICAgcy5sb29rYWhlYWQgPSBzLnN0cnN0YXJ0IC0gbWF4X3N0YXJ0O1xuICAgICAgcy5zdHJzdGFydCA9IG1heF9zdGFydDtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG5cblxuICAgIH1cbiAgICAvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWVcbiAgICAgKiBuZWdhdGl2ZSBhbmQgdGhlIGRhdGEgd2lsbCBiZSBnb25lOlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCA+PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cblxuICBzLmluc2VydCA9IDA7XG5cbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG5cbiAgaWYgKHMuc3Ryc3RhcnQgPiBzLmJsb2NrX3N0YXJ0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX05FRURfTU9SRTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wcmVzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSBjdXJyZW50XG4gKiBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBhbmQgaW5zZXJ0c1xuICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0cmluZ3Mgb3IgZm9yIHNob3J0XG4gKiBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfZmFzdChzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgLyogaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlXG4gICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSFxuICAgICAqL1xuICAgIGlmIChoYXNoX2hlYWQgIT09IDAvKk5JTCovICYmICgocy5zdHJzdGFydCAtIGhhc2hfaGVhZCkgPD0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cbiAgICB9XG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy8gY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGgpOyAvLyBmb3IgZGVidWcgb25seVxuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcblxuICAgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgICogaXMgbm90IHRvbyBsYXJnZS4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IHMubWF4X2xhenlfbWF0Y2gvKm1heF9pbnNlcnRfbGVuZ3RoKi8gJiYgcy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmVcbiAgICAgICAgICAgKiBhbHdheXMgTUlOX01BVENIIGJ5dGVzIGFoZWFkLlxuICAgICAgICAgICAqL1xuICAgICAgICB9IHdoaWxlICgtLXMubWF0Y2hfbGVuZ3RoICE9PSAwKTtcbiAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgfSBlbHNlXG4gICAgICB7XG4gICAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICAgICAgcy5pbnNfaCA9IHMud2luZG93W3Muc3Ryc3RhcnRdO1xuICAgICAgICAvKiBVUERBVEVfSEFTSChzLCBzLmluc19oLCBzLndpbmRvd1tzLnN0cnN0YXJ0KzFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4vLyNpZiBNSU5fTUFUQ0ggIT0gM1xuLy8gICAgICAgICAgICAgICAgQ2FsbCBVUERBVEVfSEFTSCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICAgIC8qIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90XG4gICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMud2luZG93W3Muc3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gKChzLnN0cnN0YXJ0IDwgKE1JTl9NQVRDSCAtIDEpKSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxKTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenlcbiAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXNcbiAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAgICAgICAgICAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIHZhciBtYXhfaW5zZXJ0O1xuXG4gIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAvKk5JTCovO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICovXG4gICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoO1xuICAgIHMucHJldl9tYXRjaCA9IHMubWF0Y2hfc3RhcnQ7XG4gICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgcy5wcmV2X2xlbmd0aCA8IHMubWF4X2xhenlfbWF0Y2ggJiZcbiAgICAgICAgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKS8qTUFYX0RJU1QocykqLykge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG5cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSA1ICYmXG4gICAgICAgICAocy5zdHJhdGVneSA9PT0gWl9GSUxURVJFRCB8fCAocy5tYXRjaF9sZW5ndGggPT09IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCA+IDQwOTYvKlRPT19GQVIqLykpKSB7XG5cbiAgICAgICAgLyogSWYgcHJldl9tYXRjaCBpcyBhbHNvIE1JTl9NQVRDSCwgbWF0Y2hfc3RhcnQgaXMgZ2FyYmFnZVxuICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LlxuICAgICAgICAgKi9cbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBhdCB0aGUgcHJldmlvdXMgc3RlcCBhbmQgdGhlIGN1cnJlbnRcbiAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOlxuICAgICAqL1xuICAgIGlmIChzLnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLm1hdGNoX2xlbmd0aCA8PSBzLnByZXZfbGVuZ3RoKSB7XG4gICAgICBtYXhfaW5zZXJ0ID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkIC0gTUlOX01BVENIO1xuICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovXG5cbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydC0xLCBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGgpO1xuXG4gICAgICAvKioqX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7XG4gICAgICAvKiBJbnNlcnQgaW4gaGFzaCB0YWJsZSBhbGwgc3RyaW5ncyB1cCB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaC5cbiAgICAgICAqIHN0cnN0YXJ0LTEgYW5kIHN0cnN0YXJ0IGFyZSBhbHJlYWR5IGluc2VydGVkLiBJZiB0aGVyZSBpcyBub3RcbiAgICAgICAqIGVub3VnaCBsb29rYWhlYWQsIHRoZSBsYXN0IHR3byBzdHJpbmdzIGFyZSBub3QgaW5zZXJ0ZWQgaW5cbiAgICAgICAqIHRoZSBoYXNoIHRhYmxlLlxuICAgICAgICovXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLnByZXZfbGVuZ3RoIC0gMTtcbiAgICAgIHMucHJldl9sZW5ndGggLT0gMjtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKCsrcy5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7XG4gICAgICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgICAgICAvKioqL1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlICgtLXMucHJldl9sZW5ndGggIT09IDApO1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuXG4gICAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgICAgfVxuICAgICAgICAvKioqL1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkge1xuICAgICAgLyogSWYgdGhlcmUgd2FzIG5vIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvbiwgb3V0cHV0IGFcbiAgICAgICAqIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2hcbiAgICAgICAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhlIHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuXG4gICAgICAgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DS19PTkxZKHMsIDApICoqKi9cbiAgICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICAgIC8qKiovXG4gICAgICB9XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvclxuICAgICAgICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChmbHVzaCAhPSBaX05PX0ZMVVNILCBcIm5vIGZsdXNoP1wiKTtcbiAgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydC0xXSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pO1xuXG4gICAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICB9XG4gIHMuaW5zZXJ0ID0gcy5zdHJzdGFydCA8IE1JTl9NQVRDSCAtIDEgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGb3IgWl9STEUsIHNpbXBseSBsb29rIGZvciBydW5zIG9mIGJ5dGVzLCBnZW5lcmF0ZSBtYXRjaGVzIG9ubHkgb2YgZGlzdGFuY2VcbiAqIG9uZS4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuICAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZlxuICogZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gWl9STEUuKVxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3JsZShzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuICB2YXIgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovXG4gIHZhciBzY2FuLCBzdHJlbmQ7ICAgICAgLyogc2NhbiBnb2VzIHVwIHRvIHN0cmVuZCBmb3IgbGVuZ3RoIG9mIHJ1biAqL1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7XG5cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBsb25nZXN0IHJ1biwgcGx1cyBvbmUgZm9yIHRoZSB1bnJvbGxlZCBsb29wLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8PSBNQVhfTUFUQ0gpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7IGJyZWFrOyB9IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuXG4gICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0ID4gMCkge1xuICAgICAgc2NhbiA9IHMuc3Ryc3RhcnQgLSAxO1xuICAgICAgcHJldiA9IF93aW5bc2Nhbl07XG4gICAgICBpZiAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0pIHtcbiAgICAgICAgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgICAgICB9IHdoaWxlIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID4gcy5sb29rYWhlYWQpIHtcbiAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IHMubG9va2FoZWFkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL0Fzc2VydChzY2FuIDw9IHMtPndpbmRvdysodUludCkocy0+d2luZG93X3NpemUtMSksIFwid2lsZCBzY2FuXCIpO1xuICAgIH1cblxuICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBlbWl0IGxpdGVyYWwgKi9cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMuc3Ryc3RhcnQgLSAxLCBzLm1hdGNoX2xlbmd0aCk7XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3QocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gMDtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX0hVRkZNQU5fT05MWSwgZG8gbm90IGxvb2sgZm9yIG1hdGNoZXMuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLlxuICogKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2YgZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gSHVmZm1hbi4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfaHVmZihzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGxpdGVyYWwgdG8gd3JpdGUuICovXG4gICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfTk9fRkxVU0gpIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogT3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IHRyZWVzLl90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG4gICAgcy5sb29rYWhlYWQtLTtcbiAgICBzLnN0cnN0YXJ0Kys7XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvblxuICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvXG4gKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmVcbiAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy5cbiAqL1xuZnVuY3Rpb24gQ29uZmlnKGdvb2RfbGVuZ3RoLCBtYXhfbGF6eSwgbmljZV9sZW5ndGgsIG1heF9jaGFpbiwgZnVuYykge1xuICB0aGlzLmdvb2RfbGVuZ3RoID0gZ29vZF9sZW5ndGg7XG4gIHRoaXMubWF4X2xhenkgPSBtYXhfbGF6eTtcbiAgdGhpcy5uaWNlX2xlbmd0aCA9IG5pY2VfbGVuZ3RoO1xuICB0aGlzLm1heF9jaGFpbiA9IG1heF9jaGFpbjtcbiAgdGhpcy5mdW5jID0gZnVuYztcbn1cblxudmFyIGNvbmZpZ3VyYXRpb25fdGFibGU7XG5cbmNvbmZpZ3VyYXRpb25fdGFibGUgPSBbXG4gIC8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi9cbiAgbmV3IENvbmZpZygwLCAwLCAwLCAwLCBkZWZsYXRlX3N0b3JlZCksICAgICAgICAgIC8qIDAgc3RvcmUgb25seSAqL1xuICBuZXcgQ29uZmlnKDQsIDQsIDgsIDQsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAgLyogMSBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAgLyogMiAqL1xuICBuZXcgQ29uZmlnKDQsIDYsIDMyLCAzMiwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgLyogMyAqL1xuXG4gIG5ldyBDb25maWcoNCwgNCwgMTYsIDE2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAgICAvKiA0IGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAzMiwgMzIsIGRlZmxhdGVfc2xvdyksICAgICAgICAgLyogNSAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNiAqL1xuICBuZXcgQ29uZmlnKDgsIDMyLCAxMjgsIDI1NiwgZGVmbGF0ZV9zbG93KSwgICAgICAgLyogNyAqL1xuICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwgICAgLyogOCAqL1xuICBuZXcgQ29uZmlnKDMyLCAyNTgsIDI1OCwgNDA5NiwgZGVmbGF0ZV9zbG93KSAgICAgLyogOSBtYXggY29tcHJlc3Npb24gKi9cbl07XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSBcImxvbmdlc3QgbWF0Y2hcIiByb3V0aW5lcyBmb3IgYSBuZXcgemxpYiBzdHJlYW1cbiAqL1xuZnVuY3Rpb24gbG1faW5pdChzKSB7XG4gIHMud2luZG93X3NpemUgPSAyICogcy53X3NpemU7XG5cbiAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAvKiBTZXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOlxuICAgKi9cbiAgcy5tYXhfbGF6eV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2xhenk7XG4gIHMuZ29vZF9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZ29vZF9sZW5ndGg7XG4gIHMubmljZV9tYXRjaCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubmljZV9sZW5ndGg7XG4gIHMubWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0ubWF4X2NoYWluO1xuXG4gIHMuc3Ryc3RhcnQgPSAwO1xuICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLmluc2VydCA9IDA7XG4gIHMubWF0Y2hfbGVuZ3RoID0gcy5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgcy5pbnNfaCA9IDA7XG59XG5cblxuZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCkge1xuICB0aGlzLnN0cm0gPSBudWxsOyAgICAgICAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovXG4gIHRoaXMuc3RhdHVzID0gMDsgICAgICAgICAgICAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovXG4gIHRoaXMucGVuZGluZ19idWYgPSBudWxsOyAgICAgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovXG4gIHRoaXMucGVuZGluZ19idWZfc2l6ZSA9IDA7ICAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovXG4gIHRoaXMucGVuZGluZ19vdXQgPSAwOyAgICAgICAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqL1xuICB0aGlzLnBlbmRpbmcgPSAwOyAgICAgICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuZ3poZWFkID0gbnVsbDsgICAgICAgICAvKiBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiB0byB3cml0ZSAqL1xuICB0aGlzLmd6aW5kZXggPSAwOyAgICAgICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi9cbiAgdGhpcy5tZXRob2QgPSBaX0RFRkxBVEVEOyAvKiBjYW4gb25seSBiZSBERUZMQVRFRCAqL1xuICB0aGlzLmxhc3RfZmx1c2ggPSAtMTsgICAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovXG5cbiAgdGhpcy53X3NpemUgPSAwOyAgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovXG4gIHRoaXMud19iaXRzID0gMDsgIC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqL1xuICB0aGlzLndfbWFzayA9IDA7ICAvKiB3X3NpemUgLSAxICovXG5cbiAgdGhpcy53aW5kb3cgPSBudWxsO1xuICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdyxcbiAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemVcbiAgICogYnl0ZXMuIFdpdGggdGhpcyBvcmdhbml6YXRpb24sIG1hdGNoZXMgYXJlIGxpbWl0ZWQgdG8gYSBkaXN0YW5jZSBvZlxuICAgKiB3U2l6ZS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXNcbiAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuXG4gICAqL1xuXG4gIHRoaXMud2luZG93X3NpemUgPSAwO1xuICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlclxuICAgKiBpcyBkaXJlY3RseSB1c2VkIGFzIHNsaWRpbmcgd2luZG93LlxuICAgKi9cblxuICB0aGlzLnByZXYgPSBudWxsO1xuICAvKiBMaW5rIHRvIG9sZGVyIHN0cmluZyB3aXRoIHNhbWUgaGFzaCBpbmRleC4gVG8gbGltaXQgdGhlIHNpemUgb2YgdGhpc1xuICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLlxuICAgKiBBbiBpbmRleCBpbiB0aGlzIGFycmF5IGlzIHRodXMgYSB3aW5kb3cgaW5kZXggbW9kdWxvIDMySy5cbiAgICovXG5cbiAgdGhpcy5oZWFkID0gbnVsbDsgICAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqL1xuXG4gIHRoaXMuaW5zX2ggPSAwOyAgICAgICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqL1xuICB0aGlzLmhhc2hfc2l6ZSA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi9cbiAgdGhpcy5oYXNoX2JpdHMgPSAwOyAgIC8qIGxvZzIoaGFzaF9zaXplKSAqL1xuICB0aGlzLmhhc2hfbWFzayA9IDA7ICAgLyogaGFzaF9zaXplLTEgKi9cblxuICB0aGlzLmhhc2hfc2hpZnQgPSAwO1xuICAvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dFxuICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3RcbiAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6XG4gICAqICAgaGFzaF9zaGlmdCAqIE1JTl9NQVRDSCA+PSBoYXNoX2JpdHNcbiAgICovXG5cbiAgdGhpcy5ibG9ja19zdGFydCA9IDA7XG4gIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0c1xuICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLlxuICAgKi9cblxuICB0aGlzLm1hdGNoX2xlbmd0aCA9IDA7ICAgICAgLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi9cbiAgdGhpcy5wcmV2X21hdGNoID0gMDsgICAgICAgIC8qIHByZXZpb3VzIG1hdGNoICovXG4gIHRoaXMubWF0Y2hfYXZhaWxhYmxlID0gMDsgICAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovXG4gIHRoaXMuc3Ryc3RhcnQgPSAwOyAgICAgICAgICAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovXG4gIHRoaXMubWF0Y2hfc3RhcnQgPSAwOyAgICAgICAvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi9cbiAgdGhpcy5sb29rYWhlYWQgPSAwOyAgICAgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi9cblxuICB0aGlzLnByZXZfbGVuZ3RoID0gMDtcbiAgLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzXG4gICAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLlxuICAgKi9cblxuICB0aGlzLm1heF9jaGFpbl9sZW5ndGggPSAwO1xuICAvKiBUbyBzcGVlZCB1cCBkZWZsYXRpb24sIGhhc2ggY2hhaW5zIGFyZSBuZXZlciBzZWFyY2hlZCBiZXlvbmQgdGhpc1xuICAgKiBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlXG4gICAqIHNwZWVkLlxuICAgKi9cblxuICB0aGlzLm1heF9sYXp5X21hdGNoID0gMDtcbiAgLyogQXR0ZW1wdCB0byBmaW5kIGEgYmV0dGVyIG1hdGNoIG9ubHkgd2hlbiB0aGUgY3VycmVudCBtYXRjaCBpcyBzdHJpY3RseVxuICAgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvblxuICAgKiBsZXZlbHMgPj0gNC5cbiAgICovXG4gIC8vIFRoYXQncyBhbGlhcyB0byBtYXhfbGF6eV9tYXRjaCwgZG9uJ3QgdXNlIGRpcmVjdGx5XG4gIC8vdGhpcy5tYXhfaW5zZXJ0X2xlbmd0aCA9IDA7XG4gIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbm90XG4gICAqIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy5cbiAgICovXG5cbiAgdGhpcy5sZXZlbCA9IDA7ICAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAoMS4uOSkgKi9cbiAgdGhpcy5zdHJhdGVneSA9IDA7ICAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovXG5cbiAgdGhpcy5nb29kX21hdGNoID0gMDtcbiAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovXG5cbiAgdGhpcy5uaWNlX21hdGNoID0gMDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqL1xuXG4gICAgICAgICAgICAgIC8qIHVzZWQgYnkgdHJlZXMuYzogKi9cblxuICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5nICovXG5cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fbHRyZWVbSEVBUF9TSVpFXTsgICAvKiBsaXRlcmFsIGFuZCBsZW5ndGggdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovXG5cbiAgLy8gVXNlIGZsYXQgYXJyYXkgb2YgRE9VQkxFIHNpemUsIHdpdGggaW50ZXJsZWF2ZWQgZmF0YSxcbiAgLy8gYmVjYXVzZSBKUyBkb2VzIG5vdCBzdXBwb3J0IGVmZmVjdGl2ZVxuICB0aGlzLmR5bl9sdHJlZSAgPSBuZXcgdXRpbHMuQnVmMTYoSEVBUF9TSVpFICogMik7XG4gIHRoaXMuZHluX2R0cmVlICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIERfQ09ERVMgKyAxKSAqIDIpO1xuICB0aGlzLmJsX3RyZWUgICAgPSBuZXcgdXRpbHMuQnVmMTYoKDIgKiBCTF9DT0RFUyArIDEpICogMik7XG4gIHplcm8odGhpcy5keW5fbHRyZWUpO1xuICB6ZXJvKHRoaXMuZHluX2R0cmVlKTtcbiAgemVybyh0aGlzLmJsX3RyZWUpO1xuXG4gIHRoaXMubF9kZXNjICAgPSBudWxsOyAgICAgICAgIC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi9cbiAgdGhpcy5kX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi9cbiAgdGhpcy5ibF9kZXNjICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGJpdCBsZW5ndGggdHJlZSAqL1xuXG4gIC8vdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdO1xuICB0aGlzLmJsX2NvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWF9CSVRTICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vaW50IGhlYXBbMipMX0NPREVTKzFdOyAgICAgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB0aGlzLmhlYXAgPSBuZXcgdXRpbHMuQnVmMTYoMiAqIExfQ09ERVMgKyAxKTsgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB6ZXJvKHRoaXMuaGVhcCk7XG5cbiAgdGhpcy5oZWFwX2xlbiA9IDA7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovXG4gIHRoaXMuaGVhcF9tYXggPSAwOyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi9cbiAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy5cbiAgICovXG5cbiAgdGhpcy5kZXB0aCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAvL3VjaCBkZXB0aFsyKkxfQ09ERVMrMV07XG4gIHplcm8odGhpcy5kZXB0aCk7XG4gIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3lcbiAgICovXG5cbiAgdGhpcy5sX2J1ZiA9IDA7ICAgICAgICAgIC8qIGJ1ZmZlciBpbmRleCBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqL1xuXG4gIHRoaXMubGl0X2J1ZnNpemUgPSAwO1xuICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yXG4gICAqIGxpbWl0aW5nIGxpdF9idWZzaXplIHRvIDY0SzpcbiAgICogICAtIGZyZXF1ZW5jaWVzIGNhbiBiZSBrZXB0IGluIDE2IGJpdCBjb3VudGVyc1xuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0XG4gICAqICAgICBkYXRhIGlzIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlblxuICAgKiAgICAgd2hlbiBpbnB1dCBjb21lcyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKFRoaXMgY2FuIGFsc28gYmUgZG9uZSBmb3JcbiAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKVxuICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW5cbiAgICogICAgIGV2ZW4gZW1pdCBhIHN0b3JlZCBmaWxlIGluc3RlYWQgb2YgYSBzdG9yZWQgYmxvY2sgKHNhdmluZyA1IGJ5dGVzKS5cbiAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLlxuICAgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0XG4gICAqICAgICBhZGFwdGF0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIGlucHV0IGRhdGEgc3RhdGlzdGljcy4gKFRha2UgZm9yXG4gICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnlcbiAgICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlXG4gICAqICAgICBmYXN0IGFkYXB0YXRpb24gYnV0IGhhdmUgb2YgY291cnNlIHRoZSBvdmVyaGVhZCBvZiB0cmFuc21pdHRpbmdcbiAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS5cbiAgICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNFxuICAgKi9cblxuICB0aGlzLmxhc3RfbGl0ID0gMDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG5cbiAgdGhpcy5kX2J1ZiA9IDA7XG4gIC8qIEJ1ZmZlciBpbmRleCBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmVcbiAgICogdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUbyB1c2UgZGlmZmVyZW50IGxlbmd0aHMsIGFuIGV4dHJhIGZsYWdcbiAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LlxuICAgKi9cblxuICB0aGlzLm9wdF9sZW4gPSAwOyAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovXG4gIHRoaXMuc3RhdGljX2xlbiA9IDA7ICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqL1xuICB0aGlzLm1hdGNoZXMgPSAwOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqL1xuICB0aGlzLmluc2VydCA9IDA7ICAgICAgICAvKiBieXRlcyBhdCBlbmQgb2Ygd2luZG93IGxlZnQgdG8gaW5zZXJ0ICovXG5cblxuICB0aGlzLmJpX2J1ZiA9IDA7XG4gIC8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0XG4gICAqIHNpZ25pZmljYW50IGJpdHMpLlxuICAgKi9cbiAgdGhpcy5iaV92YWxpZCA9IDA7XG4gIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdFxuICAgKiBhcmUgYWx3YXlzIHplcm8uXG4gICAqL1xuXG4gIC8vIFVzZWQgZm9yIHdpbmRvdyBtZW1vcnkgaW5pdC4gV2Ugc2FmZWx5IGlnbm9yZSBpdCBmb3IgSlMuIFRoYXQgbWFrZXNcbiAgLy8gc2Vuc2Ugb25seSBmb3IgcG9pbnRlcnMgYW5kIG1lbW9yeSBjaGVjayB0b29scy5cbiAgLy90aGlzLmhpZ2hfd2F0ZXIgPSAwO1xuICAvKiBIaWdoIHdhdGVyIG1hcmsgb2Zmc2V0IGluIHdpbmRvdyBmb3IgaW5pdGlhbGl6ZWQgYnl0ZXMgLS0gYnl0ZXMgYWJvdmVcbiAgICogdGhpcyBhcmUgc2V0IHRvIHplcm8gaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHdhcm5pbmdzIHdoZW5cbiAgICogbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyBhY2Nlc3MgYnl0ZXMgcGFzdCB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZW5cbiAgICogdXBkYXRlZCB0byB0aGUgbmV3IGhpZ2ggd2F0ZXIgbWFyay5cbiAgICovXG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gMDtcbiAgc3RybS5kYXRhX3R5cGUgPSBaX1VOS05PV047XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHMucGVuZGluZyA9IDA7XG4gIHMucGVuZGluZ19vdXQgPSAwO1xuXG4gIGlmIChzLndyYXAgPCAwKSB7XG4gICAgcy53cmFwID0gLXMud3JhcDtcbiAgICAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqL1xuICB9XG4gIHMuc3RhdHVzID0gKHMud3JhcCA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFKTtcbiAgc3RybS5hZGxlciA9IChzLndyYXAgPT09IDIpID9cbiAgICAwICAvLyBjcmMzMigwLCBaX05VTEwsIDApXG4gIDpcbiAgICAxOyAvLyBhZGxlcjMyKDAsIFpfTlVMTCwgMClcbiAgcy5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSDtcbiAgdHJlZXMuX3RyX2luaXQocyk7XG4gIHJldHVybiBaX09LO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciByZXQgPSBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuICBpZiAocmV0ID09PSBaX09LKSB7XG4gICAgbG1faW5pdChzdHJtLnN0YXRlKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVTZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIGlmIChzdHJtLnN0YXRlLndyYXAgIT09IDIpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0cm0uc3RhdGUuZ3poZWFkID0gaGVhZDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkge1xuICBpZiAoIXN0cm0pIHsgLy8gPT09IFpfTlVMTFxuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICB2YXIgd3JhcCA9IDE7XG5cbiAgaWYgKGxldmVsID09PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIHtcbiAgICBsZXZlbCA9IDY7XG4gIH1cblxuICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovXG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9XG5cbiAgZWxzZSBpZiAod2luZG93Qml0cyA+IDE1KSB7XG4gICAgd3JhcCA9IDI7ICAgICAgICAgICAvKiB3cml0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCAqL1xuICAgIHdpbmRvd0JpdHMgLT0gMTY7XG4gIH1cblxuXG4gIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPT0gWl9ERUZMQVRFRCB8fFxuICAgIHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8XG4gICAgc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9GSVhFRCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cblxuICBpZiAod2luZG93Qml0cyA9PT0gOCkge1xuICAgIHdpbmRvd0JpdHMgPSA5O1xuICB9XG4gIC8qIHVudGlsIDI1Ni1ieXRlIHdpbmRvdyBidWcgZml4ZWQgKi9cblxuICB2YXIgcyA9IG5ldyBEZWZsYXRlU3RhdGUoKTtcblxuICBzdHJtLnN0YXRlID0gcztcbiAgcy5zdHJtID0gc3RybTtcblxuICBzLndyYXAgPSB3cmFwO1xuICBzLmd6aGVhZCA9IG51bGw7XG4gIHMud19iaXRzID0gd2luZG93Qml0cztcbiAgcy53X3NpemUgPSAxIDw8IHMud19iaXRzO1xuICBzLndfbWFzayA9IHMud19zaXplIC0gMTtcblxuICBzLmhhc2hfYml0cyA9IG1lbUxldmVsICsgNztcbiAgcy5oYXNoX3NpemUgPSAxIDw8IHMuaGFzaF9iaXRzO1xuICBzLmhhc2hfbWFzayA9IHMuaGFzaF9zaXplIC0gMTtcbiAgcy5oYXNoX3NoaWZ0ID0gfn4oKHMuaGFzaF9iaXRzICsgTUlOX01BVENIIC0gMSkgLyBNSU5fTUFUQ0gpO1xuXG4gIHMud2luZG93ID0gbmV3IHV0aWxzLkJ1Zjgocy53X3NpemUgKiAyKTtcbiAgcy5oZWFkID0gbmV3IHV0aWxzLkJ1ZjE2KHMuaGFzaF9zaXplKTtcbiAgcy5wcmV2ID0gbmV3IHV0aWxzLkJ1ZjE2KHMud19zaXplKTtcblxuICAvLyBEb24ndCBuZWVkIG1lbSBpbml0IG1hZ2ljIGZvciBKUy5cbiAgLy9zLmhpZ2hfd2F0ZXIgPSAwOyAgLyogbm90aGluZyB3cml0dGVuIHRvIHMtPndpbmRvdyB5ZXQgKi9cblxuICBzLmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi9cblxuICBzLnBlbmRpbmdfYnVmX3NpemUgPSBzLmxpdF9idWZzaXplICogNDtcblxuICAvL292ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpO1xuICAvL3MtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTtcbiAgcy5wZW5kaW5nX2J1ZiA9IG5ldyB1dGlscy5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSk7XG5cbiAgLy8gSXQgaXMgb2Zmc2V0IGZyb20gYHMucGVuZGluZ19idWZgIChzaXplIGlzIGBzLmxpdF9idWZzaXplICogMmApXG4gIC8vcy0+ZF9idWYgPSBvdmVybGF5ICsgcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7XG4gIHMuZF9idWYgPSAxICogcy5saXRfYnVmc2l6ZTtcblxuICAvL3MtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7XG4gIHMubF9idWYgPSAoMSArIDIpICogcy5saXRfYnVmc2l6ZTtcblxuICBzLmxldmVsID0gbGV2ZWw7XG4gIHMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgcy5tZXRob2QgPSBtZXRob2Q7XG5cbiAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUluaXQoc3RybSwgbGV2ZWwpIHtcbiAgcmV0dXJuIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgWl9ERUZMQVRFRCwgTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kpO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIG9sZF9mbHVzaCwgcztcbiAgdmFyIGJlZywgdmFsOyAvLyBmb3IgZ3ppcCBoZWFkZXIgd3JpdGUgb25seVxuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fFxuICAgIGZsdXNoID4gWl9CTE9DSyB8fCBmbHVzaCA8IDApIHtcbiAgICByZXR1cm4gc3RybSA/IGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUikgOiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuXG4gIGlmICghc3RybS5vdXRwdXQgfHxcbiAgICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB8fFxuICAgICAgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgZmx1c2ggIT09IFpfRklOSVNIKSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IFpfQlVGX0VSUk9SIDogWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgcy5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovXG4gIG9sZF9mbHVzaCA9IHMubGFzdF9mbHVzaDtcbiAgcy5sYXN0X2ZsdXNoID0gZmx1c2g7XG5cbiAgLyogV3JpdGUgdGhlIGhlYWRlciAqL1xuICBpZiAocy5zdGF0dXMgPT09IElOSVRfU1RBVEUpIHtcblxuICAgIGlmIChzLndyYXAgPT09IDIpIHsgLy8gR1pJUCBoZWFkZXJcbiAgICAgIHN0cm0uYWRsZXIgPSAwOyAgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgIHB1dF9ieXRlKHMsIDMxKTtcbiAgICAgIHB1dF9ieXRlKHMsIDEzOSk7XG4gICAgICBwdXRfYnl0ZShzLCA4KTtcbiAgICAgIGlmICghcy5nemhlYWQpIHsgLy8gcy0+Z3poZWFkID09IFpfTlVMTFxuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAgICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGV4dCA/IDEgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzLmd6aGVhZC5oY3JjID8gMiA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5leHRyYSA/IDAgOiA0KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQubmFtZSA/IDAgOiA4KSArXG4gICAgICAgICAgICAgICAgICAgICghcy5nemhlYWQuY29tbWVudCA/IDAgOiAxNilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDgpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDE2KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAyNCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5vcyAmIDB4ZmYpO1xuICAgICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZik7XG4gICAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZywgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBFWFRSQV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSAvLyBERUZMQVRFIGhlYWRlclxuICAgIHtcbiAgICAgIHZhciBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy53X2JpdHMgLSA4KSA8PCA0KSkgPDwgODtcbiAgICAgIHZhciBsZXZlbF9mbGFncyA9IC0xO1xuXG4gICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPCA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA9PT0gNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDM7XG4gICAgICB9XG4gICAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpO1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHsgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOyB9XG4gICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpO1xuXG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpO1xuXG4gICAgICAvKiBTYXZlIHRoZSBhZGxlcjMyIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeTogKi9cbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gMTsgLy8gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTtcbiAgICB9XG4gIH1cblxuLy8jaWZkZWYgR1pJUFxuICBpZiAocy5zdGF0dXMgPT09IEVYVFJBX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmV4dHJhLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cblxuICAgICAgd2hpbGUgKHMuZ3ppbmRleCA8IChzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmZmYpKSB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmFbcy5nemluZGV4XSAmIDB4ZmYpO1xuICAgICAgICBzLmd6aW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3ppbmRleCA9PT0gcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gTkFNRV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5uYW1lLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBDT01NRU5UX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmNvbW1lbnQvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5jb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgaWYgKHMucGVuZGluZyArIDIgPiBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyIDw9IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgICAgIHN0cm0uYWRsZXIgPSAwOyAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgIH1cbiAgfVxuLy8jZW5kaWZcblxuICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovXG4gIGlmIChzLnBlbmRpbmcgIT09IDApIHtcbiAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aFxuICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmRcbiAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLFxuICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2VcbiAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZTpcbiAgICAgICAqL1xuICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICByZXR1cm4gWl9PSztcbiAgICB9XG5cbiAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmVcbiAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcFxuICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi5cbiAgICAgKi9cbiAgfSBlbHNlIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHJhbmsoZmx1c2gpIDw9IHJhbmsob2xkX2ZsdXNoKSAmJlxuICAgIGZsdXNoICE9PSBaX0ZJTklTSCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogVXNlciBtdXN0IG5vdCBwcm92aWRlIG1vcmUgaW5wdXQgYWZ0ZXIgdGhlIGZpcnN0IEZJTklTSDogKi9cbiAgaWYgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLlxuICAgKi9cbiAgaWYgKHN0cm0uYXZhaWxfaW4gIT09IDAgfHwgcy5sb29rYWhlYWQgIT09IDAgfHxcbiAgICAoZmx1c2ggIT09IFpfTk9fRkxVU0ggJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkpIHtcbiAgICB2YXIgYnN0YXRlID0gKHMuc3RyYXRlZ3kgPT09IFpfSFVGRk1BTl9PTkxZKSA/IGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgOlxuICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfUkxFID8gZGVmbGF0ZV9ybGUocywgZmx1c2gpIDpcbiAgICAgICAgY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5mdW5jKHMsIGZsdXNoKSk7XG5cbiAgICBpZiAoYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9ET05FKSB7XG4gICAgICBzLnN0YXR1cyA9IEZJTklTSF9TVEFURTtcbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfTkVFRF9NT1JFIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQpIHtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgICAgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICB9XG4gICAgICByZXR1cm4gWl9PSztcbiAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGxcbiAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlXG4gICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW5cbiAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvXG4gICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3RcbiAgICAgICAqIG9uZSBlbXB0eSBibG9jay5cbiAgICAgICAqL1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19CTE9DS19ET05FKSB7XG4gICAgICBpZiAoZmx1c2ggPT09IFpfUEFSVElBTF9GTFVTSCkge1xuICAgICAgICB0cmVlcy5fdHJfYWxpZ24ocyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChmbHVzaCAhPT0gWl9CTE9DSykgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi9cblxuICAgICAgICB0cmVlcy5fdHJfc3RvcmVkX2Jsb2NrKHMsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWRcbiAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZsYXRlX3N5bmMoKS5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9GVUxMX0ZMVVNIKSB7XG4gICAgICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovICAgICAgICAgICAgIC8qIGZvcmdldCBoaXN0b3J5ICovXG4gICAgICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5pbnNlcnQgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICAgIHJldHVybiBaX09LO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL0Fzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCBcImJ1ZzJcIik7XG4gIC8vaWYgKHN0cm0uYXZhaWxfb3V0IDw9IDApIHsgdGhyb3cgbmV3IEVycm9yKFwiYnVnMlwiKTt9XG5cbiAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCkgeyByZXR1cm4gWl9PSzsgfVxuICBpZiAocy53cmFwIDw9IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VORDsgfVxuXG4gIC8qIFdyaXRlIHRoZSB0cmFpbGVyICovXG4gIGlmIChzLndyYXAgPT09IDIpIHtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAyNCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLnRvdGFsX2luICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAyNCkgJiAweGZmKTtcbiAgfVxuICBlbHNlXG4gIHtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gIH1cblxuICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAvKiBJZiBhdmFpbF9vdXQgaXMgemVybywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCBkZWZsYXRlIGFnYWluXG4gICAqIHRvIGZsdXNoIHRoZSByZXN0LlxuICAgKi9cbiAgaWYgKHMud3JhcCA+IDApIHsgcy53cmFwID0gLXMud3JhcDsgfVxuICAvKiB3cml0ZSB0aGUgdHJhaWxlciBvbmx5IG9uY2UhICovXG4gIHJldHVybiBzLnBlbmRpbmcgIT09IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlRW5kKHN0cm0pIHtcbiAgdmFyIHN0YXR1cztcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSBJTklUX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBFWFRSQV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gTkFNRV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQ09NTUVOVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gSENSQ19TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQlVTWV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRklOSVNIX1NUQVRFXG4gICkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG5cbiAgcmV0dXJuIHN0YXR1cyA9PT0gQlVTWV9TVEFURSA/IGVycihzdHJtLCBaX0RBVEFfRVJST1IpIDogWl9PSztcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlXG4gKiBzZXF1ZW5jZSB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgcztcbiAgdmFyIHN0ciwgbjtcbiAgdmFyIHdyYXA7XG4gIHZhciBhdmFpbDtcbiAgdmFyIG5leHQ7XG4gIHZhciBpbnB1dDtcbiAgdmFyIHRtcERpY3Q7XG5cbiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzID0gc3RybS5zdGF0ZTtcbiAgd3JhcCA9IHMud3JhcDtcblxuICBpZiAod3JhcCA9PT0gMiB8fCAod3JhcCA9PT0gMSAmJiBzLnN0YXR1cyAhPT0gSU5JVF9TVEFURSkgfHwgcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiB3aGVuIHVzaW5nIHpsaWIgd3JhcHBlcnMsIGNvbXB1dGUgQWRsZXItMzIgZm9yIHByb3ZpZGVkIGRpY3Rpb25hcnkgKi9cbiAgaWYgKHdyYXAgPT09IDEpIHtcbiAgICAvKiBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBzdHJtLmFkbGVyID0gYWRsZXIzMihzdHJtLmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgfVxuXG4gIHMud3JhcCA9IDA7ICAgLyogYXZvaWQgY29tcHV0aW5nIEFkbGVyLTMyIGluIHJlYWRfYnVmICovXG5cbiAgLyogaWYgZGljdGlvbmFyeSB3b3VsZCBmaWxsIHdpbmRvdywganVzdCByZXBsYWNlIHRoZSBoaXN0b3J5ICovXG4gIGlmIChkaWN0TGVuZ3RoID49IHMud19zaXplKSB7XG4gICAgaWYgKHdyYXAgPT09IDApIHsgICAgICAgICAgICAvKiBhbHJlYWR5IGVtcHR5IG90aGVyd2lzZSAqL1xuICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG4gICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgcy5pbnNlcnQgPSAwO1xuICAgIH1cbiAgICAvKiB1c2UgdGhlIHRhaWwgKi9cbiAgICAvLyBkaWN0aW9uYXJ5ID0gZGljdGlvbmFyeS5zbGljZShkaWN0TGVuZ3RoIC0gcy53X3NpemUpO1xuICAgIHRtcERpY3QgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSk7XG4gICAgdXRpbHMuYXJyYXlTZXQodG1wRGljdCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCAtIHMud19zaXplLCBzLndfc2l6ZSwgMCk7XG4gICAgZGljdGlvbmFyeSA9IHRtcERpY3Q7XG4gICAgZGljdExlbmd0aCA9IHMud19zaXplO1xuICB9XG4gIC8qIGluc2VydCBkaWN0aW9uYXJ5IGludG8gd2luZG93IGFuZCBoYXNoICovXG4gIGF2YWlsID0gc3RybS5hdmFpbF9pbjtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBzdHJtLmF2YWlsX2luID0gZGljdExlbmd0aDtcbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5pbnB1dCA9IGRpY3Rpb25hcnk7XG4gIGZpbGxfd2luZG93KHMpO1xuICB3aGlsZSAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgc3RyID0gcy5zdHJzdGFydDtcbiAgICBuID0gcy5sb29rYWhlYWQgLSAoTUlOX01BVENIIC0gMSk7XG4gICAgZG8ge1xuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG5cbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjtcbiAgICAgIHN0cisrO1xuICAgIH0gd2hpbGUgKC0tbik7XG4gICAgcy5zdHJzdGFydCA9IHN0cjtcbiAgICBzLmxvb2thaGVhZCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgZmlsbF93aW5kb3cocyk7XG4gIH1cbiAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIHMuaW5zZXJ0ID0gcy5sb29rYWhlYWQ7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmlucHV0ID0gaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBhdmFpbDtcbiAgcy53cmFwID0gd3JhcDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZXhwb3J0cy5kZWZsYXRlSW5pdCA9IGRlZmxhdGVJbml0O1xuZXhwb3J0cy5kZWZsYXRlSW5pdDIgPSBkZWZsYXRlSW5pdDI7XG5leHBvcnRzLmRlZmxhdGVSZXNldCA9IGRlZmxhdGVSZXNldDtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0S2VlcCA9IGRlZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmRlZmxhdGVTZXRIZWFkZXIgPSBkZWZsYXRlU2V0SGVhZGVyO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZUVuZCA9IGRlZmxhdGVFbmQ7XG5leHBvcnRzLmRlZmxhdGVTZXREaWN0aW9uYXJ5ID0gZGVmbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmRlZmxhdGVJbmZvID0gJ3Bha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuZGVmbGF0ZUJvdW5kID0gZGVmbGF0ZUJvdW5kO1xuZXhwb3J0cy5kZWZsYXRlQ29weSA9IGRlZmxhdGVDb3B5O1xuZXhwb3J0cy5kZWZsYXRlUGFyYW1zID0gZGVmbGF0ZVBhcmFtcztcbmV4cG9ydHMuZGVmbGF0ZVBlbmRpbmcgPSBkZWZsYXRlUGVuZGluZztcbmV4cG9ydHMuZGVmbGF0ZVByaW1lID0gZGVmbGF0ZVByaW1lO1xuZXhwb3J0cy5kZWZsYXRlVHVuZSA9IGRlZmxhdGVUdW5lO1xuKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5mdW5jdGlvbiBHWmhlYWRlcigpIHtcbiAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqL1xuICB0aGlzLnRleHQgICAgICAgPSAwO1xuICAvKiBtb2RpZmljYXRpb24gdGltZSAqL1xuICB0aGlzLnRpbWUgICAgICAgPSAwO1xuICAvKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLnhmbGFncyAgICAgPSAwO1xuICAvKiBvcGVyYXRpbmcgc3lzdGVtICovXG4gIHRoaXMub3MgICAgICAgICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi9cbiAgdGhpcy5leHRyYSAgICAgID0gbnVsbDtcbiAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICh2YWxpZCBpZiBleHRyYSAhPSBaX05VTEwpICovXG4gIHRoaXMuZXh0cmFfbGVuICA9IDA7IC8vIEFjdHVhbGx5LCB3ZSBkb24ndCBuZWVkIGl0IGluIEpTLFxuICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbGVhdmUgZm9yIGZldyBjb2RlIG1vZGlmaWNhdGlvbnNcblxuICAvL1xuICAvLyBTZXR1cCBsaW1pdHMgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5XG4gIC8vIGZvciBpbmZsYXRlIHVzZSBjb25zdGFudCBsaW1pdCBpbiA2NTUzNiBieXRlc1xuICAvL1xuXG4gIC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMuZXh0cmFfbWF4ICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi9cbiAgdGhpcy5uYW1lICAgICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5uYW1lX21heCAgID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKi9cbiAgdGhpcy5jb21tZW50ICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5jb21tX21heCAgID0gMDtcbiAgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi9cbiAgdGhpcy5oY3JjICAgICAgID0gMDtcbiAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLmRvbmUgICAgICAgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHWmhlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gU2VlIHN0YXRlIGRlZnMgZnJvbSBpbmZsYXRlLmpzXG52YXIgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xuXG4vKlxuICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZ1xuICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzXG4gICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLlxuICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvclxuICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZVxuICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuXG5cbiAgIEVudHJ5IGFzc3VtcHRpb25zOlxuXG4gICAgICAgIHN0YXRlLm1vZGUgPT09IExFTlxuICAgICAgICBzdHJtLmF2YWlsX2luID49IDZcbiAgICAgICAgc3RybS5hdmFpbF9vdXQgPj0gMjU4XG4gICAgICAgIHN0YXJ0ID49IHN0cm0uYXZhaWxfb3V0XG4gICAgICAgIHN0YXRlLmJpdHMgPCA4XG5cbiAgIE9uIHJldHVybiwgc3RhdGUubW9kZSBpcyBvbmUgb2Y6XG5cbiAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0XG4gICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrXG4gICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhXG5cbiAgIE5vdGVzOlxuXG4gICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGVcbiAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLFxuICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy5cbiAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkXG4gICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLlxuXG4gICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4XG4gICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KClcbiAgICAgIHJlcXVpcmVzIHN0cm0uYXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvclxuICAgICAgb3V0cHV0IHNwYWNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkge1xuICB2YXIgc3RhdGU7XG4gIHZhciBfaW47ICAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmlucHV0ICovXG4gIHZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBoYXZlIGVub3VnaCBpbnB1dCB3aGlsZSBpbiA8IGxhc3QgKi9cbiAgdmFyIF9vdXQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBiZWc7ICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBvdXQgPCBlbmQsIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgKi9cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIHZhciBkbWF4OyAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gemxpYiBoZWFkZXIgKi9cbi8vI2VuZGlmXG4gIHZhciB3c2l6ZTsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdmFyIHdoYXZlOyAgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdmFyIHduZXh0OyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICAvLyBVc2UgYHNfd2luZG93YCBpbnN0ZWFkIGB3aW5kb3dgLCBhdm9pZCBjb25mbGljdCB3aXRoIGluc3RydW1lbnRhdGlvbiB0b29sc1xuICB2YXIgc193aW5kb3c7ICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovXG4gIHZhciBob2xkOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmhvbGQgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uYml0cyAqL1xuICB2YXIgbGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5sZW5jb2RlICovXG4gIHZhciBkY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmRpc3Rjb2RlICovXG4gIHZhciBsbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi9cbiAgdmFyIGRtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovXG4gIHZhciBoZXJlOyAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZWQgdGFibGUgZW50cnkgKi9cbiAgdmFyIG9wOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCwgdW51c2VkIGJ5dGVzICovXG4gIHZhciBkaXN0OyAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqL1xuICB2YXIgZnJvbTsgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovXG4gIHZhciBmcm9tX3NvdXJjZTtcblxuXG4gIHZhciBpbnB1dCwgb3V0cHV0OyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG5cbiAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi9cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICAvL2hlcmUgPSBzdGF0ZS5oZXJlO1xuICBfaW4gPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7XG4gIF9vdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTtcbiAgZW5kID0gX291dCArIChzdHJtLmF2YWlsX291dCAtIDI1Nyk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICBkbWF4ID0gc3RhdGUuZG1heDtcbi8vI2VuZGlmXG4gIHdzaXplID0gc3RhdGUud3NpemU7XG4gIHdoYXZlID0gc3RhdGUud2hhdmU7XG4gIHduZXh0ID0gc3RhdGUud25leHQ7XG4gIHNfd2luZG93ID0gc3RhdGUud2luZG93O1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIGxjb2RlID0gc3RhdGUubGVuY29kZTtcbiAgZGNvZGUgPSBzdGF0ZS5kaXN0Y29kZTtcbiAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7XG4gIGRtYXNrID0gKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMTtcblxuXG4gIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaFxuICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqL1xuXG4gIHRvcDpcbiAgZG8ge1xuICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgIH1cblxuICAgIGhlcmUgPSBsY29kZVtob2xkICYgbG1hc2tdO1xuXG4gICAgZG9sZW46XG4gICAgZm9yICg7OykgeyAvLyBHb3RvIGVtdWxhdGlvblxuICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICBob2xkID4+Pj0gb3A7XG4gICAgICBiaXRzIC09IG9wO1xuICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuICAgICAgaWYgKG9wID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIG91dHB1dFtfb3V0KytdID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqL1xuICAgICAgICBsZW4gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICBpZiAob3ApIHtcbiAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW4gKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBsZW4pKTtcbiAgICAgICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGhlcmUgPSBkY29kZVtob2xkICYgZG1hc2tdO1xuXG4gICAgICAgIGRvZGlzdDpcbiAgICAgICAgZm9yICg7OykgeyAvLyBnb3RvIGVtdWxhdGlvblxuICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcblxuICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi9cbiAgICAgICAgICAgIGRpc3QgPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgICAgIGlmIChkaXN0ID4gZG1heCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBkaXN0KSk7XG4gICAgICAgICAgICBvcCA9IF9vdXQgLSBiZWc7ICAgICAgICAgICAgICAgIC8qIG1heCBkaXN0YW5jZSBpbiBvdXRwdXQgKi9cbiAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgICAgICB9XG5cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gb3AgLSB3aGF2ZSkge1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgIGxlbiAtPSBvcCAtIHdoYXZlO1xuLy8gICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpO1xuLy8gICAgICAgICAgICAgICAgaWYgKG9wID09PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmcm9tID0gMDsgLy8gd2luZG93IGluZGV4XG4gICAgICAgICAgICAgIGZyb21fc291cmNlID0gc193aW5kb3c7XG4gICAgICAgICAgICAgIGlmICh3bmV4dCA9PT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24gY2FzZSAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHduZXh0IDwgb3ApIHsgICAgICAvKiB3cmFwIGFyb3VuZCB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gZW5kIG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSAwO1xuICAgICAgICAgICAgICAgICAgaWYgKHduZXh0IDwgbGVuKSB7ICAvKiBzb21lIGZyb20gc3RhcnQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICAgIG9wID0gd25leHQ7XG4gICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogY29udGlndW91cyBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgICAgIC8qIGNvcHkgZGlyZWN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGxlbmd0aCBpcyB0aHJlZSAqL1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTtcbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAvKiAybmQgbGV2ZWwgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICAgICAgaGVyZSA9IGRjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgICAgICBjb250aW51ZSBkb2Rpc3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgaGVyZSA9IGxjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgIGNvbnRpbnVlIGRvbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuXG4gICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgIH1cbiAgfSB3aGlsZSAoX2luIDwgbGFzdCAmJiBfb3V0IDwgZW5kKTtcblxuICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi9cbiAgbGVuID0gYml0cyA+PiAzO1xuICBfaW4gLT0gbGVuO1xuICBiaXRzIC09IGxlbiA8PCAzO1xuICBob2xkICY9ICgxIDw8IGJpdHMpIC0gMTtcblxuICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJldHVybiAqL1xuICBzdHJtLm5leHRfaW4gPSBfaW47XG4gIHN0cm0ubmV4dF9vdXQgPSBfb3V0O1xuICBzdHJtLmF2YWlsX2luID0gKF9pbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBfaW4pIDogNSAtIChfaW4gLSBsYXN0KSk7XG4gIHN0cm0uYXZhaWxfb3V0ID0gKF9vdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gX291dCkgOiAyNTcgLSAoX291dCAtIGVuZCkpO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIHJldHVybjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzICAgICAgICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciBhZGxlcjMyICAgICAgID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICAgICAgICA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciBpbmZsYXRlX2Zhc3QgID0gcmVxdWlyZSgnLi9pbmZmYXN0Jyk7XG52YXIgaW5mbGF0ZV90YWJsZSA9IHJlcXVpcmUoJy4vaW5mdHJlZXMnKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbi8vdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG4vL3ZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbi8vdmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xudmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbnZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cblxuLyogU1RBVEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyICAgIEhFQUQgPSAxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi9cbnZhciAgICBGTEFHUyA9IDI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi9cbnZhciAgICBUSU1FID0gMzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovXG52YXIgICAgT1MgPSA0OyAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqL1xudmFyICAgIEVYTEVOID0gNTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovXG52YXIgICAgRVhUUkEgPSA2OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqL1xudmFyICAgIE5BTUUgPSA3OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqL1xudmFyICAgIENPTU1FTlQgPSA4OyAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi9cbnZhciAgICBIQ1JDID0gOTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi9cbnZhciAgICBESUNUSUQgPSAxMDsgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqL1xudmFyICAgIERJQ1QgPSAxMTsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi9cbnZhciAgICAgICAgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cbnZhciAgICAgICAgVFlQRURPID0gMTM7ICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi9cbnZhciAgICAgICAgU1RPUkVEID0gMTQ7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG52YXIgICAgICAgIENPUFlfID0gMTU7ICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICBDT1BZID0gMTY7ICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi9cbnZhciAgICAgICAgVEFCTEUgPSAxNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBMRU5MRU5TID0gMTg7ICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgIENPREVMRU5TID0gMTk7ICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgICAgIExFTl8gPSAyMDsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICAgICAgTEVOID0gMjE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi9cbnZhciAgICAgICAgICAgIExFTkVYVCA9IDIyOyAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgRElTVCA9IDIzOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbnZhciAgICAgICAgICAgIERJU1RFWFQgPSAyNDsgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBNQVRDSCA9IDI1OyAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovXG52YXIgICAgICAgICAgICBMSVQgPSAyNjsgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbnZhciAgICBDSEVDSyA9IDI3OyAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovXG52YXIgICAgTEVOR1RIID0gMjg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovXG52YXIgICAgRE9ORSA9IDI5OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBNRU0gPSAzMTsgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBTWU5DID0gMzI7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7XG5cblxuZnVuY3Rpb24genN3YXAzMihxKSB7XG4gIHJldHVybiAgKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICAgICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAgICAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAgICAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufVxuXG5cbmZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5tb2RlID0gMDsgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7ICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi9cbiAgdGhpcy5mbGFncyA9IDA7ICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi9cbiAgdGhpcy5kbWF4ID0gMDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqL1xuXG4gIC8qIHNsaWRpbmcgd2luZG93ICovXG4gIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqL1xuICB0aGlzLndzaXplID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHRoaXMud2hhdmUgPSAwOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHRoaXMud25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdGhpcy53aW5kb3cgPSBudWxsOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7ICAgICAgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5iaXRzID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi9cbiAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmRpc3QgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG4gIHRoaXMuaGF2ZSA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyB1dGlscy5CdWYxNigzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyB1dGlscy5CdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuZHluID0gbnVsbDsgICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5kaXN0ZHluID0gbnVsbDsgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLnNhbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovXG4gIHRoaXMuYmFjayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi9cbiAgdGhpcy53YXMgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi9cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwO1xuICBzdHJtLm1zZyA9ICcnOyAvKlpfTlVMTCovXG4gIGlmIChzdGF0ZS53cmFwKSB7ICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi9cbiAgICBzdHJtLmFkbGVyID0gc3RhdGUud3JhcCAmIDE7XG4gIH1cbiAgc3RhdGUubW9kZSA9IEhFQUQ7XG4gIHN0YXRlLmxhc3QgPSAwO1xuICBzdGF0ZS5oYXZlZGljdCA9IDA7XG4gIHN0YXRlLmRtYXggPSAzMjc2ODtcbiAgc3RhdGUuaGVhZCA9IG51bGwvKlpfTlVMTCovO1xuICBzdGF0ZS5ob2xkID0gMDtcbiAgc3RhdGUuYml0cyA9IDA7XG4gIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9ESVNUUyk7XG5cbiAgc3RhdGUuc2FuZSA9IDE7XG4gIHN0YXRlLmJhY2sgPSAtMTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiByZXNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0YXRlLndzaXplID0gMDtcbiAgc3RhdGUud2hhdmUgPSAwO1xuICBzdGF0ZS53bmV4dCA9IDA7XG4gIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgd3JhcDtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGdldCB0aGUgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogZXh0cmFjdCB3cmFwIHJlcXVlc3QgZnJvbSB3aW5kb3dCaXRzIHBhcmFtZXRlciAqL1xuICBpZiAod2luZG93Qml0cyA8IDApIHtcbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgd3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTtcbiAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7XG4gICAgICB3aW5kb3dCaXRzICY9IDE1O1xuICAgIH1cbiAgfVxuXG4gIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqL1xuICBpZiAod2luZG93Qml0cyAmJiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHJldDtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgLy9zdHJtLm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovXG5cbiAgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7XG5cbiAgLy9pZiAoc3RhdGUgPT09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IGFsbG9jYXRlZFxcblwiKSk7XG4gIHN0cm0uc3RhdGUgPSBzdGF0ZTtcbiAgc3RhdGUud2luZG93ID0gbnVsbC8qWl9OVUxMKi87XG4gIHJldCA9IGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cyk7XG4gIGlmIChyZXQgIT09IFpfT0spIHtcbiAgICBzdHJtLnN0YXRlID0gbnVsbC8qWl9OVUxMKi87XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQoc3RybSkge1xuICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7XG59XG5cblxuLypcbiBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvXG4gZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLlxuIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGVcbiBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kXG4gdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW5cbiBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmVcbiB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luXG4gbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS5cbiAqL1xudmFyIHZpcmdpbiA9IHRydWU7XG5cbnZhciBsZW5maXgsIGRpc3RmaXg7IC8vIFdlIGhhdmUgbm8gcG9pbnRlcnMgaW4gSlMsIHNvIGtlZXAgdGFibGVzIHNlcGFyYXRlXG5cbmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7XG4gIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovXG4gIGlmICh2aXJnaW4pIHtcbiAgICB2YXIgc3ltO1xuXG4gICAgbGVuZml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyB1dGlscy5CdWYzMigzMik7XG5cbiAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gOTsgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cblxuICAgIGluZmxhdGVfdGFibGUoTEVOUywgIHN0YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAgIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTtcblxuICAgIC8qIGRpc3RhbmNlIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMzIpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA1OyB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgICBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7XG5cbiAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqL1xuICAgIHZpcmdpbiA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDtcbiAgc3RhdGUubGVuYml0cyA9IDk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gZGlzdGZpeDtcbiAgc3RhdGUuZGlzdGJpdHMgPSA1O1xufVxuXG5cbi8qXG4gVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZVxuIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWRcbiB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzXG4gaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LlxuIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5XG4gaXMgbG9hZGVkLlxuXG4gUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZFxuIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3dcbiB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZlxuIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci5cbiBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLlxuICovXG5mdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3JjLCBlbmQsIGNvcHkpIHtcbiAgdmFyIGRpc3Q7XG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqL1xuICBpZiAoc3RhdGUud2luZG93ID09PSBudWxsKSB7XG4gICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IDA7XG5cbiAgICBzdGF0ZS53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzdGF0ZS53c2l6ZSk7XG4gIH1cblxuICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi9cbiAgaWYgKGNvcHkgPj0gc3RhdGUud3NpemUpIHtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gc3RhdGUud3NpemUsIHN0YXRlLndzaXplLCAwKTtcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBkaXN0ID0gc3RhdGUud3NpemUgLSBzdGF0ZS53bmV4dDtcbiAgICBpZiAoZGlzdCA+IGNvcHkpIHtcbiAgICAgIGRpc3QgPSBjb3B5O1xuICAgIH1cbiAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7XG4gICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGRpc3QsIHN0YXRlLnduZXh0KTtcbiAgICBjb3B5IC09IGRpc3Q7XG4gICAgaWYgKGNvcHkpIHtcbiAgICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBjb3B5LCBjb3B5KTtcbiAgICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBjb3B5LCAwKTtcbiAgICAgIHN0YXRlLnduZXh0ID0gY29weTtcbiAgICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3RhdGUud25leHQgKz0gZGlzdDtcbiAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHsgc3RhdGUud25leHQgPSAwOyB9XG4gICAgICBpZiAoc3RhdGUud2hhdmUgPCBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53aGF2ZSArPSBkaXN0OyB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIGlucHV0LCBvdXRwdXQ7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBidWZmZXJzXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGlucHV0IElOREVYICovXG4gIHZhciBwdXQ7ICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG91dHB1dCBJTkRFWCAqL1xuICB2YXIgaGF2ZSwgbGVmdDsgICAgICAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqL1xuICB2YXIgX2luLCBfb3V0OyAgICAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgY29weTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuICB2YXIgaGVyZSA9IDA7ICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqL1xuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsgLy8gcGFrZWQgXCJoZXJlXCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgLy92YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovXG4gIHZhciBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOyAvLyBwYWtlZCBcImxhc3RcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqL1xuICB2YXIgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi9cbiAgdmFyIGhidWYgPSBuZXcgdXRpbHMuQnVmOCg0KTsgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi9cbiAgdmFyIG9wdHM7XG5cbiAgdmFyIG47IC8vIHRlbXBvcmFyeSB2YXIgZm9yIE5FRURfQklUU1xuXG4gIHZhciBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqL1xuICAgIFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdO1xuXG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgeyBzdGF0ZS5tb2RlID0gVFlQRURPOyB9ICAgIC8qIHNraXAgY2hlY2sgKi9cblxuXG4gIC8vLS0tIExPQUQoKSAtLS1cbiAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAvLy0tLVxuXG4gIF9pbiA9IGhhdmU7XG4gIF9vdXQgPSBsZWZ0O1xuICByZXQgPSBaX09LO1xuXG4gIGluZl9sZWF2ZTogLy8gZ290byBlbXVsYXRpb25cbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoc3RhdGUubW9kZSkge1xuICAgIGNhc2UgSEVBRDpcbiAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpO1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgJiYgaG9sZCA9PT0gMHg4YjFmKSB7ICAvKiBnemlwIGhlYWRlciAqL1xuICAgICAgICBzdGF0ZS5jaGVjayA9IDAvKmNyYzMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgLy89PT0vL1xuXG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRkxBR1M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZmxhZ3MgPSAwOyAgICAgICAgICAgLyogZXhwZWN0IHpsaWIgaGVhZGVyICovXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi9cbiAgICAgICAgKCgoaG9sZCAmIDB4ZmYpLypCSVRTKDgpKi8gPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgaGVhZGVyIGNoZWNrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICBiaXRzIC09IDQ7XG4gICAgICAvLy0tLS8vXG4gICAgICBsZW4gPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA4O1xuICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7XG4gICAgICAgIHN0YXRlLndiaXRzID0gbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUud2JpdHMpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCB3aW5kb3cgc2l6ZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuO1xuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXFxuXCIpKTtcbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgIHN0YXRlLm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBicmVhaztcbiAgICBjYXNlIEZMQUdTOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkO1xuICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweGUwMDApIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSAoKGhvbGQgPj4gOCkgJiAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUSU1FOlxuICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkM0KHN0YXRlLmNoZWNrLCBob2xkKVxuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBoYnVmWzJdID0gKGhvbGQgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhidWZbM10gPSAoaG9sZCA+Pj4gMjQpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgNCwgMCk7XG4gICAgICAgIC8vPT09XG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE9TOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICBzdGF0ZS5oZWFkLm9zID0gKGhvbGQgPj4gOCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIEVYTEVOOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkO1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbGVuID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbnVsbC8qWl9OVUxMKi87XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBFWFRSQTpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgLy8gVXNlIHVudHlwZWQgYXJyYXkgZm9yIG1vcmUgY29udmVuaWVuZCBwcm9jZXNzaW5nIGxhdGVyXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBuZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXRpbHMuYXJyYXlTZXQoXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsXG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCBpcyBsaW1pdGVkIHRvIDY1NTM2IGJ5dGVzXG4gICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgIGNvcHksXG4gICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovXG4gICAgICAgICAgICAgIGxlblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vem1lbWNweShzdGF0ZS5oZWFkLmV4dHJhICsgbGVuLCBuZXh0LFxuICAgICAgICAgICAgLy8gICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCA/XG4gICAgICAgICAgICAvLyAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gTkFNRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE5BTUU6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA4MDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLy8gVE9ETzogMiBvciAxIGJ5dGVzP1xuICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQubmFtZV9tYXgqLykpIHtcbiAgICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5uYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gQ09NTUVOVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPTU1FTlQ6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDEwMDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5jb21tX21heCovKSkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgSENSQzpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDB4ZmZmZikpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdoZWFkZXIgY3JjIG1pc21hdGNoJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gKChzdGF0ZS5mbGFncyA+PiA5KSAmIDEpO1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBESUNUSUQ6XG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSB6c3dhcDMyKGhvbGQpO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gRElDVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERJQ1Q6XG4gICAgICBpZiAoc3RhdGUuaGF2ZWRpY3QgPT09IDApIHtcbiAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgIC8vLS0tXG4gICAgICAgIHJldHVybiBaX05FRURfRElDVDtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgVFlQRTpcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9CTE9DSyB8fCBmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIFRZUEVETzpcbiAgICAgIGlmIChzdGF0ZS5sYXN0KSB7XG4gICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICBiaXRzIC09IGJpdHMgJiA3O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBDSEVDSztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLz09PSBORUVEQklUUygzKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubGFzdCA9IChob2xkICYgMHgwMSkvKkJJVFMoMSkqLztcbiAgICAgIC8vLS0tIERST1BCSVRTKDEpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gMTtcbiAgICAgIGJpdHMgLT0gMTtcbiAgICAgIC8vLS0tLy9cblxuICAgICAgc3dpdGNoICgoaG9sZCAmIDB4MDMpLypCSVRTKDIpKi8pIHtcbiAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkIGJsb2NrICovXG4gICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykge1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVEFCTEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJsb2NrIHR5cGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgfVxuICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgYml0cyAtPSAyO1xuICAgICAgLy8tLS0vL1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBTVE9SRUQ6XG4gICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi9cbiAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAvLy0tLS8vXG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9PSAoKGhvbGQgPj4+IDE2KSBeIDB4ZmZmZikpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3Rocyc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZCAmIDB4ZmZmZjtcbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxcblwiLFxuICAgICAgLy8gICAgICAgIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gQ09QWV87XG4gICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT1BZXzpcbiAgICAgIHN0YXRlLm1vZGUgPSBDT1BZO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgQ09QWTpcbiAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICBpZiAoY29weSkge1xuICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgIGlmIChjb3B5ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvLy0tLSB6bWVtY3B5KHB1dCwgbmV4dCwgY29weSk7IC0tLVxuICAgICAgICB1dGlscy5hcnJheVNldChvdXRwdXQsIGlucHV0LCBuZXh0LCBjb3B5LCBwdXQpO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgIHB1dCArPSBjb3B5O1xuICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcXG5cIikpO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFRBQkxFOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTQpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubmxlbiA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDI1NztcbiAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNTtcbiAgICAgIGJpdHMgLT0gNTtcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLm5kaXN0ID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMTtcbiAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNTtcbiAgICAgIGJpdHMgLT0gNTtcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgNDtcbiAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNDtcbiAgICAgIGJpdHMgLT0gNDtcbiAgICAgIC8vLS0tLy9cbi8vI2lmbmRlZiBQS1pJUF9CVUdfV09SS0FST1VORFxuICAgICAgaWYgKHN0YXRlLm5sZW4gPiAyODYgfHwgc3RhdGUubmRpc3QgPiAzMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICd0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuLy8jZW5kaWZcbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcXG5cIikpO1xuICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTkxFTlM6XG4gICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7XG4gICAgICAgIHN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV0gPSAwO1xuICAgICAgfVxuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICAgICAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcbiAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5bjtcbiAgICAgIHN0YXRlLmxlbmJpdHMgPSA3O1xuXG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS5sZW5zLCAwLCAxOSwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29kZSBsZW5ndGhzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcXG5cIikpO1xuICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gQ09ERUxFTlM7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT0RFTEVOUzpcbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGhlcmVfdmFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChoZXJlX3ZhbCA9PT0gMTYpIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDIpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDI7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxlbiA9IHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSAtIDFdO1xuICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDMpOy8vQklUUygyKTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaGVyZV92YWwgPT09IDE3KSB7XG4gICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTtcbiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzO1xuICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDcpOy8vQklUUygzKTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICAgIGJpdHMgLT0gMztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTtcbiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3O1xuICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgY29weSA9IDExICsgKGhvbGQgJiAweDdmKTsvL0JJVFMoNyk7XG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyg3KSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IDc7XG4gICAgICAgICAgICBiaXRzIC09IDc7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5oYXZlICsgY29weSA+IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlIChjb3B5LS0pIHtcbiAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGxlbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogaGFuZGxlIGVycm9yIGJyZWFrcyBpbiB3aGlsZSAqL1xuICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkgeyBicmVhazsgfVxuXG4gICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi9cbiAgICAgIGlmIChzdGF0ZS5sZW5zWzI1Nl0gPT09IDApIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzIC0tIG5vdGU6IGRvIG5vdCBjaGFuZ2UgdGhlIGxlbmJpdHMgb3IgZGlzdGJpdHNcbiAgICAgICAgIHZhbHVlcyBoZXJlICg5IGFuZCA2KSB3aXRob3V0IHJlYWRpbmcgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi9cbiAgICAgIHN0YXRlLmxlbmJpdHMgPSA5O1xuXG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLmxlbnMsIDAsIHN0YXRlLm5sZW4sIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5kaXN0Yml0cyA9IDY7XG4gICAgICAvL3N0YXRlLmRpc3Rjb2RlLmNvcHkoc3RhdGUuY29kZXMpO1xuICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW47XG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5kaXN0Yml0cyB9O1xuICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy8gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2VzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgJ2luZmxhdGU6ICAgICAgIGNvZGVzIG9rXFxuJykpO1xuICAgICAgc3RhdGUubW9kZSA9IExFTl87XG4gICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU5fOlxuICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTjpcbiAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHtcbiAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgIC8vLS0tXG4gICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBfb3V0KTtcbiAgICAgICAgLy8tLS0gTE9BRCgpIC0tLVxuICAgICAgICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICAgICAgICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgICAgICAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICAgICAgICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICAgICAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gICAgICAgIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICAgICAgICBob2xkID0gc3RhdGUuaG9sZDtcbiAgICAgICAgYml0cyA9IHN0YXRlLmJpdHM7XG4gICAgICAgIC8vLS0tXG5cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHtcbiAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5iYWNrID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsgIC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmJiAoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgfVxuICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICBzdGF0ZS5sZW5ndGggPSBoZXJlX3ZhbDtcbiAgICAgIGlmIChoZXJlX29wID09PSAwKSB7XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMSVQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhlcmVfb3AgJiAzMikge1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1O1xuICAgICAgc3RhdGUubW9kZSA9IExFTkVYVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTkVYVDpcbiAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxlbmd0aCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICB9XG4gICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgIHN0YXRlLndhcyA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIHN0YXRlLm1vZGUgPSBESVNUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElTVDpcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5kaXN0Yml0cykqL1xuICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5vZmZzZXQgPSBoZXJlX3ZhbDtcbiAgICAgIHN0YXRlLmV4dHJhID0gKGhlcmVfb3ApICYgMTU7XG4gICAgICBzdGF0ZS5tb2RlID0gRElTVEVYVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERJU1RFWFQ6XG4gICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5vZmZzZXQgKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgfVxuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBzdGF0ZS5kbWF4KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4vLyNlbmRpZlxuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBzdGF0ZS5vZmZzZXQpKTtcbiAgICAgIHN0YXRlLm1vZGUgPSBNQVRDSDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE1BVENIOlxuICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICBjb3B5ID0gX291dCAtIGxlZnQ7XG4gICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gY29weSkgeyAgICAgICAgIC8qIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgY29weSA9IHN0YXRlLm9mZnNldCAtIGNvcHk7XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgIFRyYWNlKChzdGRlcnIsIFwiaW5mbGF0ZS5jIHRvbyBmYXJcXG5cIikpO1xuLy8gICAgICAgICAgY29weSAtPSBzdGF0ZS53aGF2ZTtcbi8vICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbi8vICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuLy8gICAgICAgICAgbGVmdCAtPSBjb3B5O1xuLy8gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4vLyAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgIG91dHB1dFtwdXQrK10gPSAwO1xuLy8gICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbi8vICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuLy8gICAgICAgICAgYnJlYWs7XG4vLyNlbmRpZlxuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUud25leHQpIHtcbiAgICAgICAgICBjb3B5IC09IHN0YXRlLnduZXh0O1xuICAgICAgICAgIGZyb20gPSBzdGF0ZS53c2l6ZSAtIGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4gICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93O1xuICAgICAgfVxuICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqL1xuICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLm9mZnNldDtcbiAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICBkbyB7XG4gICAgICAgIG91dHB1dFtwdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbiAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBMSVQ6XG4gICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIG91dHB1dFtwdXQrK10gPSBzdGF0ZS5sZW5ndGg7XG4gICAgICBsZWZ0LS07XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBDSEVDSzpcbiAgICAgIGlmIChzdGF0ZS53cmFwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAvLyBVc2UgJ3wnIGluc2RlYWQgb2YgJysnIHRvIG1ha2Ugc3VyZSB0aGF0IHJlc3VsdCBpcyBzaWduZWRcbiAgICAgICAgICBob2xkIHw9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBfb3V0IC09IGxlZnQ7XG4gICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gICAgICAgIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gICAgICAgIGlmIChfb3V0KSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID1cbiAgICAgICAgICAgICAgLypVUERBVEUoc3RhdGUuY2hlY2ssIHB1dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAgICAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSk7XG5cbiAgICAgICAgfVxuICAgICAgICBfb3V0ID0gbGVmdDtcbiAgICAgICAgLy8gTkI6IGNyYzMyIHN0b3JlZCBhcyBzaWduZWQgMzItYml0IGludCwgenN3YXAzMiByZXR1cm5zIHNpZ25lZCB0b29cbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyA/IGhvbGQgOiB6c3dhcDMyKGhvbGQpKSAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgZGF0YSBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOR1RIO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOR1RIOlxuICAgICAgaWYgKHN0YXRlLndyYXAgJiYgc3RhdGUuZmxhZ3MpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUudG90YWwgJiAweGZmZmZmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBsZW5ndGggY2hlY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBsZW5ndGggbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBET05FO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRE9ORTpcbiAgICAgIHJldCA9IFpfU1RSRUFNX0VORDtcbiAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICBjYXNlIEJBRDpcbiAgICAgIHJldCA9IFpfREFUQV9FUlJPUjtcbiAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICBjYXNlIE1FTTpcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICBjYXNlIFNZTkM6XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgICB9XG4gIH1cblxuICAvLyBpbmZfbGVhdmUgPC0gaGVyZSBpcyByZWFsIHBsYWNlIGZvciBcImdvdG8gaW5mX2xlYXZlXCIsIGVtdWxhdGVkIHZpYSBcImJyZWFrIGluZl9sZWF2ZVwiXG5cbiAgLypcbiAgICAgUmV0dXJuIGZyb20gaW5mbGF0ZSgpLCB1cGRhdGluZyB0aGUgdG90YWwgY291bnRzIGFuZCB0aGUgY2hlY2sgdmFsdWUuXG4gICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXJcbiAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuXG4gICAgIE5vdGU6IGEgbWVtb3J5IGVycm9yIGZyb20gaW5mbGF0ZSgpIGlzIG5vbi1yZWNvdmVyYWJsZS5cbiAgICovXG5cbiAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIC8vLS0tXG5cbiAgaWYgKHN0YXRlLndzaXplIHx8IChfb3V0ICE9PSBzdHJtLmF2YWlsX291dCAmJiBzdGF0ZS5tb2RlIDwgQkFEICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPCBDSEVDSyB8fCBmbHVzaCAhPT0gWl9GSU5JU0gpKSkge1xuICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQsIF9vdXQgLSBzdHJtLmF2YWlsX291dCkpIHtcbiAgICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgfVxuICB9XG4gIF9pbiAtPSBzdHJtLmF2YWlsX2luO1xuICBfb3V0IC09IHN0cm0uYXZhaWxfb3V0O1xuICBzdHJtLnRvdGFsX2luICs9IF9pbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgaWYgKHN0YXRlLndyYXAgJiYgX291dCkge1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBzdHJtLm5leHRfb3V0IC0gX291dCwgX291dCk7Ki9cbiAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpKTtcbiAgfVxuICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IExFTl8gfHwgc3RhdGUubW9kZSA9PT0gQ09QWV8gPyAyNTYgOiAwKTtcbiAgaWYgKCgoX2luID09PSAwICYmIF9vdXQgPT09IDApIHx8IGZsdXNoID09PSBaX0ZJTklTSCkgJiYgcmV0ID09PSBaX09LKSB7XG4gICAgcmV0ID0gWl9CVUZfRVJST1I7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUVuZChzdHJtKSB7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIC8qfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUud2luZG93KSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuICBzdHJtLnN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICB2YXIgc3RhdGU7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmICgoc3RhdGUud3JhcCAmIDIpID09PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuXG4gIC8qIHNhdmUgaGVhZGVyIHN0cnVjdHVyZSAqL1xuICBzdGF0ZS5oZWFkID0gaGVhZDtcbiAgaGVhZC5kb25lID0gZmFsc2U7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHN0YXRlO1xuICB2YXIgZGljdGlkO1xuICB2YXIgcmV0O1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSAvKiA9PSBaX05VTEwgKi8gfHwgIXN0cm0uc3RhdGUgLyogPT0gWl9OVUxMICovKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKHN0YXRlLndyYXAgIT09IDAgJiYgc3RhdGUubW9kZSAhPT0gRElDVCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWRlbnRpZmllciAqL1xuICBpZiAoc3RhdGUubW9kZSA9PT0gRElDVCkge1xuICAgIGRpY3RpZCA9IDE7IC8qIGFkbGVyMzIoMCwgbnVsbCwgMCkqL1xuICAgIC8qIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7XG4gICAgfVxuICB9XG4gIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgdXNpbmcgdXBkYXRld2luZG93KCksIHdoaWNoIHdpbGwgYW1lbmQgdGhlXG4gICBleGlzdGluZyBkaWN0aW9uYXJ5IGlmIGFwcHJvcHJpYXRlICovXG4gIHJldCA9IHVwZGF0ZXdpbmRvdyhzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCBkaWN0TGVuZ3RoKTtcbiAgaWYgKHJldCkge1xuICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICB9XG4gIHN0YXRlLmhhdmVkaWN0ID0gMTtcbiAgLy8gVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBkaWN0aW9uYXJ5IHNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5leHBvcnRzLmluZmxhdGVSZXNldCA9IGluZmxhdGVSZXNldDtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0MiA9IGluZmxhdGVSZXNldDI7XG5leHBvcnRzLmluZmxhdGVSZXNldEtlZXAgPSBpbmZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5pbmZsYXRlSW5pdCA9IGluZmxhdGVJbml0O1xuZXhwb3J0cy5pbmZsYXRlSW5pdDIgPSBpbmZsYXRlSW5pdDI7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlRW5kID0gaW5mbGF0ZUVuZDtcbmV4cG9ydHMuaW5mbGF0ZUdldEhlYWRlciA9IGluZmxhdGVHZXRIZWFkZXI7XG5leHBvcnRzLmluZmxhdGVTZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVJbmZvID0gJ3Bha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuaW5mbGF0ZUNvcHkgPSBpbmZsYXRlQ29weTtcbmV4cG9ydHMuaW5mbGF0ZUdldERpY3Rpb25hcnkgPSBpbmZsYXRlR2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZU1hcmsgPSBpbmZsYXRlTWFyaztcbmV4cG9ydHMuaW5mbGF0ZVByaW1lID0gaW5mbGF0ZVByaW1lO1xuZXhwb3J0cy5pbmZsYXRlU3luYyA9IGluZmxhdGVTeW5jO1xuZXhwb3J0cy5pbmZsYXRlU3luY1BvaW50ID0gaW5mbGF0ZVN5bmNQb2ludDtcbmV4cG9ydHMuaW5mbGF0ZVVuZGVybWluZSA9IGluZmxhdGVVbmRlcm1pbmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xuXG52YXIgTUFYQklUUyA9IDE1O1xudmFyIEVOT1VHSF9MRU5TID0gODUyO1xudmFyIEVOT1VHSF9ESVNUUyA9IDU5Mjtcbi8vdmFyIEVOT1VHSCA9IChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxudmFyIGxiYXNlID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqL1xuICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLFxuICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMFxuXTtcblxudmFyIGxleHQgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCxcbiAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDcyLCA3OFxuXTtcblxudmFyIGRiYXNlID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovXG4gIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MyxcbiAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LFxuICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwXG5dO1xuXG52YXIgZGV4dCA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsXG4gIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LFxuICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0XG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfdGFibGUodHlwZSwgbGVucywgbGVuc19pbmRleCwgY29kZXMsIHRhYmxlLCB0YWJsZV9pbmRleCwgd29yaywgb3B0cylcbntcbiAgdmFyIGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvL2hlcmUgPSBvcHRzLmhlcmU7IC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqL1xuXG4gIHZhciBsZW4gPSAwOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovXG4gIHZhciBzeW0gPSAwOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqL1xuICB2YXIgbWluID0gMCwgbWF4ID0gMDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi9cbiAgdmFyIHJvb3QgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi9cbiAgdmFyIGN1cnIgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi9cbiAgdmFyIGRyb3AgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqL1xuICB2YXIgbGVmdCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovXG4gIHZhciB1c2VkID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovXG4gIHZhciBodWZmID0gMDsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqL1xuICB2YXIgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi9cbiAgdmFyIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqL1xuICB2YXIgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi9cbiAgdmFyIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqL1xuICB2YXIgYmFzZSA9IG51bGw7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgYmFzZV9pbmRleCA9IDA7XG4vLyAgdmFyIHNob2V4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi9cbiAgdmFyIGNvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovXG4gIHZhciBvZmZzID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovXG4gIHZhciBleHRyYSA9IG51bGw7XG4gIHZhciBleHRyYV9pbmRleCA9IDA7XG5cbiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7XG5cbiAgLypcbiAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGVcbiAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZVxuICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGVcbiAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyXG4gICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzXG4gICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlclxuICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGhcbiAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHNcbiAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzXG4gICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLlxuXG4gICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpblxuICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy5cbiAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0XG4gICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLlxuXG4gICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsXG4gICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGVcbiAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZFxuICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5XG4gICB0aGUgY2FsbGVyLlxuXG4gICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nXG4gICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnlcbiAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkXG4gICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcy5cbiAgICovXG5cbiAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovXG4gIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgY291bnRbbGVuXSA9IDA7XG4gIH1cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBjb3VudFtsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrO1xuICB9XG5cbiAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi9cbiAgcm9vdCA9IGJpdHM7XG4gIGZvciAobWF4ID0gTUFYQklUUzsgbWF4ID49IDE7IG1heC0tKSB7XG4gICAgaWYgKGNvdW50W21heF0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA+IG1heCkge1xuICAgIHJvb3QgPSBtYXg7XG4gIH1cbiAgaWYgKG1heCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi9cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7ICAvL2hlcmUub3AgPSAodmFyIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxOyAgIC8vaGVyZS5iaXRzID0gKHZhciBjaGFyKTE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7ICAgLy9oZXJlLnZhbCA9ICh2YXIgc2hvcnQpMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG5cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7XG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG4gICAgb3B0cy5iaXRzID0gMTtcbiAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi9cbiAgfVxuICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspIHtcbiAgICBpZiAoY291bnRbbWluXSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290IDwgbWluKSB7XG4gICAgcm9vdCA9IG1pbjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqL1xuICBsZWZ0ID0gMTtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBsZWZ0IDw8PSAxO1xuICAgIGxlZnQgLT0gY291bnRbbGVuXTtcbiAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi9cbiAgfVxuICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT09IENPREVTIHx8IG1heCAhPT0gMSkpIHtcbiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovXG4gIH1cblxuICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqL1xuICBvZmZzWzFdID0gMDtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykge1xuICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dO1xuICB9XG5cbiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqL1xuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGlmIChsZW5zW2xlbnNfaW5kZXggKyBzeW1dICE9PSAwKSB7XG4gICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZ1xuICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmZcbiAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcFxuICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLFxuICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0b1xuICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuXG5cbiAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHNcbiAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4XG4gICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYVxuICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzXG4gICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuXG5cbiAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlXG4gICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aFxuICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmVcbiAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy5cblxuICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGVcbiAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3RcbiAgIHRoZSBjb25zdGFudHMgRU5PVUdIX0xFTlMgYW5kIEVOT1VHSF9ESVNUUyB0byBndWFyZCBhZ2FpbnN0IGNoYW5nZXMgaW5cbiAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4gICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuXG4gICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzXG4gICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzXG4gICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuXG4gICAqL1xuXG4gIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovXG4gIC8vIHBvb3IgbWFuIG9wdGltaXphdGlvbiAtIHVzZSBpZi1lbHNlIGluc3RlYWQgb2Ygc3dpdGNoLFxuICAvLyB0byBhdm9pZCBkZW9wdHMgaW4gb2xkIHY4XG4gIGlmICh0eXBlID09PSBDT0RFUykge1xuICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqL1xuICAgIGVuZCA9IDE5O1xuXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTEVOUykge1xuICAgIGJhc2UgPSBsYmFzZTtcbiAgICBiYXNlX2luZGV4IC09IDI1NztcbiAgICBleHRyYSA9IGxleHQ7XG4gICAgZXh0cmFfaW5kZXggLT0gMjU3O1xuICAgIGVuZCA9IDI1NjtcblxuICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogRElTVFMgKi9cbiAgICBiYXNlID0gZGJhc2U7XG4gICAgZXh0cmEgPSBkZXh0O1xuICAgIGVuZCA9IC0xO1xuICB9XG5cbiAgLyogaW5pdGlhbGl6ZSBvcHRzIGZvciBsb29wICovXG4gIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovXG4gIHN5bSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqL1xuICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi9cbiAgbmV4dCA9IHRhYmxlX2luZGV4OyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovXG4gIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi9cbiAgZHJvcCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyB0byBkcm9wIGZyb20gY29kZSBmb3IgaW5kZXggKi9cbiAgbG93ID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi9cbiAgdXNlZCA9IDEgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqL1xuICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqL1xuXG4gIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqL1xuICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGkgPSAwO1xuICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovXG4gIGZvciAoOzspIHtcbiAgICBpKys7XG4gICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovXG4gICAgaGVyZV9iaXRzID0gbGVuIC0gZHJvcDtcbiAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7XG4gICAgICBoZXJlX29wID0gMDtcbiAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dO1xuICAgIH1cbiAgICBlbHNlIGlmICh3b3JrW3N5bV0gPiBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSBleHRyYVtleHRyYV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgICBoZXJlX3ZhbCA9IGJhc2VbYmFzZV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovXG4gICAgICBoZXJlX3ZhbCA9IDA7XG4gICAgfVxuXG4gICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gZHJvcCk7XG4gICAgZmlsbCA9IDEgPDwgY3VycjtcbiAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqL1xuICAgIGRvIHtcbiAgICAgIGZpbGwgLT0gaW5jcjtcbiAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gKGhlcmVfYml0cyA8PCAyNCkgfCAoaGVyZV9vcCA8PCAxNikgfCBoZXJlX3ZhbCB8MDtcbiAgICB9IHdoaWxlIChmaWxsICE9PSAwKTtcblxuICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIDEpO1xuICAgIHdoaWxlIChodWZmICYgaW5jcikge1xuICAgICAgaW5jciA+Pj0gMTtcbiAgICB9XG4gICAgaWYgKGluY3IgIT09IDApIHtcbiAgICAgIGh1ZmYgJj0gaW5jciAtIDE7XG4gICAgICBodWZmICs9IGluY3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh1ZmYgPSAwO1xuICAgIH1cblxuICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqL1xuICAgIHN5bSsrO1xuICAgIGlmICgtLWNvdW50W2xlbl0gPT09IDApIHtcbiAgICAgIGlmIChsZW4gPT09IG1heCkgeyBicmVhazsgfVxuICAgICAgbGVuID0gbGVuc1tsZW5zX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG5cbiAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi9cbiAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9PSBsb3cpIHtcbiAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqL1xuICAgICAgaWYgKGRyb3AgPT09IDApIHtcbiAgICAgICAgZHJvcCA9IHJvb3Q7XG4gICAgICB9XG5cbiAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi9cbiAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqL1xuXG4gICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi9cbiAgICAgIGN1cnIgPSBsZW4gLSBkcm9wO1xuICAgICAgbGVmdCA9IDEgPDwgY3VycjtcbiAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkge1xuICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkgeyBicmVhazsgfVxuICAgICAgICBjdXJyKys7XG4gICAgICAgIGxlZnQgPDw9IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi9cbiAgICAgIHVzZWQgKz0gMSA8PCBjdXJyO1xuICAgICAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAgICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqL1xuICAgICAgbG93ID0gaHVmZiAmIG1hc2s7XG4gICAgICAvKnRhYmxlLm9wW2xvd10gPSBjdXJyO1xuICAgICAgdGFibGUuYml0c1tsb3ddID0gcm9vdDtcbiAgICAgIHRhYmxlLnZhbFtsb3ddID0gbmV4dCAtIG9wdHMudGFibGVfaW5kZXg7Ki9cbiAgICAgIHRhYmxlW2xvd10gPSAocm9vdCA8PCAyNCkgfCAoY3VyciA8PCAxNikgfCAobmV4dCAtIHRhYmxlX2luZGV4KSB8MDtcbiAgICB9XG4gIH1cblxuICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZVxuICAgYXQgbW9zdCBvbmUgcmVtYWluaW5nIGVudHJ5LCBzaW5jZSBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlLCB0aGVcbiAgIG1heGltdW0gY29kZSBsZW5ndGggdGhhdCB3YXMgYWxsb3dlZCB0byBnZXQgdGhpcyBmYXIgaXMgb25lIGJpdCkgKi9cbiAgaWYgKGh1ZmYgIT09IDApIHtcbiAgICAvL3RhYmxlLm9wW25leHQgKyBodWZmXSA9IDY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbbmV4dCArIGh1ZmZdID0gbGVuIC0gZHJvcDtcbiAgICAvL3RhYmxlLnZhbFtuZXh0ICsgaHVmZl0gPSAwO1xuICAgIHRhYmxlW25leHQgKyBodWZmXSA9ICgobGVuIC0gZHJvcCkgPDwgMjQpIHwgKDY0IDw8IDE2KSB8MDtcbiAgfVxuXG4gIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqL1xuICAvL29wdHMudGFibGVfaW5kZXggKz0gdXNlZDtcbiAgb3B0cy5iaXRzID0gcm9vdDtcbiAgcmV0dXJuIDA7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgMjogICAgICAnbmVlZCBkaWN0aW9uYXJ5JywgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovXG4gIDE6ICAgICAgJ3N0cmVhbSBlbmQnLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqL1xuICAwOiAgICAgICcnLCAgICAgICAgICAgICAgICAgICAgLyogWl9PSyAgICAgICAgICAgICAgMCAgKi9cbiAgJy0xJzogICAnZmlsZSBlcnJvcicsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovXG4gICctMic6ICAgJ3N0cmVhbSBlcnJvcicsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqL1xuICAnLTMnOiAgICdkYXRhIGVycm9yJywgICAgICAgICAgLyogWl9EQVRBX0VSUk9SICAgICgtMykgKi9cbiAgJy00JzogICAnaW5zdWZmaWNpZW50IG1lbW9yeScsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovXG4gICctNSc6ICAgJ2J1ZmZlciBlcnJvcicsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqL1xuICAnLTYnOiAgICdpbmNvbXBhdGlibGUgdmVyc2lvbicgLyogWl9WRVJTSU9OX0VSUk9SICgtNikgKi9cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vdmFyIFpfRklMVEVSRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9IVUZGTUFOX09OTFkgICAgICA9IDI7XG4vL3ZhciBaX1JMRSAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEICAgICAgICAgICAgICAgPSA0O1xuLy92YXIgWl9ERUZBVUxUX1NUUkFURUdZICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbnZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xudmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04gICAgICAgICAgICAgPSAyO1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG4vLyBGcm9tIHp1dGlsLmhcblxudmFyIFNUT1JFRF9CTE9DSyA9IDA7XG52YXIgU1RBVElDX1RSRUVTID0gMTtcbnZhciBEWU5fVFJFRVMgICAgPSAyO1xuLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi9cblxudmFyIE1JTl9NQVRDSCAgICA9IDM7XG52YXIgTUFYX01BVENIICAgID0gMjU4O1xuLyogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gbWF0Y2ggbGVuZ3RocyAqL1xuXG4vLyBGcm9tIGRlZmxhdGUuaFxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS5cbiAqL1xuXG52YXIgTEVOR1RIX0NPREVTICA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBMSVRFUkFMUyAgICAgID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG5cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBEX0NPREVTICAgICAgID0gMzA7XG4vKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi9cblxudmFyIEJMX0NPREVTICAgICAgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xuXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG5cbnZhciBNQVhfQklUUyAgICAgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIEJ1Zl9zaXplICAgICAgPSAxNjtcbi8qIHNpemUgb2YgYml0IGJ1ZmZlciBpbiBiaV9idWYgKi9cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0YW50c1xuICovXG5cbnZhciBNQVhfQkxfQklUUyA9IDc7XG4vKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovXG5cbnZhciBFTkRfQkxPQ0sgICA9IDI1Njtcbi8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi9cblxudmFyIFJFUF8zXzYgICAgID0gMTY7XG4vKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzNfMTAgICA9IDE3O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzExXzEzOCA9IDE4O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxuLyogZXNsaW50LWRpc2FibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cbnZhciBleHRyYV9sYml0cyA9ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqL1xuICBbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwXTtcblxudmFyIGV4dHJhX2RiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi9cbiAgWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdO1xuXG52YXIgZXh0cmFfYmxiaXRzID0gIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XTtcblxudmFyIGJsX29yZGVyID1cbiAgWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdO1xuLyogZXNsaW50LWVuYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xuXG4vKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nXG4gKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy5cbiAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIExvY2FsIGRhdGEuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBvbmx5IG9uY2UuXG4gKi9cblxuLy8gV2UgcHJlLWZpbGwgYXJyYXlzIHdpdGggMCB0byBhdm9pZCB1bmluaXRpYWxpemVkIGdhcHNcblxudmFyIERJU1RfQ09ERV9MRU4gPSA1MTI7IC8qIHNlZSBkZWZpbml0aW9uIG9mIGFycmF5IGRpc3RfY29kZSBiZWxvdyAqL1xuXG4vLyAhISEhIFVzZSBmbGF0IGFycmF5IGluc2RlYWQgb2Ygc3RydWN0dXJlLCBGcmVxID0gaSoyLCBMZW4gPSBpKjIrMVxudmFyIHN0YXRpY19sdHJlZSAgPSBuZXcgQXJyYXkoKExfQ09ERVMgKyAyKSAqIDIpO1xuemVybyhzdGF0aWNfbHRyZWUpO1xuLyogVGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUuIFNpbmNlIHRoZSBiaXQgbGVuZ3RocyBhcmUgaW1wb3NlZCwgdGhlcmUgaXMgbm9cbiAqIG5lZWQgZm9yIHRoZSBMX0NPREVTIGV4dHJhIGNvZGVzIHVzZWQgZHVyaW5nIGhlYXAgY29uc3RydWN0aW9uLiBIb3dldmVyXG4gKiBUaGUgY29kZXMgMjg2IGFuZCAyODcgYXJlIG5lZWRlZCB0byBidWlsZCBhIGNhbm9uaWNhbCB0cmVlIChzZWUgX3RyX2luaXRcbiAqIGJlbG93KS5cbiAqL1xuXG52YXIgc3RhdGljX2R0cmVlICA9IG5ldyBBcnJheShEX0NPREVTICogMik7XG56ZXJvKHN0YXRpY19kdHJlZSk7XG4vKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUuIChBY3R1YWxseSBhIHRyaXZpYWwgdHJlZSBzaW5jZSBhbGwgY29kZXMgdXNlXG4gKiA1IGJpdHMuKVxuICovXG5cbnZhciBfZGlzdF9jb2RlICAgID0gbmV3IEFycmF5KERJU1RfQ09ERV9MRU4pO1xuemVybyhfZGlzdF9jb2RlKTtcbi8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXNcbiAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2ZcbiAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLlxuICovXG5cbnZhciBfbGVuZ3RoX2NvZGUgID0gbmV3IEFycmF5KE1BWF9NQVRDSCAtIE1JTl9NQVRDSCArIDEpO1xuemVybyhfbGVuZ3RoX2NvZGUpO1xuLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9sZW5ndGggICA9IG5ldyBBcnJheShMRU5HVEhfQ09ERVMpO1xuemVybyhiYXNlX2xlbmd0aCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9kaXN0ICAgICA9IG5ldyBBcnJheShEX0NPREVTKTtcbnplcm8oYmFzZV9kaXN0KTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgZGlzdGFuY2UgZm9yIGVhY2ggY29kZSAoMCA9IGRpc3RhbmNlIG9mIDEpICovXG5cblxuZnVuY3Rpb24gU3RhdGljVHJlZURlc2Moc3RhdGljX3RyZWUsIGV4dHJhX2JpdHMsIGV4dHJhX2Jhc2UsIGVsZW1zLCBtYXhfbGVuZ3RoKSB7XG5cbiAgdGhpcy5zdGF0aWNfdHJlZSAgPSBzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iaXRzICAgPSBleHRyYV9iaXRzOyAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovXG4gIHRoaXMuZXh0cmFfYmFzZSAgID0gZXh0cmFfYmFzZTsgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovXG4gIHRoaXMuZWxlbXMgICAgICAgID0gZWxlbXM7ICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovXG4gIHRoaXMubWF4X2xlbmd0aCAgID0gbWF4X2xlbmd0aDsgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovXG5cbiAgLy8gc2hvdyBpZiBgc3RhdGljX3RyZWVgIGhhcyBkYXRhIG9yIGR1bW15IC0gbmVlZGVkIGZvciBtb25vbW9ycGhpYyBvYmplY3RzXG4gIHRoaXMuaGFzX3N0cmVlICAgID0gc3RhdGljX3RyZWUgJiYgc3RhdGljX3RyZWUubGVuZ3RoO1xufVxuXG5cbnZhciBzdGF0aWNfbF9kZXNjO1xudmFyIHN0YXRpY19kX2Rlc2M7XG52YXIgc3RhdGljX2JsX2Rlc2M7XG5cblxuZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsIHN0YXRfZGVzYykge1xuICB0aGlzLmR5bl90cmVlID0gZHluX3RyZWU7ICAgICAvKiB0aGUgZHluYW1pYyB0cmVlICovXG4gIHRoaXMubWF4X2NvZGUgPSAwOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsgICAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqL1xufVxuXG5cblxuZnVuY3Rpb24gZF9jb2RlKGRpc3QpIHtcbiAgcmV0dXJuIGRpc3QgPCAyNTYgPyBfZGlzdF9jb2RlW2Rpc3RdIDogX2Rpc3RfY29kZVsyNTYgKyAoZGlzdCA+Pj4gNyldO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uXG4gKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuXG4gKi9cbmZ1bmN0aW9uIHB1dF9zaG9ydChzLCB3KSB7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodykgJiAweGZmKSk7XG4vLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodXNoKSh3KSA+PiA4KSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodyA+Pj4gOCkgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuXG4gKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy5cbiAqL1xuZnVuY3Rpb24gc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPiAoQnVmX3NpemUgLSBsZW5ndGgpKSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSB2YWx1ZSA+PiAoQnVmX3NpemUgLSBzLmJpX3ZhbGlkKTtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplO1xuICB9IGVsc2Uge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHNlbmRfY29kZShzLCBjLCB0cmVlKSB7XG4gIHNlbmRfYml0cyhzLCB0cmVlW2MgKiAyXS8qLkNvZGUqLywgdHJlZVtjICogMiArIDFdLyouTGVuKi8pO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXJcbiAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSlcbiAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTVcbiAqL1xuZnVuY3Rpb24gYmlfcmV2ZXJzZShjb2RlLCBsZW4pIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGRvIHtcbiAgICByZXMgfD0gY29kZSAmIDE7XG4gICAgY29kZSA+Pj49IDE7XG4gICAgcmVzIDw8PSAxO1xuICB9IHdoaWxlICgtLWxlbiA+IDApO1xuICByZXR1cm4gcmVzID4+PiAxO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuXG4gKi9cbmZ1bmN0aW9uIGJpX2ZsdXNoKHMpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPT09IDE2KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IDA7XG4gICAgcy5iaV92YWxpZCA9IDA7XG5cbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID49IDgpIHtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmICYgMHhmZjtcbiAgICBzLmJpX2J1ZiA+Pj0gODtcbiAgICBzLmJpX3ZhbGlkIC09IDg7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoXG4gKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZFxuICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGVcbiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC5cbiAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXNcbiAqICAgICBub3QgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2JpdGxlbihzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgICAgICAgID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIG1heF9jb2RlICAgICAgICA9IGRlc2MubWF4X2NvZGU7XG4gIHZhciBzdHJlZSAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGV4dHJhICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2JpdHM7XG4gIHZhciBiYXNlICAgICAgICAgICAgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iYXNlO1xuICB2YXIgbWF4X2xlbmd0aCAgICAgID0gZGVzYy5zdGF0X2Rlc2MubWF4X2xlbmd0aDtcbiAgdmFyIGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovXG4gIHZhciBuLCBtOyAgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqL1xuICB2YXIgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi9cbiAgdmFyIGY7ICAgICAgICAgICAgICAvKiBmcmVxdWVuY3kgKi9cbiAgdmFyIG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqL1xuXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIHMuYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXlcbiAgICogb3ZlcmZsb3cgaW4gdGhlIGNhc2Ugb2YgdGhlIGJpdCBsZW5ndGggdHJlZSkuXG4gICAqL1xuICB0cmVlW3MuaGVhcFtzLmhlYXBfbWF4XSAqIDIgKyAxXS8qLkxlbiovID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqL1xuXG4gIGZvciAoaCA9IHMuaGVhcF9tYXggKyAxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHtcbiAgICBuID0gcy5oZWFwW2hdO1xuICAgIGJpdHMgPSB0cmVlW3RyZWVbbiAqIDIgKyAxXS8qLkRhZCovICogMiArIDFdLyouTGVuKi8gKyAxO1xuICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkge1xuICAgICAgYml0cyA9IG1heF9sZW5ndGg7XG4gICAgICBvdmVyZmxvdysrO1xuICAgIH1cbiAgICB0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi9cblxuICAgIGlmIChuID4gbWF4X2NvZGUpIHsgY29udGludWU7IH0gLyogbm90IGEgbGVhZiBub2RlICovXG5cbiAgICBzLmJsX2NvdW50W2JpdHNdKys7XG4gICAgeGJpdHMgPSAwO1xuICAgIGlmIChuID49IGJhc2UpIHtcbiAgICAgIHhiaXRzID0gZXh0cmFbbiAtIGJhc2VdO1xuICAgIH1cbiAgICBmID0gdHJlZVtuICogMl0vKi5GcmVxKi87XG4gICAgcy5vcHRfbGVuICs9IGYgKiAoYml0cyArIHhiaXRzKTtcbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdLyouTGVuKi8gKyB4Yml0cyk7XG4gICAgfVxuICB9XG4gIGlmIChvdmVyZmxvdyA9PT0gMCkgeyByZXR1cm47IH1cblxuICAvLyBUcmFjZSgoc3RkZXJyLFwiXFxuYml0IGxlbmd0aCBvdmVyZmxvd1xcblwiKSk7XG4gIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovXG5cbiAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi9cbiAgZG8ge1xuICAgIGJpdHMgPSBtYXhfbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAocy5ibF9jb3VudFtiaXRzXSA9PT0gMCkgeyBiaXRzLS07IH1cbiAgICBzLmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovXG4gICAgcy5ibF9jb3VudFtiaXRzICsgMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqL1xuICAgIHMuYmxfY291bnRbbWF4X2xlbmd0aF0tLTtcbiAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLFxuICAgICAqIGJ1dCB0aGlzIGRvZXMgbm90IGFmZmVjdCBibF9jb3VudFttYXhfbGVuZ3RoXVxuICAgICAqL1xuICAgIG92ZXJmbG93IC09IDI7XG4gIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7XG5cbiAgLyogTm93IHJlY29tcHV0ZSBhbGwgYml0IGxlbmd0aHMsIHNjYW5uaW5nIGluIGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsXG4gICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuXG4gICAqIGZyb20gJ2FyJyB3cml0dGVuIGJ5IEhhcnVoaWtvIE9rdW11cmEuKVxuICAgKi9cbiAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPT0gMDsgYml0cy0tKSB7XG4gICAgbiA9IHMuYmxfY291bnRbYml0c107XG4gICAgd2hpbGUgKG4gIT09IDApIHtcbiAgICAgIG0gPSBzLmhlYXBbLS1oXTtcbiAgICAgIGlmIChtID4gbWF4X2NvZGUpIHsgY29udGludWU7IH1cbiAgICAgIGlmICh0cmVlW20gKiAyICsgMV0vKi5MZW4qLyAhPT0gYml0cykge1xuICAgICAgICAvLyBUcmFjZSgoc3RkZXJyLFwiY29kZSAlZCBiaXRzICVkLT4lZFxcblwiLCBtLCB0cmVlW21dLkxlbiwgYml0cykpO1xuICAgICAgICBzLm9wdF9sZW4gKz0gKGJpdHMgLSB0cmVlW20gKiAyICsgMV0vKi5MZW4qLykgKiB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICAgICAgdHJlZVttICogMiArIDFdLyouTGVuKi8gPSBiaXRzO1xuICAgICAgfVxuICAgICAgbi0tO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlXG4gKiBvcHRpbWFsKS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yXG4gKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub25cbiAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KVxuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAgICAgICAgICAgLyogdGhlIHRyZWUgdG8gZGVjb3JhdGUgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuLy8gICAgdXNoZiAqYmxfY291bnQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCAqL1xue1xuICB2YXIgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTICsgMSk7IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovXG4gIHZhciBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi9cbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBpbmRleCAqL1xuXG4gIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlc1xuICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC5cbiAgICovXG4gIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykge1xuICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMgLSAxXSkgPDwgMTtcbiAgfVxuICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlXG4gICAqIG11c3QgYmUgYWxsIG9uZXMuXG4gICAqL1xuICAvL0Fzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSxcbiAgLy8gICAgICAgIFwiaW5jb25zaXN0ZW50IGJpdCBjb3VudHNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5nZW5fY29kZXM6IG1heF9jb2RlICVkIFwiLCBtYXhfY29kZSkpO1xuXG4gIGZvciAobiA9IDA7ICBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICB2YXIgbGVuID0gdHJlZVtuICogMiArIDFdLyouTGVuKi87XG4gICAgaWYgKGxlbiA9PT0gMCkgeyBjb250aW51ZTsgfVxuICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovXG4gICAgdHJlZVtuICogMl0vKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssIGxlbik7XG5cbiAgICAvL1RyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsXCJcXG5uICUzZCAlYyBsICUyZCBjICU0eCAoJXgpIFwiLFxuICAgIC8vICAgICBuLCAoaXNncmFwaChuKSA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwgbmV4dF9jb2RlW2xlbl0tMSkpO1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLlxuICovXG5mdW5jdGlvbiB0cl9zdGF0aWNfaW5pdCgpIHtcbiAgdmFyIG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqL1xuICB2YXIgbGVuZ3RoOyAgIC8qIGxlbmd0aCB2YWx1ZSAqL1xuICB2YXIgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqL1xuICB2YXIgYmxfY291bnQgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy8gZG8gY2hlY2sgaW4gX3RyX2luaXQoKVxuICAvL2lmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47XG5cbiAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqL1xuLyojaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlNcbiAgc3RhdGljX2xfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19sdHJlZTtcbiAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7XG4gIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7XG4gIHN0YXRpY19kX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2RiaXRzO1xuICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzO1xuI2VuZGlmKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovXG4gIGxlbmd0aCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMgLSAxOyBjb2RlKyspIHtcbiAgICBiYXNlX2xlbmd0aFtjb2RlXSA9IGxlbmd0aDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfbGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAobGVuZ3RoID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogbGVuZ3RoICE9IDI1NlwiKTtcbiAgLyogTm90ZSB0aGF0IHRoZSBsZW5ndGggMjU1IChtYXRjaCBsZW5ndGggMjU4KSBjYW4gYmUgcmVwcmVzZW50ZWRcbiAgICogaW4gdHdvIGRpZmZlcmVudCB3YXlzOiBjb2RlIDI4NCArIDUgYml0cyBvciBjb2RlIDI4NSwgc28gd2VcbiAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOlxuICAgKi9cbiAgX2xlbmd0aF9jb2RlW2xlbmd0aCAtIDFdID0gY29kZTtcblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi9cbiAgZGlzdCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCAxNjsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDtcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgZXh0cmFfZGJpdHNbY29kZV0pOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTZcIik7XG4gIGRpc3QgPj49IDc7IC8qIGZyb20gbm93IG9uLCBhbGwgZGlzdGFuY2VzIGFyZSBkaXZpZGVkIGJ5IDEyOCAqL1xuICBmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNztcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgKGV4dHJhX2RiaXRzW2NvZGVdIC0gNykpOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyXCIpO1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi9cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgbiA9IDA7XG4gIHdoaWxlIChuIDw9IDE0Mykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI1NSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA5O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs5XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI3OSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA3O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs3XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI4Nykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZVxuICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGVcbiAgICogYWxsIG9uZXMpXG4gICAqL1xuICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTICsgMSwgYmxfY291bnQpO1xuXG4gIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDU7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7XG4gIH1cblxuICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2FuIGluaXQgc3RhdGljIHRyZWVzXG4gIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMgKyAxLCBMX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19kX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFMpO1xuICBzdGF0aWNfYmxfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksIGV4dHJhX2JsYml0cywgMCwgICAgICAgICBCTF9DT0RFUywgTUFYX0JMX0JJVFMpO1xuXG4gIC8vc3RhdGljX2luaXRfZG9uZSA9IHRydWU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIGEgbmV3IGJsb2NrLlxuICovXG5mdW5jdGlvbiBpbml0X2Jsb2NrKHMpIHtcbiAgdmFyIG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgIG4rKykgeyBzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gPSAwOyB9XG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyAgbisrKSB7IHMuZHluX2R0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTOyBuKyspIHsgcy5ibF90cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cblxuICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXS8qLkZyZXEqLyA9IDE7XG4gIHMub3B0X2xlbiA9IHMuc3RhdGljX2xlbiA9IDA7XG4gIHMubGFzdF9saXQgPSBzLm1hdGNoZXMgPSAwO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5XG4gKi9cbmZ1bmN0aW9uIGJpX3dpbmR1cChzKVxue1xuICBpZiAocy5iaV92YWxpZCA+IDgpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPiAwKSB7XG4gICAgLy9wdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpO1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWY7XG4gIH1cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0c1xuICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcilcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAgICAqYnVmOyAgICAvKiB0aGUgaW5wdXQgZGF0YSAqL1xuLy91bnNpZ25lZCBsZW47ICAgICAvKiBpdHMgbGVuZ3RoICovXG4vL2ludCAgICAgIGhlYWRlcjsgIC8qIHRydWUgaWYgYmxvY2sgaGVhZGVyIG11c3QgYmUgd3JpdHRlbiAqL1xue1xuICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovXG5cbiAgaWYgKGhlYWRlcikge1xuICAgIHB1dF9zaG9ydChzLCBsZW4pO1xuICAgIHB1dF9zaG9ydChzLCB+bGVuKTtcbiAgfVxuLy8gIHdoaWxlIChsZW4tLSkge1xuLy8gICAgcHV0X2J5dGUocywgKmJ1ZisrKTtcbi8vICB9XG4gIHV0aWxzLmFycmF5U2V0KHMucGVuZGluZ19idWYsIHMud2luZG93LCBidWYsIGxlbiwgcy5wZW5kaW5nKTtcbiAgcy5wZW5kaW5nICs9IGxlbjtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlblxuICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIHtcbiAgdmFyIF9uMiA9IG4gKiAyO1xuICB2YXIgX20yID0gbSAqIDI7XG4gIHJldHVybiAodHJlZVtfbjJdLyouRnJlcSovIDwgdHJlZVtfbTJdLyouRnJlcSovIHx8XG4gICAgICAgICAodHJlZVtfbjJdLyouRnJlcSovID09PSB0cmVlW19tMl0vKi5GcmVxKi8gJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgayxcbiAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nXG4gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzXG4gKiB0d28gc29ucykuXG4gKi9cbmZ1bmN0aW9uIHBxZG93bmhlYXAocywgdHJlZSwgaylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgLyogdGhlIHRyZWUgdG8gcmVzdG9yZSAqL1xuLy8gICAgaW50IGs7ICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi9cbntcbiAgdmFyIHYgPSBzLmhlYXBba107XG4gIHZhciBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqL1xuICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7XG4gICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi9cbiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiZcbiAgICAgIHNtYWxsZXIodHJlZSwgcy5oZWFwW2ogKyAxXSwgcy5oZWFwW2pdLCBzLmRlcHRoKSkge1xuICAgICAgaisrO1xuICAgIH1cbiAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqL1xuICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHsgYnJlYWs7IH1cblxuICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovXG4gICAgcy5oZWFwW2tdID0gcy5oZWFwW2pdO1xuICAgIGsgPSBqO1xuXG4gICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqL1xuICAgIGogPDw9IDE7XG4gIH1cbiAgcy5oZWFwW2tdID0gdjtcbn1cblxuXG4vLyBpbmxpbmVkIG1hbnVhbGx5XG4vLyB2YXIgU01BTExFU1QgPSAxO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlc1xuICovXG5mdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY29uc3QgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqL1xuLy8gICAgY29uc3QgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbntcbiAgdmFyIGRpc3Q7ICAgICAgICAgICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqL1xuICB2YXIgbHggPSAwOyAgICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cbiAgdmFyIGNvZGU7ICAgICAgICAgICAvKiB0aGUgY29kZSB0byBzZW5kICovXG4gIHZhciBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqL1xuXG4gIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7XG4gICAgZG8ge1xuICAgICAgZGlzdCA9IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDJdIDw8IDgpIHwgKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMiArIDFdKTtcbiAgICAgIGxjID0gcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgbHhdO1xuICAgICAgbHgrKztcblxuICAgICAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgICAgLy9UcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLFwiICclYycgXCIsIGxjKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdO1xuICAgICAgICBzZW5kX2NvZGUocywgY29kZSArIExJVEVSQUxTICsgMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTtcbiAgICAgICAgLy9Bc3NlcnQgKGNvZGUgPCBEX0NPREVTLCBcImJhZCBkX2NvZGVcIik7XG5cbiAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUsIGR0cmVlKTsgICAgICAgLyogc2VuZCB0aGUgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdO1xuICAgICAgICBpZiAoZXh0cmEgIT09IDApIHtcbiAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTtcbiAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqL1xuXG4gICAgICAvKiBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmIGlzIG9rOiAqL1xuICAgICAgLy9Bc3NlcnQoKHVJbnQpKHMtPnBlbmRpbmcpIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LFxuICAgICAgLy8gICAgICAgXCJwZW5kaW5nQnVmIG92ZXJmbG93XCIpO1xuXG4gICAgfSB3aGlsZSAobHggPCBzLmxhc3RfbGl0KTtcbiAgfVxuXG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLlxuICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhcbiAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpc1xuICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfdHJlZShzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgc3RyZWUgICAgPSBkZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZTtcbiAgdmFyIGhhc19zdHJlZSA9IGRlc2Muc3RhdF9kZXNjLmhhc19zdHJlZTtcbiAgdmFyIGVsZW1zICAgID0gZGVzYy5zdGF0X2Rlc2MuZWxlbXM7XG4gIHZhciBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqL1xuICB2YXIgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHZhciBub2RlOyAgICAgICAgICAvKiBuZXcgbm9kZSBiZWluZyBjcmVhdGVkICovXG5cbiAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpblxuICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS5cbiAgICogaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICovXG4gIHMuaGVhcF9sZW4gPSAwO1xuICBzLmhlYXBfbWF4ID0gSEVBUF9TSVpFO1xuXG4gIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7XG4gICAgaWYgKHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IG1heF9jb2RlID0gbjtcbiAgICAgIHMuZGVwdGhbbl0gPSAwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gMDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLFxuICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmVcbiAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3RcbiAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS5cbiAgICovXG4gIHdoaWxlIChzLmhlYXBfbGVuIDwgMikge1xuICAgIG5vZGUgPSBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7XG4gICAgdHJlZVtub2RlICogMl0vKi5GcmVxKi8gPSAxO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAwO1xuICAgIHMub3B0X2xlbi0tO1xuXG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUgKiAyICsgMV0vKi5MZW4qLztcbiAgICB9XG4gICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovXG4gIH1cbiAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlO1xuXG4gIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSxcbiAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6XG4gICAqL1xuICBmb3IgKG4gPSAocy5oZWFwX2xlbiA+PiAxLyppbnQgLzIqLyk7IG4gPj0gMTsgbi0tKSB7IHBxZG93bmhlYXAocywgdHJlZSwgbik7IH1cblxuICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvXG4gICAqIGZyZXF1ZW50IG5vZGVzLlxuICAgKi9cbiAgbm9kZSA9IGVsZW1zOyAgICAgICAgICAgICAgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovXG4gIGRvIHtcbiAgICAvL3BxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovXG4gICAgLyoqKiBwcXJlbW92ZSAqKiovXG4gICAgbiA9IHMuaGVhcFsxLypTTUFMTEVTVCovXTtcbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBzLmhlYXBbcy5oZWFwX2xlbi0tXTtcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuICAgIC8qKiovXG5cbiAgICBtID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqL1xuXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovXG4gICAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBtO1xuXG4gICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi9cbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IHRyZWVbbiAqIDJdLyouRnJlcSovICsgdHJlZVttICogMl0vKi5GcmVxKi87XG4gICAgcy5kZXB0aFtub2RlXSA9IChzLmRlcHRoW25dID49IHMuZGVwdGhbbV0gPyBzLmRlcHRoW25dIDogcy5kZXB0aFttXSkgKyAxO1xuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkRhZCovID0gdHJlZVttICogMiArIDFdLyouRGFkKi8gPSBub2RlO1xuXG4gICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi9cbiAgICBzLmhlYXBbMS8qU01BTExFU1QqL10gPSBub2RlKys7XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxLypTTUFMTEVTVCovKTtcblxuICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpO1xuXG4gIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuXG4gIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3dcbiAgICogZ2VuZXJhdGUgdGhlIGJpdCBsZW5ndGhzLlxuICAgKi9cbiAgZ2VuX2JpdGxlbihzLCBkZXNjKTtcblxuICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovXG4gIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgcy5ibF9jb3VudCk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzXG4gKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLlxuICovXG5mdW5jdGlvbiBzY2FuX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG4gIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0vKi5MZW4qLyA9IDB4ZmZmZjsgLyogZ3VhcmQgKi9cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0vKi5GcmVxKi8gKz0gY291bnQ7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuXG4gICAgICBpZiAoY3VybGVuICE9PSBwcmV2bGVuKSB7IHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLysrOyB9XG4gICAgICBzLmJsX3RyZWVbUkVQXzNfNiAqIDJdLyouRnJlcSovKys7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8zXzEwICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8xMV8xMzggKiAyXS8qLkZyZXEqLysrO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuXG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluXG4gKiBibF90cmVlLlxuICovXG5mdW5jdGlvbiBzZW5kX3RyZWUocywgdHJlZSwgbWF4X2NvZGUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47ICAgICAgICAgICAgICAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXS8qLkxlbiovOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7ICAgICAgICAgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0vKi5MZW4qLztcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBkbyB7IHNlbmRfY29kZShzLCBjdXJsZW4sIHMuYmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT09IDApO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTtcbiAgICAgICAgY291bnQtLTtcbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgXCIgM182P1wiKTtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMik7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMTEsIDcpO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpblxuICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX2JsX3RyZWUocykge1xuICB2YXIgbWF4X2JsaW5kZXg7ICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBiaXQgbGVuZ3RoIGZyZXF1ZW5jaWVzIGZvciBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICBzY2FuX3RyZWUocywgcy5keW5fbHRyZWUsIHMubF9kZXNjLm1heF9jb2RlKTtcbiAgc2Nhbl90cmVlKHMsIHMuZHluX2R0cmVlLCBzLmRfZGVzYy5tYXhfY29kZSk7XG5cbiAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi9cbiAgYnVpbGRfdHJlZShzLCBzLmJsX2Rlc2MpO1xuICAvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0XG4gICAqIHRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RocyBjb2RlcyBhbmQgdGhlIDUrNSs0IGJpdHMgZm9yIHRoZSBjb3VudHMuXG4gICAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdFxuICAgKiByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IDQgYml0IGxlbmd0aCBjb2RlcyBiZSBzZW50LiAoYXBwbm90ZS50eHQgc2F5c1xuICAgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pXG4gICAqL1xuICBmb3IgKG1heF9ibGluZGV4ID0gQkxfQ09ERVMgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7XG4gICAgaWYgKHMuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF0gKiAyICsgMV0vKi5MZW4qLyAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovXG4gIHMub3B0X2xlbiArPSAzICogKG1heF9ibGluZGV4ICsgMSkgKyA1ICsgNSArIDQ7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuZHluIHRyZWVzOiBkeW4gJWxkLCBzdGF0ICVsZFwiLFxuICAvLyAgICAgICAgcy0+b3B0X2xlbiwgcy0+c3RhdGljX2xlbikpO1xuXG4gIHJldHVybiBtYXhfYmxpbmRleDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGhlYWRlciBmb3IgYSBibG9jayB1c2luZyBkeW5hbWljIEh1ZmZtYW4gdHJlZXM6IHRoZSBjb3VudHMsIHRoZVxuICogbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcywgdGhlIGxpdGVyYWwgdHJlZSBhbmQgdGhlIGRpc3RhbmNlIHRyZWUuXG4gKiBJTiBhc3NlcnRpb246IGxjb2RlcyA+PSAyNTcsIGRjb2RlcyA+PSAxLCBibGNvZGVzID49IDQuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfYWxsX3RyZWVzKHMsIGxjb2RlcywgZGNvZGVzLCBibGNvZGVzKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGludCBsY29kZXMsIGRjb2RlcywgYmxjb2RlczsgLyogbnVtYmVyIG9mIGNvZGVzIGZvciBlYWNoIHRyZWUgKi9cbntcbiAgdmFyIHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqL1xuXG4gIC8vQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgXCJub3QgZW5vdWdoIGNvZGVzXCIpO1xuICAvL0Fzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUyxcbiAgLy8gICAgICAgIFwidG9vIG1hbnkgY29kZXNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY291bnRzOiBcIikpO1xuICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCAgIDUpO1xuICBzZW5kX2JpdHMocywgYmxjb2RlcyAtIDQsICA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7XG4gICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb2RlICUyZCBcIiwgYmxfb3JkZXJbcmFua10pKTtcbiAgICBzZW5kX2JpdHMocywgcy5ibF90cmVlW2JsX29yZGVyW3JhbmtdICogMiArIDFdLyouTGVuKi8sIDMpO1xuICB9XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLyogbGl0ZXJhbCB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06XG4gKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6XG4gKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcImJsYWNrIGxpc3RcIiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLlxuICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJ3aGl0ZSBsaXN0XCIgKDkge1RBQn0sIDEwIHtMRn0sIDEzIHtDUn0sIDMyLi4yNTUpLlxuICogLSBCSU5BUlkgb3RoZXJ3aXNlLlxuICogLSBUaGUgZm9sbG93aW5nIHBhcnRpYWxseS1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgZm9ybSBhXG4gKiAgIFwiZ3JheSBsaXN0XCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobTpcbiAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LlxuICovXG5mdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHtcbiAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzXG4gICAqIHNldCBiaXRzIDAuLjYsIDE0Li4yNSwgYW5kIDI4Li4zMVxuICAgKiAweGYzZmZjMDdmID0gYmluYXJ5IDExMTEwMDExMTExMTExMTExMTAwMDAwMDAxMTExMTExXG4gICAqL1xuICB2YXIgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2Y7XG4gIHZhciBuO1xuXG4gIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoXCJibGFjay1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj49IDEpIHtcbiAgICBpZiAoKGJsYWNrX21hc2sgJiAxKSAmJiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSkge1xuICAgICAgcmV0dXJuIFpfQklOQVJZO1xuICAgIH1cbiAgfVxuXG4gIC8qIENoZWNrIGZvciB0ZXh0dWFsIChcIndoaXRlLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgaWYgKHMuZHluX2x0cmVlWzkgKiAyXS8qLkZyZXEqLyAhPT0gMCB8fCBzLmR5bl9sdHJlZVsxMCAqIDJdLyouRnJlcSovICE9PSAwIHx8XG4gICAgICBzLmR5bl9sdHJlZVsxMyAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgcmV0dXJuIFpfVEVYVDtcbiAgfVxuICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTOyBuKyspIHtcbiAgICBpZiAocy5keW5fbHRyZWVbbiAqIDJdLyouRnJlcSovICE9PSAwKSB7XG4gICAgICByZXR1cm4gWl9URVhUO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZXJlIGFyZSBubyBcImJsYWNrLWxpc3RlZFwiIG9yIFwid2hpdGUtbGlzdGVkXCIgYnl0ZXM6XG4gICAqIHRoaXMgc3RyZWFtIGVpdGhlciBpcyBlbXB0eSBvciBoYXMgdG9sZXJhdGVkIChcImdyYXktbGlzdGVkXCIpIGJ5dGVzIG9ubHkuXG4gICAqL1xuICByZXR1cm4gWl9CSU5BUlk7XG59XG5cblxudmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIF90cl9pbml0KHMpXG57XG5cbiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7XG4gICAgdHJfc3RhdGljX2luaXQoKTtcbiAgICBzdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbiAgfVxuXG4gIHMubF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9sdHJlZSwgc3RhdGljX2xfZGVzYyk7XG4gIHMuZF9kZXNjICA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7XG4gIHMuYmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmJsX3RyZWUsIHN0YXRpY19ibF9kZXNjKTtcblxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqL1xuICBpbml0X2Jsb2NrKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHN0b3JlZCBibG9ja1xuICovXG5mdW5jdGlvbiBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsgICAgLyogc2VuZCBibG9jayB0eXBlICovXG4gIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsgLyogd2l0aCBoZWFkZXIgKi9cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuXG4gKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gX3RyX2FsaWduKHMpIHtcbiAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUyA8PCAxLCAzKTtcbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTtcbiAgYmlfZmx1c2gocyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWNcbiAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS5cbiAqL1xuZnVuY3Rpb24gX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7ICAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovXG4gIHZhciBtYXhfYmxpbmRleCA9IDA7ICAgICAgICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovXG5cbiAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqL1xuICBpZiAocy5sZXZlbCA+IDApIHtcblxuICAgIC8qIENoZWNrIGlmIHRoZSBmaWxlIGlzIGJpbmFyeSBvciB0ZXh0ICovXG4gICAgaWYgKHMuc3RybS5kYXRhX3R5cGUgPT09IFpfVU5LTk9XTikge1xuICAgICAgcy5zdHJtLmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7XG4gICAgfVxuXG4gICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcbiAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2ZcbiAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLlxuICAgICAqL1xuXG4gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXhcbiAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7XG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovXG4gICAgb3B0X2xlbmIgPSAocy5vcHRfbGVuICsgMyArIDcpID4+PiAzO1xuICAgIHN0YXRpY19sZW5iID0gKHMuc3RhdGljX2xlbiArIDMgKyA3KSA+Pj4gMztcblxuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1IFwiLFxuICAgIC8vICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sXG4gICAgLy8gICAgICAgIHMtPmxhc3RfbGl0KSk7XG5cbiAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIHsgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYjsgfVxuXG4gIH0gZWxzZSB7XG4gICAgLy8gQXNzZXJ0KGJ1ZiAhPSAoY2hhciopMCwgXCJsb3N0IGJ1ZlwiKTtcbiAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovXG4gIH1cblxuICBpZiAoKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iKSAmJiAoYnVmICE9PSAtMSkpIHtcbiAgICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovXG5cbiAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLlxuICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2VcbiAgICAgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW5cbiAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG9cbiAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLlxuICAgICAqL1xuICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTtcblxuICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQgfHwgc3RhdGljX2xlbmIgPT09IG9wdF9sZW5iKSB7XG5cbiAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzLmR5bl9sdHJlZSwgcy5keW5fZHRyZWUpO1xuICB9XG4gIC8vIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCBcImJhZCBjb21wcmVzc2VkIHNpemVcIik7XG4gIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CXG4gICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLlxuICAgKi9cbiAgaW5pdF9ibG9jayhzKTtcblxuICBpZiAobGFzdCkge1xuICAgIGJpX3dpbmR1cChzKTtcbiAgfVxuICAvLyBUcmFjZXYoKHN0ZGVycixcIlxcbmNvbXBybGVuICVsdSglbHUpIFwiLCBzLT5jb21wcmVzc2VkX2xlbj4+MyxcbiAgLy8gICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNypsYXN0KSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmXG4gKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIF90cl90YWxseShzLCBkaXN0LCBsYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB1bnNpZ25lZCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbi8vICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqL1xue1xuICAvL3ZhciBvdXRfbGVuZ3RoLCBpbl9sZW5ndGgsIGRjb2RlO1xuXG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyXSAgICAgPSAoZGlzdCA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBzLmxhc3RfbGl0ICogMiArIDFdID0gZGlzdCAmIDB4ZmY7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgcy5sYXN0X2xpdF0gPSBsYyAmIDB4ZmY7XG4gIHMubGFzdF9saXQrKztcblxuICBpZiAoZGlzdCA9PT0gMCkge1xuICAgIC8qIGxjIGlzIHRoZSB1bm1hdGNoZWQgY2hhciAqL1xuICAgIHMuZHluX2x0cmVlW2xjICogMl0vKi5GcmVxKi8rKztcbiAgfSBlbHNlIHtcbiAgICBzLm1hdGNoZXMrKztcbiAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgZGlzdC0tOyAgICAgICAgICAgICAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgLy9Bc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJlxuICAgIC8vICAgICAgICh1c2gpbGMgPD0gKHVzaCkoTUFYX01BVENILU1JTl9NQVRDSCkgJiZcbiAgICAvLyAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgIFwiX3RyX3RhbGx5OiBiYWQgbWF0Y2hcIik7XG5cbiAgICBzLmR5bl9sdHJlZVsoX2xlbmd0aF9jb2RlW2xjXSArIExJVEVSQUxTICsgMSkgKiAyXS8qLkZyZXEqLysrO1xuICAgIHMuZHluX2R0cmVlW2RfY29kZShkaXN0KSAqIDJdLyouRnJlcSovKys7XG4gIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcblxuLy8jaWZkZWYgVFJVTkNBVEVfQkxPQ0tcbi8vICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi9cbi8vICBpZiAoKHMubGFzdF9saXQgJiAweDFmZmYpID09PSAwICYmIHMubGV2ZWwgPiAyKSB7XG4vLyAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi9cbi8vICAgIG91dF9sZW5ndGggPSBzLmxhc3RfbGl0Kjg7XG4vLyAgICBpbl9sZW5ndGggPSBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydDtcbi8vXG4vLyAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7XG4vLyAgICAgIG91dF9sZW5ndGggKz0gcy5keW5fZHRyZWVbZGNvZGUqMl0vKi5GcmVxKi8gKiAoNSArIGV4dHJhX2RiaXRzW2Rjb2RlXSk7XG4vLyAgICB9XG4vLyAgICBvdXRfbGVuZ3RoID4+Pj0gMztcbi8vICAgIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgXCIsXG4vLyAgICAvLyAgICAgICBzLT5sYXN0X2xpdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLFxuLy8gICAgLy8gICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTtcbi8vICAgIGlmIChzLm1hdGNoZXMgPCAocy5sYXN0X2xpdD4+MSkvKmludCAvMiovICYmIG91dF9sZW5ndGggPCAoaW5fbGVuZ3RoPj4xKS8qaW50IC8yKi8pIHtcbi8vICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICB9XG4vLyAgfVxuLy8jZW5kaWZcblxuICByZXR1cm4gKHMubGFzdF9saXQgPT09IHMubGl0X2J1ZnNpemUgLSAxKTtcbiAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLXG4gICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvXG4gICAqIDY0Sy0xIGJ5dGVzLlxuICAgKi9cbn1cblxuZXhwb3J0cy5fdHJfaW5pdCAgPSBfdHJfaW5pdDtcbmV4cG9ydHMuX3RyX3N0b3JlZF9ibG9jayA9IF90cl9zdG9yZWRfYmxvY2s7XG5leHBvcnRzLl90cl9mbHVzaF9ibG9jayAgPSBfdHJfZmx1c2hfYmxvY2s7XG5leHBvcnRzLl90cl90YWxseSA9IF90cl90YWxseTtcbmV4cG9ydHMuX3RyX2FsaWduID0gX3RyX2FsaWduO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIFpTdHJlYW0oKSB7XG4gIC8qIG5leHQgaW5wdXQgYnl0ZSAqL1xuICB0aGlzLmlucHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfaW4gPSAwO1xuICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IGlucHV0ICovXG4gIHRoaXMuYXZhaWxfaW4gPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9pbiA9IDA7XG4gIC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqL1xuICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X291dCA9IDA7XG4gIC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG91dHB1dCAqL1xuICB0aGlzLmF2YWlsX291dCA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovXG4gIHRoaXMudG90YWxfb3V0ID0gMDtcbiAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovXG4gIHRoaXMubXNnID0gJycvKlpfTlVMTCovO1xuICAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi9cbiAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi9cbiAgdGhpcy5kYXRhX3R5cGUgPSAyLypaX1VOS05PV04qLztcbiAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi9cbiAgdGhpcy5hZGxlciA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gbGlnaHR3ZWlnaHQgQnVmZmVyIHNoaW0gZm9yIHBiZiBicm93c2VyIGJ1aWxkXG4vLyBiYXNlZCBvbiBjb2RlIGZyb20gZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyIChNSVQtbGljZW5zZWQpXG5cbm1vZHVsZS5leHBvcnRzID0gQnVmZmVyO1xuXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKTtcblxudmFyIEJ1ZmZlck1ldGhvZHM7XG5cbmZ1bmN0aW9uIEJ1ZmZlcihsZW5ndGgpIHtcbiAgICB2YXIgYXJyO1xuICAgIGlmIChsZW5ndGggJiYgbGVuZ3RoLmxlbmd0aCkge1xuICAgICAgICBhcnIgPSBsZW5ndGg7XG4gICAgICAgIGxlbmd0aCA9IGFyci5sZW5ndGg7XG4gICAgfVxuICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGggfHwgMCk7XG4gICAgaWYgKGFycikgYnVmLnNldChhcnIpO1xuXG4gICAgYnVmLnJlYWRVSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZFVJbnQzMkxFO1xuICAgIGJ1Zi53cml0ZVVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZVVJbnQzMkxFO1xuICAgIGJ1Zi5yZWFkSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZEludDMyTEU7XG4gICAgYnVmLndyaXRlSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVJbnQzMkxFO1xuICAgIGJ1Zi5yZWFkRmxvYXRMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZEZsb2F0TEU7XG4gICAgYnVmLndyaXRlRmxvYXRMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVGbG9hdExFO1xuICAgIGJ1Zi5yZWFkRG91YmxlTEUgPSBCdWZmZXJNZXRob2RzLnJlYWREb3VibGVMRTtcbiAgICBidWYud3JpdGVEb3VibGVMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVEb3VibGVMRTtcbiAgICBidWYudG9TdHJpbmcgPSBCdWZmZXJNZXRob2RzLnRvU3RyaW5nO1xuICAgIGJ1Zi53cml0ZSA9IEJ1ZmZlck1ldGhvZHMud3JpdGU7XG4gICAgYnVmLnNsaWNlID0gQnVmZmVyTWV0aG9kcy5zbGljZTtcbiAgICBidWYuY29weSA9IEJ1ZmZlck1ldGhvZHMuY29weTtcblxuICAgIGJ1Zi5faXNCdWZmZXIgPSB0cnVlO1xuICAgIHJldHVybiBidWY7XG59XG5cbnZhciBsYXN0U3RyLCBsYXN0U3RyRW5jb2RlZDtcblxuQnVmZmVyTWV0aG9kcyA9IHtcbiAgICByZWFkVUludDMyTEU6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICByZXR1cm4gKCh0aGlzW3Bvc10pIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDJdIDw8IDE2KSkgK1xuICAgICAgICAgICAgKHRoaXNbcG9zICsgM10gKiAweDEwMDAwMDApO1xuICAgIH0sXG5cbiAgICB3cml0ZVVJbnQzMkxFOiBmdW5jdGlvbih2YWwsIHBvcykge1xuICAgICAgICB0aGlzW3Bvc10gPSB2YWw7XG4gICAgICAgIHRoaXNbcG9zICsgMV0gPSAodmFsID4+PiA4KTtcbiAgICAgICAgdGhpc1twb3MgKyAyXSA9ICh2YWwgPj4+IDE2KTtcbiAgICAgICAgdGhpc1twb3MgKyAzXSA9ICh2YWwgPj4+IDI0KTtcbiAgICB9LFxuXG4gICAgcmVhZEludDMyTEU6IGZ1bmN0aW9uKHBvcykge1xuICAgICAgICByZXR1cm4gKCh0aGlzW3Bvc10pIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDJdIDw8IDE2KSkgK1xuICAgICAgICAgICAgKHRoaXNbcG9zICsgM10gPDwgMjQpO1xuICAgIH0sXG5cbiAgICByZWFkRmxvYXRMRTogIGZ1bmN0aW9uKHBvcykgeyByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIHBvcywgdHJ1ZSwgMjMsIDQpOyB9LFxuICAgIHJlYWREb3VibGVMRTogZnVuY3Rpb24ocG9zKSB7IHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgcG9zLCB0cnVlLCA1MiwgOCk7IH0sXG5cbiAgICB3cml0ZUZsb2F0TEU6ICBmdW5jdGlvbih2YWwsIHBvcykgeyByZXR1cm4gaWVlZTc1NC53cml0ZSh0aGlzLCB2YWwsIHBvcywgdHJ1ZSwgMjMsIDQpOyB9LFxuICAgIHdyaXRlRG91YmxlTEU6IGZ1bmN0aW9uKHZhbCwgcG9zKSB7IHJldHVybiBpZWVlNzU0LndyaXRlKHRoaXMsIHZhbCwgcG9zLCB0cnVlLCA1MiwgOCk7IH0sXG5cbiAgICB0b1N0cmluZzogZnVuY3Rpb24oZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdmFyIHN0ciA9ICcnLFxuICAgICAgICAgICAgdG1wID0gJyc7XG5cbiAgICAgICAgc3RhcnQgPSBzdGFydCB8fCAwO1xuICAgICAgICBlbmQgPSBNYXRoLm1pbih0aGlzLmxlbmd0aCwgZW5kIHx8IHRoaXMubGVuZ3RoKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoID0gdGhpc1tpXTtcbiAgICAgICAgICAgIGlmIChjaCA8PSAweDdGKSB7XG4gICAgICAgICAgICAgICAgc3RyICs9IGRlY29kZVVSSUNvbXBvbmVudCh0bXApICsgU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICAgICAgICAgICAgdG1wID0gJyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRtcCArPSAnJScgKyBjaC50b1N0cmluZygxNik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdHIgKz0gZGVjb2RlVVJJQ29tcG9uZW50KHRtcCk7XG5cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9LFxuXG4gICAgd3JpdGU6IGZ1bmN0aW9uKHN0ciwgcG9zKSB7XG4gICAgICAgIHZhciBieXRlcyA9IHN0ciA9PT0gbGFzdFN0ciA/IGxhc3RTdHJFbmNvZGVkIDogZW5jb2RlU3RyaW5nKHN0cik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXNbcG9zICsgaV0gPSBieXRlc1tpXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzbGljZTogZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKTtcbiAgICB9LFxuXG4gICAgY29weTogZnVuY3Rpb24oYnVmLCBwb3MpIHtcbiAgICAgICAgcG9zID0gcG9zIHx8IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYnVmW3BvcyArIGldID0gdGhpc1tpXTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkJ1ZmZlck1ldGhvZHMud3JpdGVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZVVJbnQzMkxFO1xuXG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGZ1bmN0aW9uKHN0cikge1xuICAgIGxhc3RTdHIgPSBzdHI7XG4gICAgbGFzdFN0ckVuY29kZWQgPSBlbmNvZGVTdHJpbmcoc3RyKTtcbiAgICByZXR1cm4gbGFzdFN0ckVuY29kZWQubGVuZ3RoO1xufTtcblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24oYnVmKSB7XG4gICAgcmV0dXJuICEhKGJ1ZiAmJiBidWYuX2lzQnVmZmVyKTtcbn07XG5cbmZ1bmN0aW9uIGVuY29kZVN0cmluZyhzdHIpIHtcbiAgICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aCxcbiAgICAgICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBjLCBsZWFkOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpOyAvLyBjb2RlIHBvaW50XG5cbiAgICAgICAgaWYgKGMgPiAweEQ3RkYgJiYgYyA8IDB4RTAwMCkge1xuXG4gICAgICAgICAgICBpZiAobGVhZCkge1xuICAgICAgICAgICAgICAgIGlmIChjIDwgMHhEQzAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgICAgICAgICAgIGxlYWQgPSBjO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBsZWFkIC0gMHhEODAwIDw8IDEwIHwgYyAtIDB4REMwMCB8IDB4MTAwMDA7XG4gICAgICAgICAgICAgICAgICAgIGxlYWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA+IDB4REJGRiB8fCAoaSArIDEgPT09IGxlbmd0aCkpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgICAgICAgZWxzZSBsZWFkID0gYztcblxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAobGVhZCkge1xuICAgICAgICAgICAgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgIGxlYWQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSBieXRlcy5wdXNoKGMpO1xuICAgICAgICBlbHNlIGlmIChjIDwgMHg4MDApIGJ5dGVzLnB1c2goYyA+PiAweDYgfCAweEMwLCBjICYgMHgzRiB8IDB4ODApO1xuICAgICAgICBlbHNlIGlmIChjIDwgMHgxMDAwMCkgYnl0ZXMucHVzaChjID4+IDB4QyB8IDB4RTAsIGMgPj4gMHg2ICYgMHgzRiB8IDB4ODAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgICAgIGVsc2UgYnl0ZXMucHVzaChjID4+IDB4MTIgfCAweEYwLCBjID4+IDB4QyAmIDB4M0YgfCAweDgwLCBjID4+IDB4NiAmIDB4M0YgfCAweDgwLCBjICYgMHgzRiB8IDB4ODApO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGJmO1xuXG52YXIgQnVmZmVyID0gZ2xvYmFsLkJ1ZmZlciB8fCByZXF1aXJlKCcuL2J1ZmZlcicpO1xuXG5mdW5jdGlvbiBQYmYoYnVmKSB7XG4gICAgdGhpcy5idWYgPSAhQnVmZmVyLmlzQnVmZmVyKGJ1ZikgPyBuZXcgQnVmZmVyKGJ1ZiB8fCAwKSA6IGJ1ZjtcbiAgICB0aGlzLnBvcyA9IDA7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLmJ1Zi5sZW5ndGg7XG59XG5cblBiZi5WYXJpbnQgID0gMDsgLy8gdmFyaW50OiBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBzaW50MzIsIHNpbnQ2NCwgYm9vbCwgZW51bVxuUGJmLkZpeGVkNjQgPSAxOyAvLyA2NC1iaXQ6IGRvdWJsZSwgZml4ZWQ2NCwgc2ZpeGVkNjRcblBiZi5CeXRlcyAgID0gMjsgLy8gbGVuZ3RoLWRlbGltaXRlZDogc3RyaW5nLCBieXRlcywgZW1iZWRkZWQgbWVzc2FnZXMsIHBhY2tlZCByZXBlYXRlZCBmaWVsZHNcblBiZi5GaXhlZDMyID0gNTsgLy8gMzItYml0OiBmbG9hdCwgZml4ZWQzMiwgc2ZpeGVkMzJcblxudmFyIFNISUZUX0xFRlRfMzIgPSAoMSA8PCAxNikgKiAoMSA8PCAxNiksXG4gICAgU0hJRlRfUklHSFRfMzIgPSAxIC8gU0hJRlRfTEVGVF8zMixcbiAgICBQT1dfMl82MyA9IE1hdGgucG93KDIsIDYzKTtcblxuUGJmLnByb3RvdHlwZSA9IHtcblxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmJ1ZiA9IG51bGw7XG4gICAgfSxcblxuICAgIC8vID09PSBSRUFESU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICByZWFkRmllbGRzOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCwgZW5kKSB7XG4gICAgICAgIGVuZCA9IGVuZCB8fCB0aGlzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLnJlYWRWYXJpbnQoKSxcbiAgICAgICAgICAgICAgICB0YWcgPSB2YWwgPj4gMyxcbiAgICAgICAgICAgICAgICBzdGFydFBvcyA9IHRoaXMucG9zO1xuXG4gICAgICAgICAgICByZWFkRmllbGQodGFnLCByZXN1bHQsIHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgPT09IHN0YXJ0UG9zKSB0aGlzLnNraXAodmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICByZWFkTWVzc2FnZTogZnVuY3Rpb24ocmVhZEZpZWxkLCByZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZpZWxkcyhyZWFkRmllbGQsIHJlc3VsdCwgdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyk7XG4gICAgfSxcblxuICAgIHJlYWRGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkSW50MzJMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIC8vIDY0LWJpdCBpbnQgaGFuZGxpbmcgaXMgYmFzZWQgb24gZ2l0aHViLmNvbS9kcHcvbm9kZS1idWZmZXItbW9yZS1pbnRzIChNSVQtbGljZW5zZWQpXG5cbiAgICByZWFkRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpICsgdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKSArIHRoaXMuYnVmLnJlYWRJbnQzMkxFKHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkRmxvYXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZEZsb2F0TEUodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkRG91YmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWREb3VibGVMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYnVmID0gdGhpcy5idWYsXG4gICAgICAgICAgICB2YWwsIGIsIGIwLCBiMSwgYjIsIGIzO1xuXG4gICAgICAgIGIwID0gYnVmW3RoaXMucG9zKytdOyBpZiAoYjAgPCAweDgwKSByZXR1cm4gYjA7ICAgICAgICAgICAgICAgICBiMCA9IGIwICYgMHg3ZjtcbiAgICAgICAgYjEgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMSA8IDB4ODApIHJldHVybiBiMCB8IGIxIDw8IDc7ICAgICAgIGIxID0gKGIxICYgMHg3ZikgPDwgNztcbiAgICAgICAgYjIgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMiA8IDB4ODApIHJldHVybiBiMCB8IGIxIHwgYjIgPDwgMTQ7IGIyID0gKGIyICYgMHg3ZikgPDwgMTQ7XG4gICAgICAgIGIzID0gYnVmW3RoaXMucG9zKytdOyBpZiAoYjMgPCAweDgwKSByZXR1cm4gYjAgfCBiMSB8IGIyIHwgYjMgPDwgMjE7XG5cbiAgICAgICAgdmFsID0gYjAgfCBiMSB8IGIyIHwgKGIzICYgMHg3ZikgPDwgMjE7XG5cbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDEwMDAwMDAwOyAgICAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDgwMDAwMDAwMDsgICAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDQwMDAwMDAwMDAwOyAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDIwMDAwMDAwMDAwMDA7ICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDEwMDAwMDAwMDAwMDAwMDsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDgwMDAwMDAwMDAwMDAwMDA7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzJyk7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMucG9zLFxuICAgICAgICAgICAgdmFsID0gdGhpcy5yZWFkVmFyaW50KCk7XG5cbiAgICAgICAgaWYgKHZhbCA8IFBPV18yXzYzKSByZXR1cm4gdmFsO1xuXG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcyAtIDI7XG4gICAgICAgIHdoaWxlICh0aGlzLmJ1Zltwb3NdID09PSAweGZmKSBwb3MtLTtcbiAgICAgICAgaWYgKHBvcyA8IHN0YXJ0UG9zKSBwb3MgPSBzdGFydFBvcztcblxuICAgICAgICB2YWwgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvcyAtIHN0YXJ0UG9zICsgMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYiA9IH50aGlzLmJ1ZltzdGFydFBvcyArIGldICYgMHg3ZjtcbiAgICAgICAgICAgIHZhbCArPSBpIDwgNCA/IGIgPDwgaSAqIDcgOiBiICogTWF0aC5wb3coMiwgaSAqIDcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIC12YWwgLSAxO1xuICAgIH0sXG5cbiAgICByZWFkU1ZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBudW0gPSB0aGlzLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgcmV0dXJuIG51bSAlIDIgPT09IDEgPyAobnVtICsgMSkgLyAtMiA6IG51bSAvIDI7IC8vIHppZ3phZyBlbmNvZGluZ1xuICAgIH0sXG5cbiAgICByZWFkQm9vbGVhbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMucmVhZFZhcmludCgpKTtcbiAgICB9LFxuXG4gICAgcmVhZFN0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgc3RyID0gdGhpcy5idWYudG9TdHJpbmcoJ3V0ZjgnLCB0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfSxcblxuICAgIHJlYWRCeXRlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5idWYuc2xpY2UodGhpcy5wb3MsIGVuZCk7XG4gICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH0sXG5cbiAgICAvLyB2ZXJib3NlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOyBkb2Vzbid0IGFmZmVjdCBnemlwcGVkIHNpemVcblxuICAgIHJlYWRQYWNrZWRWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkVmFyaW50KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU1ZhcmludCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRmxvYXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRmxvYXQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRG91YmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG5cbiAgICBza2lwOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB2YWwgJiAweDc7XG4gICAgICAgIGlmICh0eXBlID09PSBQYmYuVmFyaW50KSB3aGlsZSAodGhpcy5idWZbdGhpcy5wb3MrK10gPiAweDdmKSB7fVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuQnl0ZXMpIHRoaXMucG9zID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcztcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkMzIpIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5GaXhlZDY0KSB0aGlzLnBvcyArPSA4O1xuICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcignVW5pbXBsZW1lbnRlZCB0eXBlOiAnICsgdHlwZSk7XG4gICAgfSxcblxuICAgIC8vID09PSBXUklUSU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICB3cml0ZVRhZzogZnVuY3Rpb24odGFnLCB0eXBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoKHRhZyA8PCAzKSB8IHR5cGUpO1xuICAgIH0sXG5cbiAgICByZWFsbG9jOiBmdW5jdGlvbihtaW4pIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDE2O1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGggPCB0aGlzLnBvcyArIG1pbikgbGVuZ3RoICo9IDI7XG5cbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKGxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLmJ1Zi5jb3B5KGJ1Zik7XG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnNsaWNlKDAsIHRoaXMubGVuZ3RoKTtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDMyOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZVVJbnQzMkxFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZVNGaXhlZDMyOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlVUludDMyTEUoTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkNjQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRSh2YWwgJiAtMSwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUoTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlVmFyaW50OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdmFsID0gK3ZhbDtcblxuICAgICAgICBpZiAodmFsIDw9IDB4N2YpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gdmFsO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodmFsIDw9IDB4M2ZmZikge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDIpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMCkgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiA3KSAmIDB4N2YpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodmFsIDw9IDB4MWZmZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMyk7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMTQpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHhmZmZmZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMTQpICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gMjEpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgICAgIHdoaWxlICh2YWwgPj0gMHg4MCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICh2YWwgJiAweGZmKSB8IDB4ODA7XG4gICAgICAgICAgICAgICAgdmFsIC89IDB4ODA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMSk7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IHZhbCB8IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgLSBwb3MgPiAxMCkgdGhyb3cgbmV3IEVycm9yKCdHaXZlbiB2YXJpbnQgZG9lc25cXCd0IGZpdCBpbnRvIDEwIGJ5dGVzJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgd3JpdGVTVmFyaW50OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwgPCAwID8gLXZhbCAqIDIgLSAxIDogdmFsICogMik7XG4gICAgfSxcblxuICAgIHdyaXRlQm9vbGVhbjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoQm9vbGVhbih2YWwpKTtcbiAgICB9LFxuXG4gICAgd3JpdGVTdHJpbmc6IGZ1bmN0aW9uKHN0cikge1xuICAgICAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICAgICAgdmFyIGJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoc3RyKTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChieXRlcyk7XG4gICAgICAgIHRoaXMucmVhbGxvYyhieXRlcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlKHN0ciwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSBieXRlcztcbiAgICB9LFxuXG4gICAgd3JpdGVGbG9hdDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVGbG9hdExFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZURvdWJsZTogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVEb3VibGVMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVCeXRlczogZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICAgIHZhciBsZW4gPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucmVhbGxvYyhsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IGJ1ZmZlcltpXTtcbiAgICB9LFxuXG4gICAgd3JpdGVNZXNzYWdlOiBmdW5jdGlvbih0YWcsIGZuLCBvYmopIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG5cbiAgICAgICAgdGhpcy5wb3MrKzsgLy8gcmVzZXJ2ZSAxIGJ5dGUgZm9yIHNob3J0IG1lc3NhZ2UgbGVuZ3RoXG5cbiAgICAgICAgLy8gd3JpdGUgdGhlIG1lc3NhZ2UgZGlyZWN0bHkgdG8gdGhlIGJ1ZmZlciBhbmQgc2VlIGhvdyBtdWNoIHdhcyB3cml0dGVuXG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMucG9zO1xuICAgICAgICBmbihvYmosIHRoaXMpO1xuICAgICAgICB2YXIgbGVuID0gdGhpcy5wb3MgLSBzdGFydFBvcztcblxuICAgICAgICB2YXIgdmFyaW50TGVuID1cbiAgICAgICAgICAgIGxlbiA8PSAweDdmID8gMSA6XG4gICAgICAgICAgICBsZW4gPD0gMHgzZmZmID8gMiA6XG4gICAgICAgICAgICBsZW4gPD0gMHgxZmZmZmYgPyAzIDpcbiAgICAgICAgICAgIGxlbiA8PSAweGZmZmZmZmYgPyA0IDogTWF0aC5jZWlsKE1hdGgubG9nKGxlbikgLyAoTWF0aC5MTjIgKiA3KSk7XG5cbiAgICAgICAgLy8gaWYgMSBieXRlIGlzbid0IGVub3VnaCBmb3IgZW5jb2RpbmcgbWVzc2FnZSBsZW5ndGgsIHNoaWZ0IHRoZSBkYXRhIHRvIHRoZSByaWdodFxuICAgICAgICBpZiAodmFyaW50TGVuID4gMSkge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKHZhcmludExlbiAtIDEpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMucG9zIC0gMTsgaSA+PSBzdGFydFBvczsgaS0tKSB0aGlzLmJ1ZltpICsgdmFyaW50TGVuIC0gMV0gPSB0aGlzLmJ1ZltpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSBtZXNzYWdlIGxlbmd0aCBpbiB0aGUgcmVzZXJ2ZWQgcGxhY2UgYW5kIHJlc3RvcmUgdGhlIHBvc2l0aW9uXG4gICAgICAgIHRoaXMucG9zID0gc3RhcnRQb3MgLSAxO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICB9LFxuXG4gICAgd3JpdGVQYWNrZWRWYXJpbnQ6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFZhcmludCwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkU1ZhcmludDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTVmFyaW50LCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEJvb2xlYW46ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkQm9vbGVhbiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRGbG9hdDogICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZsb2F0LCBhcnIpOyAgICB9LFxuICAgIHdyaXRlUGFja2VkRG91YmxlOiAgIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWREb3VibGUsIGFycik7ICAgfSxcbiAgICB3cml0ZVBhY2tlZEZpeGVkMzI6ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRml4ZWQzMiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNGaXhlZDMyLCBhcnIpOyB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQ2NDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDY0LCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDY0OiBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkNjQsIGFycik7IH0sXG5cbiAgICB3cml0ZUJ5dGVzRmllbGQ6IGZ1bmN0aW9uKHRhZywgYnVmZmVyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlQnl0ZXMoYnVmZmVyKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkMzIodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkNjQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVNWYXJpbnQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU3RyaW5nRmllbGQ6IGZ1bmN0aW9uKHRhZywgc3RyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKHN0cik7XG4gICAgfSxcbiAgICB3cml0ZUZsb2F0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGbG9hdCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVEb3VibGVGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICAgICAgdGhpcy53cml0ZURvdWJsZSh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVCb29sZWFuRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnRGaWVsZCh0YWcsIEJvb2xlYW4odmFsKSk7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gd3JpdGVQYWNrZWRWYXJpbnQoYXJyLCBwYmYpICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlVmFyaW50KGFycltpXSk7ICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTVmFyaW50KGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU1ZhcmludChhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGbG9hdChhcnIsIHBiZikgICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRmxvYXQoYXJyW2ldKTsgICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWREb3VibGUoYXJyLCBwYmYpICAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRG91YmxlKGFycltpXSk7ICAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRCb29sZWFuKGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlQm9vbGVhbihhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDMyKGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRml4ZWQzMihhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQzMihhcnIsIHBiZikgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU0ZpeGVkMzIoYXJyW2ldKTsgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDY0KGFyciwgcGJmKSAgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlRml4ZWQ2NChhcnJbaV0pOyAgfVxuZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQ2NChhcnIsIHBiZikgeyBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgcGJmLndyaXRlU0ZpeGVkNjQoYXJyW2ldKTsgfVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50O1xuXG5mdW5jdGlvbiBQb2ludCh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xufVxuXG5Qb2ludC5wcm90b3R5cGUgPSB7XG4gICAgY2xvbmU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IFBvaW50KHRoaXMueCwgdGhpcy55KTsgfSxcblxuICAgIGFkZDogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHApOyAgICAgfSxcbiAgICBzdWI6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3N1YihwKTsgICAgIH0sXG4gICAgbXVsdDogICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0KGspOyAgICB9LFxuICAgIGRpdjogICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2KGspOyAgICAgfSxcbiAgICByb3RhdGU6ICBmdW5jdGlvbihhKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZShhKTsgIH0sXG4gICAgbWF0TXVsdDogZnVuY3Rpb24obSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KG0pOyB9LFxuICAgIHVuaXQ6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCk7IH0sXG4gICAgcGVycDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3BlcnAoKTsgfSxcbiAgICByb3VuZDogICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKTsgfSxcblxuICAgIG1hZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55KTtcbiAgICB9LFxuXG4gICAgZXF1YWxzOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnggPT09IHAueCAmJlxuICAgICAgICAgICAgICAgdGhpcy55ID09PSBwLnk7XG4gICAgfSxcblxuICAgIGRpc3Q6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RTcXIocCkpO1xuICAgIH0sXG5cbiAgICBkaXN0U3FyOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHZhciBkeCA9IHAueCAtIHRoaXMueCxcbiAgICAgICAgICAgIGR5ID0gcC55IC0gdGhpcy55O1xuICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG4gICAgfSxcblxuICAgIGFuZ2xlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55LCB0aGlzLngpO1xuICAgIH0sXG5cbiAgICBhbmdsZVRvOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSAtIGIueSwgdGhpcy54IC0gYi54KTtcbiAgICB9LFxuXG4gICAgYW5nbGVXaXRoOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuZ2xlV2l0aFNlcChiLngsIGIueSk7XG4gICAgfSxcblxuICAgIC8vIEZpbmQgdGhlIGFuZ2xlIG9mIHRoZSB0d28gdmVjdG9ycywgc29sdmluZyB0aGUgZm9ybXVsYSBmb3IgdGhlIGNyb3NzIHByb2R1Y3QgYSB4IGIgPSB8YXx8YnxzaW4ozrgpIGZvciDOuC5cbiAgICBhbmdsZVdpdGhTZXA6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIoXG4gICAgICAgICAgICB0aGlzLnggKiB5IC0gdGhpcy55ICogeCxcbiAgICAgICAgICAgIHRoaXMueCAqIHggKyB0aGlzLnkgKiB5KTtcbiAgICB9LFxuXG4gICAgX21hdE11bHQ6IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgdmFyIHggPSBtWzBdICogdGhpcy54ICsgbVsxXSAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBtWzJdICogdGhpcy54ICsgbVszXSAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9hZGQ6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54ICs9IHAueDtcbiAgICAgICAgdGhpcy55ICs9IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9zdWI6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54IC09IHAueDtcbiAgICAgICAgdGhpcy55IC09IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9tdWx0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAqPSBrO1xuICAgICAgICB0aGlzLnkgKj0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kaXY6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54IC89IGs7XG4gICAgICAgIHRoaXMueSAvPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3VuaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLl9kaXYodGhpcy5tYWcoKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcGVycDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55O1xuICAgICAgICB0aGlzLnkgPSB0aGlzLng7XG4gICAgICAgIHRoaXMueCA9IC15O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdGF0ZTogZnVuY3Rpb24oYW5nbGUpIHtcbiAgICAgICAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgIHggPSBjb3MgKiB0aGlzLnggLSBzaW4gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gc2luICogdGhpcy54ICsgY29zICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy54ID0gTWF0aC5yb3VuZCh0aGlzLngpO1xuICAgICAgICB0aGlzLnkgPSBNYXRoLnJvdW5kKHRoaXMueSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG5cbi8vIGNvbnN0cnVjdHMgUG9pbnQgZnJvbSBhbiBhcnJheSBpZiBuZWNlc3NhcnlcblBvaW50LmNvbnZlcnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIGlmIChhIGluc3RhbmNlb2YgUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoYVswXSwgYVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBhO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKCFwcm9jZXNzLnZlcnNpb24gfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjAuJykgPT09IDAgfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuJykgPT09IDAgJiYgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLjguJykgIT09IDApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBuZXh0VGljaztcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcHJvY2Vzcy5uZXh0VGljaztcbn1cblxuZnVuY3Rpb24gbmV4dFRpY2soZm4sIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiY2FsbGJhY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGFyZ3MsIGk7XG4gIHN3aXRjaCAobGVuKSB7XG4gIGNhc2UgMDpcbiAgY2FzZSAxOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZuKTtcbiAgY2FzZSAyOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja09uZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSk7XG4gICAgfSk7XG4gIGNhc2UgMzpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUd28oKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIpO1xuICAgIH0pO1xuICBjYXNlIDQ6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVGhyZWUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgIH0pO1xuICBkZWZhdWx0OlxuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBhcmdzLmxlbmd0aCkge1xuICAgICAgYXJnc1tpKytdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2soKSB7XG4gICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfXJldHVybiBrZXlzO1xufTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IER1cGxleDtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcblxudXRpbC5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxudmFyIGtleXMgPSBvYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSk7XG5mb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgdmFyIG1ldGhvZCA9IGtleXNbdl07XG4gIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXTtcbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgcHJvY2Vzc05leHRUaWNrKG9uRW5kTlQsIHRoaXMpO1xufVxuXG5mdW5jdGlvbiBvbkVuZE5UKHNlbGYpIHtcbiAgc2VsZi5lbmQoKTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59IiwiLy8gYSBwYXNzdGhyb3VnaCBzdHJlYW0uXG4vLyBiYXNpY2FsbHkganVzdCB0aGUgbW9zdCBtaW5pbWFsIHNvcnQgb2YgVHJhbnNmb3JtIHN0cmVhbS5cbi8vIEV2ZXJ5IHdyaXR0ZW4gY2h1bmsgZ2V0cyBvdXRwdXQgYXMtaXMuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYXNzVGhyb3VnaDtcblxudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vX3N0cmVhbV90cmFuc2Zvcm0nKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpIHJldHVybiBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG5cbiAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cblBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobnVsbCwgY2h1bmspO1xufTsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5Jyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB1bmRlZmluZWQ7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMuYnVmZmVyID0gW107XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gbmV3IEJ1ZmZlcihjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNraXBBZGQ7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgc2tpcEFkZCA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIGNodW5rLmxlbmd0aCA9PT0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhZGRUb0Zyb250KSBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIERvbid0IGFkZCB0byB0aGUgYnVmZmVyIGlmIHdlJ3ZlIGRlY29kZWQgdG8gYW4gZW1wdHkgc3RyaW5nIGNodW5rIGFuZFxuICAgICAgLy8gd2UncmUgbm90IGluIG9iamVjdCBtb2RlXG4gICAgICBpZiAoIXNraXBBZGQpIHtcbiAgICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5uZWVkUmVhZGFibGUgfHwgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMlxuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgcmV0dXJuIDA7XG5cbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiBuID09PSAwID8gMCA6IDE7XG5cbiAgaWYgKG4gPT09IG51bGwgfHwgaXNOYU4obikpIHtcbiAgICAvLyBvbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5idWZmZXIubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyWzBdLmxlbmd0aDtlbHNlIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cblxuICBpZiAobiA8PSAwKSByZXR1cm4gMDtcblxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgdGFyZ2V0IGJ1ZmZlciBsZXZlbCxcbiAgLy8gdGhlbiByYWlzZSB0aGUgd2F0ZXIgbWFyay4gIEJ1bXAgdXAgdG8gdGhlIG5leHQgaGlnaGVzdFxuICAvLyBwb3dlciBvZiAyLCB0byBwcmV2ZW50IGluY3JlYXNpbmcgaXQgZXhjZXNzaXZlbHkgaW4gdGlueVxuICAvLyBhbW91bnRzLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcblxuICAvLyBkb24ndCBoYXZlIHRoYXQgbXVjaC4gIHJldHVybiBudWxsLCB1bmxlc3Mgd2UndmUgZW5kZWQuXG4gIGlmIChuID4gc3RhdGUubGVuZ3RoKSB7XG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA+IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH1cblxuICBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICB9XG5cbiAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICBpZiAoZG9SZWFkICYmICFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfVxuXG4gIHN0YXRlLmxlbmd0aCAtPSBuO1xuXG4gIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHByb2Nlc3NOZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBwcm9jZXNzTmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0KSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXNbMF0gPT09IGRlc3QgJiYgc3JjLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA9PT0gMSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG4gIC8vIFRoaXMgaXMgYSBicnV0YWxseSB1Z2x5IGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXJcbiAgLy8gaXMgYXR0YWNoZWQgYmVmb3JlIGFueSB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy5cbiAgaWYgKCFkZXN0Ll9ldmVudHMgfHwgIWRlc3QuX2V2ZW50cy5lcnJvcikgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtlbHNlIGlmIChpc0FycmF5KGRlc3QuX2V2ZW50cy5lcnJvcikpIGRlc3QuX2V2ZW50cy5lcnJvci51bnNoaWZ0KG9uZXJyb3IpO2Vsc2UgZGVzdC5fZXZlbnRzLmVycm9yID0gW29uZXJyb3IsIGRlc3QuX2V2ZW50cy5lcnJvcl07XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgZGVzdHNbX2ldLmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgLy8gSWYgbGlzdGVuaW5nIHRvIGRhdGEsIGFuZCBpdCBoYXMgbm90IGV4cGxpY2l0bHkgYmVlbiBwYXVzZWQsXG4gIC8vIHRoZW4gY2FsbCByZXN1bWUgdG8gc3RhcnQgdGhlIGZsb3cgb2YgZGF0YSBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAoZXYgPT09ICdkYXRhJyAmJiBmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgdGhpcy5yZXN1bWUoKTtcbiAgfVxuXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyAmJiAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzc05leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMsIHN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIGlmIChzdGF0ZS5mbG93aW5nKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICB9IHdoaWxlIChudWxsICE9PSBjaHVuayAmJiBzdGF0ZS5mbG93aW5nKTtcbiAgfVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbiAoZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICB2YXIgbGlzdCA9IHN0YXRlLmJ1ZmZlcjtcbiAgdmFyIGxlbmd0aCA9IHN0YXRlLmxlbmd0aDtcbiAgdmFyIHN0cmluZ01vZGUgPSAhIXN0YXRlLmRlY29kZXI7XG4gIHZhciBvYmplY3RNb2RlID0gISFzdGF0ZS5vYmplY3RNb2RlO1xuICB2YXIgcmV0O1xuXG4gIC8vIG5vdGhpbmcgaW4gdGhlIGxpc3QsIGRlZmluaXRlbHkgZW1wdHkuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0ID0gbnVsbDtlbHNlIGlmIChvYmplY3RNb2RlKSByZXQgPSBsaXN0LnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBsZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGFycmF5LlxuICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSBsaXN0LmpvaW4oJycpO2Vsc2UgaWYgKGxpc3QubGVuZ3RoID09PSAxKSByZXQgPSBsaXN0WzBdO2Vsc2UgcmV0ID0gQnVmZmVyLmNvbmNhdChsaXN0LCBsZW5ndGgpO1xuICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIGp1c3Qgc29tZSBvZiBpdC5cbiAgICBpZiAobiA8IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBqdXN0IHRha2UgYSBwYXJ0IG9mIHRoZSBmaXJzdCBsaXN0IGl0ZW0uXG4gICAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5ncy5cbiAgICAgIHZhciBidWYgPSBsaXN0WzBdO1xuICAgICAgcmV0ID0gYnVmLnNsaWNlKDAsIG4pO1xuICAgICAgbGlzdFswXSA9IGJ1Zi5zbGljZShuKTtcbiAgICB9IGVsc2UgaWYgKG4gPT09IGxpc3RbMF0ubGVuZ3RoKSB7XG4gICAgICAvLyBmaXJzdCBsaXN0IGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wbGV4IGNhc2UuXG4gICAgICAvLyB3ZSBoYXZlIGVub3VnaCB0byBjb3ZlciBpdCwgYnV0IGl0IHNwYW5zIHBhc3QgdGhlIGZpcnN0IGJ1ZmZlci5cbiAgICAgIGlmIChzdHJpbmdNb2RlKSByZXQgPSAnJztlbHNlIHJldCA9IG5ldyBCdWZmZXIobik7XG5cbiAgICAgIHZhciBjID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGlzdC5sZW5ndGg7IGkgPCBsICYmIGMgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICAgIHZhciBjcHkgPSBNYXRoLm1pbihuIC0gYywgYnVmLmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHN0cmluZ01vZGUpIHJldCArPSBidWYuc2xpY2UoMCwgY3B5KTtlbHNlIGJ1Zi5jb3B5KHJldCwgYywgMCwgY3B5KTtcblxuICAgICAgICBpZiAoY3B5IDwgYnVmLmxlbmd0aCkgbGlzdFswXSA9IGJ1Zi5zbGljZShjcHkpO2Vsc2UgbGlzdC5zaGlmdCgpO1xuXG4gICAgICAgIGMgKz0gY3B5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoJ2VuZFJlYWRhYmxlIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn0iLCIvLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG5cbnZhciBEdXBsZXggPSByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhUcmFuc2Zvcm0sIER1cGxleCk7XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0aGlzLndyaXRlZW5jb2RpbmcgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MnKSk7XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICBzdHJlYW0uX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO1xuXG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpO1xuXG4gIC8vIHdoZW4gdGhlIHdyaXRhYmxlIHNpZGUgZmluaXNoZXMsIHRoZW4gZmx1c2ggb3V0IGFueXRoaW5nIHJlbWFpbmluZy5cbiAgdmFyIHN0cmVhbSA9IHRoaXM7XG5cbiAgLy8gc3RhcnQgb3V0IGFza2luZyBmb3IgYSByZWFkYWJsZSBldmVudCBvbmNlIGRhdGEgaXMgdHJhbnNmb3JtZWQuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAvLyB3ZSBoYXZlIGltcGxlbWVudGVkIHRoZSBfcmVhZCBtZXRob2QsIGFuZCBkb25lIHRoZSBvdGhlciB0aGluZ3NcbiAgLy8gdGhhdCBSZWFkYWJsZSB3YW50cyBiZWZvcmUgdGhlIGZpcnN0IF9yZWFkIGNhbGwsIHNvIHVuc2V0IHRoZVxuICAvLyBzeW5jIGd1YXJkIGZsYWcuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm07XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaDtcbiAgfVxuXG4gIHRoaXMub25jZSgncHJlZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoKGZ1bmN0aW9uIChlcikge1xuICAgICAgZG9uZShzdHJlYW0sIGVyKTtcbiAgICB9KTtlbHNlIGRvbmUoc3RyZWFtKTtcbiAgfSk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICByZXR1cm4gRHVwbGV4LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIHBhcnQgd2hlcmUgeW91IGRvIHN0dWZmIVxuLy8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gJ2NodW5rJyBpcyBhbiBpbnB1dCBjaHVuay5cbi8vXG4vLyBDYWxsIGBwdXNoKG5ld0NodW5rKWAgdG8gcGFzcyBhbG9uZyB0cmFuc2Zvcm1lZCBvdXRwdXRcbi8vIHRvIHRoZSByZWFkYWJsZSBzaWRlLiAgWW91IG1heSBjYWxsICdwdXNoJyB6ZXJvIG9yIG1vcmUgdGltZXMuXG4vL1xuLy8gQ2FsbCBgY2IoZXJyKWAgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIGNodW5rLiAgSWYgeW91IHBhc3Ncbi8vIGFuIGVycm9yLCB0aGVuIHRoYXQnbGwgcHV0IHRoZSBodXJ0IG9uIHRoZSB3aG9sZSBvcGVyYXRpb24uICBJZiB5b3Vcbi8vIG5ldmVyIGNhbGwgY2IoKSwgdGhlbiB5b3UnbGwgbmV2ZXIgZ2V0IGFub3RoZXIgY2h1bmsuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMud3JpdGVjYiA9IGNiO1xuICB0cy53cml0ZWNodW5rID0gY2h1bms7XG4gIHRzLndyaXRlZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKCF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB2YXIgcnMgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICh0cy5uZWVkVHJhbnNmb3JtIHx8IHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59O1xuXG4vLyBEb2Vzbid0IG1hdHRlciB3aGF0IHRoZSBhcmdzIGFyZSBoZXJlLlxuLy8gX3RyYW5zZm9ybSBkb2VzIGFsbCB0aGUgd29yay5cbi8vIFRoYXQgd2UgZ290IGhlcmUgbWVhbnMgdGhhdCB0aGUgcmVhZGFibGUgc2lkZSB3YW50cyBtb3JlIGRhdGEuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHRzLndyaXRlY2h1bmsgIT09IG51bGwgJiYgdHMud3JpdGVjYiAmJiAhdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdHMudHJhbnNmb3JtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuaywgdHMud3JpdGVlbmNvZGluZywgdHMuYWZ0ZXJUcmFuc2Zvcm0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgdGhhdCB3ZSBuZWVkIGEgdHJhbnNmb3JtLCBzbyB0aGF0IGFueSBkYXRhIHRoYXQgY29tZXMgaW5cbiAgICAvLyB3aWxsIGdldCBwcm9jZXNzZWQsIG5vdyB0aGF0IHdlJ3ZlIGFza2VkIGZvciBpdC5cbiAgICB0cy5uZWVkVHJhbnNmb3JtID0gdHJ1ZTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZG9uZShzdHJlYW0sIGVyKSB7XG4gIGlmIChlcikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcblxuICAvLyBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlciwgdGhlbiB0aGF0IG1lYW5zXG4gIC8vIHRoYXQgbm90aGluZyBtb3JlIHdpbGwgZXZlciBiZSBwcm92aWRlZFxuICB2YXIgd3MgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG5cbiAgaWYgKHdzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAnKTtcblxuICBpZiAodHMudHJhbnNmb3JtaW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmcnKTtcblxuICByZXR1cm4gc3RyZWFtLnB1c2gobnVsbCk7XG59IiwiLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gV3JpdGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgcHJvY2Vzc05leHRUaWNrID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHByb2Nlc3NOZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtO1xuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdCcgKyAncmVhbScpO1xuICB9IGNhdGNoIChfKSB7fSBmaW5hbGx5IHtcbiAgICBpZiAoIVN0cmVhbSkgU3RyZWFtID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuICB9XG59KSgpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGNyZWF0ZSB0aGUgdHdvIG9iamVjdHMgbmVlZGVkIHRvIHN0b3JlIHRoZSBjb3JrZWQgcmVxdWVzdHNcbiAgLy8gdGhleSBhcmUgbm90IGEgbGlua2VkIGxpc3QsIGFzIG5vIG5ldyBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlcmVcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiB3cml0YWJsZVN0YXRlR2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0aG91Z2ggdGhleSdyZSBub3RcbiAgLy8gaW5zdGFuY2VvZiBXcml0YWJsZSwgdGhleSdyZSBpbnN0YW5jZW9mIFJlYWRhYmxlLlxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV3JpdGFibGUpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW5ub3QgcGlwZS4gTm90IHJlYWRhYmxlLicpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIHZhciBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcbiAgaWYgKHN5bmMpIHByb2Nlc3NOZXh0VGljayhjYiwgZXIpO2Vsc2UgY2IoZXIpO1xuXG4gIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICBhc3luY1dyaXRlKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQpIHtcbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3NOZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG5cbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIGVudHJ5ID0gX3RoaXMuZW50cnk7XG4gICAgX3RoaXMuZW50cnkgPSBudWxsO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICAgIGNiKGVycik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gX3RoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IF90aGlzO1xuICAgIH1cbiAgfTtcbn0iLCJ2YXIgU3RyZWFtID0gKGZ1bmN0aW9uICgpe1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdzdCcgKyAncmVhbScpOyAvLyBoYWNrIHRvIGZpeCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgaXNzdWUgd2hlbiB1c2VkIHdpdGggYnJvd3NlcmlmeVxuICB9IGNhdGNoKF8pe31cbn0oKSk7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5leHBvcnRzLlN0cmVhbSA9IFN0cmVhbSB8fCBleHBvcnRzO1xuZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG5leHBvcnRzLldyaXRhYmxlID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuZXhwb3J0cy5EdXBsZXggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nXG4gIHx8IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICBjYXNlICdoZXgnOiBjYXNlICd1dGY4JzogY2FzZSAndXRmLTgnOiBjYXNlICdhc2NpaSc6IGNhc2UgJ2JpbmFyeSc6IGNhc2UgJ2Jhc2U2NCc6IGNhc2UgJ3VjczInOiBjYXNlICd1Y3MtMic6IGNhc2UgJ3V0ZjE2bGUnOiBjYXNlICd1dGYtMTZsZSc6IGNhc2UgJ3Jhdyc6IHJldHVybiB0cnVlO1xuICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICAgfVxuXG5cbmZ1bmN0aW9uIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIH1cbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLiBDRVNVLTggaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZSBVVEYtOCBlbmNvZGluZy5cbi8vXG4vLyBAVE9ETyBIYW5kbGluZyBhbGwgZW5jb2RpbmdzIGluc2lkZSBhIHNpbmdsZSBvYmplY3QgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHRcbi8vIHRvIHJlYXNvbiBhYm91dCB0aGlzIGNvZGUsIHNvIGl0IHNob3VsZCBiZSBzcGxpdCB1cCBpbiB0aGUgZnV0dXJlLlxuLy8gQFRPRE8gVGhlcmUgc2hvdWxkIGJlIGEgdXRmOC1zdHJpY3QgZW5jb2RpbmcgdGhhdCByZWplY3RzIGludmFsaWQgVVRGLTggY29kZVxuLy8gcG9pbnRzIGFzIHVzZWQgYnkgQ0VTVS04LlxudmFyIFN0cmluZ0RlY29kZXIgPSBleHBvcnRzLlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5vdWdoIHNwYWNlIHRvIHN0b3JlIGFsbCBieXRlcyBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuIFVURi04IG5lZWRzIDRcbiAgLy8gYnl0ZXMsIGJ1dCBDRVNVLTggbWF5IHJlcXVpcmUgdXAgdG8gNiAoMyBieXRlcyBwZXIgc3Vycm9nYXRlKS5cbiAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IDA7XG4gIC8vIE51bWJlciBvZiBieXRlcyBleHBlY3RlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyTGVuZ3RoID0gMDtcbn07XG5cblxuLy8gd3JpdGUgZGVjb2RlcyB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0IGFzIEpTIHN0cmluZyB0aGF0IGlzXG4vLyBndWFyYW50ZWVkIHRvIG5vdCBjb250YWluIGFueSBwYXJ0aWFsIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gQW55IHBhcnRpYWxcbi8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgYnVmZmVyZWQgdXAsIGFuZCB3aWxsIGJlXG4vLyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgd3JpdGUgYWdhaW4gd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzLlxuLy9cbi8vIE5vdGU6IENvbnZlcnRpbmcgYSBCdWZmZXIgY29udGFpbmluZyBhbiBvcnBoYW4gc3Vycm9nYXRlIHRvIGEgU3RyaW5nXG4vLyBjdXJyZW50bHkgd29ya3MsIGJ1dCBjb252ZXJ0aW5nIGEgU3RyaW5nIHRvIGEgQnVmZmVyICh2aWEgYG5ldyBCdWZmZXJgLCBvclxuLy8gQnVmZmVyI3dyaXRlKSB3aWxsIHJlcGxhY2UgaW5jb21wbGV0ZSBzdXJyb2dhdGVzIHdpdGggdGhlIHVuaWNvZGVcbi8vIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4gU2VlIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMTIxMTczMDA5LyAuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgY2hhclN0ciA9ICcnO1xuICAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgIHZhciBhdmFpbGFibGUgPSAoYnVmZmVyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCkgP1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6XG4gICAgICAgIGJ1ZmZlci5sZW5ndGg7XG5cbiAgICAvLyBhZGQgdGhlIG5ldyBieXRlcyB0byB0aGUgY2hhciBidWZmZXJcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IGF2YWlsYWJsZTtcblxuICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgLy8gc3RpbGwgbm90IGVub3VnaCBjaGFycyBpbiB0aGlzIGJ1ZmZlcj8gd2FpdCBmb3IgbW9yZSAuLi5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXJcbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoYXZhaWxhYmxlLCBidWZmZXIubGVuZ3RoKTtcblxuICAgIC8vIGdldCB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHNwbGl0XG4gICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xuXG4gICAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoYXJTdHI7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIGFuZCBzZXQgY2hhckxlbmd0aCAvIGNoYXJSZWNlaXZlZFxuICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcik7XG5cbiAgdmFyIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG4gIGlmICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBidWZmZXIgdGhlIGluY29tcGxldGUgY2hhcmFjdGVyIGJ5dGVzIHdlIGdvdFxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkLCBlbmQpO1xuICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgfVxuXG4gIGNoYXJTdHIgKz0gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIGVuZCk7XG5cbiAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTtcbiAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGVuZCk7XG4gIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBzaXplO1xuICAgIHRoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgc2l6ZSwgMCwgc2l6ZSk7XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCAwLCBzaXplKTtcbiAgICByZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgfVxuXG4gIC8vIG9yIGp1c3QgZW1pdCB0aGUgY2hhclN0clxuICByZXR1cm4gY2hhclN0cjtcbn07XG5cbi8vIGRldGVjdEluY29tcGxldGVDaGFyIGRldGVybWluZXMgaWYgdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXIgYXRcbi8vIHRoZSBlbmQgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gSWYgc28sIGl0IHNldHMgdGhpcy5jaGFyTGVuZ3RoIHRvIHRoZSBieXRlXG4vLyBsZW5ndGggdGhhdCBjaGFyYWN0ZXIsIGFuZCBzZXRzIHRoaXMuY2hhclJlY2VpdmVkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXNcbi8vIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGFyYWN0ZXIuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gMykgPyAzIDogYnVmZmVyLmxlbmd0aDtcblxuICAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gIC8vIGluY29tcGxldGUgY2hhci5cbiAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07XG5cbiAgICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuXG4gICAgLy8gMTEwWFhYWFhcbiAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMFhYWFhcbiAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMTBYWFhcbiAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gaTtcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgcmVzID0gJyc7XG4gIGlmIChidWZmZXIgJiYgYnVmZmVyLmxlbmd0aClcbiAgICByZXMgPSB0aGlzLndyaXRlKGJ1ZmZlcik7XG5cbiAgaWYgKHRoaXMuY2hhclJlY2VpdmVkKSB7XG4gICAgdmFyIGNyID0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjtcbiAgICB2YXIgZW5jID0gdGhpcy5lbmNvZGluZztcbiAgICByZXMgKz0gYnVmLnNsaWNlKDAsIGNyKS50b1N0cmluZyhlbmMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIHBhc3NUaHJvdWdoV3JpdGUoYnVmZmVyKSB7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAzO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDMgOiAwO1xufVxuIiwiLyohXG4gKiBzdHJpcC1jb21tZW50cyA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvc3RyaXAtY29tbWVudHM+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IEpvbiBTY2hsaW5rZXJ0LCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpYyc7XG5cbnZhciByZUJsb2NrID0gJ1xcXFwvXFxcXConO1xudmFyIHJlQmxvY2tJZ25vcmUgPSAnXFxcXC9cXFxcKig/IVxcXFwqP1xcXFwhKSc7XG52YXIgcmVCbG9ja0VuZCA9ICcoLnxbXFxcXHJcXFxcbl18XFxcXG4pKj9cXFxcKlxcXFwvXFxcXG4/XFxcXG4/JztcbnZhciByZUxpbmUgPSAvKF58W15cXFNcXG5dKSg/OlxcL1xcLykoW1xcc1xcU10rPykkL2dtO1xudmFyIHJlTGluZUlnbm9yZSA9IC8oXnxbXlxcU1xcbl0pKD86XFwvXFwvW14hXSkoW1xcc1xcU10rPykkL2dtO1xuXG5cbi8qKlxuICogU3RyaXAgYWxsIGNvbW1lbnRzXG4gKlxuICogeyU9IGRvY3MoXCJzdHJpcFwiKSAlfVxuICpcbiAqIEBwYXJhbSAgIHtTdHJpbmd9IGBzdHJgICBmaWxlIGNvbnRlbnRzIG9yIHN0cmluZyB0byBzdHJpcC5cbiAqIEBwYXJhbSAgIHtPYmplY3R9IGBvcHRzYCAgb3B0aW9ucyBhcmUgcGFzc2VkIHRvIGAuYmxvY2tgLCBhbmQgYC5saW5lYFxuICogQHJldHVybiAge1N0cmluZ30gU3RyaW5nIHdpdGhvdXQgY29tbWVudHMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnZhciBzdHJpcCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc3RyLCBvcHRzKSB7XG4gIHJldHVybiBzdHIgPyBzdHJpcC5ibG9jayhzdHJpcC5saW5lKHN0ciwgb3B0cyksIG9wdHMpIDogJyc7XG59O1xuXG5cbi8qKlxuICogU3RyaXAgb25seSBibG9jayBjb21tZW50cywgb3B0aW9uYWxseSBsZWF2aW5nIHByb3RlY3RlZCBjb21tZW50c1xuICogKGUuZy4gYC8qIWApIGludGFjdC5cbiAqXG4gKiB7JT0gZG9jcyhcImJsb2NrXCIpICV9XG4gKlxuICogQHBhcmFtICAge1N0cmluZ30gYHN0cmAgIGZpbGUgY29udGVudCBvciBzdHJpbmcgdG8gc3RyaXAgdG9cbiAqIEBwYXJhbSAgIHtPYmplY3R9IGBvcHRzYCAgaWYgYHNhZmU6dHJ1ZWAsIHN0cmlwIG9ubHkgY29tbWVudHMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBgLyohYCBvciBgLyoqIWBcbiAqIEByZXR1cm4gIHtTdHJpbmd9IFN0cmluZyB3aXRob3V0IGJsb2NrIGNvbW1lbnRzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5zdHJpcC5ibG9jayA9IGZ1bmN0aW9uKHN0ciwgb3B0cykge1xuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgdmFyIHJlID0gbmV3IFJlZ0V4cChyZUJsb2NrICsgcmVCbG9ja0VuZCwgJ2dtJyk7XG4gIGlmKG9wdHMuc2FmZSkge1xuICAgIHJlID0gbmV3IFJlZ0V4cChyZUJsb2NrSWdub3JlICsgcmVCbG9ja0VuZCwgJ2dtJyk7XG4gIH1cbiAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKHJlLCAnJykgOiAnJztcbn07XG5cblxuLyoqXG4gKiBTdHJpcCBvbmx5IGxpbmUgY29tbWVudHNcbiAqXG4gKiB7JT0gZG9jcyhcImxpbmVcIikgJX1cbiAqXG4gKiBAcGFyYW0gICB7U3RyaW5nfSBgc3RyYCAgZmlsZSBjb250ZW50IG9yIHN0cmluZyB0byBzdHJpcCB0b1xuICogQHBhcmFtICAge09iamVjdH0gYG9wdHNgICBpZiBgc2FmZTp0cnVlYCwgc3RyaXAgYWxsIHRoYXQgbm90IHN0YXJ0cyB3aXRoIGAvLyFgXG4gKiBAcmV0dXJuICB7U3RyaW5nfSBTdHJpbmcgd2l0aG91dCBsaW5lIGNvbW1lbnRzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5zdHJpcC5saW5lID0gZnVuY3Rpb24oc3RyLCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB2YXIgcmUgPSByZUxpbmU7XG4gIGlmKG9wdHMuc2FmZSkge1xuICAgIHJlID0gcmVMaW5lSWdub3JlO1xuICB9XG4gIHJldHVybiBzdHIgPyBzdHIucmVwbGFjZShyZSwgJycpIDogJyc7XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RvcG9qc29uL3RvcG9qc29uLWNsaWVudCBWZXJzaW9uIDIuMS4wLiBDb3B5cmlnaHQgMjAxNiBNaWtlIEJvc3RvY2suXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gIChmYWN0b3J5KChnbG9iYWwudG9wb2pzb24gPSBnbG9iYWwudG9wb2pzb24gfHwge30pKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7XG5cbnZhciByZXZlcnNlID0gZnVuY3Rpb24oYXJyYXksIG4pIHtcbiAgdmFyIHQsIGogPSBhcnJheS5sZW5ndGgsIGkgPSBqIC0gbjtcbiAgd2hpbGUgKGkgPCAtLWopIHQgPSBhcnJheVtpXSwgYXJyYXlbaSsrXSA9IGFycmF5W2pdLCBhcnJheVtqXSA9IHQ7XG59O1xuXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB4O1xufTtcblxudmFyIHRyYW5zZm9ybSA9IGZ1bmN0aW9uKHRvcG9sb2d5KSB7XG4gIGlmICgodHJhbnNmb3JtID0gdG9wb2xvZ3kudHJhbnNmb3JtKSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHk7XG4gIHZhciB0cmFuc2Zvcm0sXG4gICAgICB4MCxcbiAgICAgIHkwLFxuICAgICAga3ggPSB0cmFuc2Zvcm0uc2NhbGVbMF0sXG4gICAgICBreSA9IHRyYW5zZm9ybS5zY2FsZVsxXSxcbiAgICAgIGR4ID0gdHJhbnNmb3JtLnRyYW5zbGF0ZVswXSxcbiAgICAgIGR5ID0gdHJhbnNmb3JtLnRyYW5zbGF0ZVsxXTtcbiAgcmV0dXJuIGZ1bmN0aW9uKHBvaW50LCBpKSB7XG4gICAgaWYgKCFpKSB4MCA9IHkwID0gMDtcbiAgICBwb2ludFswXSA9ICh4MCArPSBwb2ludFswXSkgKiBreCArIGR4O1xuICAgIHBvaW50WzFdID0gKHkwICs9IHBvaW50WzFdKSAqIGt5ICsgZHk7XG4gICAgcmV0dXJuIHBvaW50O1xuICB9O1xufTtcblxudmFyIGZlYXR1cmUgPSBmdW5jdGlvbih0b3BvbG9neSwgbykge1xuICByZXR1cm4gby50eXBlID09PSBcIkdlb21ldHJ5Q29sbGVjdGlvblwiXG4gICAgICA/IHt0eXBlOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsIGZlYXR1cmVzOiBvLmdlb21ldHJpZXMubWFwKGZ1bmN0aW9uKG8pIHsgcmV0dXJuIGZlYXR1cmUkMSh0b3BvbG9neSwgbyk7IH0pfVxuICAgICAgOiBmZWF0dXJlJDEodG9wb2xvZ3ksIG8pO1xufTtcblxuZnVuY3Rpb24gZmVhdHVyZSQxKHRvcG9sb2d5LCBvKSB7XG4gIHZhciBpZCA9IG8uaWQsXG4gICAgICBiYm94ID0gby5iYm94LFxuICAgICAgcHJvcGVydGllcyA9IG8ucHJvcGVydGllcyA9PSBudWxsID8ge30gOiBvLnByb3BlcnRpZXMsXG4gICAgICBnZW9tZXRyeSA9IG9iamVjdCh0b3BvbG9neSwgbyk7XG4gIHJldHVybiBpZCA9PSBudWxsICYmIGJib3ggPT0gbnVsbCA/IHt0eXBlOiBcIkZlYXR1cmVcIiwgcHJvcGVydGllczogcHJvcGVydGllcywgZ2VvbWV0cnk6IGdlb21ldHJ5fVxuICAgICAgOiBiYm94ID09IG51bGwgPyB7dHlwZTogXCJGZWF0dXJlXCIsIGlkOiBpZCwgcHJvcGVydGllczogcHJvcGVydGllcywgZ2VvbWV0cnk6IGdlb21ldHJ5fVxuICAgICAgOiB7dHlwZTogXCJGZWF0dXJlXCIsIGlkOiBpZCwgYmJveDogYmJveCwgcHJvcGVydGllczogcHJvcGVydGllcywgZ2VvbWV0cnk6IGdlb21ldHJ5fTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0KHRvcG9sb2d5LCBvKSB7XG4gIHZhciB0cmFuc2Zvcm1Qb2ludCA9IHRyYW5zZm9ybSh0b3BvbG9neSksXG4gICAgICBhcmNzID0gdG9wb2xvZ3kuYXJjcztcblxuICBmdW5jdGlvbiBhcmMoaSwgcG9pbnRzKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGgpIHBvaW50cy5wb3AoKTtcbiAgICBmb3IgKHZhciBhID0gYXJjc1tpIDwgMCA/IH5pIDogaV0sIGsgPSAwLCBuID0gYS5sZW5ndGg7IGsgPCBuOyArK2spIHtcbiAgICAgIHBvaW50cy5wdXNoKHRyYW5zZm9ybVBvaW50KGFba10uc2xpY2UoKSwgaykpO1xuICAgIH1cbiAgICBpZiAoaSA8IDApIHJldmVyc2UocG9pbnRzLCBuKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvaW50KHApIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtUG9pbnQocC5zbGljZSgpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpbmUoYXJjcykge1xuICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFyY3MubGVuZ3RoOyBpIDwgbjsgKytpKSBhcmMoYXJjc1tpXSwgcG9pbnRzKTtcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDIpIHBvaW50cy5wdXNoKHBvaW50c1swXS5zbGljZSgpKTtcbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG5cbiAgZnVuY3Rpb24gcmluZyhhcmNzKSB7XG4gICAgdmFyIHBvaW50cyA9IGxpbmUoYXJjcyk7XG4gICAgd2hpbGUgKHBvaW50cy5sZW5ndGggPCA0KSBwb2ludHMucHVzaChwb2ludHNbMF0uc2xpY2UoKSk7XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvbHlnb24oYXJjcykge1xuICAgIHJldHVybiBhcmNzLm1hcChyaW5nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlb21ldHJ5KG8pIHtcbiAgICB2YXIgdHlwZSA9IG8udHlwZSwgY29vcmRpbmF0ZXM7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiR2VvbWV0cnlDb2xsZWN0aW9uXCI6IHJldHVybiB7dHlwZTogdHlwZSwgZ2VvbWV0cmllczogby5nZW9tZXRyaWVzLm1hcChnZW9tZXRyeSl9O1xuICAgICAgY2FzZSBcIlBvaW50XCI6IGNvb3JkaW5hdGVzID0gcG9pbnQoby5jb29yZGluYXRlcyk7IGJyZWFrO1xuICAgICAgY2FzZSBcIk11bHRpUG9pbnRcIjogY29vcmRpbmF0ZXMgPSBvLmNvb3JkaW5hdGVzLm1hcChwb2ludCk7IGJyZWFrO1xuICAgICAgY2FzZSBcIkxpbmVTdHJpbmdcIjogY29vcmRpbmF0ZXMgPSBsaW5lKG8uYXJjcyk7IGJyZWFrO1xuICAgICAgY2FzZSBcIk11bHRpTGluZVN0cmluZ1wiOiBjb29yZGluYXRlcyA9IG8uYXJjcy5tYXAobGluZSk7IGJyZWFrO1xuICAgICAgY2FzZSBcIlBvbHlnb25cIjogY29vcmRpbmF0ZXMgPSBwb2x5Z29uKG8uYXJjcyk7IGJyZWFrO1xuICAgICAgY2FzZSBcIk11bHRpUG9seWdvblwiOiBjb29yZGluYXRlcyA9IG8uYXJjcy5tYXAocG9seWdvbik7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7dHlwZTogdHlwZSwgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzfTtcbiAgfVxuXG4gIHJldHVybiBnZW9tZXRyeShvKTtcbn1cblxuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIGJib3h9IGZyb20gXCIuL3NyYy9iYm94XCI7XG5cbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBtZXNoLCBtZXNoQXJjc30gZnJvbSBcIi4vc3JjL21lc2hcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBtZXJnZSwgbWVyZ2VBcmNzfSBmcm9tIFwiLi9zcmMvbWVyZ2VcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBuZWlnaGJvcnN9IGZyb20gXCIuL3NyYy9uZWlnaGJvcnNcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyBxdWFudGl6ZX0gZnJvbSBcIi4vc3JjL3F1YW50aXplXCI7XG4vLyBleHBvcnQge2RlZmF1bHQgYXMgdHJhbnNmb3JtfSBmcm9tIFwiLi9zcmMvdHJhbnNmb3JtXCI7XG4vLyBleHBvcnQge2RlZmF1bHQgYXMgdW50cmFuc2Zvcm19IGZyb20gXCIuL3NyYy91bnRyYW5zZm9ybVwiO1xuXG5leHBvcnRzLmZlYXR1cmUgPSBmZWF0dXJlO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuIiwiXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGVwcmVjYXRlO1xuXG4vKipcbiAqIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2Uubm9EZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudGhyb3dEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCB0aHJvdyBhbiBFcnJvciB3aGVuIGludm9rZWQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50cmFjZURlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIGludm9rZSBgY29uc29sZS50cmFjZSgpYCBpbnN0ZWFkIG9mIGBjb25zb2xlLmVycm9yKClgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdGhlIGZ1bmN0aW9uIHRvIGRlcHJlY2F0ZVxuICogQHBhcmFtIHtTdHJpbmd9IG1zZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQgdG8gdGhlIGNvbnNvbGUgd2hlbiBgZm5gIGlzIGludm9rZWRcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBuZXcgXCJkZXByZWNhdGVkXCIgdmVyc2lvbiBvZiBgZm5gXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZSAoZm4sIG1zZykge1xuICBpZiAoY29uZmlnKCdub0RlcHJlY2F0aW9uJykpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChjb25maWcoJ3Rocm93RGVwcmVjYXRpb24nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnKCd0cmFjZURlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufVxuXG4vKipcbiAqIENoZWNrcyBgbG9jYWxTdG9yYWdlYCBmb3IgYm9vbGVhbiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBgbmFtZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29uZmlnIChuYW1lKSB7XG4gIC8vIGFjY2Vzc2luZyBnbG9iYWwubG9jYWxTdG9yYWdlIGNhbiB0cmlnZ2VyIGEgRE9NRXhjZXB0aW9uIGluIHNhbmRib3hlZCBpZnJhbWVzXG4gIHRyeSB7XG4gICAgaWYgKCFnbG9iYWwubG9jYWxTdG9yYWdlKSByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHZhbCA9IGdsb2JhbC5sb2NhbFN0b3JhZ2VbbmFtZV07XG4gIGlmIChudWxsID09IHZhbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gU3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5tb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWxheWVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZShwYmYsIGVuZCkge1xuICAgIHRoaXMubGF5ZXJzID0gcGJmLnJlYWRGaWVsZHMocmVhZFRpbGUsIHt9LCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkVGlsZSh0YWcsIGxheWVycywgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICB2YXIgbGF5ZXIgPSBuZXcgVmVjdG9yVGlsZUxheWVyKHBiZiwgcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MpO1xuICAgICAgICBpZiAobGF5ZXIubGVuZ3RoKSBsYXllcnNbbGF5ZXIubmFtZV0gPSBsYXllcjtcbiAgICB9XG59XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlRmVhdHVyZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUZlYXR1cmUocGJmLCBlbmQsIGV4dGVudCwga2V5cywgdmFsdWVzKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0ge307XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQ7XG4gICAgdGhpcy50eXBlID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fZ2VvbWV0cnkgPSAtMTtcbiAgICB0aGlzLl9rZXlzID0ga2V5cztcbiAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkRmVhdHVyZSwgdGhpcywgZW5kKTtcbn1cblxuZnVuY3Rpb24gcmVhZEZlYXR1cmUodGFnLCBmZWF0dXJlLCBwYmYpIHtcbiAgICBpZiAodGFnID09IDEpIGZlYXR1cmUuX2lkID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMikgcmVhZFRhZyhwYmYsIGZlYXR1cmUpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAzKSBmZWF0dXJlLnR5cGUgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSA0KSBmZWF0dXJlLl9nZW9tZXRyeSA9IHBiZi5wb3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWcocGJmLCBmZWF0dXJlKSB7XG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIGtleSA9IGZlYXR1cmUuX2tleXNbcGJmLnJlYWRWYXJpbnQoKV0sXG4gICAgICAgICAgICB2YWx1ZSA9IGZlYXR1cmUuX3ZhbHVlc1twYmYucmVhZFZhcmludCgpXTtcbiAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG59XG5cblZlY3RvclRpbGVGZWF0dXJlLnR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgbGluZXMgPSBbXSxcbiAgICAgICAgbGluZTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgY21kTGVuID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcbiAgICAgICAgICAgIGxlbmd0aCA9IGNtZExlbiA+PiAzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVuZ3RoLS07XG5cbiAgICAgICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcbiAgICAgICAgICAgIHggKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICB5ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuXG4gICAgICAgICAgICBpZiAoY21kID09PSAxKSB7IC8vIG1vdmVUb1xuICAgICAgICAgICAgICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGluZS5wdXNoKG5ldyBQb2ludCh4LCB5KSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgPT09IDcpIHtcbiAgICAgICAgICAgIGxpbmUucHVzaChsaW5lWzBdLmNsb25lKCkpOyAvLyBjbG9zZVBvbHlnb25cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcblxuICAgIHJldHVybiBsaW5lcztcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5iYm94ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgeDEgPSBJbmZpbml0eSxcbiAgICAgICAgeDIgPSAtSW5maW5pdHksXG4gICAgICAgIHkxID0gSW5maW5pdHksXG4gICAgICAgIHkyID0gLUluZmluaXR5O1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICBpZiAoeCA8IHgxKSB4MSA9IHg7XG4gICAgICAgICAgICBpZiAoeCA+IHgyKSB4MiA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IHkxKSB5MSA9IHk7XG4gICAgICAgICAgICBpZiAoeSA+IHkyKSB5MiA9IHk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgIT09IDcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml07XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICAgIHZhciBzaXplID0gdGhpcy5leHRlbnQgKiBNYXRoLnBvdygyLCB6KSxcbiAgICAgICAgeDAgPSB0aGlzLmV4dGVudCAqIHgsXG4gICAgICAgIHkwID0gdGhpcy5leHRlbnQgKiB5LFxuICAgICAgICBjb29yZHMgPSB0aGlzLmxvYWRHZW9tZXRyeSgpLFxuICAgICAgICB0eXBlID0gVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbdGhpcy50eXBlXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBsaW5lID0gY29vcmRzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBwID0gbGluZVtqXSwgeTIgPSAxODAgLSAocC55ICsgeTApICogMzYwIC8gc2l6ZTtcbiAgICAgICAgICAgIGxpbmVbal0gPSBbXG4gICAgICAgICAgICAgICAgKHAueCArIHgwKSAqIDM2MCAvIHNpemUgLSAxODAsXG4gICAgICAgICAgICAgICAgMzYwIC8gTWF0aC5QSSAqIE1hdGguYXRhbihNYXRoLmV4cCh5MiAqIE1hdGguUEkgLyAxODApKSAtIDkwXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgJiYgY29vcmRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb29yZHMgPSBjb29yZHNbMF1bMF07XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXTtcbiAgICAgICAgdHlwZSA9ICdNdWx0aVBvaW50JztcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJyAmJiBjb29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICB0eXBlID0gJ011bHRpTGluZVN0cmluZyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3Jkc1xuICAgICAgICB9LFxuICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXNcbiAgICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlZmVhdHVyZS5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVMYXllcjtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUxheWVyKHBiZiwgZW5kKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy52ZXJzaW9uID0gMTtcbiAgICB0aGlzLm5hbWUgPSBudWxsO1xuICAgIHRoaXMuZXh0ZW50ID0gNDA5NjtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgICB0aGlzLl9mZWF0dXJlcyA9IFtdO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZExheWVyLCB0aGlzLCBlbmQpO1xuXG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLl9mZWF0dXJlcy5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIHJlYWRMYXllcih0YWcsIGxheWVyLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxNSkgbGF5ZXIudmVyc2lvbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAxKSBsYXllci5uYW1lID0gcGJmLnJlYWRTdHJpbmcoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGxheWVyLmV4dGVudCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBsYXllci5fZmVhdHVyZXMucHVzaChwYmYucG9zKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDMpIGxheWVyLl9rZXlzLnB1c2gocGJmLnJlYWRTdHJpbmcoKSk7XG4gICAgZWxzZSBpZiAodGFnID09PSA0KSBsYXllci5fdmFsdWVzLnB1c2gocmVhZFZhbHVlTWVzc2FnZShwYmYpKTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhbHVlTWVzc2FnZShwYmYpIHtcbiAgICB2YXIgdmFsdWUgPSBudWxsLFxuICAgICAgICBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciB0YWcgPSBwYmYucmVhZFZhcmludCgpID4+IDM7XG5cbiAgICAgICAgdmFsdWUgPSB0YWcgPT09IDEgPyBwYmYucmVhZFN0cmluZygpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMiA/IHBiZi5yZWFkRmxvYXQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDMgPyBwYmYucmVhZERvdWJsZSgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNCA/IHBiZi5yZWFkVmFyaW50NjQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDUgPyBwYmYucmVhZFZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNiA/IHBiZi5yZWFkU1ZhcmludCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNyA/IHBiZi5yZWFkQm9vbGVhbigpIDogbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIHJldHVybiBmZWF0dXJlIGBpYCBmcm9tIHRoaXMgbGF5ZXIgYXMgYSBgVmVjdG9yVGlsZUZlYXR1cmVgXG5WZWN0b3JUaWxlTGF5ZXIucHJvdG90eXBlLmZlYXR1cmUgPSBmdW5jdGlvbihpKSB7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2ZlYXR1cmUgaW5kZXggb3V0IG9mIGJvdW5kcycpO1xuXG4gICAgdGhpcy5fcGJmLnBvcyA9IHRoaXMuX2ZlYXR1cmVzW2ldO1xuXG4gICAgdmFyIGVuZCA9IHRoaXMuX3BiZi5yZWFkVmFyaW50KCkgKyB0aGlzLl9wYmYucG9zO1xuICAgIHJldHVybiBuZXcgVmVjdG9yVGlsZUZlYXR1cmUodGhpcy5fcGJmLCBlbmQsIHRoaXMuZXh0ZW50LCB0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMpO1xufTtcbiIsIi8vIEdlb21ldHJ5IGJ1aWxkaW5nIGZ1bmN0aW9uc1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5leHBvcnQgY29uc3QgdGlsZV9ib3VuZHMgPSBbXG4gICAgeyB4OiAwLCB5OiAwfSxcbiAgICB7IHg6IEdlby50aWxlX3NjYWxlLCB5OiAtR2VvLnRpbGVfc2NhbGUgfSAvLyBUT0RPOiBjb3JyZWN0IGZvciBmbGlwcGVkIHktYXhpcz9cbl07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0X3V2cyA9IFswLCAwLCAxLCAxXTtcblxuLy8gVGVzdHMgaWYgYSBsaW5lIHNlZ21lbnQgKGZyb20gcG9pbnQgQSB0byBCKSBpcyBvdXRzaWRlIHRoZSB0aWxlIGJvdW5kc1xuLy8gKHdpdGhpbiBhIGNlcnRhaW4gdG9sZXJhbmNlIHRvIGFjY291bnQgZm9yIGdlb21ldHJ5IG5lYXJseSBvbiB0aWxlIGVkZ2VzKVxuZXhwb3J0IGZ1bmN0aW9uIG91dHNpZGVUaWxlIChfYSwgX2IsIHRvbGVyYW5jZSkge1xuICAgIGxldCB0aWxlX21pbiA9IHRpbGVfYm91bmRzWzBdO1xuICAgIGxldCB0aWxlX21heCA9IHRpbGVfYm91bmRzWzFdO1xuXG4gICAgLy8gVE9ETzogZml4IGZsaXBwZWQgWSBjb29yZHMgaGVyZSwgY29uZnVzaW5nIHdpdGggJ21heCcgcmVmZXJlbmNlXG4gICAgaWYgKChfYVswXSA8PSB0aWxlX21pbi54ICsgdG9sZXJhbmNlICYmIF9iWzBdIDw9IHRpbGVfbWluLnggKyB0b2xlcmFuY2UpIHx8XG4gICAgICAgIChfYVswXSA+PSB0aWxlX21heC54IC0gdG9sZXJhbmNlICYmIF9iWzBdID49IHRpbGVfbWF4LnggLSB0b2xlcmFuY2UpIHx8XG4gICAgICAgIChfYVsxXSA+PSB0aWxlX21pbi55IC0gdG9sZXJhbmNlICYmIF9iWzFdID49IHRpbGVfbWluLnkgLSB0b2xlcmFuY2UpIHx8XG4gICAgICAgIChfYVsxXSA8PSB0aWxlX21heC55ICsgdG9sZXJhbmNlICYmIF9iWzFdIDw9IHRpbGVfbWF4LnkgKyB0b2xlcmFuY2UpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29vcmRPdXRzaWRlVGlsZSAoY29vcmQsIHRvbGVyYW5jZSkge1xuICAgIHRvbGVyYW5jZSA9IHRvbGVyYW5jZSB8fCAwO1xuICAgIGxldCB0aWxlX21pbiA9IHRpbGVfYm91bmRzWzBdO1xuICAgIGxldCB0aWxlX21heCA9IHRpbGVfYm91bmRzWzFdO1xuXG4gICAgcmV0dXJuIGNvb3JkWzBdIDw9IHRpbGVfbWluLnggKyB0b2xlcmFuY2UgfHxcbiAgICAgICAgICAgY29vcmRbMF0gPj0gdGlsZV9tYXgueCAtIHRvbGVyYW5jZSB8fFxuICAgICAgICAgICBjb29yZFsxXSA+PSB0aWxlX21pbi55IC0gdG9sZXJhbmNlIHx8XG4gICAgICAgICAgIGNvb3JkWzFdIDw9IHRpbGVfbWF4LnkgKyB0b2xlcmFuY2U7XG59XG4iLCIvLyBQb2ludCBidWlsZGVyc1xuaW1wb3J0IHsgZGVmYXVsdF91dnMgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8vIEJ1aWxkIGEgYmlsbGJvYXJkIHNwcml0ZSBxdWFkIGNlbnRlcmVkIG9uIGEgcG9pbnQuIFNwcml0ZXMgYXJlIGludGVuZGVkIHRvIGJlIGRyYXduIGluIHNjcmVlbnNwYWNlLCBhbmQgaGF2ZVxuLy8gcHJvcGVydGllcyBmb3Igd2lkdGgsIGhlaWdodCwgYW5nbGUsIGFuZCBhIHNjYWxlIGZhY3RvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVycG9sYXRlIHRoZSBzY3JlZW5zcGFjZSBzaXplXG4vLyBvZiBhIHNwcml0ZSBiZXR3ZWVuIHR3byB6b29tIGxldmVscy5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFF1YWRzRm9yUG9pbnRzIChwb2ludHMsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgeyB0ZXhjb29yZF9pbmRleCwgcG9zaXRpb25faW5kZXgsIHNoYXBlX2luZGV4LCBvZmZzZXRfaW5kZXggfSxcbiAgICB7IHF1YWQsIHF1YWRfbm9ybWFsaXplLCBvZmZzZXQsIGFuZ2xlLCBzaGFwZV93LCB0ZXhjb29yZF9zY2FsZSwgdGV4Y29vcmRfbm9ybWFsaXplIH0pIHtcbiAgICBxdWFkX25vcm1hbGl6ZSA9IHF1YWRfbm9ybWFsaXplIHx8IDE7XG4gICAgbGV0IHcyID0gcXVhZFswXSAvIDIgKiBxdWFkX25vcm1hbGl6ZTtcbiAgICBsZXQgaDIgPSBxdWFkWzFdIC8gMiAqIHF1YWRfbm9ybWFsaXplO1xuICAgIGxldCBzY2FsaW5nID0gW1xuICAgICAgICBbLXcyLCAtaDJdLFxuICAgICAgICBbdzIsIC1oMl0sXG4gICAgICAgIFt3MiwgaDJdLFxuICAgICAgICBbLXcyLCBoMl1cbiAgICBdO1xuXG4gICAgbGV0IHZlcnRleF9lbGVtZW50cyA9IHZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcbiAgICBsZXQgZWxlbWVudF9vZmZzZXQgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICBsZXQgdGV4Y29vcmRzO1xuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgMTtcblxuICAgICAgICB2YXIgW21pbl91LCBtaW5fdiwgbWF4X3UsIG1heF92XSA9IHRleGNvb3JkX3NjYWxlIHx8IGRlZmF1bHRfdXZzO1xuICAgICAgICB0ZXhjb29yZHMgPSBbXG4gICAgICAgICAgICBbbWluX3UsIG1pbl92XSxcbiAgICAgICAgICAgIFttYXhfdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtYXhfdl0sXG4gICAgICAgICAgICBbbWluX3UsIG1heF92XVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGxldCBudW1fcG9pbnRzID0gcG9pbnRzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBwPTA7IHAgPCBudW1fcG9pbnRzOyBwKyspIHtcbiAgICAgICAgbGV0IHBvaW50ID0gcG9pbnRzW3BdO1xuXG4gICAgICAgIGZvciAobGV0IHBvcz0wOyBwb3MgPCA0OyBwb3MrKykge1xuICAgICAgICAgICAgLy8gQWRkIHRleGNvb3Jkc1xuICAgICAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMF0gPSB0ZXhjb29yZHNbcG9zXVswXSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAxXSA9IHRleGNvb3Jkc1twb3NdWzFdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbcG9zaXRpb25faW5kZXggKyAwXSA9IHBvaW50WzBdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3Bvc2l0aW9uX2luZGV4ICsgMV0gPSBwb2ludFsxXTtcblxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3NoYXBlX2luZGV4ICsgMF0gPSBzY2FsaW5nW3Bvc11bMF07XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAxXSA9IHNjYWxpbmdbcG9zXVsxXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDJdID0gYW5nbGU7XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAzXSA9IHNoYXBlX3c7XG5cbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtvZmZzZXRfaW5kZXggKyAwXSA9IG9mZnNldFswXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtvZmZzZXRfaW5kZXggKyAxXSA9IG9mZnNldFsxXTtcblxuICAgICAgICAgICAgdmVydGV4X2RhdGEuYWRkVmVydGV4KHZlcnRleF90ZW1wbGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDEpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDMpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuXG4gICAgICAgIGVsZW1lbnRfb2Zmc2V0ICs9IDQ7XG4gICAgfVxufVxuIiwiLy8gUG9seWdvbiBidWlsZGVyc1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuLi92ZWN0b3InO1xuaW1wb3J0IHsgZGVmYXVsdF91dnMsIG91dHNpZGVUaWxlIH0gZnJvbSAnLi9jb21tb24nO1xuXG5pbXBvcnQgZWFyY3V0IGZyb20gJ2VhcmN1dCc7XG5cbmNvbnN0IHVwX3ZlYzMgPSBbMCwgMCwgMV07XG5cbi8vIFRlc3NlbGF0ZSBhIGZsYXQgMkQgcG9seWdvblxuLy8geCAmIHkgY29vcmRpbmF0ZXMgd2lsbCBiZSBzZXQgYXMgZmlyc3QgdHdvIGVsZW1lbnRzIG9mIHByb3ZpZGVkIHZlcnRleF90ZW1wbGF0ZVxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9seWdvbnMgKFxuICAgIHBvbHlnb25zLFxuICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgeyB0ZXhjb29yZF9pbmRleCwgdGV4Y29vcmRfc2NhbGUsIHRleGNvb3JkX25vcm1hbGl6ZSB9KSB7XG5cbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gdmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuXG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCAxO1xuICAgICAgICB2YXIgW21pbl91LCBtaW5fdiwgbWF4X3UsIG1heF92XSA9IHRleGNvb3JkX3NjYWxlIHx8IGRlZmF1bHRfdXZzO1xuICAgIH1cblxuICAgIHZhciBudW1fcG9seWdvbnMgPSBwb2x5Z29ucy5sZW5ndGg7XG4gICAgZm9yICh2YXIgcD0wOyBwIDwgbnVtX3BvbHlnb25zOyBwKyspIHtcbiAgICAgICAgdmFyIGVsZW1lbnRfb2Zmc2V0ID0gdmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuXG4gICAgICAgIHZhciBwb2x5Z29uID0gcG9seWdvbnNbcF07XG5cbiAgICAgICAgLy8gRmluZCBwb2x5Z29uIGV4dGVudHMgdG8gY2FsY3VsYXRlIFVWcywgZml0IHRoZW0gdG8gdGhlIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3hcbiAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICB2YXIgW21pbl94LCBtaW5feSwgbWF4X3gsIG1heF95XSA9IEdlby5maW5kQm91bmRpbmdCb3gocG9seWdvbik7XG4gICAgICAgICAgICB2YXIgc3Bhbl94ID0gbWF4X3ggLSBtaW5feDtcbiAgICAgICAgICAgIHZhciBzcGFuX3kgPSBtYXhfeSAtIG1pbl95O1xuICAgICAgICAgICAgdmFyIHNjYWxlX3UgPSAobWF4X3UgLSBtaW5fdSkgLyBzcGFuX3g7XG4gICAgICAgICAgICB2YXIgc2NhbGVfdiA9IChtYXhfdiAtIG1pbl92KSAvIHNwYW5feTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHJpbmdfaW5kZXggPSAwOyByaW5nX2luZGV4IDwgcG9seWdvbi5sZW5ndGg7IHJpbmdfaW5kZXgrKyl7XG4gICAgICAgICAgICAvLyBBZGQgdmVydGV4IGRhdGFcbiAgICAgICAgICAgIHZhciBwb2x5Z29uX3JpbmcgPSBwb2x5Z29uW3JpbmdfaW5kZXhdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29uX3JpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdmVydGV4ID0gcG9seWdvbl9yaW5nW2ldO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVswXSA9IHZlcnRleFswXTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMV0gPSB2ZXJ0ZXhbMV07XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgVVZzXG4gICAgICAgICAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDBdID0gKCh2ZXJ0ZXhbMF0gLSBtaW5feCkgKiBzY2FsZV91ICsgbWluX3UpICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAxXSA9ICgodmVydGV4WzFdIC0gbWluX3kpICogc2NhbGVfdiArIG1pbl92KSAqIHRleGNvb3JkX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBlbGVtZW50IGluZGljZXNcbiAgICAgICAgdmFyIGluZGljZXMgPSB0cmlhbmd1bGF0ZVBvbHlnb24oZWFyY3V0LmZsYXR0ZW4ocG9seWdvbikpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyBpbmRpY2VzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gVGVzc2VsYXRlIGFuZCBleHRydWRlIGEgZmxhdCAyRCBwb2x5Z29uIGludG8gYSBzaW1wbGUgM0QgbW9kZWwgd2l0aCBmaXhlZCBoZWlnaHQgYW5kIGFkZCB0byBHTCB2ZXJ0ZXggYnVmZmVyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFeHRydWRlZFBvbHlnb25zIChcbiAgICBwb2x5Z29ucyxcbiAgICB6LCBoZWlnaHQsIG1pbl9oZWlnaHQsXG4gICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICBub3JtYWxfaW5kZXgsXG4gICAgbm9ybWFsX25vcm1hbGl6ZSxcbiAgICB7XG4gICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlLFxuICAgICAgICB0ZXhjb29yZF9pbmRleCxcbiAgICAgICAgdGV4Y29vcmRfc2NhbGUsXG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSxcbiAgICAgICAgd2luZGluZ1xuICAgIH0pIHtcblxuICAgIC8vIFRvcFxuICAgIHZhciBtaW5feiA9IHogKyAobWluX2hlaWdodCB8fCAwKTtcbiAgICB2YXIgbWF4X3ogPSB6ICsgaGVpZ2h0O1xuICAgIHZlcnRleF90ZW1wbGF0ZVsyXSA9IG1heF96O1xuICAgIGJ1aWxkUG9seWdvbnMocG9seWdvbnMsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsIHsgdGV4Y29vcmRfaW5kZXgsIHRleGNvb3JkX3NjYWxlLCB0ZXhjb29yZF9ub3JtYWxpemUgfSk7XG5cbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gdmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuICAgIHZhciBlbGVtZW50X29mZnNldCA9IHZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgIC8vIFdhbGxzXG4gICAgLy8gRml0IFVWcyB0byB3YWxsIHF1YWRcbiAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplID0gdGV4Y29vcmRfbm9ybWFsaXplIHx8IDE7XG4gICAgICAgIHZhciBbbWluX3UsIG1pbl92LCBtYXhfdSwgbWF4X3ZdID0gdGV4Y29vcmRfc2NhbGUgfHwgZGVmYXVsdF91dnM7XG4gICAgICAgIHZhciB0ZXhjb29yZHMgPSBbXG4gICAgICAgICAgICBbbWluX3UsIG1heF92XSxcbiAgICAgICAgICAgIFttaW5fdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1heF92XVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHZhciBudW1fcG9seWdvbnMgPSBwb2x5Z29ucy5sZW5ndGg7XG4gICAgZm9yICh2YXIgcD0wOyBwIDwgbnVtX3BvbHlnb25zOyBwKyspIHtcbiAgICAgICAgdmFyIHBvbHlnb24gPSBwb2x5Z29uc1twXTtcblxuICAgICAgICBmb3IgKHZhciBxPTA7IHEgPCBwb2x5Z29uLmxlbmd0aDsgcSsrKSB7XG4gICAgICAgICAgICB2YXIgY29udG91ciA9IHBvbHlnb25bcV07XG5cbiAgICAgICAgICAgIGZvciAodmFyIHc9MDsgdyA8IGNvbnRvdXIubGVuZ3RoIC0gMTsgdysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZV90aWxlX2VkZ2VzICYmIG91dHNpZGVUaWxlKGNvbnRvdXJbd10sIGNvbnRvdXJbdysxXSwgdGlsZV9lZGdlX3RvbGVyYW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGRvbid0IGV4dHJ1ZGUgdGlsZSBlZGdlc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFdhbGwgb3JkZXIgaXMgZGVwZW5kZW50IG9uIHdpbmRpbmcgb3JkZXIsIHNvIHRoYXQgbm9ybWFscyBmYWNlIG91dHdhcmRcbiAgICAgICAgICAgICAgICBsZXQgdzAsIHcxO1xuICAgICAgICAgICAgICAgIGlmICh3aW5kaW5nID09PSAnQ0NXJykge1xuICAgICAgICAgICAgICAgICAgICB3MCA9IHc7XG4gICAgICAgICAgICAgICAgICAgIHcxID0gdysxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdzAgPSB3KzE7XG4gICAgICAgICAgICAgICAgICAgIHcxID0gdztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBUd28gdHJpYW5nbGVzIGZvciB0aGUgcXVhZCBmb3JtZWQgYnkgZWFjaCB2ZXJ0ZXggcGFpciwgZ29pbmcgZnJvbSBib3R0b20gdG8gdG9wIGhlaWdodFxuICAgICAgICAgICAgICAgIHZhciB3YWxsX3ZlcnRpY2VzID0gW1xuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MV1bMF0sIGNvbnRvdXJbdzFdWzFdLCBtYXhfel0sXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cxXVswXSwgY29udG91clt3MV1bMV0sIG1pbl96XSxcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRvdXJbdzBdWzBdLCBjb250b3VyW3cwXVsxXSwgbWluX3pdLFxuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MF1bMF0sIGNvbnRvdXJbdzBdWzFdLCBtYXhfel1cbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2FsYyB0aGUgbm9ybWFsIG9mIHRoZSB3YWxsIGZyb20gdXAgdmVjdG9yIGFuZCBvbmUgc2VnbWVudCBvZiB0aGUgd2FsbCB0cmlhbmdsZXNcbiAgICAgICAgICAgICAgICBsZXQgd2FsbF92ZWMgPSBWZWN0b3Iubm9ybWFsaXplKFtjb250b3VyW3cxXVswXSAtIGNvbnRvdXJbdzBdWzBdLCBjb250b3VyW3cxXVsxXSAtIGNvbnRvdXJbdzBdWzFdLCAwXSk7XG4gICAgICAgICAgICAgICAgbGV0IG5vcm1hbCA9IFZlY3Rvci5jcm9zcyh1cF92ZWMzLCB3YWxsX3ZlYyk7XG5cbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdmVydGV4IHRlbXBsYXRlIHdpdGggY3VycmVudCBzdXJmYWNlIG5vcm1hbFxuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtub3JtYWxfaW5kZXggKyAwXSA9IG5vcm1hbFswXSAqIG5vcm1hbF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW25vcm1hbF9pbmRleCArIDFdID0gbm9ybWFsWzFdICogbm9ybWFsX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbbm9ybWFsX2luZGV4ICsgMl0gPSBub3JtYWxbMl0gKiBub3JtYWxfbm9ybWFsaXplO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgd3Y9MDsgd3YgPCB3YWxsX3ZlcnRpY2VzLmxlbmd0aDsgd3YrKykge1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMF0gPSB3YWxsX3ZlcnRpY2VzW3d2XVswXTtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzFdID0gd2FsbF92ZXJ0aWNlc1t3dl1bMV07XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVsyXSA9IHdhbGxfdmVydGljZXNbd3ZdWzJdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMF0gPSB0ZXhjb29yZHNbd3ZdWzBdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMV0gPSB0ZXhjb29yZHNbd3ZdWzFdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X2RhdGEuYWRkVmVydGV4KHZlcnRleF90ZW1wbGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAwKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDEpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAyKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDMpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50X29mZnNldCArPSA0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBUcmlhbmd1bGF0aW9uIHVzaW5nIGVhcmN1dFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9lYXJjdXRcbmV4cG9ydCBmdW5jdGlvbiB0cmlhbmd1bGF0ZVBvbHlnb24gKGRhdGEpIHtcbiAgICByZXR1cm4gZWFyY3V0KGRhdGEudmVydGljZXMsIGRhdGEuaG9sZXMsIGRhdGEuZGltZW5zaW9ucyk7XG59XG4iLCIvLyBHZW9tZXRyeSBidWlsZGluZyBmdW5jdGlvbnNcblxuaW1wb3J0IFZlY3RvciBmcm9tICcuLi92ZWN0b3InO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IHtvdXRzaWRlVGlsZSwgaXNDb29yZE91dHNpZGVUaWxlfSBmcm9tICcuL2NvbW1vbic7XG5cbmNvbnN0IHplcm9fdmVjMiA9IFswLCAwXTtcblxuLy8gQnVpbGQgdGVzc2VsbGF0ZWQgdHJpYW5nbGVzIGZvciBhIHBvbHlsaW5lXG5jb25zdCBDQVBfVFlQRSA9IHtcbiAgICBidXR0OiAwLFxuICAgIHNxdWFyZTogMSxcbiAgICByb3VuZDogMlxufTtcblxuY29uc3QgSk9JTl9UWVBFID0ge1xuICAgIG1pdGVyOiAwLFxuICAgIGJldmVsOiAxLFxuICAgIHJvdW5kOiAyXG59O1xuXG5jb25zdCBERUZBVUxUID0ge1xuICAgIE1JVEVSX0xJTUlUOiAzLFxuICAgIFRFWENPT1JEX05PUk1BTElaRTogMSxcbiAgICBURVhDT09SRF9SQVRJTzogMSxcbiAgICBNSU5fRkFOX1dJRFRIOiA1ICAgICAgICAvLyBXaWR0aCBvZiBsaW5lIGluIHRpbGUgdW5pdHMgdG8gcGxhY2UgMSB0cmlhbmdsZSBwZXIgZmFuXG59O1xuXG4vLyBTY2FsaW5nIGZhY3RvciB0byBhZGQgcHJlY2lzaW9uIHRvIGxpbmUgdGV4dHVyZSBWIGNvb3JkaW5hdGUgcGFja2VkIGFzIG5vcm1hbGl6ZWQgc2hvcnRcbmNvbnN0IHZfc2NhbGVfYWRqdXN0ID0gR2VvLnRpbGVfc2NhbGU7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvbHlsaW5lcyAobGluZXMsIHdpZHRoLCB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgIHtcbiAgICAgICAgY2xvc2VkX3BvbHlnb24sXG4gICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlLFxuICAgICAgICB0ZXhjb29yZF9pbmRleCxcbiAgICAgICAgdGV4Y29vcmRfc2NhbGUsXG4gICAgICAgIHRleGNvb3JkX3dpZHRoLFxuICAgICAgICB0ZXhjb29yZF9yYXRpbyxcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplLFxuICAgICAgICBzY2FsaW5nX2luZGV4LFxuICAgICAgICBzY2FsaW5nX25vcm1hbGl6ZSxcbiAgICAgICAgam9pbiwgY2FwLFxuICAgICAgICBtaXRlcl9saW1pdFxuICAgIH0pIHtcblxuICAgIHZhciBjYXBfdHlwZSA9IGNhcCA/IENBUF9UWVBFW2NhcF0gOiBDQVBfVFlQRS5idXR0O1xuICAgIHZhciBqb2luX3R5cGUgPSBqb2luID8gSk9JTl9UWVBFW2pvaW5dIDogSk9JTl9UWVBFLm1pdGVyO1xuXG4gICAgLy8gQ29uZmlndXJlIG1pdGVyIGxpbWl0XG4gICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgIG1pdGVyX2xpbWl0ID0gbWl0ZXJfbGltaXQgfHwgREVGQVVMVC5NSVRFUl9MSU1JVDsgLy8gZGVmYXVsdCBtaXRlciBsaW1pdFxuICAgICAgICB2YXIgbWl0ZXJfbGVuX3NxID0gbWl0ZXJfbGltaXQgKiBtaXRlcl9saW1pdDtcbiAgICB9XG5cbiAgICAvLyBUZXh0dXJlIFZhcmlhYmxlc1xuICAgIHZhciB2X3NjYWxlO1xuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgREVGQVVMVC5URVhDT09SRF9OT1JNQUxJWkU7XG4gICAgICAgIHRleGNvb3JkX3JhdGlvID0gdGV4Y29vcmRfcmF0aW8gfHwgREVGQVVMVC5URVhDT09SRF9SQVRJTztcbiAgICAgICAgdl9zY2FsZSA9IDEgLyAodGV4Y29vcmRfd2lkdGggKiB0ZXhjb29yZF9yYXRpbyAqIHZfc2NhbGVfYWRqdXN0KTsgLy8gc2NhbGVzIGxpbmUgdGV4dHVyZSBhcyBhIHJhdGlvIG9mIHRoZSBsaW5lJ3Mgd2lkdGhcbiAgICB9XG5cbiAgICAvLyBWYWx1ZXMgdGhhdCBhcmUgY29uc3RhbnQgZm9yIGVhY2ggbGluZSBhbmQgYXJlIHBhc3NlZCB0byBoZWxwZXIgZnVuY3Rpb25zXG4gICAgdmFyIGNvbnRleHQgPSB7XG4gICAgICAgIGNsb3NlZF9wb2x5Z29uLFxuICAgICAgICByZW1vdmVfdGlsZV9lZGdlcyxcbiAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZSxcbiAgICAgICAgbWl0ZXJfbGVuX3NxLFxuICAgICAgICBqb2luX3R5cGUsXG4gICAgICAgIGNhcF90eXBlLFxuICAgICAgICB2ZXJ0ZXhfZGF0YSxcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICBoYWxmX3dpZHRoOiB3aWR0aCAvIDIsXG4gICAgICAgIHNjYWxpbmdfaW5kZXgsXG4gICAgICAgIHNjYWxpbmdfbm9ybWFsaXplLFxuICAgICAgICB2X3NjYWxlLFxuICAgICAgICB0ZXhjb29yZF9pbmRleCxcbiAgICAgICAgdGV4Y29vcmRfd2lkdGgsXG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZVxuICAgIH07XG5cbiAgICAvLyBCdWZmZXIgZm9yIGV4dHJhIGxpbmVzIHRvIHByb2Nlc3NcbiAgICB2YXIgZXh0cmFfbGluZXMgPSBbXTtcblxuICAgIC8vIFByb2Nlc3MgbGluZXNcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGluZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGJ1aWxkUG9seWxpbmUobGluZXNbaW5kZXhdLCBjb250ZXh0LCBleHRyYV9saW5lcyk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBleHRyYSBsaW5lc1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHRyYV9saW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgYnVpbGRQb2x5bGluZShleHRyYV9saW5lc1tpbmRleF0sIGNvbnRleHQsIGV4dHJhX2xpbmVzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUG9seWxpbmUobGluZSwgY29udGV4dCwgZXh0cmFfbGluZXMpe1xuICAgIC8vIFNraXAgaWYgbGluZSBpcyBub3QgdmFsaWRcbiAgICBpZiAobGluZS5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIge2pvaW5fdHlwZSwgY2FwX3R5cGUsIGNsb3NlZF9wb2x5Z29uLCByZW1vdmVfdGlsZV9lZGdlcywgdGlsZV9lZGdlX3RvbGVyYW5jZSwgdl9zY2FsZSwgbWl0ZXJfbGVuX3NxfSA9IGNvbnRleHQ7XG5cbiAgICAvLyBMb29wIGJhY2t3YXJkcyB0aHJvdWdoIGxpbmUgdG8gYSB0aWxlIGJvdW5kYXJ5IGlmIGZvdW5kXG4gICAgaWYgKGNsb3NlZF9wb2x5Z29uICYmIGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgIHZhciBib3VuZGFyeUluZGV4ID0gZ2V0VGlsZUJvdW5kYXJ5SW5kZXgobGluZSk7XG4gICAgICAgIGlmIChib3VuZGFyeUluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgbmV3IGxpbmUgdGhhdCBpcyBhIGN5Y2xpYyBwZXJtdXRhdGlvbiBvZiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgIHZhciBwZXJtdXRlZExpbmUgPSBwZXJtdXRlTGluZShsaW5lLCBib3VuZGFyeUluZGV4KTtcbiAgICAgICAgICAgIGV4dHJhX2xpbmVzLnB1c2gocGVybXV0ZWRMaW5lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjb29yZEN1cnIsIGNvb3JkTmV4dCwgbm9ybVByZXYsIG5vcm1OZXh0O1xuICAgIHZhciB2ID0gMDsgLy8gVGV4dHVyZSB2LWNvb3JkaW5hdGVcblxuICAgIHZhciBpbmRleF9zdGFydCA9IDA7XG4gICAgdmFyIGluZGV4X2VuZCA9IGxpbmUubGVuZ3RoIC0gMTtcbiAgICB2YXIgaWdub3JlZF9pbmRpY2VzX2NvdW50ID0gMDtcblxuICAgIC8vIEZJUlNUIFBPSU5UXG4gICAgLy8gbG9vcCB0aHJvdWdoIGJlZ2lubmluZyBwb2ludHMgaWYgZHVwbGljYXRlc1xuICAgIGNvb3JkQ3VyciA9IGxpbmVbaW5kZXhfc3RhcnRdO1xuICAgIGNvb3JkTmV4dCA9IGxpbmVbaW5kZXhfc3RhcnQgKyAxXTtcbiAgICB3aGlsZSAoVmVjdG9yLmlzRXF1YWwoY29vcmRDdXJyLCBjb29yZE5leHQpKSB7XG4gICAgICAgIGluZGV4X3N0YXJ0Kys7XG4gICAgICAgIGNvb3JkQ3VyciA9IGNvb3JkTmV4dDtcbiAgICAgICAgY29vcmROZXh0ID0gbGluZVtpbmRleF9zdGFydCArIDFdO1xuICAgICAgICBpZ25vcmVkX2luZGljZXNfY291bnQrKztcbiAgICAgICAgaWYgKGluZGV4X3N0YXJ0ID09PSBsaW5lLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGxvb3AgdGhyb3VnaCBlbmRpbmcgcG9pbnRzIHRvIGNoZWNrIGZvciBkdXBsaWNhdGVzXG4gICAgd2hpbGUgKFZlY3Rvci5pc0VxdWFsKGxpbmVbaW5kZXhfZW5kXSwgbGluZVtpbmRleF9lbmQgLSAxXSkpIHtcbiAgICAgICAgaW5kZXhfZW5kLS07XG4gICAgICAgIGlnbm9yZWRfaW5kaWNlc19jb3VudCsrO1xuICAgICAgICBpZiAoaW5kZXhfZW5kID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5sZW5ndGggPCAyICsgaWdub3JlZF9pbmRpY2VzX2NvdW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBub3JtTmV4dCA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAoY29vcmRDdXJyLCBjb29yZE5leHQpKTtcblxuICAgIC8vIFNraXAgdGlsZSBib3VuZGFyeSBsaW5lcyBhbmQgYXBwZW5kIGEgbmV3IGxpbmUgaWYgbmVlZGVkXG4gICAgaWYgKHJlbW92ZV90aWxlX2VkZ2VzICYmIG91dHNpZGVUaWxlKGNvb3JkQ3VyciwgY29vcmROZXh0LCB0aWxlX2VkZ2VfdG9sZXJhbmNlKSkge1xuICAgICAgICB2YXIgbm9uQm91bmRhcnlTZWdtZW50ID0gZ2V0TmV4dE5vbkJvdW5kYXJ5U2VnbWVudChsaW5lLCBpbmRleF9zdGFydCwgdGlsZV9lZGdlX3RvbGVyYW5jZSk7XG4gICAgICAgIGlmIChub25Cb3VuZGFyeVNlZ21lbnQpIHtcbiAgICAgICAgICAgIGV4dHJhX2xpbmVzLnB1c2gobm9uQm91bmRhcnlTZWdtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlZF9wb2x5Z29uKXtcbiAgICAgICAgLy8gQmVnaW4gdGhlIHBvbHlnb24gd2l0aCBhIGpvaW4gKGNvbm5lY3RpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzKVxuICAgICAgICBub3JtUHJldiA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAobGluZVtpbmRleF9lbmQgLSAxXSwgY29vcmRDdXJyKSk7XG4gICAgICAgIHN0YXJ0UG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIElmIGxpbmUgYmVnaW5zIGF0IGVkZ2UsIGRvbid0IGFkZCBhIGNhcFxuICAgICAgICBpZiAoIWlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgICAgICBhZGRDYXAoY29vcmRDdXJyLCB2LCBub3JtTmV4dCwgY2FwX3R5cGUsIHRydWUsIGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKGNhcF90eXBlICE9PSBDQVBfVFlQRS5idXR0KSB7XG4gICAgICAgICAgICAgICAgdiArPSAwLjUgKiB2X3NjYWxlICogY29udGV4dC50ZXhjb29yZF93aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBmaXJzdCBwYWlyIG9mIHBvaW50cyBmb3IgdGhlIGxpbmUgc3RyaXBcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIElOVEVSTUVESUFSWSBQT0lOVFNcbiAgICB2ICs9IHZfc2NhbGUgKiBWZWN0b3IubGVuZ3RoKFZlY3Rvci5zdWIoY29vcmROZXh0LCBjb29yZEN1cnIpKTtcbiAgICBmb3IgKHZhciBpID0gaW5kZXhfc3RhcnQgKyAxOyBpIDwgaW5kZXhfZW5kOyBpKyspIHtcbiAgICAgICAgdmFyIGN1cnJJbmRleCA9IGk7XG4gICAgICAgIHZhciBuZXh0SW5kZXggPSBpICsgMTtcbiAgICAgICAgY29vcmRDdXJyID0gbGluZVtjdXJySW5kZXhdO1xuICAgICAgICBjb29yZE5leHQgPSBsaW5lW25leHRJbmRleF07XG5cbiAgICAgICAgLy8gU2tpcCByZWR1bmRhbnQgdmVydGljZXNcbiAgICAgICAgaWYgKFZlY3Rvci5pc0VxdWFsKGNvb3JkQ3VyciwgY29vcmROZXh0KSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGlsZSBib3VuZGFyaWVzXG4gICAgICAgIGlmIChyZW1vdmVfdGlsZV9lZGdlcyAmJiBvdXRzaWRlVGlsZShjb29yZEN1cnIsIGNvb3JkTmV4dCwgdGlsZV9lZGdlX3RvbGVyYW5jZSkpIHtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICB2YXIgbm9uQm91bmRhcnlMaW5lcyA9IGdldE5leHROb25Cb3VuZGFyeVNlZ21lbnQobGluZSwgY3VyckluZGV4ICsgMSwgdGlsZV9lZGdlX3RvbGVyYW5jZSk7XG4gICAgICAgICAgICBpZiAobm9uQm91bmRhcnlMaW5lcykge1xuICAgICAgICAgICAgICAgIGV4dHJhX2xpbmVzLnB1c2gobm9uQm91bmRhcnlMaW5lcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBub3JtUHJldiA9IG5vcm1OZXh0O1xuICAgICAgICBub3JtTmV4dCA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAoY29vcmRDdXJyLCBjb29yZE5leHQpKTtcblxuICAgICAgICAvLyBBZGQgam9pblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgICAgIGFkZE1pdGVyKHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBtaXRlcl9sZW5fc3EsIGZhbHNlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZEpvaW4oam9pbl90eXBlLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgZmFsc2UsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdiArPSB2X3NjYWxlICogVmVjdG9yLmxlbmd0aChWZWN0b3Iuc3ViKGNvb3JkTmV4dCwgY29vcmRDdXJyKSk7XG4gICAgfVxuXG4gICAgLy8gTEFTVCBQT0lOVFxuICAgIGNvb3JkQ3VyciA9IGNvb3JkTmV4dDtcbiAgICBub3JtUHJldiA9IG5vcm1OZXh0O1xuXG4gICAgaWYgKGNsb3NlZF9wb2x5Z29uKSB7XG4gICAgICAgIC8vIENsb3NlIHRoZSBwb2x5Z29uIHdpdGggYSBtaXRlciBqb2ludCBvciBidXR0IGNhcCBpZiBvbiBhIHRpbGUgYm91bmRhcnlcbiAgICAgICAgbm9ybU5leHQgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5wZXJwKGNvb3JkQ3VyciwgbGluZVsxXSkpO1xuICAgICAgICBlbmRQb2x5Z29uKGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBqb2luX3R5cGUsIHYsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gRmluaXNoIHRoZSBsaW5lIHN0cmlwXG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1QcmV2LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1QcmV2KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBJZiBsaW5lIGVuZHMgYXQgZWRnZSwgZG9uJ3QgYWRkIGEgY2FwXG4gICAgICAgIGlmICghaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgICAgIGFkZENhcChjb29yZEN1cnIsIHYsIG5vcm1QcmV2LCBjYXBfdHlwZSwgZmFsc2UsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRUaWxlQm91bmRhcnlJbmRleChsaW5lKXtcbiAgICBpZiAoaXNDb29yZE91dHNpZGVUaWxlKGxpbmVbMF0pKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGZvciAodmFyIGJhY2tJbmRleCA9IDA7IGJhY2tJbmRleCA8IGxpbmUubGVuZ3RoOyBiYWNrSW5kZXgrKykge1xuICAgICAgICB2YXIgY29vcmRDdXJyID0gbGluZVtsaW5lLmxlbmd0aCAtIDEgLSBiYWNrSW5kZXhdO1xuICAgICAgICBpZiAoaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgICAgIHJldHVybiBsaW5lLmxlbmd0aCAtIDEgLSBiYWNrSW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbn1cblxuLy8gSXRlcmF0ZSB0aHJvdWdoIGxpbmUgZnJvbSBzdGFydEluZGV4IHRvIGZpbmQgYSBzZWdtZW50IG5vdCBvbiBhIHRpbGUgYm91bmRhcnksIGlmIGFueS5cbmZ1bmN0aW9uIGdldE5leHROb25Cb3VuZGFyeVNlZ21lbnQgKGxpbmUsIHN0YXJ0SW5kZXgsIHRvbGVyYW5jZSkge1xuICAgIHZhciBlbmRJbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgd2hpbGUgKGxpbmVbZW5kSW5kZXggKyAxXSAmJiBvdXRzaWRlVGlsZShsaW5lW2VuZEluZGV4XSwgbGluZVtlbmRJbmRleCArIDFdLCB0b2xlcmFuY2UpKSB7XG4gICAgICAgIGVuZEluZGV4Kys7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBsaW5lIHNlZ21lbnQgcmVtYWluaW5nIHRoYXQgaXMgd2l0aGluIHRoZSB0aWxlLCBwdXNoIGl0IHRvIHRoZSBsaW5lcyBhcnJheVxuICAgIHJldHVybiAobGluZS5sZW5ndGggLSBlbmRJbmRleCA+PSAyKSA/IGxpbmUuc2xpY2UoZW5kSW5kZXgpIDogZmFsc2U7XG59XG5cbi8vIEJlZ2luIGEgcG9seWdvbiB3aXRoIGEgam9pbiBjb25uZWN0aW5nIHRvIHRoZSBsYXN0IHNlZ21lbnQgKGlmIHZhbGlkIGpvaW4tdHlwZSBzcGVjaWZpZWQpXG5mdW5jdGlvbiBzdGFydFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgY29udGV4dCl7XG4gICAgLy8gSWYgcG9seWdvbiBzdGFydHMgb24gYSB0aWxlIGJvdW5kYXJ5LCBkb24ndCBhZGQgYSBqb2luXG4gICAgaWYgKGpvaW5fdHlwZSA9PT0gdW5kZWZpbmVkIHx8IGlzQ29vcmRPdXRzaWRlVGlsZShjb29yZEN1cnIpKSB7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgMF0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1OZXh0KSwgWzAsIDBdLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIElmIHBvbHlnb24gc3RhcnRzIHdpdGhpbiBhIHRpbGUsIGFkZCBhIGpvaW5cbiAgICAgICAgdmFyIHYgPSAwO1xuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgICAgIGFkZE1pdGVyKHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBjb250ZXh0Lm1pdGVyX2xlbl9zcSwgdHJ1ZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRKb2luKGpvaW5fdHlwZSwgdiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIHRydWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBFbmQgYSBwb2x5Z29uIGFwcHJvcHJpYXRlbHlcbmZ1bmN0aW9uIGVuZFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgdiwgY29udGV4dCkge1xuICAgIC8vIElmIHBvbHlnb24gZW5kcyBvbiBhIHRpbGUgYm91bmRhcnksIGRvbid0IGFkZCBhIGpvaW5cbiAgICBpZiAoaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgcG9seWdvbiBlbmRzIHdpdGhpbiBhIHRpbGUsIGFkZCBNaXRlciBvciBubyBqb2ludCAoam9pbiBhZGRlZCBvbiBzdGFydFBvbHlnb24pXG4gICAgICAgIHZhciBtaXRlclZlYyA9IGNyZWF0ZU1pdGVyVmVjKG5vcm1QcmV2LCBub3JtTmV4dCk7XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyICYmIFZlY3Rvci5sZW5ndGhTcShtaXRlclZlYykgPiBjb250ZXh0Lm1pdGVyX2xlbl9zcSkge1xuICAgICAgICAgICAgam9pbl90eXBlID0gSk9JTl9UWVBFLmJldmVsOyAvLyBzd2l0Y2ggdG8gYmV2ZWxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KSB7XG4gICAgdmFyIG1pdGVyVmVjID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IuYWRkKG5vcm1QcmV2LCBub3JtTmV4dCkpO1xuICAgIHZhciBzY2FsZSA9IDIgLyAoMSArIE1hdGguYWJzKFZlY3Rvci5kb3Qobm9ybVByZXYsIG1pdGVyVmVjKSkpO1xuICAgIHJldHVybiBWZWN0b3IubXVsdChtaXRlclZlYywgc2NhbGUgKiBzY2FsZSk7XG59XG5cbi8vIEFkZCBhIG1pdGVyIHZlY3RvciBvciBhIGpvaW4gaWYgdGhlIG1pdGVyIGlzIHRvbyBzaGFycFxuZnVuY3Rpb24gYWRkTWl0ZXIgKHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBtaXRlcl9sZW5fc3EsIGlzQmVnaW5uaW5nLCBjb250ZXh0KSB7XG4gICAgdmFyIG1pdGVyVmVjID0gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KTtcblxuICAgIC8vICBNaXRlciBsaW1pdDogaWYgbWl0ZXIgam9pbiBpcyB0b28gc2hhcnAsIGNvbnZlcnQgdG8gYmV2ZWwgaW5zdGVhZFxuICAgIGlmIChWZWN0b3IubGVuZ3RoU3EobWl0ZXJWZWMpID4gbWl0ZXJfbGVuX3NxKSB7XG4gICAgICAgIGFkZEpvaW4oSk9JTl9UWVBFLm1pdGVyLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgaXNCZWdpbm5pbmcsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICBpZiAoIWlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBBZGQgYSBiZXZlbCBvciByb3VuZCBqb2luXG5mdW5jdGlvbiBhZGRKb2luKGpvaW5fdHlwZSwgdiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGlzQmVnaW5uaW5nLCBjb250ZXh0KSB7XG4gICAgdmFyIG1pdGVyVmVjID0gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KTtcbiAgICB2YXIgaXNDbG9ja3dpc2UgPSAobm9ybU5leHRbMF0gKiBub3JtUHJldlsxXSAtIG5vcm1OZXh0WzFdICogbm9ybVByZXZbMF0gPiAwKTtcblxuICAgIGlmIChpc0Nsb2Nrd2lzZSl7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG1pdGVyVmVjLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1QcmV2KSwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAoIWlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLmJldmVsKSB7XG4gICAgICAgICAgICBhZGRCZXZlbChjb29yZEN1cnIsXG4gICAgICAgICAgICAgICAgVmVjdG9yLm5lZyhub3JtUHJldiksIG1pdGVyVmVjLCBWZWN0b3IubmVnKG5vcm1OZXh0KSxcbiAgICAgICAgICAgICAgICBbMCwgdl0sIFsxLCB2XSwgWzAsIHZdLFxuICAgICAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUucm91bmQpIHtcbiAgICAgICAgICAgIGFkZEZhbihjb29yZEN1cnIsXG4gICAgICAgICAgICAgICAgVmVjdG9yLm5lZyhub3JtUHJldiksIG1pdGVyVmVjLCBWZWN0b3IubmVnKG5vcm1OZXh0KSxcbiAgICAgICAgICAgICAgICBbMCwgdl0sIFsxLCB2XSwgWzAsIHZdLFxuICAgICAgICAgICAgICAgIGZhbHNlLCBjb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICghaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUuYmV2ZWwpIHtcbiAgICAgICAgICAgIGFkZEJldmVsKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBub3JtUHJldiwgVmVjdG9yLm5lZyhtaXRlclZlYyksIG5vcm1OZXh0LFxuICAgICAgICAgICAgICAgIFsxLCB2XSwgWzAsIHZdLCBbMSwgdl0sXG4gICAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5yb3VuZCkge1xuICAgICAgICAgICAgYWRkRmFuKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBub3JtUHJldiwgVmVjdG9yLm5lZyhtaXRlclZlYyksIG5vcm1OZXh0LFxuICAgICAgICAgICAgICAgIFsxLCB2XSwgWzAsIHZdLCBbMSwgdl0sXG4gICAgICAgICAgICAgICAgZmFsc2UsIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtTmV4dCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG4gICAgfVxufVxuXG4vLyBBZGQgaW5kaWNlcyB0byB2ZXJ0ZXhfZWxlbWVudHNcbmZ1bmN0aW9uIGluZGV4UGFpcnMobnVtX3BhaXJzLCBjb250ZXh0KXtcbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG4gICAgdmFyIG51bV92ZXJ0aWNlcyA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuICAgIHZhciBvZmZzZXQgPSBudW1fdmVydGljZXMgLSAyICogbnVtX3BhaXJzIC0gMjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX3BhaXJzOyBpKyspe1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDEpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDIpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDMpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChvZmZzZXQgKyAyICogaSArIDEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkVmVydGV4KGNvb3JkaW5hdGUsIG5vcm1hbCwgdXYsIGNvbnRleHQpIHtcbiAgICB2YXIgdmVydGV4X3RlbXBsYXRlID0gY29udGV4dC52ZXJ0ZXhfdGVtcGxhdGU7XG4gICAgdmFyIHZlcnRleF9kYXRhID0gY29udGV4dC52ZXJ0ZXhfZGF0YTtcblxuICAgIGJ1aWxkVmVydGV4VGVtcGxhdGUodmVydGV4X3RlbXBsYXRlLCBjb29yZGluYXRlLCB1diwgbm9ybWFsLCBjb250ZXh0KTtcbiAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRWZXJ0ZXhUZW1wbGF0ZSAodmVydGV4X3RlbXBsYXRlLCB2ZXJ0ZXgsIHRleHR1cmVfY29vcmQsIHNjYWxlLCBjb250ZXh0KSB7XG4gICAgLy8gc2V0IHZlcnRleCBwb3NpdGlvblxuICAgIHZlcnRleF90ZW1wbGF0ZVswXSA9IHZlcnRleFswXTtcbiAgICB2ZXJ0ZXhfdGVtcGxhdGVbMV0gPSB2ZXJ0ZXhbMV07XG5cbiAgICAvLyBzZXQgVVZzXG4gICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggJiYgdGV4dHVyZV9jb29yZCkge1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC50ZXhjb29yZF9pbmRleCArIDBdID0gdGV4dHVyZV9jb29yZFswXSAqIGNvbnRleHQudGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC50ZXhjb29yZF9pbmRleCArIDFdID0gdGV4dHVyZV9jb29yZFsxXSAqIGNvbnRleHQudGV4Y29vcmRfbm9ybWFsaXplO1xuICAgIH1cblxuICAgIC8vIHNldCBTY2FsaW5nIHZlcnRleCAoWCwgWSBub3JtYWwgZGlyZWN0aW9uICsgWiBoYWxmX3dpZHRoIGFzIGF0dHJpYnV0ZSlcbiAgICBpZiAoY29udGV4dC5zY2FsaW5nX2luZGV4KSB7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnNjYWxpbmdfaW5kZXggKyAwXSA9IHNjYWxlWzBdICogY29udGV4dC5zY2FsaW5nX25vcm1hbGl6ZTtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQuc2NhbGluZ19pbmRleCArIDFdID0gc2NhbGVbMV0gKiBjb250ZXh0LnNjYWxpbmdfbm9ybWFsaXplO1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC5zY2FsaW5nX2luZGV4ICsgMl0gPSBjb250ZXh0LmhhbGZfd2lkdGg7XG4gICAgfVxufVxuXG4vLyAgVGVzc2FsYXRlIGEgRkFOIGdlb21ldHJ5IGJldHdlZW4gcG9pbnRzIEEgICAgICAgQlxuLy8gIHVzaW5nIHRoZWlyIG5vcm1hbHMgZnJvbSBhIGNlbnRlciAgICAgICAgXFwgLiAuIC9cbi8vICBhbmQgaW50ZXJwb2xhdGluZyB0aGVpciBVVnMgICAgICAgICAgICAgICBcXCBwIC9cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFwuL1xuZnVuY3Rpb24gYWRkRmFuIChjb29yZCwgbkEsIG5DLCBuQiwgdXZBLCB1dkMsIHV2QiwgaXNDYXAsIGNvbnRleHQpIHtcbiAgICB2YXIgY3Jvc3MgPSBuQVswXSAqIG5CWzFdIC0gbkFbMV0gKiBuQlswXTtcbiAgICB2YXIgZG90ID0gVmVjdG9yLmRvdChuQSwgbkIpO1xuXG4gICAgdmFyIGFuZ2xlID0gTWF0aC5hdGFuMihjcm9zcywgZG90KTtcbiAgICB3aGlsZSAoYW5nbGUgPj0gTWF0aC5QSSkge1xuICAgICAgICBhbmdsZSAtPSAyKk1hdGguUEk7XG4gICAgfVxuXG4gICAgdmFyIG51bVRyaWFuZ2xlcyA9IHRyaWFuZ2xlc1BlckFyYyhhbmdsZSwgY29udGV4dC5oYWxmX3dpZHRoKTtcbiAgICBpZiAobnVtVHJpYW5nbGVzIDwgMSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHBpdm90SW5kZXggPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcbiAgICB2YXIgdmVydGV4X2VsZW1lbnRzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG5cbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5DLCB1dkMsIGNvbnRleHQpO1xuICAgIGFkZFZlcnRleChjb29yZCwgbkEsIHV2QSwgY29udGV4dCk7XG5cbiAgICB2YXIgYmxhZGUgPSBuQTtcblxuICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHV2Q3VycjtcbiAgICAgICAgaWYgKGlzQ2FwKXtcbiAgICAgICAgICAgIHV2Q3VyciA9IFtdO1xuICAgICAgICAgICAgdmFyIGFmZmluZV91dkN1cnIgPSBWZWN0b3Iuc3ViKHV2QSwgdXZDKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHV2Q3VyciA9IFZlY3Rvci5zZXQodXZBKTtcbiAgICAgICAgICAgIHZhciB1dl9kZWx0YSA9IFZlY3Rvci5kaXYoVmVjdG9yLnN1Yih1dkIsIHV2QSksIG51bVRyaWFuZ2xlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYW5nbGVfc3RlcCA9IGFuZ2xlIC8gbnVtVHJpYW5nbGVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtVHJpYW5nbGVzOyBpKyspIHtcbiAgICAgICAgYmxhZGUgPSBWZWN0b3Iucm90KGJsYWRlLCBhbmdsZV9zdGVwKTtcblxuICAgICAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoaXNDYXApe1xuICAgICAgICAgICAgICAgIC8vIFVWIHRleHR1cmVzIGdvIFwidGhyb3VnaFwiIHRoZSBjYXBcbiAgICAgICAgICAgICAgICBhZmZpbmVfdXZDdXJyID0gVmVjdG9yLnJvdChhZmZpbmVfdXZDdXJyLCBhbmdsZV9zdGVwKTtcbiAgICAgICAgICAgICAgICB1dkN1cnJbMF0gPSBhZmZpbmVfdXZDdXJyWzBdICsgdXZDWzBdO1xuICAgICAgICAgICAgICAgIHV2Q3VyclsxXSA9IGFmZmluZV91dkN1cnJbMV0gKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlICsgdXZDWzFdOyAvLyBzY2FsZSB0aGUgdi1jb29yZGluYXRlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVViB0ZXh0dXJlcyBnbyBcImFyb3VuZFwiIHRoZSBqb2luXG4gICAgICAgICAgICAgICAgdXZDdXJyID0gVmVjdG9yLmFkZCh1dkN1cnIsIHV2X2RlbHRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFZlcnRleChjb29yZCwgYmxhZGUsIHV2Q3VyciwgY29udGV4dCk7XG5cbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIGkgKyAoKGNyb3NzID4gMCkgPyAyIDogMSkpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4KTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIGkgKyAoKGNyb3NzID4gMCkgPyAxIDogMikpO1xuICAgIH1cbn1cblxuLy8gIGFkZEJldmVsICAgIEEgLS0tLS0gQlxuLy8gICAgICAgICAgICAgLyBcXCAgICAgLyBcXFxuLy8gICAgICAgICAgIC8gICAvXFwgICAvXFwgIFxcXG4vLyAgICAgICAgICAgICAgLyAgXFwgLyAgXFwgIFxcXG4vLyAgICAgICAgICAgICAgICAvIEMgXFxcbmZ1bmN0aW9uIGFkZEJldmVsIChjb29yZCwgbkEsIG5DLCBuQiwgdUEsIHVDLCB1QiwgY29udGV4dCkge1xuICAgIHZhciBwaXZvdEluZGV4ID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5DLCB1QywgY29udGV4dCk7XG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQSwgdUEsIGNvbnRleHQpO1xuICAgIGFkZFZlcnRleChjb29yZCwgbkIsIHVCLCBjb250ZXh0KTtcblxuICAgIHZhciBvcmllbnRhdGlvbiA9IG5BWzBdICogbkJbMV0gLSBuQVsxXSAqIG5CWzBdID4gMDtcblxuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcblxuICAgIGlmIChvcmllbnRhdGlvbikge1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAwKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAxKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMik7XG4gICAgfVxufVxuXG4vLyAgRnVuY3Rpb24gdG8gYWRkIHRoZSB2ZXJ0ZXggbmVlZCBmb3IgbGluZSBjYXBzLFxuLy8gIGJlY2F1c2UgcmUtdXNlIHRoZSBidWZmZXJzIG5lZWRzIHRvIGJlIGF0IHRoZSBlbmRcbmZ1bmN0aW9uIGFkZENhcCAoY29vcmQsIHYsIG5vcm1hbCwgdHlwZSwgaXNCZWdpbm5pbmcsIGNvbnRleHQpIHtcbiAgICB2YXIgbmVnX25vcm1hbCA9IFZlY3Rvci5uZWcobm9ybWFsKTtcblxuICAgIHN3aXRjaCAodHlwZSl7XG4gICAgICAgIGNhc2UgQ0FQX1RZUEUuc3F1YXJlOlxuICAgICAgICAgICAgdmFyIHRhbmdlbnQ7XG4gICAgICAgICAgICBpZiAoaXNCZWdpbm5pbmcpe1xuICAgICAgICAgICAgICAgIHRhbmdlbnQgPSBbbm9ybWFsWzFdLCAtbm9ybWFsWzBdXTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgVmVjdG9yLmFkZChub3JtYWwsIHRhbmdlbnQpLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgVmVjdG9yLmFkZChuZWdfbm9ybWFsLCB0YW5nZW50KSwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBsZW5ndGggb2Ygc3F1YXJlIGNhcCB0byB0ZXh0dXJlIGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGU7XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5vcm1hbCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5lZ19ub3JtYWwsIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YW5nZW50ID0gWy1ub3JtYWxbMV0sIG5vcm1hbFswXV07XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5vcm1hbCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIG5lZ19ub3JtYWwsIFswLCB2XSwgY29udGV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgbGVuZ3RoIG9mIHNxdWFyZSBjYXAgdG8gdGV4dHVyZSBjb29yZGluYXRlXG4gICAgICAgICAgICAgICAgdiArPSAwLjUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlO1xuXG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5vcm1hbCwgdGFuZ2VudCksIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5lZ19ub3JtYWwsIHRhbmdlbnQpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ0FQX1RZUEUucm91bmQ6XG4gICAgICAgICAgICB2YXIgbkEsIG5CLCB1dkEsIHV2QiwgdXZDO1xuICAgICAgICAgICAgaWYgKGlzQmVnaW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgbkEgPSBub3JtYWw7XG4gICAgICAgICAgICAgICAgbkIgPSBuZWdfbm9ybWFsO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgIHYgKz0gMC41ICogY29udGV4dC50ZXhjb29yZF93aWR0aCAqIGNvbnRleHQudl9zY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgdXZBID0gWzEsIHZdO1xuICAgICAgICAgICAgICAgICAgICB1dkIgPSBbMCwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QyA9IFswLjUsIHZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5BID0gbmVnX25vcm1hbDtcbiAgICAgICAgICAgICAgICBuQiA9IG5vcm1hbDtcblxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgICB1dkEgPSBbMCwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QiA9IFsxLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZDID0gWzAuNSwgdl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhZGRGYW4oY29vcmQsXG4gICAgICAgICAgICAgICAgbkEsIHplcm9fdmVjMiwgbkIsXG4gICAgICAgICAgICAgICAgdXZBLCB1dkMsIHV2QixcbiAgICAgICAgICAgICAgICB0cnVlLCBjb250ZXh0XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDQVBfVFlQRS5idXR0OlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgIH1cbn1cblxuLy8gRm9yIElFIE1hdGgubG9nMiBzdXBwb3J0XG5sZXQgbG9nMiA9IE1hdGgubG9nMiB8fCBmdW5jdGlvbih4KXsgcmV0dXJuIE1hdGgubG9nKHgpICogTWF0aC5MT0cyRTsgfTtcblxuLy8gQ2FsY3VsYXRlIG51bWJlciBvZiB0cmlhbmdsZXMgZm9yIGEgZmFuIGdpdmVuIGFuIGFuZ2xlIGFuZCBsaW5lIHdpZHRoXG5mdW5jdGlvbiB0cmlhbmdsZXNQZXJBcmMgKGFuZ2xlLCB3aWR0aCkge1xuICAgIGlmIChhbmdsZSA8IDApIHtcbiAgICAgICAgYW5nbGUgPSAtYW5nbGU7XG4gICAgfVxuXG4gICAgdmFyIG51bVRyaWFuZ2xlcyA9ICh3aWR0aCA+IDIgKiBERUZBVUxULk1JTl9GQU5fV0lEVEgpID8gbG9nMih3aWR0aCAvIERFRkFVTFQuTUlOX0ZBTl9XSURUSCkgOiAxO1xuICAgIHJldHVybiBNYXRoLmNlaWwoYW5nbGUgLyBNYXRoLlBJICogbnVtVHJpYW5nbGVzKTtcbn1cblxuLy8gQ3ljbGljYWxseSBwZXJtdXRlIGNsb3NlZCBsaW5lIHN0YXJ0aW5nIGF0IGFuIGluZGV4XG5mdW5jdGlvbiBwZXJtdXRlTGluZShsaW5lLCBzdGFydEluZGV4KXtcbiAgICB2YXIgbmV3TGluZSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBpbmRleCA9IChpICsgc3RhcnRJbmRleCkgJSBsaW5lLmxlbmd0aDtcbiAgICAgICAgLy8gc2tpcCB0aGUgZmlyc3QgKHJlcGVhdGVkKSBpbmRleFxuICAgICAgICBpZiAoaW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIG5ld0xpbmUucHVzaChsaW5lW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV3TGluZS5wdXNoKG5ld0xpbmVbMF0pO1xuICAgIHJldHVybiBuZXdMaW5lO1xufSIsImltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IHttYXQ0LCBtYXQzLCB2ZWMzfSBmcm9tICcuL3V0aWxzL2dsLW1hdHJpeCc7XG5cbi8vIEFic3RyYWN0IGJhc2UgY2xhc3NcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb247XG4gICAgICAgIHRoaXMuem9vbSA9IG9wdGlvbnMuem9vbTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBjYW1lcmEgYnkgdHlwZSBuYW1lLCBmYWN0b3J5LXN0eWxlXG4gICAgc3RhdGljIGNyZWF0ZShuYW1lLCB2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3dpdGNoIChjb25maWcudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnaXNvbWV0cmljJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElzb21ldHJpY0NhbWVyYShuYW1lLCB2aWV3LCBjb25maWcpO1xuICAgICAgICAgICAgY2FzZSAnZmxhdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbGF0Q2FtZXJhKG5hbWUsIHZpZXcsIGNvbmZpZyk7XG4gICAgICAgICAgICBjYXNlICdwZXJzcGVjdGl2ZSc6XG4gICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGVyc3BlY3RpdmVDYW1lcmEobmFtZSwgdmlldywgY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlKCkge1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbmNlIHBlciBmcmFtZSBwZXIgcHJvZ3JhbSAoZS5nLiBmb3IgbWFpbiByZW5kZXIgcGFzcywgdGhlbiBmb3IgZWFjaCBhZGRpdGlvbmFsIHBhc3MgZm9yIGZlYXR1cmUgc2VsZWN0aW9uLCBldGMuKVxuICAgIHNldHVwUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgfVxuXG4gICAgLy8gU3luYyBjYW1lcmEgcG9zaXRpb24vem9vbSB0byBzY2VuZSB2aWV3XG4gICAgdXBkYXRlVmlldyAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uIHx8IHRoaXMuem9vbSkge1xuICAgICAgICAgICAgdmFyIHZpZXcgPSB7fTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmlldyA9IHsgbG5nOiB0aGlzLnBvc2l0aW9uWzBdLCBsYXQ6IHRoaXMucG9zaXRpb25bMV0sIHpvb206IHRoaXMucG9zaXRpb25bMl0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnpvb20pIHtcbiAgICAgICAgICAgICAgICB2aWV3Lnpvb20gPSB0aGlzLnpvb207XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZpZXcuc2V0Vmlldyh2aWV3KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBtb2RlbC12aWV3IGFuZCBub3JtYWwgbWF0cmljZXNcbiAgICBzZXR1cE1hdHJpY2VzIChtYXRyaWNlcywgcHJvZ3JhbSkge1xuICAgICAgICAvLyBNb2RlbCB2aWV3IG1hdHJpeCAtIHRyYW5zZm9ybSB0aWxlIHNwYWNlIGludG8gdmlldyBzcGFjZSAobWV0ZXJzLCByZWxhdGl2ZSB0byBjYW1lcmEpXG4gICAgICAgIG1hdDQubXVsdGlwbHkobWF0cmljZXMubW9kZWxfdmlldzMyLCB0aGlzLnZpZXdfbWF0cml4LCBtYXRyaWNlcy5tb2RlbCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfbW9kZWxWaWV3JywgbWF0cmljZXMubW9kZWxfdmlldzMyKTtcblxuICAgICAgICAvLyBOb3JtYWwgbWF0cmljZXMgLSB0cmFuc2Zvcm1zIHN1cmZhY2Ugbm9ybWFscyBpbnRvIHZpZXcgc3BhY2VcbiAgICAgICAgbWF0My5ub3JtYWxGcm9tTWF0NChtYXRyaWNlcy5ub3JtYWwzMiwgbWF0cmljZXMubW9kZWxfdmlldzMyKTtcbiAgICAgICAgbWF0My5pbnZlcnQobWF0cmljZXMuaW52ZXJzZV9ub3JtYWwzMiwgbWF0cmljZXMubm9ybWFsMzIpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDNmdicsICd1X25vcm1hbE1hdHJpeCcsIG1hdHJpY2VzLm5vcm1hbDMyKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXgzZnYnLCAndV9pbnZlcnNlTm9ybWFsTWF0cml4JywgbWF0cmljZXMuaW52ZXJzZV9ub3JtYWwzMik7XG4gICAgfVxuXG59XG5cbi8qKlxuICAgIFBlcnNwZWN0aXZlIG1hdHJpeCBwcm9qZWN0aW9uXG5cbiAgICBUaGlzIGlzIGEgc3BlY2lhbGl6ZWQgcGVyc3BlY3RpdmUgY2FtZXJhIHRoYXQsIGdpdmVuIGEgZGVzaXJlZCBjYW1lcmEgZm9jYWwgbGVuZ3RoICh3aGljaCBjYW4gYWxzbyB2YXJ5IGJ5IHpvb20gbGV2ZWwpLFxuICAgIGNvbnN0cmFpbnMgdGhlIGNhbWVyYSBoZWlnaHQgYWJvdmUgdGhlIGdyb3VuZCBwbGFuZSBzdWNoIHRoYXQgdGhlIGRpc3BsYXllZCBncm91bmQgYXJlYSBvZiB0aGUgbWFwIG1hdGNoZXMgdGhhdCBvZlxuICAgIGEgdHJhZGl0aW9uYWwgd2ViIG1lcmNhdG9yIG1hcC4gVGhpcyBtZWFucyB5b3UgY2FuIHNldCB0aGUgY2FtZXJhIGxvY2F0aW9uIGJ5IFtsYXQsIGxuZywgem9vbV0gYXMgeW91IHdvdWxkIGEgdHlwaWNhbFxuICAgIHdlYiBtZXJjYXRvciBtYXAsIHRoZW4gYWRqdXN0IHRoZSBmb2NhbCBsZW5ndGggYXMgbmVlZGVkLlxuXG4gICAgVmFuaXNoaW5nIHBvaW50IGNhbiBhbHNvIGJlIGFkanVzdGVkIHRvIGFjaGlldmUgZGlmZmVyZW50IFwidmlld2luZyBhbmdsZXNcIiwgZS5nLiBpbnN0ZWFkIG9mIGxvb2tpbmcgc3RyYWlnaHQgZG93biBpbnRvXG4gICAgdGhlIGNlbnRlciBvZiB0aGUgdmlld3BvcnQsIHRoZSBjYW1lcmEgYXBwZWFycyB0byBiZSB0aWx0ZWQgYXQgYW4gYW5nbGUuIEZvciBleGFtcGxlOlxuXG4gICAgWzAsIDBdID0gbG9va2luZyB0b3dhcmRzIGNlbnRlciBvZiB2aWV3cG9ydFxuICAgIFstMjUwLCAtMjUwXSA9IGxvb2tpbmcgMjUwIHBpeGVscyBmcm9tIHRoZSB2aWV3cG9ydCBjZW50ZXIgdG8gdGhlIGxvd2VyLWxlZnQgY29ybmVyXG4gICAgWzQwMCwgMF0gPSBsb29raW5nIDQwMCBwaXhlbHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSB2aWV3cG9ydCBjZW50ZXJcbiovXG5jbGFzcyBQZXJzcGVjdGl2ZUNhbWVyYSBleHRlbmRzIENhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdmlldywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdwZXJzcGVjdGl2ZSc7XG5cbiAgICAgICAgLy8gYSBzaW5nbGUgc2NhbGFyLCBvciBwYWlycyBvZiBzdG9wcyBtYXBwaW5nIHpvb20gbGV2ZWxzLCBlLmcuIFt6b29tLCBmb2NhbCBsZW5ndGhdXG4gICAgICAgIHRoaXMuZm9jYWxfbGVuZ3RoID0gb3B0aW9ucy5mb2NhbF9sZW5ndGg7XG4gICAgICAgIHRoaXMuZm92ID0gb3B0aW9ucy5mb3Y7XG4gICAgICAgIGlmICghdGhpcy5mb2NhbF9sZW5ndGggJiYgIXRoaXMuZm92KSB7XG4gICAgICAgICAgICAvLyBEZWZhdWx0IGZvY2FsIGxlbmd0aCByYW5nZXMgYnkgem9vbVxuICAgICAgICAgICAgdGhpcy5mb2NhbF9sZW5ndGggPSBbWzE2LCAyXSwgWzE3LCAyLjVdLCBbMTgsIDNdLCBbMTksIDRdLCBbMjAsIDZdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50ID0gb3B0aW9ucy52YW5pc2hpbmdfcG9pbnQgfHwgWzAsIDBdOyAvLyBbeCwgeV1cbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnQgPSB0aGlzLnZhbmlzaGluZ19wb2ludC5tYXAocGFyc2VGbG9hdCk7IC8vIHdlIGltcGxpY2l0bHkgb25seSBzdXBwb3J0IHB4IHVuaXRzIGhlcmVcbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tldyA9IFtdO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb25fbWV0ZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3X21hdHJpeCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG5cbiAgICAgICAgLy8gJ2NhbWVyYScgaXMgdGhlIG5hbWUgb2YgdGhlIHNoYWRlciBibG9jaywgZS5nLiBkZXRlcm1pbmVzIHdoZXJlIGluIHRoZSBzaGFkZXIgdGhpcyBjb2RlIGlzIGluamVjdGVkXG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdjYW1lcmEnLCBgXG4gICAgICAgICAgICB1bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZXllO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMyIHVfdmFuaXNoaW5nX3BvaW50O1xuXG4gICAgICAgICAgICB2b2lkIGNhbWVyYVByb2plY3Rpb24gKGlub3V0IHZlYzQgcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHVfcHJvamVjdGlvbiAqIHBvc2l0aW9uO1xuICAgICAgICAgICAgfWBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb25zdHJhaW5zIHRoZSBjYW1lcmEgc28gdGhhdCB0aGUgdmlld2FibGUgYXJlYSBtYXRjaGVzIGdpdmVuIHRoZSB2aWV3cG9ydCBoZWlnaHRcbiAgICAvLyAoaW4gd29ybGQgc3BhY2UsIGUuZy4gbWV0ZXJzKSwgZ2l2ZW4gZWl0aGVyIGEgY2FtZXJhIGZvY2FsIGxlbmd0aCBvciBmaWVsZC1vZi12aWV3XG4gICAgLy8gKGZvY2FsIGxlbmd0aCBpcyB1c2VkIGlmIGJvdGggYXJlIHBhc3NlZCkuXG4gICAgY29uc3RyYWluQ2FtZXJhKHsgdmlld19oZWlnaHQsIGhlaWdodCwgZm9jYWxfbGVuZ3RoLCBmb3YgfSkge1xuICAgICAgICAvLyBTb2x2ZSBmb3IgY2FtZXJhIGhlaWdodFxuICAgICAgICBpZiAoIWhlaWdodCkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBmb2NhbCBsZW5ndGgsIGNhbGN1bGF0ZSBGT1ZcbiAgICAgICAgICAgIGlmIChmb2NhbF9sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3YgPSBNYXRoLmF0YW4oMSAvIGZvY2FsX2xlbmd0aCkgKiAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgaGF2ZSBGT1YsIGNhbGN1bGF0ZSBmb2NhbCBsZW5ndGhcbiAgICAgICAgICAgIGVsc2UgaWYgKGZvdikge1xuICAgICAgICAgICAgICAgIGZvdiA9IGZvdiAqIE1hdGguUEkgLyAxODA7IC8vIGNvbnZlcnQgRk9WIGRlZ3JlZXMgdG8gcmFkaWFuc1xuICAgICAgICAgICAgICAgIGZvY2FsX2xlbmd0aCA9IDEgLyBNYXRoLnRhbihmb3YgLyAyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGlzdGFuY2UgdGhhdCBjYW1lcmEgc2hvdWxkIGJlIGZyb20gZ3JvdW5kIHN1Y2ggdGhhdCBpdCBmaXRzIHRoZSBmaWVsZCBvZiB2aWV3IGV4cGVjdGVkXG4gICAgICAgICAgICAvLyBmb3IgYSBjb252ZW50aW9uYWwgd2ViIG1lcmNhdG9yIG1hcCBhdCB0aGUgY3VycmVudCB6b29tIGxldmVsIGFuZCBjYW1lcmEgZm9jYWwgbGVuZ3RoXG4gICAgICAgICAgICBoZWlnaHQgPSB2aWV3X2hlaWdodCAvIDIgKiBmb2NhbF9sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29sdmUgZm9yIGNhbWVyYSBmb2NhbCBsZW5ndGggLyBmaWVsZC1vZi12aWV3XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9jYWxfbGVuZ3RoID0gMiAqIGhlaWdodCAvIHZpZXdfaGVpZ2h0O1xuICAgICAgICAgICAgZm92ID0gTWF0aC5hdGFuKDEgLyBmb2NhbF9sZW5ndGgpICogMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHZpZXdfaGVpZ2h0LCBoZWlnaHQsIGZvY2FsX2xlbmd0aCwgZm92IH07XG4gICAgfVxuXG4gICAgdXBkYXRlTWF0cmljZXMoKSB7XG4gICAgICAgIC8vIFRPRE86IG9ubHkgcmUtY2FsY3VsYXRlIHRoZXNlIHZhcnMgd2hlbiBuZWNlc3NhcnlcblxuICAgICAgICAvLyBIZWlnaHQgb2YgdGhlIHZpZXdwb3J0IGluIG1ldGVycyBhdCBjdXJyZW50IHpvb21cbiAgICAgICAgdmFyIHZpZXdwb3J0X2hlaWdodCA9IHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQgKiB0aGlzLnZpZXcubWV0ZXJzX3Blcl9waXhlbDtcblxuICAgICAgICAvLyBDb21wdXRlIGNhbWVyYSBwcm9wZXJ0aWVzIHRvIGZpdCBkZXNpcmVkIHZpZXdcbiAgICAgICAgdmFyIHsgaGVpZ2h0LCBmb3YgfSA9IHRoaXMuY29uc3RyYWluQ2FtZXJhKHtcbiAgICAgICAgICAgIHZpZXdfaGVpZ2h0OiB2aWV3cG9ydF9oZWlnaHQsXG4gICAgICAgICAgICBmb2NhbF9sZW5ndGg6IFV0aWxzLmludGVycG9sYXRlKHRoaXMudmlldy56b29tLCB0aGlzLmZvY2FsX2xlbmd0aCksXG4gICAgICAgICAgICBmb3Y6IFV0aWxzLmludGVycG9sYXRlKHRoaXMudmlldy56b29tLCB0aGlzLmZvdilcbiAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFZpZXcgbWF0cml4XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IFt0aGlzLnZpZXcuY2VudGVyLm1ldGVycy54LCB0aGlzLnZpZXcuY2VudGVyLm1ldGVycy55LCBoZWlnaHRdO1xuICAgICAgICB0aGlzLnBvc2l0aW9uX21ldGVycyA9IHBvc2l0aW9uO1xuXG4gICAgICAgIC8vIG1hdDQubG9va0F0KHRoaXMudmlld19tYXRyaXgsXG4gICAgICAgIC8vICAgICB2ZWMzLmZyb21WYWx1ZXMoLi4ucG9zaXRpb24pLFxuICAgICAgICAvLyAgICAgdmVjMy5mcm9tVmFsdWVzKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgaGVpZ2h0IC0gMSksXG4gICAgICAgIC8vICAgICB2ZWMzLmZyb21WYWx1ZXMoMCwgMSwgMCkpO1xuICAgICAgICAvLyBFeGNsdWRlIGNhbWVyYSBoZWlnaHQgZnJvbSB2aWV3IG1hdHJpeFxuICAgICAgICBtYXQ0Lmxvb2tBdCh0aGlzLnZpZXdfbWF0cml4LFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgMCksXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMocG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdLCAtMSksXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMoMCwgMSwgMCkpO1xuXG4gICAgICAgIC8vIFByb2plY3Rpb24gbWF0cml4XG4gICAgICAgIG1hdDQucGVyc3BlY3RpdmUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgZm92LCB0aGlzLnZpZXcuYXNwZWN0LCAxLCBoZWlnaHQgKiAyKTtcblxuICAgICAgICAvLyBDb252ZXJ0IHZhbmlzaGluZyBwb2ludCBmcm9tIHBpeGVscyB0byB2aWV3cG9ydCBzcGFjZVxuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzBdID0gdGhpcy52YW5pc2hpbmdfcG9pbnRbMF0gLyB0aGlzLnZpZXcuc2l6ZS5jc3Mud2lkdGg7XG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMV0gPSB0aGlzLnZhbmlzaGluZ19wb2ludFsxXSAvIHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQ7XG5cbiAgICAgICAgLy8gQWRqdXN0IHByb2plY3Rpb24gbWF0cml4IHRvIGluY2x1ZGUgdmFuaXNoaW5nIHBvaW50IHNrZXdcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeFs4XSA9IC10aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzBdICogMjsgLy8geiBjb2x1bW4gb2YgeCByb3csIGUuZy4gYW1vdW50IHogc2tld3MgeFxuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzldID0gLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMV0gKiAyOyAvLyB6IGNvbHVtbiBvZiB5IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB5XG5cbiAgICAgICAgLy8gVHJhbnNsYXRlIGdlb21ldHJ5IGludG8gdGhlIGRpc3RhbmNlIHNvIHRoYXQgY2FtZXJhIGlzIGFwcHJvcHJpYXRlIGhlaWdodCBhYm92ZSBncm91bmRcbiAgICAgICAgLy8gQWRkaXRpb25hbGx5LCBhZGp1c3QgeHkgdG8gY29tcGVuc2F0ZSBmb3IgYW55IHZhbmlzaGluZyBwb2ludCBza2V3LCBlLmcuIG1vdmUgZ2VvbWV0cnkgc28gdGhhdCB0aGUgZGlzcGxheWVkIGdcbiAgICAgICAgLy8gcGxhbmUgb2YgdGhlIG1hcCBtYXRjaGVzIHRoYXQgZXhwZWN0ZWQgYnkgYSB0cmFkaXRpb25hbCB3ZWIgbWVyY2F0b3IgbWFwIGF0IHRoaXMgW2xhdCwgbG5nLCB6b29tXS5cbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcyhcbiAgICAgICAgICAgICAgICB2aWV3cG9ydF9oZWlnaHQvMiAqIHRoaXMudmlldy5hc3BlY3QgKiAoLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMF0gKiAyKSxcbiAgICAgICAgICAgICAgICB2aWV3cG9ydF9oZWlnaHQvMiAqICgtdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1sxXSAqIDIpLFxuICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJbmNsdWRlIGNhbWVyYSBoZWlnaHQgaW4gcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCwgdmVjMy5mcm9tVmFsdWVzKDAsIDAsIC1oZWlnaHQpKTtcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZU1hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtKHByb2dyYW0pIHtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9wcm9qZWN0aW9uJywgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnM2YnLCAndV9leWUnLCBbMCwgMCwgdGhpcy5wb3NpdGlvbl9tZXRlcnNbMl1dKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcyZnYnLCAndV92YW5pc2hpbmdfcG9pbnQnLCB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3KTtcbiAgICB9XG5cbn1cblxuLy8gSXNvbWV0cmljLXN0eWxlIHByb2plY3Rpb25cbi8vIE5vdGU6IHRoaXMgaXMgYWN0dWFsbHkgYW4gXCJheG9ub21ldHJpY1wiIHByb2plY3Rpb24sIGJ1dCBJJ20gdXNpbmcgdGhlIGNvbGxvcXVpYWwgdGVybSBpc29tZXRyaWMgYmVjYXVzZSBpdCBpcyBtb3JlIHJlY29nbml6YWJsZS5cbi8vIEFuIGlzb21ldHJpYyBwcm9qZWN0aW9uIGlzIGEgc3BlY2lmaWMgc3Vic2V0IG9mIGF4b25vbWV0cmljIHByb2plY3Rpb25zLlxuLy8gJ2F4aXMnIGRldGVybWluZXMgdGhlIHh5IHNrZXcgYXBwbGllZCB0byBhIHZlcnRleCBiYXNlZCBvbiBpdHMgeiBjb29yZGluYXRlLCBlLmcuIFswLCAxXSBheGlzIGNhdXNlcyBidWlsZGluZ3MgdG8gYmUgZHJhd25cbi8vIHN0cmFpZ2h0IHVwd2FyZHMgb24gc2NyZWVuIGF0IHRoZWlyIHRydWUgaGVpZ2h0LCBbMCwgLjVdIHdvdWxkIGRyYXcgdGhlbSB1cCBhdCBoYWxmLWhlaWdodCwgWzEsIDBdIHdvdWxkIGJlIHNpZGV3YXlzLCBldGMuXG5jbGFzcyBJc29tZXRyaWNDYW1lcmEgZXh0ZW5kcyBDYW1lcmEge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdmlldywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG5hbWUsIHZpZXcsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnaXNvbWV0cmljJztcbiAgICAgICAgdGhpcy5heGlzID0gb3B0aW9ucy5heGlzIHx8IHsgeDogMCwgeTogMSB9O1xuICAgICAgICBpZiAodGhpcy5heGlzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgdGhpcy5heGlzID0geyB4OiB0aGlzLmF4aXNbMF0sIHk6IHRoaXMuYXhpc1sxXSB9OyAvLyBhbGxvdyBheGlzIHRvIGFsc28gYmUgcGFzc2VkIGFzIDItZWxlbSBhcnJheVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZXdwb3J0X2hlaWdodCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy52aWV3X21hdHJpeCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG5cbiAgICAgICAgLy8gJ2NhbWVyYScgaXMgdGhlIG5hbWUgb2YgdGhlIHNoYWRlciBibG9jaywgZS5nLiBkZXRlcm1pbmVzIHdoZXJlIGluIHRoZSBzaGFkZXIgdGhpcyBjb2RlIGlzIGluamVjdGVkXG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdjYW1lcmEnLCBgXG4gICAgICAgICAgICB1bmlmb3JtIG1hdDQgdV9wcm9qZWN0aW9uO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZXllO1xuICAgICAgICAgICAgdW5pZm9ybSB2ZWMyIHVfdmFuaXNoaW5nX3BvaW50O1xuXG4gICAgICAgICAgICB2b2lkIGNhbWVyYVByb2plY3Rpb24gKGlub3V0IHZlYzQgcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHVfcHJvamVjdGlvbiAqIHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uLnh5ICs9IHBvc2l0aW9uLnogKiB1X2lzb21ldHJpY19heGlzO1xuXG4gICAgICAgICAgICAgICAgLy8gUmV2ZXJzZSB6IGZvciBkZXB0aCBidWZmZXIgc28gdXAgaXMgbmVnYXRpdmUsXG4gICAgICAgICAgICAgICAgLy8gYW5kIHNjYWxlIGRvd24gdmFsdWVzIHNvIG9iamVjdHMgaGlnaGVyIHRoYW4gb25lIHNjcmVlbiBoZWlnaHQgd2lsbCBub3QgZ2V0IGNsaXBwZWRcbiAgICAgICAgICAgICAgICAvLyBwdWxsIGZvcndhcmQgc2xpZ2h0bHkgdG8gYXZvaWQgZ29pbmcgcGFzdCBmYXIgY2xpcHBpbmcgcGxhbmVcbiAgICAgICAgICAgICAgICBwb3NpdGlvbi56ID0gLXBvc2l0aW9uLnogLyAxMDAuICsgMS4gLSAwLjAwMTtcbiAgICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcblxuICAgICAgICB0aGlzLnZpZXdwb3J0X2hlaWdodCA9IHRoaXMudmlldy5zaXplLmNzcy5oZWlnaHQgKiB0aGlzLnZpZXcubWV0ZXJzX3Blcl9waXhlbDtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gW3RoaXMudmlldy5jZW50ZXIubWV0ZXJzLngsIHRoaXMudmlldy5jZW50ZXIubWV0ZXJzLnksIHRoaXMudmlld3BvcnRfaGVpZ2h0XTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBwb3NpdGlvbjtcblxuICAgICAgICAvLyBWaWV3XG4gICAgICAgIG1hdDQuaWRlbnRpdHkodGhpcy52aWV3X21hdHJpeCk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHRoaXMudmlld19tYXRyaXgsIHRoaXMudmlld19tYXRyaXgsIHZlYzMuZnJvbVZhbHVlcygtcG9zaXRpb25bMF0sIC1wb3NpdGlvblsxXSwgMCkpO1xuXG4gICAgICAgIC8vIFByb2plY3Rpb25cbiAgICAgICAgbWF0NC5pZGVudGl0eSh0aGlzLnByb2plY3Rpb25fbWF0cml4KTtcblxuICAgICAgICAvLyBhcHBseSBpc29tZXRyaWMgc2tld1xuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzhdID0gdGhpcy5heGlzLnggLyB0aGlzLnZpZXcuYXNwZWN0OyAvLyB6IGNvbHVtbiBvZiB4IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB4XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXhbOV0gPSB0aGlzLmF4aXMueTsgICAgICAgICAgICAgICAgICAgIC8vIHogY29sdW1uIG9mIHggcm93LCBlLmcuIGFtb3VudCB6IHNrZXdzIHlcblxuICAgICAgICAvLyBjb252ZXJ0IG1ldGVycyB0byB2aWV3cG9ydFxuICAgICAgICBtYXQ0LnNjYWxlKHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgsXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMoXG4gICAgICAgICAgICAgICAgMiAvIHRoaXMudmlldy5zaXplLm1ldGVycy54LFxuICAgICAgICAgICAgICAgIDIgLyB0aGlzLnZpZXcuc2l6ZS5tZXRlcnMueSxcbiAgICAgICAgICAgICAgICAyIC8gdGhpcy52aWV3LnNpemUubWV0ZXJzLnlcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0ocHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDRmdicsICd1X3Byb2plY3Rpb24nLCB0aGlzLnByb2plY3Rpb25fbWF0cml4KTtcblxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzNmdicsICd1X2V5ZScsIFswLCAwLCB0aGlzLnZpZXdwb3J0X2hlaWdodF0pO1xuICAgICAgICAvLyBwcm9ncmFtLnVuaWZvcm0oJzNmJywgJ3VfZXllJywgdGhpcy52aWV3cG9ydF9oZWlnaHQgKiB0aGlzLmF4aXMueCwgdGhpcy52aWV3cG9ydF9oZWlnaHQgKiB0aGlzLmF4aXMueSwgdGhpcy52aWV3cG9ydF9oZWlnaHQpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzJmdicsICd1X3ZhbmlzaGluZ19wb2ludCcsIFswLCAwXSk7XG4gICAgfVxuXG59XG5cbi8vIEZsYXQgcHJvamVjdGlvbiAoZS5nLiBqdXN0IHRvcC1kb3duLCBubyBwZXJzcGVjdGl2ZSkgLSBhIGRlZ2VuZXJhdGUgaXNvbWV0cmljIGNhbWVyYVxuY2xhc3MgRmxhdENhbWVyYSBleHRlbmRzIElzb21ldHJpY0NhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB2aWV3LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdmlldywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdmbGF0JztcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIC8vIEF4aXMgaXMgZml4ZWQgdG8gKDAsIDApIGZvciBmbGF0IGNhbWVyYVxuICAgICAgICB0aGlzLmF4aXMueCA9IDA7XG4gICAgICAgIHRoaXMuYXhpcy55ID0gMDtcblxuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICB9XG5cbn1cbiIsIi8vIE1pc2NlbGxhbmVvdXMgZ2VvIGZ1bmN0aW9uc1xuXG52YXIgR2VvO1xuZXhwb3J0IGRlZmF1bHQgR2VvID0ge307XG5cbi8vIFByb2plY3Rpb24gY29uc3RhbnRzXG5HZW8uZGVmYXVsdF9zb3VyY2VfbWF4X3pvb20gPSAxODtcbkdlby5kZWZhdWx0X3ZpZXdfbWF4X3pvb20gPSAyMDtcbkdlby50aWxlX3NpemUgPSAyNTY7XG5HZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycyA9IDIwMDM3NTA4LjM0Mjc4OTI0NDtcbkdlby5jaXJjdW1mZXJlbmNlX21ldGVycyA9IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzICogMjtcbkdlby5taW5fem9vbV9tZXRlcnNfcGVyX3BpeGVsID0gR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gR2VvLnRpbGVfc2l6ZTsgLy8gbWluIHpvb20gZHJhd3Mgd29ybGQgYXMgMiB0aWxlcyB3aWRlXG5cbmxldCBtZXRlcnNfcGVyX3BpeGVsID0gW107XG5HZW8ubWV0ZXJzUGVyUGl4ZWwgPSBmdW5jdGlvbiAoeikge1xuICAgIG1ldGVyc19wZXJfcGl4ZWxbel0gPSBtZXRlcnNfcGVyX3BpeGVsW3pdIHx8IEdlby5taW5fem9vbV9tZXRlcnNfcGVyX3BpeGVsIC8gTWF0aC5wb3coMiwgeik7XG4gICAgcmV0dXJuIG1ldGVyc19wZXJfcGl4ZWxbel07XG59O1xuXG5sZXQgbWV0ZXJzX3Blcl90aWxlID0gW107XG5HZW8ubWV0ZXJzUGVyVGlsZSA9IGZ1bmN0aW9uICh6KSB7XG4gICAgbWV0ZXJzX3Blcl90aWxlW3pdID0gbWV0ZXJzX3Blcl90aWxlW3pdIHx8IEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHopO1xuICAgIHJldHVybiBtZXRlcnNfcGVyX3RpbGVbel07XG59O1xuXG4vLyBDb252ZXJzaW9uIGZ1bmN0aW9ucyBiYXNlZCBvbiBhbiBkZWZpbmVkIHRpbGUgc2NhbGVcbkdlby50aWxlX3NjYWxlID0gNDA5NjsgLy8gY29vcmRpbmF0ZXMgYXJlIGxvY2FsbHkgc2NhbGVkIHRvIHRoZSByYW5nZSBbMCwgdGlsZV9zY2FsZV1cbkdlby51bml0c19wZXJfcGl4ZWwgPSBHZW8udGlsZV9zY2FsZSAvIEdlby50aWxlX3NpemU7XG5HZW8uaGVpZ2h0X3NjYWxlID0gMTY7ICAvLyBwcm92aWRlcyBzdWItbWV0ZXIgcHJlY2lzaW9uIGZvciBoZWlnaHQgdmFsdWVzICgxNnRocyBvZiBhIG1ldGVycylcblxubGV0IHVuaXRzX3Blcl9tZXRlciA9IFtdO1xuR2VvLnVuaXRzUGVyTWV0ZXIgPSBmdW5jdGlvbiAoeikge1xuICAgIHVuaXRzX3Blcl9tZXRlclt6XSA9IHVuaXRzX3Blcl9tZXRlclt6XSB8fCBHZW8udGlsZV9zY2FsZSAvIChHZW8udGlsZV9zaXplICogR2VvLm1ldGVyc1BlclBpeGVsKHopKTtcbiAgICByZXR1cm4gdW5pdHNfcGVyX21ldGVyW3pdO1xufTtcblxuLy8gQ29udmVydCB0aWxlIGxvY2F0aW9uIHRvIG1lcmNhdG9yIG1ldGVycyAtIG11bHRpcGx5IGJ5IHBpeGVscyBwZXIgdGlsZSwgdGhlbiBieSBtZXRlcnMgcGVyIHBpeGVsLCBhZGp1c3QgZm9yIG1hcCBvcmlnaW5cbkdlby5tZXRlcnNGb3JUaWxlID0gZnVuY3Rpb24gKHRpbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiB0aWxlLnggKiBHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB0aWxlLnopIC0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMsXG4gICAgICAgIHk6IC0odGlsZS55ICogR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgdGlsZS56KSAtIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzKVxuICAgIH07XG59O1xuXG4vKipcbiAgIEdpdmVuIGEgcG9pbnQgaW4gbWVyY2F0b3IgbWV0ZXJzIGFuZCBhIHpvb20gbGV2ZWwsIHJldHVybiB0aGUgdGlsZSBYL1kvWiB0aGF0IHRoZSBwb2ludCBsaWVzIGluXG4qL1xuR2VvLnRpbGVGb3JNZXRlcnMgPSBmdW5jdGlvbiAoW3gsIHldLCB6b29tKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogTWF0aC5mbG9vcigoeCArIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzKSAvIChHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB6b29tKSkpLFxuICAgICAgICB5OiBNYXRoLmZsb29yKCgteSArIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzKSAvIChHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB6b29tKSkpLFxuICAgICAgICB6OiB6b29tXG4gICAgfTtcbn07XG5cbi8vIFdyYXAgYSB0aWxlIHRvIHBvc2l0aXZlICNzIGZvciB6b29tXG4vLyBPcHRpb25hbGx5IHNwZWNpZnkgdGhlIGF4ZXMgdG8gd3JhcFxuR2VvLndyYXBUaWxlID0gZnVuY3Rpb24oeyB4LCB5LCB6IH0sIG1hc2sgPSB7IHg6IHRydWUsIHk6IGZhbHNlIH0pIHtcbiAgICB2YXIgbSA9ICgxIDw8IHopIC0gMTtcbiAgICBpZiAobWFzay54KSB7XG4gICAgICAgIHggPSB4ICYgbTtcbiAgICB9XG4gICAgaWYgKG1hc2sueSkge1xuICAgICAgICB5ID0geSAmIG07XG4gICAgfVxuICAgIHJldHVybiB7IHgsIHksIHogfTtcbn07XG5cbi8qKlxuICAgQ29udmVydCBtZXJjYXRvciBtZXRlcnMgdG8gbGF0LWxuZ1xuKi9cbkdlby5tZXRlcnNUb0xhdExuZyA9IGZ1bmN0aW9uIChbeCwgeV0pIHtcblxuICAgIHggLz0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnM7XG4gICAgeSAvPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycztcblxuICAgIHkgPSAoMiAqIE1hdGguYXRhbihNYXRoLmV4cCh5ICogTWF0aC5QSSkpIC0gKE1hdGguUEkgLyAyKSkgLyBNYXRoLlBJO1xuXG4gICAgeCAqPSAxODA7XG4gICAgeSAqPSAxODA7XG5cbiAgICByZXR1cm4gW3gsIHldO1xufTtcblxuLyoqXG4gIENvbnZlcnQgbGF0LWxuZyB0byBtZXJjYXRvciBtZXRlcnNcbiovXG5HZW8ubGF0TG5nVG9NZXRlcnMgPSBmdW5jdGlvbihbeCwgeV0pIHtcblxuICAgIC8vIExhdGl0dWRlXG4gICAgeSA9IE1hdGgubG9nKE1hdGgudGFuKHkqTWF0aC5QSS8zNjAgKyBNYXRoLlBJLzQpKSAvIE1hdGguUEk7XG4gICAgeSAqPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycztcblxuICAgIC8vIExvbmdpdHVkZVxuICAgIHggKj0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyAxODA7XG5cbiAgICByZXR1cm4gW3gsIHldO1xufTtcblxuR2VvLndyYXBMbmcgPSBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPiAxODAgfHwgeCA8IC0xODApIHtcbiAgICAgICAgeCA9ICgoeCArIDE4MCkgJSAzNjAgKyAzNjApICUgMzYwIC0gMTgwO1xuICAgIH1cbiAgICByZXR1cm4geDtcbn07XG5cbi8vIFJ1biBhbiBpbi1wbGFjZSB0cmFuc2Zvcm0gZnVuY3Rpb24gb24gZWFjaCBjb29vcmRpbmF0ZSBpbiBhIEdlb0pTT04gZ2VvbWV0cnlcbkdlby50cmFuc2Zvcm1HZW9tZXRyeSA9IGZ1bmN0aW9uIChnZW9tZXRyeSwgdHJhbnNmb3JtKSB7XG4gICAgaWYgKGdlb21ldHJ5ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBza2lwIGlmIG1pc3NpbmcgZ2VvbWV0cnkgKHZhbGlkIEdlb0pTT04pXG4gICAgfVxuXG4gICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgdHJhbnNmb3JtKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKHRyYW5zZm9ybSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKGNvb3JkaW5hdGVzID0+IGNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2gocG9seWdvbiA9PiB7XG4gICAgICAgICAgICBwb2x5Z29uLmZvckVhY2goY29vcmRpbmF0ZXMgPT4gY29vcmRpbmF0ZXMuZm9yRWFjaCh0cmFuc2Zvcm0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFRPRE86IHN1cHBvcnQgR2VvbWV0cnlDb2xsZWN0aW9uXG59O1xuXG5HZW8uYm94SW50ZXJzZWN0ID0gZnVuY3Rpb24gKGIxLCBiMikge1xuICAgIHJldHVybiAhKFxuICAgICAgICBiMi5zdy54ID4gYjEubmUueCB8fFxuICAgICAgICBiMi5uZS54IDwgYjEuc3cueCB8fFxuICAgICAgICBiMi5zdy55ID4gYjEubmUueSB8fFxuICAgICAgICBiMi5uZS55IDwgYjEuc3cueVxuICAgICk7XG59O1xuXG4vLyBGaW5kcyB0aGUgYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCBmb3IgYSBwb2x5Z29uXG5HZW8uZmluZEJvdW5kaW5nQm94ID0gZnVuY3Rpb24gKHBvbHlnb24pIHtcbiAgICB2YXIgbWluX3ggPSBJbmZpbml0eSxcbiAgICAgICAgbWF4X3ggPSAtSW5maW5pdHksXG4gICAgICAgIG1pbl95ID0gSW5maW5pdHksXG4gICAgICAgIG1heF95ID0gLUluZmluaXR5O1xuXG4gICAgLy8gT25seSBuZWVkIHRvIGV4YW1pbmUgb3V0ZXIgcmluZyAocG9seWdvblswXSlcbiAgICB2YXIgbnVtX2Nvb3JkcyA9IHBvbHlnb25bMF0ubGVuZ3RoO1xuICAgIGZvciAodmFyIGM9MDsgYyA8IG51bV9jb29yZHM7IGMrKykge1xuICAgICAgICB2YXIgY29vcmQgPSBwb2x5Z29uWzBdW2NdO1xuXG4gICAgICAgIGlmIChjb29yZFswXSA8IG1pbl94KSB7XG4gICAgICAgICAgICBtaW5feCA9IGNvb3JkWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb29yZFsxXSA8IG1pbl95KSB7XG4gICAgICAgICAgICBtaW5feSA9IGNvb3JkWzFdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb29yZFswXSA+IG1heF94KSB7XG4gICAgICAgICAgICBtYXhfeCA9IGNvb3JkWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb29yZFsxXSA+IG1heF95KSB7XG4gICAgICAgICAgICBtYXhfeSA9IGNvb3JkWzFdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFttaW5feCwgbWluX3ksIG1heF94LCBtYXhfeV07XG59O1xuXG4vLyBDb252ZXJ0IGdlb21ldHJ5IHR5cGUgdG8gb25lIG9mOiAncG9pbnQnLCAnbGluZScsICdwb2x5Z29uJ1xuR2VvLmdlb21ldHJ5VHlwZSA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gJ1BvbHlnb24nIHx8IHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHJldHVybiAncG9seWdvbic7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCB0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJ2xpbmUnO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgcmV0dXJuICdwb2ludCc7XG4gICAgfVxufTtcblxuR2VvLmNlbnRyb2lkID0gZnVuY3Rpb24gKHBvbHlnb24pIHtcbiAgICAvLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL0xlYWZsZXQvTGVhZmxldC9ibG9iL2MxMGY0MDVhMTEyMTQyYjE5Nzg1OTY3Y2UwZTE0MjEzMmE2MDk1YWQvc3JjL2xheWVyL3ZlY3Rvci9Qb2x5Z29uLmpzI0w1N1xuICAgIGxldCB4ID0gMCwgeSA9IDAsIGFyZWEgPSAwO1xuICAgIGxldCByaW5nID0gcG9seWdvblswXTsgLy8gb25seSB1c2UgZmlyc3QgcmluZyBmb3Igbm93XG4gICAgbGV0IGxlbiA9IHJpbmcubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSwgaSsrKSB7XG4gICAgICAgIGxldCBwMCA9IHJpbmdbaV07XG4gICAgICAgIGxldCBwMSA9IHJpbmdbal07XG4gICAgICAgIGxldCBmID0gcDBbMV0gKiBwMVswXSAtIHAxWzFdICogcDBbMF07XG5cbiAgICAgICAgeCArPSAocDBbMF0gKyBwMVswXSkgKiBmO1xuICAgICAgICB5ICs9IChwMFsxXSArIHAxWzFdKSAqIGY7XG4gICAgICAgIGFyZWEgKz0gZiAqIDM7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4IC8gYXJlYSwgeSAvIGFyZWFdO1xufTtcblxuR2VvLm11bHRpQ2VudHJvaWQgPSBmdW5jdGlvbiAocG9seWdvbnMpIHtcbiAgICBsZXQgbiA9IHBvbHlnb25zLmxlbmd0aDtcbiAgICBsZXQgY2VudHJvaWQgPSBbMCwgMF07XG5cbiAgICBmb3IgKGxldCBwPTA7IHAgPCBwb2x5Z29ucy5sZW5ndGg7IHArKykge1xuICAgICAgICBsZXQgYyA9IEdlby5jZW50cm9pZChwb2x5Z29uc1twXSk7XG4gICAgICAgIGNlbnRyb2lkWzBdICs9IGNbMF07XG4gICAgICAgIGNlbnRyb2lkWzFdICs9IGNbMV07XG4gICAgfVxuXG4gICAgY2VudHJvaWRbMF0gLz0gbjtcbiAgICBjZW50cm9pZFsxXSAvPSBuO1xuXG4gICAgcmV0dXJuIGNlbnRyb2lkO1xufTtcblxuR2VvLnNpZ25lZFBvbHlnb25SaW5nQXJlYVN1bSA9IGZ1bmN0aW9uIChyaW5nKSB7XG4gICAgbGV0IGFyZWEgPSAwO1xuICAgIGxldCBuID0gcmluZy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4gLSAxOyBpKyspIHtcbiAgICAgICAgbGV0IHAwID0gcmluZ1tpXTtcbiAgICAgICAgbGV0IHAxID0gcmluZ1tpKzFdO1xuXG4gICAgICAgIGFyZWEgKz0gcDBbMF0gKiBwMVsxXSAtIHAxWzBdICogcDBbMV07XG4gICAgfVxuXG4gICAgYXJlYSArPSByaW5nW24gLSAxXVswXSAqIHJpbmdbMF1bMV0gLSByaW5nWzBdWzBdICogcmluZ1tuIC0gMV1bMV07XG4gICAgcmV0dXJuIGFyZWE7XG59O1xuXG5HZW8ucG9seWdvblJpbmdBcmVhID0gZnVuY3Rpb24gKHJpbmcpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoR2VvLnNpZ25lZFBvbHlnb25SaW5nQXJlYVN1bShyaW5nKSkgLyAyO1xufTtcblxuLy8gVE9ETzogc3VidHJhY3QgaW5uZXIgcmluZ3Ncbkdlby5wb2x5Z29uQXJlYSA9IGZ1bmN0aW9uIChwb2x5Z29uKSB7XG4gICAgcmV0dXJuIEdlby5wb2x5Z29uUmluZ0FyZWEocG9seWdvblswXSk7XG59O1xuXG5HZW8ubXVsdGlQb2x5Z29uQXJlYSA9IGZ1bmN0aW9uIChwb2x5Z29ucykge1xuICAgIGxldCBhcmVhID0gMDtcblxuICAgIGZvciAobGV0IHA9MDsgcCA8IHBvbHlnb25zLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgIGFyZWEgKz0gR2VvLnBvbHlnb25BcmVhKHBvbHlnb25zW3BdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJlYTtcbn07XG5cbkdlby5yaW5nV2luZGluZyA9IGZ1bmN0aW9uIChyaW5nKSB7XG4gICAgbGV0IGFyZWEgPSBHZW8uc2lnbmVkUG9seWdvblJpbmdBcmVhU3VtKHJpbmcpO1xuICAgIGlmIChhcmVhID4gMCkge1xuICAgICAgICByZXR1cm4gJ0NXJztcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJlYSA8IDApIHtcbiAgICAgICAgcmV0dXJuICdDQ1cnO1xuICAgIH1cbiAgICAvLyByZXR1cm4gdW5kZWZpbmVkIG9uIHplcm8gYXJlYSBwb2x5Z29uXG59O1xuIiwiLy8gV2ViR0wgY29uc3RhbnRzIC0gbmVlZCB0byBpbXBvcnQgdGhlc2Ugc2VwYXJhdGVseSB0byBtYWtlIHRoZW0gYXZhaWxhYmxlIGluIHRoZSB3ZWIgd29ya2VyXG5cbnZhciBnbDtcbmV4cG9ydCBkZWZhdWx0IGdsID0ge307XG5cbi8qIERhdGFUeXBlICovXG5nbC5CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDA7XG5nbC5VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgPSAweDE0MDE7XG5nbC5TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDI7XG5nbC5VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgPSAweDE0MDM7XG5nbC5JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDQ7XG5nbC5VTlNJR05FRF9JTlQgICAgICAgICAgICAgICAgICAgPSAweDE0MDU7XG5nbC5GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDY7XG4iLCIvLyBXZWJHTCBjb250ZXh0IHdyYXBwZXJcblxudmFyIENvbnRleHQ7XG5leHBvcnQgZGVmYXVsdCBDb250ZXh0ID0ge307XG5cbmxldCBjb250ZXh0X2lkID0gMDtcblxuLy8gU2V0dXAgYSBXZWJHTCBjb250ZXh0XG4vLyBJZiBubyBjYW52YXMgZWxlbWVudCBpcyBwcm92aWRlZCwgb25lIGlzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBib2R5XG5Db250ZXh0LmdldENvbnRleHQgPSBmdW5jdGlvbiBnZXRDb250ZXh0IChjYW52YXMsIG9wdGlvbnMpXG57XG4gICAgdmFyIGZ1bGxzY3JlZW4gPSBmYWxzZTtcbiAgICBpZiAoY2FudmFzID09IG51bGwpIHtcbiAgICAgICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIGNhbnZhcy5zdHlsZS50b3AgPSAwO1xuICAgICAgICBjYW52YXMuc3R5bGUubGVmdCA9IDA7XG4gICAgICAgIGNhbnZhcy5zdHlsZS56SW5kZXggPSAtMTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgICAgICBmdWxsc2NyZWVuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBvcHRpb25zKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgb3B0aW9ucyk7XG4gICAgaWYgKCFnbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBjcmVhdGUgV2ViR0wgY29udGV4dC5cIik7XG4gICAgfVxuICAgIGdsLl90YW5ncmFtX2lkID0gY29udGV4dF9pZCsrO1xuXG4gICAgaWYgKCFmdWxsc2NyZWVuKSB7XG4gICAgICAgIENvbnRleHQucmVzaXplKGdsLCBwYXJzZUZsb2F0KGNhbnZhcy5zdHlsZS53aWR0aCksIHBhcnNlRmxvYXQoY2FudmFzLnN0eWxlLmhlaWdodCksIG9wdGlvbnMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIENvbnRleHQucmVzaXplKGdsLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0LCBvcHRpb25zLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBDb250ZXh0LnJlc2l6ZShnbCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCwgb3B0aW9ucy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2w7XG59O1xuXG5Db250ZXh0LnJlc2l6ZSA9IGZ1bmN0aW9uIChnbCwgd2lkdGgsIGhlaWdodCwgZGV2aWNlX3BpeGVsX3JhdGlvKVxue1xuICAgIGRldmljZV9waXhlbF9yYXRpbyA9IGRldmljZV9waXhlbF9yYXRpbyB8fCB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICAgIGdsLmNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcbiAgICBnbC5jYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICBnbC5jYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoICogZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICBnbC5jYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQgKiBkZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgZ2wudmlld3BvcnQoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KTtcbn07XG4iLCIvLyBXZWJHTCBleHRlbnNpb24gd3JhcHBlclxuLy8gU3RvcmVzIGV4dGVuc2lvbnMgYnkgbmFtZSBhbmQgR0wgY29udGV4dFxuXG4vLyBsaXN0IG9mIGV4dGVuc2lvbiBhcnJheXMsIGZvciBlYWNoIGVudHJ5LCAxc3QgZWxlbWVudCBHTCBjb250ZXh0LCAybmQgbWFwIG9mIGV4dGVuc2lvbnMgYnkgbmFtZVxubGV0IGV4dGVuc2lvbnMgPSBbXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uIChnbCwgbmFtZSkge1xuICAgIGxldCBleHRzID0gZXh0ZW5zaW9ucy5maWx0ZXIoZSA9PiBlWzBdID09PSBnbClbMF07XG4gICAgZXh0cyA9IGV4dHMgJiYgZXh0c1sxXTtcblxuICAgIGlmICghZXh0cykge1xuICAgICAgICBleHRlbnNpb25zLnB1c2goW2dsLCB7fV0pO1xuICAgICAgICBleHRzID0gZXh0ZW5zaW9uc1tleHRlbnNpb25zLmxlbmd0aC0xXVsxXTtcbiAgICB9XG5cbiAgICBpZiAoIWV4dHNbbmFtZV0pIHtcbiAgICAgICAgZXh0c1tuYW1lXSA9IGdsLmdldEV4dGVuc2lvbihuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4dHNbbmFtZV07XG59XG4iLCJ2YXIgR0xTTCA9IHt9O1xuZXhwb3J0IGRlZmF1bHQgR0xTTDtcblxuLyoqXG4gICAgUGFyc2UgdW5pZm9ybXMgZnJvbSBhIEpTIG9iamVjdCwgaW5mZXJzIHR5cGVzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCB0aGVcbiAgICBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gc2V0IHVuaWZvcm0gdmFsdWVzIG9uIGEgR0wgcHJvZ3JhbS4gRWFjaCBvYmplY3QgaW4gdGhlIHJldHVybmVkXG4gICAgYXJyYXkgaGFzIHRoZSBmb3JtOlxuICAgIHsgdHlwZSwgbWV0aG9kLCBuYW1lLCB2YWx1ZSB9XG5cbiAgICB0eXBlOiB0aGUgR0wgdW5pZm9ybSB0eXBlLCBzdWNoIGFzICd2ZWMzJywgJ2Zsb2F0JywgZXRjLlxuICAgIG1ldGhvZDogdGhlIEdMIHVuaWZvcm0gc2V0dGVyIG1ldGhvZCB0byB1c2UsIHN1Y2ggYXMgJzFmJywgJzNmdicsIGV0Yy5cbiAgICBuYW1lOiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEdMIHVuaWZvcm0gbG9jYXRpb24sIGUuZy4gJ2FycmF5WzBdLmZpZWxkJywgZXRjLlxuICAgIHZhbHVlOiB0aGUgdmFsdWUgdG8gYmUgcGFzc2VkIHRvIHRoZSBHTCB1bmlmb3JtIHNldHRlciBmb3IgdGhhdCB0eXBlLCBlLmcuIFsxLCAyLCAzXSBmb3IgYSB2ZWMzXG5cbiAgICBUZXh0dXJlcyBoYXZlIHNwZWNpYWwgYmVoYXZpb3I6IHVuaWZvcm1zIHdpdGggc3RyaW5nIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyB0ZXh0dXJlcywgYW5kXG4gICAgdGhlIHN0cmluZyBpcyB1c2VkIGFzIGEgdW5pcXVlIHRleHR1cmUgJ2tleScgdG8gYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIGNhbGxlciAod2hpY2ggaXMgcmVzcG9uc2libGVcbiAgICBmb3IgYWN0dWFsbHkgc2V0dGluZyB0aGUgdW5pZm9ybXMpLiBGb3IgZXhhbXBsZSwgdGhpcyBjb3VsZCBiZSB1c2VkIGFzIGEga2V5IGludG8gYSBkaWN0aW9uYXJ5IG9mXG4gICAga25vd24gdGV4dHVyZSBuYW1lcywgb3IgaXQgY291bGQgc2ltcGx5IGJlIHVzZWQgYXMgYSBVUkwgdG8gZHluYW1pY2FsbHkgbG9hZCB0aGUgdGV4dHVyZSBmcm9tLlxuKi9cbkdMU0wucGFyc2VVbmlmb3JtcyA9IGZ1bmN0aW9uICh1bmlmb3Jtcykge1xuICAgIHZhciBwYXJzZWQgPSBbXTtcblxuICAgIGZvciAodmFyIG5hbWUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgdmFyIGtleSA9IG5hbWU7IC8vIHNhdmUgdGhlIG9yaWdpbmFsIG5hbWVcbiAgICAgICAgdmFyIHVuaWZvcm0gPSB1bmlmb3Jtc1tuYW1lXTtcbiAgICAgICAgdmFyIHU7XG5cbiAgICAgICAgLy8gU2luZ2xlIGZsb2F0XG4gICAgICAgIGlmICh0eXBlb2YgdW5pZm9ybSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZmxvYXQnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJzFmJyxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXk6IHZlY3RvciwgYXJyYXkgb2YgZmxvYXRzLCBhcnJheSBvZiB0ZXh0dXJlc1xuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHVuaWZvcm0pKSB7XG4gICAgICAgICAgICAvLyBOdW1lcmljIHZhbHVlc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1bmlmb3JtWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIC8vIGZsb2F0IHZlY3RvcnMgKHZlYzIsIHZlYzMsIHZlYzQpXG4gICAgICAgICAgICAgICAgaWYgKHVuaWZvcm0ubGVuZ3RoID49IDIgJiYgdW5pZm9ybS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmVjJyArIHVuaWZvcm0ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiB1bmlmb3JtLmxlbmd0aCArICdmdicsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZmxvYXQgYXJyYXlcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh1bmlmb3JtLmxlbmd0aCA+IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Zsb2F0W10nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnMWZ2JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUgKyAnWzBdJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGFzc3VtZSBtYXRyaXggZm9yICh0eXBlb2YgPT0gRmxvYXQzMkFycmF5ICYmIGxlbmd0aCA9PSAxNik/XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBcnJheSBvZiB0ZXh0dXJlc1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm1bMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZm9yICh1PTA7IHUgPCB1bmlmb3JtLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzYW1wbGVyMkQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnMWknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSArICdbJyArIHUgKyAnXScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybVt1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogdSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zOiB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFycmF5IG9mIGFycmF5cyAtIGJ1dCBvbmx5IGFycmF5cyBvZiB2ZWN0b3JzIGFyZSBhbGxvd2VkIGluIHRoaXMgY2FzZVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh1bmlmb3JtWzBdKSAmJiB0eXBlb2YgdW5pZm9ybVswXVswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAvLyBmbG9hdCB2ZWN0b3JzICh2ZWMyLCB2ZWMzLCB2ZWM0KVxuICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtWzBdLmxlbmd0aCA+PSAyICYmIHVuaWZvcm1bMF0ubGVuZ3RoIDw9IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgICAgICBmb3IgKHU9MDsgdSA8IHVuaWZvcm0ubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmVjJyArIHVuaWZvcm1bMF0ubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogdW5pZm9ybVt1XS5sZW5ndGggKyAnZnYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUgKyAnWycgKyB1ICsgJ10nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtW3VdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogdSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtczogdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPOiBlbHNlIHdhcm5pbmdcbiAgICAgICAgfVxuICAgICAgICAvLyBCb29sZWFuXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB1bmlmb3JtID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWknLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUZXh0dXJlXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB1bmlmb3JtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzYW1wbGVyMkQnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJzFpJyxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xufTtcblxuLyoqXG4gICAgR2VuZXJhdGUgYSBHTFNMIHZhcmlhYmxlIGRlZmluaXRpb24gZnJvbSBhIEpTIG9iamVjdFxuKi9cbkdMU0wuZGVmaW5lVmFyaWFibGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgdHlwZSwgYXJyYXk7XG5cbiAgICAvLyBTaW5nbGUgZmxvYXRcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB0eXBlID0gJ2Zsb2F0JztcbiAgICB9XG4gICAgLy8gTXVsdGlwbGUgZmxvYXRzIC0gdmVjdG9yIG9yIGFycmF5XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gTnVtZXJpYyB2YWx1ZXNcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZVswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIC8vIGZsb2F0IHZlY3RvcnMgKHZlYzIsIHZlYzMsIHZlYzQpXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IDIgJiYgdmFsdWUubGVuZ3RoIDw9IDQpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gJ3ZlYycgKyB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmbG9hdCBhcnJheVxuICAgICAgICAgICAgZWxzZSB7IC8vaWYgKHZhbHVlLmxlbmd0aCA+IDQpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gJ2Zsb2F0JztcbiAgICAgICAgICAgICAgICBhcnJheSA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE86IGFzc3VtZSBtYXRyaXggZm9yICh0eXBlb2YgPT0gRmxvYXQzMkFycmF5ICYmIGxlbmd0aCA9PSAxNik/XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2YgdGV4dHVyZXNcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHlwZSA9ICdzYW1wbGVyMkQnO1xuICAgICAgICAgICAgYXJyYXkgPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQm9vbGVhblxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHR5cGUgPSAnYm9vbCc7XG4gICAgfVxuICAgIC8vIFRleHR1cmVcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHR5cGUgPSAnc2FtcGxlcjJEJztcbiAgICB9XG5cbiAgICAvLyBDb25zdHJ1Y3QgdmFyaWFibGUgZGVmaW5pdGlvblxuICAgIHZhciB2YXJpYWJsZSA9ICcnO1xuICAgIHZhcmlhYmxlICs9IGAke3R5cGV9ICR7bmFtZX1gO1xuICAgIGlmIChhcnJheSkge1xuICAgICAgICB2YXJpYWJsZSArPSBgWyR7YXJyYXl9XWA7XG4gICAgfVxuICAgIHZhcmlhYmxlICs9ICc7XFxuJztcblxuICAgIHJldHVybiB2YXJpYWJsZTtcbn07XG5cbi8qKlxuICAgIEdlbmVyYXRlIGEgR0xTTCB1bmlmb3JtIGRlZmluaXRpb24gZnJvbSBhIEpTIG9iamVjdFxuKi9cbkdMU0wuZGVmaW5lVW5pZm9ybSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHJldHVybiAndW5pZm9ybSAnICsgR0xTTC5kZWZpbmVWYXJpYWJsZShuYW1lLCB2YWx1ZSk7XG59O1xuXG4vKipcbiAgICBDaGVjayBmb3IgYSB1bmlmb3JtIGRlZmluaXRpb24gb2YgJ25hbWUnIGluIHRoZSBwcm92aWRlZCBHTFNMIHNvdXJjZVxuICAgIFNpbXBsZSByZWdleCBjaGVjayBmb3IgJ3VuaWZvcm0nIGtleXdvcmQgYW5kIHZhciBuYW1lLCBkb2VzIG5vdCBhdHRlbXB0IHRvIHBhcnNlL2V4dHJhY3QgR0xTTFxuICAgIE5PVEU6IGFzc3VtZXMgY29tbWVudHMgaGF2ZSBiZWVuIHN0cmlwcGVkIGZyb20gc291cmNlXG4qL1xuR0xTTC5pc1VuaWZvcm1EZWZpbmVkID0gZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSkge1xuICAgIC8vIE1hdGNoLCBpbiBvcmRlcjpcbiAgICAvLyAtIHRoZSBrZXl3b3JkICd1bmlmb3JtJ1xuICAgIC8vIC0gYXQgbGVhc3Qgb25lIGNoYXJhY3RlciB0aGF0IGlzIGFueXRoaW5nIGV4Y2VwdCBhIHNlbWljb2xvbiwgO1xuICAgIC8vIC0gb3B0aW9uYWxseSwgYW55dGhpbmcgZW5jbG9zZWQgaW4gY3VybHkgYnJhY2VzLCB7IC4uLiB9IChhbiBpbmxpbmUgc3RydWN0dXJlIGRlZmluaXRpb24gY2FuIGdvIGhlcmUpXG4gICAgLy8gLSBvcHRpb25hbGx5LCBhbnkgIyBvZiBjaGFyYWN0ZXJzIHRoYXQgaXMgbm90IGEgc2VtaWNvbG9uLCA7XG4gICAgLy8gLSB0aGUgbmFtZSBvZiB0aGUgdW5pZm9ybVxuXG4gICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgndW5pZm9ybVteO10rKD86e1tcXFxcc1xcXFxTXSp9KT9bXjtdKlxcXFxiJyArIG5hbWUgKyAnXFxcXGInLCAnZycpO1xuICAgIGlmIChzb3VyY2UubWF0Y2gocmUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAgICBDaGVjayB0aGF0IGEgc3ltYm9sIGlzIHJlZmVyZW5jZWQgaW4gdGhlIEdMU0wgc291cmNlXG4gICAgTk9URTogYXNzdW1lcyBjb21tZW50cyBoYXZlIGJlZW4gc3RyaXBwZWQgZnJvbSBzb3VyY2VcbiovXG5HTFNMLmlzU3ltYm9sUmVmZXJlbmNlZCA9IGZ1bmN0aW9uIChuYW1lLCBzb3VyY2UpIHtcbiAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdcXFxcYicgKyBuYW1lICsgJ1xcXFxiJywgJ2cnKTtcbiAgICBpZiAoc291cmNlLnNlYXJjaChyZSkgPj0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gICAgRXhwYW5kIGEgc2luZ2xlIHZhbHVlIG9yIDItZWxlbWVudCBhcnJheSBpbnRvIGEgMy1lbGVtZW50IGFycmF5LCB3aXRoIHRoZSBsYXN0ICggeiApXG4gICAgY29vcmRpbmF0ZSBkZWZhdWx0aW5nIHRvIDEgKHdpdGggb3B0aW9uIHRvIHNwZWNpZnkpLiBBbHNvIHJ1bnMgcGFyc2VGbG9hdCB0byB0cnkgdG8gbWFpbnRhaW5cbiAgICBkYXRhIGludGVncml0eS4gUmV0dXJucyBudWxsIGlmIGlucHV0IGNvdWxkbid0IGJlIHBhcnNlZC5cbiovXG5HTFNMLmV4cGFuZFZlYzMgPSBmdW5jdGlvbiAodiwgeiA9IDEpIHtcbiAgICBsZXQgeDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICBpZiAodi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHggPSBbLi4udiwgel0ubWFwKHBhcnNlRmxvYXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHggPSBbdiwgdiwgdl0ubWFwKHBhcnNlRmxvYXQpO1xuICAgIH1cblxuICAgIGlmICh4ICYmIHguZXZlcnkobiA9PiB0eXBlb2YgbiA9PT0gJ251bWJlcicgJiYgIWlzTmFOKG4pKSkge1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG59O1xuXG4vKipcbiAgICBFeHBhbmQgYSBzaW5nbGUgdmFsdWUgb3IgMy1lbGVtZW50IGFycmF5IGludG8gYSA0LWVsZW1lbnQgYXJyYXksIHdpdGggdGhlIGxhc3QgKGUuZy4gdyBvciBhKVxuICAgIGNvb3JkaW5hdGUgZGVmYXVsdGluZyB0byAxICh3aXRoIG9wdGlvbiB0byBzcGVjaWZ5KS4gQWxzbyBydW5zIHBhcnNlRmxvYXQgdG8gdHJ5IHRvIG1haW50YWluXG4gICAgZGF0YSBpbnRlZ3JpdHkuIFJldHVybnMgbnVsbCBpZiBpbnB1dCBjb3VsZG4ndCBiZSBwYXJzZWQuXG4qL1xuR0xTTC5leHBhbmRWZWM0ID0gZnVuY3Rpb24gKHYsIHcgPSAxKSB7XG4gICAgbGV0IHg7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgaWYgKHYubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB4ID0gWy4uLnYsIHddLm1hcChwYXJzZUZsb2F0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB4ID0gW3YsIHYsIHYsIHddLm1hcChwYXJzZUZsb2F0KTtcbiAgICB9XG5cbiAgICBpZiAoeCAmJiB4LmV2ZXJ5KG4gPT4gdHlwZW9mIG4gPT09ICdudW1iZXInICYmICFpc05hTihuKSkpIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxufTtcblxuXG4iLCJcbmV4cG9ydCBjbGFzcyBSZW5kZXJTdGF0ZSB7XG5cdGNvbnN0cnVjdG9yICh2YWx1ZSwgc2V0dXApIHtcbiAgICAgICAgc2V0dXAodmFsdWUpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc2V0dXAgPSBzZXR1cDtcbiAgICB9XG5cbiAgICBzZXQgKHZhbHVlKSB7XG4gICAgXHQvLyBpZiB0aGUgc3RhdGVzIGFyZSBkaWZmZXJlbnQsIGNhbGwgdGhlIEdMIGNvbnRleHQgZm9yIGEgc3RhdGUgY2hhbmdlXG4gICAgXHRpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkge1xuICAgIFx0XHR0aGlzLnNldHVwKHZhbHVlKTtcbiAgICBcdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIFx0fVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyU3RhdGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yIChnbCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRzID0ge307XG5cbiAgICAgICAgLy8gQ3VsbGluZ1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmN1bGxpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmN1bGxpbmdfZmFjZSA9IGdsLkJBQ0s7XG5cbiAgICAgICAgLy8gQmxlbmRpbmdcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyYyA9IGdsLk9ORV9NSU5VU19TUkNfQUxQSEE7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfZHN0ID0gZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19zcmNfYWxwaGEgPSBnbC5PTkU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfZHN0X2FscGhhID0gZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcblxuICAgICAgICAvLyBEZXB0aCB0ZXN0L3dyaXRlXG4gICAgICAgIHRoaXMuZGVmYXVsdHMuZGVwdGhfd3JpdGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmRlcHRoX3Rlc3QgPSB0cnVlO1xuICAgICAgICBnbC5kZXB0aEZ1bmMoZ2wuTEVTUyk7IC8vIGRlcHRoIGZ1bmN0aW9uIG9ubHkgbmVlZHMgdG8gYmUgc2V0IG9uY2VcblxuICAgIFx0Ly8gQ3VsbGluZ1xuICAgICAgICB0aGlzLmN1bGxpbmcgPSBuZXcgUmVuZGVyU3RhdGUoXG4gICAgICAgICAgICB7IGN1bGw6IHRoaXMuZGVmYXVsdHMuY3VsbGluZywgZmFjZTogdGhpcy5kZWZhdWx0cy5jdWxsaW5nX2ZhY2UgfSxcbiAgICBcdFx0KHZhbHVlKSA9PiB7XG4gICAgXHRcdFx0aWYgKHZhbHVlLmN1bGwpIHtcbiAgICBcdFx0XHRcdGdsLmVuYWJsZShnbC5DVUxMX0ZBQ0UpO1xuICAgICAgICAgICAgXHRcdGdsLmN1bGxGYWNlKHZhbHVlLmZhY2UpO1xuICAgIFx0XHRcdH0gZWxzZSB7XG4gICAgXHRcdFx0XHRnbC5kaXNhYmxlKGdsLkNVTExfRkFDRSk7XG4gICAgXHRcdFx0fVxuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgXHQvLyBCbGVuZGluZyBtb2RlXG4gICAgICAgIHRoaXMuYmxlbmRpbmcgPSBuZXcgUmVuZGVyU3RhdGUoe1xuICAgICAgICAgICAgICAgIGJsZW5kOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nLFxuICAgICAgICAgICAgICAgIHNyYzogdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19zcmMsXG4gICAgICAgICAgICAgICAgZHN0OiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX2RzdCxcbiAgICAgICAgICAgICAgICBzcmNfYWxwaGE6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfc3JjX2FscGhhLFxuICAgICAgICAgICAgICAgIGRzdF9hbHBoYTogdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3RfYWxwaGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAodmFsdWUpID0+IHtcbiAgICBcdFx0XHRpZiAodmFsdWUuYmxlbmQpIHtcbiAgICAgICAgICAgIFx0XHRnbC5lbmFibGUoZ2wuQkxFTkQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zcmNfYWxwaGEgJiYgdmFsdWUuZHN0X2FscGhhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmNTZXBhcmF0ZSh2YWx1ZS5zcmMsIHZhbHVlLmRzdCwgdmFsdWUuc3JjX2FscGhhLCB2YWx1ZS5kc3RfYWxwaGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2wuYmxlbmRGdW5jKHZhbHVlLnNyYywgdmFsdWUuZHN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgIFx0XHRcdH0gZWxzZSB7XG4gICAgXHRcdFx0XHRnbC5kaXNhYmxlKGdsLkJMRU5EKTtcbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdCk7XG5cbiAgICBcdC8vIERlcHRoIHdyaXRlXG4gICAgICAgIHRoaXMuZGVwdGhfd3JpdGUgPSBuZXcgUmVuZGVyU3RhdGUoXG4gICAgICAgICAgICB7IGRlcHRoX3dyaXRlOiB0aGlzLmRlZmF1bHRzLmRlcHRoX3dyaXRlIH0sXG4gICAgXHRcdCh2YWx1ZSkgPT4ge1xuICAgICAgICBcdFx0Z2wuZGVwdGhNYXNrKHZhbHVlLmRlcHRoX3dyaXRlKTtcbiAgICBcdFx0fVxuICAgIFx0KTtcblxuICAgIFx0Ly8gRGVwdGggdGVzdFxuICAgICAgICB0aGlzLmRlcHRoX3Rlc3QgPSBuZXcgUmVuZGVyU3RhdGUoXG4gICAgICAgICAgICB7IGRlcHRoX3Rlc3Q6IHRoaXMuZGVmYXVsdHMuZGVwdGhfdGVzdCB9LFxuICAgICAgICAgICAgKHZhbHVlKSA9PiB7XG4gICAgXHRcdFx0aWYgKHZhbHVlLmRlcHRoX3Rlc3QpIHtcbiAgICAgICAgICAgIFx0XHRnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgXHRcdFx0fSBlbHNlIHtcbiAgICAgICAgICAgIFx0XHRnbC5kaXNhYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgIFx0XHRcdH1cbiAgICBcdFx0fVxuICAgIFx0KTtcblxuICAgIH1cblxufVxuIiwiLy8gR0wgcHJvZ3JhbSB3cmFwcGVyIHRvIGNhY2hlIHVuaWZvcm0gbG9jYXRpb25zL3ZhbHVlcywgZG8gY29tcGlsZS10aW1lIHByZS1wcm9jZXNzaW5nXG4vLyAoaW5qZWN0aW5nICNkZWZpbmVzIGFuZCAjcHJhZ21hIGJsb2NrcyBpbnRvIHNoYWRlcnMpLCBldGMuXG5cbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBHTFNMIGZyb20gJy4vZ2xzbCc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL3RleHR1cmUnO1xuaW1wb3J0IGdldEV4dGVuc2lvbiBmcm9tICcuL2V4dGVuc2lvbnMnO1xuXG5pbXBvcnQgc3RyaXAgZnJvbSAnc3RyaXAtY29tbWVudHMnO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBwYXJzZVNoYWRlckVycm9ycyB9IGZyb20gJ2dsLXNoYWRlci1lcnJvcnMnO1xuXG4vLyBSZWdleCBwYXR0ZXJuc1xuY29uc3QgcmVfcHJhZ21hID0gL15cXHMqI3ByYWdtYS4qJC9nbTsgICAvLyBmb3IgcmVtb3ZpbmcgdW51c2VkIHByYWdtYXMgYWZ0ZXIgc2hhZGVyIGJsb2NrIGluamVjdGlvblxuY29uc3QgcmVfY29udGludWVfbGluZSA9IC9cXFxcXFxzKlxcbi9tZzsgICAvLyBmb3IgcmVtb3ZpbmcgYmFja3NsYXNoIGxpbmUgY29udGludWF0aW9uc1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGFkZXJQcm9ncmFtIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCB2ZXJ0ZXhfc291cmNlLCBmcmFnbWVudF9zb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuXG4gICAgICAgIC8vIGtleS92YWx1ZXMgaW5zZXJ0ZWQgYXMgI2RlZmluZXMgaW50byBzaGFkZXJzIGF0IGNvbXBpbGUtdGltZVxuICAgICAgICB0aGlzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmRlZmluZXN8fHt9KTtcblxuICAgICAgICAvLyBrZXkvdmFsdWVzIGZvciBibG9ja3MgdGhhdCBjYW4gYmUgaW5qZWN0ZWQgaW50byBzaGFkZXJzIGF0IGNvbXBpbGUtdGltZVxuICAgICAgICB0aGlzLmJsb2NrcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuYmxvY2tzfHx7fSk7XG4gICAgICAgIHRoaXMuYmxvY2tfc2NvcGVzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5ibG9ja19zY29wZXN8fHt9KTtcblxuICAgICAgICAvLyBsaXN0IG9mIGV4dGVuc2lvbnMgdG8gYWN0aXZhdGVcbiAgICAgICAgdGhpcy5leHRlbnNpb25zID0gb3B0aW9ucy5leHRlbnNpb25zIHx8IFtdO1xuXG4gICAgICAgIC8vIEpTLW9iamVjdCB1bmlmb3JtcyB0aGF0IGFyZSBleHBlY3RlZCBieSB0aGlzIHByb2dyYW1cbiAgICAgICAgLy8gSWYgdGhleSBhcmUgbm90IGZvdW5kIGluIHRoZSBleGlzdGluZyBzaGFkZXIgc291cmNlLCB0aGVpciB0eXBlcyB3aWxsIGJlIGluZmVycmVkIGFuZCBkZWZpbml0aW9uc1xuICAgICAgICAvLyBmb3IgZWFjaCB3aWxsIGJlIGluamVjdGVkLlxuICAgICAgICB0aGlzLmRlcGVuZGVudF91bmlmb3JtcyA9IG9wdGlvbnMudW5pZm9ybXM7XG5cbiAgICAgICAgdGhpcy51bmlmb3JtcyA9IHt9OyAvLyBwcm9ncmFtIGxvY2F0aW9ucyBvZiB1bmlmb3JtcywgbGF6aWx5IGFkZGVkIGFzIGVhY2ggdW5pZm9ybSBpcyBzZXRcbiAgICAgICAgdGhpcy5hdHRyaWJzID0ge307IC8vIHByb2dyYW0gbG9jYXRpb25zIG9mIHZlcnRleCBhdHRyaWJ1dGVzLCBsYXppbHkgYWRkZWQgYXMgZWFjaCBhdHRyaWJ1dGUgaXMgYWNjZXNzZWRcblxuICAgICAgICB0aGlzLnZlcnRleF9zb3VyY2UgPSB2ZXJ0ZXhfc291cmNlO1xuICAgICAgICB0aGlzLmZyYWdtZW50X3NvdXJjZSA9IGZyYWdtZW50X3NvdXJjZTtcblxuICAgICAgICB0aGlzLmlkID0gU2hhZGVyUHJvZ3JhbS5pZCsrO1xuICAgICAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7IC8vIGNhbiBwcm92aWRlIGEgcHJvZ3JhbSBuYW1lICh1c2VmdWwgZm9yIGRlYnVnZ2luZylcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0obnVsbCk7XG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLnVuaWZvcm1zID0ge307XG4gICAgICAgIHRoaXMuYXR0cmlicyA9IHt9O1xuICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVXNlIHByb2dyYW0gd3JhcHBlciB3aXRoIHNpbXBsZSBzdGF0ZSBjYWNoZVxuICAgIHVzZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoU2hhZGVyUHJvZ3JhbS5jdXJyZW50ICE9PSB0aGlzKSB7XG4gICAgICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0odGhpcy5wcm9ncmFtKTtcbiAgICAgICAgfVxuICAgICAgICBTaGFkZXJQcm9ncmFtLmN1cnJlbnQgPSB0aGlzO1xuICAgIH1cblxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGluZykge1xuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBTaGFkZXJQcm9ncmFtLmNvbXBpbGUoKTogc2tpcHBpbmcgZm9yICR7dGhpcy5pZH0gKCR7dGhpcy5uYW1lfSkgYmVjYXVzZSBhbHJlYWR5IGNvbXBpbGluZ2ApKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbXBpbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgLy8gQ29weSBzb3VyY2VzIGZyb20gcHJlLW1vZGlmaWVkIHRlbXBsYXRlXG4gICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHRoaXMudmVydGV4X3NvdXJjZTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmZyYWdtZW50X3NvdXJjZTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgZXh0ZW5zaW9uIGF2YWlsYWJpbGl0eVxuICAgICAgICBsZXQgZXh0ZW5zaW9ucyA9IHRoaXMuY2hlY2tFeHRlbnNpb25zKCk7XG5cbiAgICAgICAgLy8gTWFrZSBsaXN0IG9mIGRlZmluZXMgdG8gYmUgaW5qZWN0ZWQgbGF0ZXJcbiAgICAgICAgdmFyIGRlZmluZXMgPSB0aGlzLmJ1aWxkRGVmaW5lTGlzdCgpO1xuXG4gICAgICAgIC8vIEluamVjdCB1c2VyLWRlZmluZWQgYmxvY2tzIChhcmJpdHJhcnkgY29kZSBwb2ludHMgbWF0Y2hpbmcgbmFtZWQgI3ByYWdtYXMpXG4gICAgICAgIC8vIFJlcGxhY2UgYWNjb3JkaW5nIHRvIHRoaXMgcGF0dGVybjpcbiAgICAgICAgLy8gI3ByYWdtYSB0YW5ncmFtOiBba2V5XVxuICAgICAgICAvLyBlLmcuICNwcmFnbWEgdGFuZ3JhbTogZ2xvYmFsXG5cbiAgICAgICAgLy8gR2F0aGVyIGFsbCBibG9jayBjb2RlIHNuaXBwZXRzXG4gICAgICAgIHZhciBibG9ja3MgPSB0aGlzLmJ1aWxkU2hhZGVyQmxvY2tMaXN0KCk7XG4gICAgICAgIHZhciByZWdleHA7XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIGJsb2Nrcykge1xuICAgICAgICAgICAgdmFyIGJsb2NrID0gYmxvY2tzW2tleV07XG4gICAgICAgICAgICBpZiAoIWJsb2NrIHx8IChBcnJheS5pc0FycmF5KGJsb2NrKSAmJiBibG9jay5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpcnN0IGZpbmQgY29kZSByZXBsYWNlIHBvaW50cyBpbiBzaGFkZXJzXG4gICAgICAgICAgICByZWdleHAgPSBuZXcgUmVnRXhwKCdeXFxcXHMqI3ByYWdtYVxcXFxzK3RhbmdyYW06XFxcXHMrJyArIGtleSArICdcXFxccyokJywgJ20nKTtcbiAgICAgICAgICAgIHZhciBpbmplY3RfdmVydGV4ID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLm1hdGNoKHJlZ2V4cCk7XG4gICAgICAgICAgICB2YXIgaW5qZWN0X2ZyYWdtZW50ID0gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UubWF0Y2gocmVnZXhwKTtcblxuICAgICAgICAgICAgLy8gQXZvaWQgbmV0d29yayByZXF1ZXN0IGlmIG5vdGhpbmcgdG8gcmVwbGFjZVxuICAgICAgICAgICAgaWYgKGluamVjdF92ZXJ0ZXggPT0gbnVsbCAmJiBpbmplY3RfZnJhZ21lbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb21iaW5lIGFsbCBibG9ja3MgaW50byBvbmUgc3RyaW5nXG4gICAgICAgICAgICB2YXIgc291cmNlID0gJyc7XG4gICAgICAgICAgICBibG9jay5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTWFyayBzdGFydCBhbmQgZW5kIG9mIGVhY2ggYmxvY2sgd2l0aCBtZXRhZGF0YSAod2hpY2ggY2FuIGJlIGV4dHJhY3RlZCBmcm9tXG4gICAgICAgICAgICAgICAgLy8gZmluYWwgc291cmNlIGZvciBlcnJvciBoYW5kbGluZywgZGVidWdnaW5nLCBldGMuKVxuICAgICAgICAgICAgICAgIGxldCBtYXJrID0gYCR7dmFsLnNjb3BlfSwgJHt2YWwua2V5fSwgJHt2YWwubnVtfWA7XG4gICAgICAgICAgICAgICAgc291cmNlICs9IGBcXG4vLyB0YW5ncmFtLWJsb2NrLXN0YXJ0OiAke21hcmt9XFxuYDtcbiAgICAgICAgICAgICAgICBzb3VyY2UgKz0gdmFsLnNvdXJjZTtcbiAgICAgICAgICAgICAgICBzb3VyY2UgKz0gYFxcbi8vIHRhbmdyYW0tYmxvY2stZW5kOiAke21hcmt9XFxuYDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBJbmplY3RcbiAgICAgICAgICAgIGlmIChpbmplY3RfdmVydGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UucmVwbGFjZShyZWdleHAsIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5qZWN0X2ZyYWdtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLnJlcGxhY2UocmVnZXhwLCBzb3VyY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgYSAjZGVmaW5lIGZvciB0aGlzIGluamVjdGlvbiBwb2ludFxuICAgICAgICAgICAgZGVmaW5lc1snVEFOR1JBTV9CTE9DS18nICsga2V5LnJlcGxhY2UoL1tcXHMtXSsvZywgJ18nKS50b1VwcGVyQ2FzZSgpXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhbi11cCBhbnkgI3ByYWdtYXMgdGhhdCB3ZXJlbid0IHJlcGxhY2VkICh0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzKVxuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UucmVwbGFjZShyZV9wcmFnbWEsICcnKTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZS5yZXBsYWNlKHJlX3ByYWdtYSwgJycpO1xuXG4gICAgICAgIC8vIERldGVjdCB1bmlmb3JtIGRlZmluaXRpb25zLCBpbmplY3QgYW55IG1pc3Npbmcgb25lc1xuICAgICAgICB0aGlzLmVuc3VyZVVuaWZvcm1zKHRoaXMuZGVwZW5kZW50X3VuaWZvcm1zKTtcblxuICAgICAgICAvLyBCdWlsZCAmIGluamVjdCBleHRlbnNpb25zICYgZGVmaW5lc1xuICAgICAgICAvLyBUaGlzIGlzIGRvbmUgKmFmdGVyKiBjb2RlIGluamVjdGlvbiBzbyB0aGF0IHdlIGNhbiBhZGQgZGVmaW5lcyBmb3Igd2hpY2ggY29kZSBwb2ludHMgd2VyZSBpbmplY3RlZFxuICAgICAgICBsZXQgcHJlY2lzaW9uID0gJyc7XG4gICAgICAgIGxldCBoaWdoID0gdGhpcy5nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQodGhpcy5nbC5GUkFHTUVOVF9TSEFERVIsIHRoaXMuZ2wuSElHSF9GTE9BVCk7XG4gICAgICAgIGlmIChoaWdoICYmIGhpZ2gucHJlY2lzaW9uID4gMCkge1xuICAgICAgICAgICAgcHJlY2lzaW9uID0gJ3ByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJlY2lzaW9uID0gJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xcbic7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX1ZFUlRFWF9TSEFERVInXSA9IHRydWU7XG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fRlJBR01FTlRfU0hBREVSJ10gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID1cbiAgICAgICAgICAgIHByZWNpc2lvbiArXG4gICAgICAgICAgICBTaGFkZXJQcm9ncmFtLmJ1aWxkRGVmaW5lU3RyaW5nKGRlZmluZXMpICtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZTtcblxuICAgICAgICAvLyBQcmVjaXNpb24gcXVhbGlmaWVyIG9ubHkgdmFsaWQgaW4gZnJhZ21lbnQgc2hhZGVyXG4gICAgICAgIC8vIE5COiAnI2V4dGVuc2lvbicgc3RhdGVtZW50cyBhZGRlZCB0byBmcmFnbWVudCBzaGFkZXIgb25seSwgYXMgSUUxMSB0aHJvd3MgZXJyb3Igd2hlbiB0aGV5IGFwcGVhciBpblxuICAgICAgICAvLyB2ZXJ0ZXggc2hhZGVyIChldmVuIHdoZW4gZ3VhcmRlZCBieSAjaWZkZWYpLCBhbmQgbm8gV2ViR0wgZXh0ZW5zaW9ucyByZXF1aXJlICcjZXh0ZW5zaW9uJyBpbiB2ZXJ0ZXggc2hhZGVyc1xuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX1ZFUlRFWF9TSEFERVInXSA9IGZhbHNlO1xuICAgICAgICBkZWZpbmVzWydUQU5HUkFNX0ZSQUdNRU5UX1NIQURFUiddID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UgPVxuICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbS5idWlsZEV4dGVuc2lvblN0cmluZyhleHRlbnNpb25zKSArXG4gICAgICAgICAgICBwcmVjaXNpb24gK1xuICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbS5idWlsZERlZmluZVN0cmluZyhkZWZpbmVzKSArXG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZTtcblxuICAgICAgICAvLyBSZXBsYWNlIG11bHRpLWxpbmUgYmFja3NsYXNoZXNcbiAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLnJlcGxhY2UocmVfY29udGludWVfbGluZSwgJycpO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLnJlcGxhY2UocmVfY29udGludWVfbGluZSwgJycpO1xuXG4gICAgICAgIC8vIENvbXBpbGUgJiBzZXQgdW5pZm9ybXMgdG8gY2FjaGVkIHZhbHVlc1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gU2hhZGVyUHJvZ3JhbS51cGRhdGVQcm9ncmFtKHRoaXMuZ2wsIHRoaXMucHJvZ3JhbSwgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlLCB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yO1xuXG4gICAgICAgICAgICAvLyBzaGFkZXIgZXJyb3IgaW5mb1xuICAgICAgICAgICAgaWYgKGVycm9yLnR5cGUgPT09ICd2ZXJ0ZXgnIHx8IGVycm9yLnR5cGUgPT09ICdmcmFnbWVudCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRlcl9lcnJvcnMgPSBlcnJvci5lcnJvcnM7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkZXJfZXJyb3JzLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGUudHlwZSA9IGVycm9yLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGUuYmxvY2sgPSB0aGlzLmJsb2NrKGVycm9yLnR5cGUsIGUubGluZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93KG5ldyBFcnJvcihgU2hhZGVyUHJvZ3JhbS5jb21waWxlKCk6IHByb2dyYW0gJHt0aGlzLmlkfSAoJHt0aGlzLm5hbWV9KSBlcnJvcjpgLCBlcnJvcikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51c2UoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVW5pZm9ybXMoKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoQXR0cmlidXRlcygpO1xuICAgIH1cblxuICAgIC8vIE1ha2UgbGlzdCBvZiBkZWZpbmVzIChnbG9iYWwsIHRoZW4gcHJvZ3JhbS1zcGVjaWZpYylcbiAgICBidWlsZERlZmluZUxpc3QoKSB7XG4gICAgICAgIHZhciBkLCBkZWZpbmVzID0ge307XG4gICAgICAgIGZvciAoZCBpbiBTaGFkZXJQcm9ncmFtLmRlZmluZXMpIHtcbiAgICAgICAgICAgIGRlZmluZXNbZF0gPSBTaGFkZXJQcm9ncmFtLmRlZmluZXNbZF07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChkIGluIHRoaXMuZGVmaW5lcykge1xuICAgICAgICAgICAgZGVmaW5lc1tkXSA9IHRoaXMuZGVmaW5lc1tkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lcztcbiAgICB9XG5cbiAgICAvLyBNYWtlIGxpc3Qgb2Ygc2hhZGVyIGJsb2NrcyAoZ2xvYmFsLCB0aGVuIHByb2dyYW0tc3BlY2lmaWMpXG4gICAgYnVpbGRTaGFkZXJCbG9ja0xpc3QoKSB7XG4gICAgICAgIGxldCBrZXksIGJsb2NrcyA9IHt9O1xuXG4gICAgICAgIC8vIEdsb2JhbCBibG9ja3NcbiAgICAgICAgZm9yIChrZXkgaW4gU2hhZGVyUHJvZ3JhbS5ibG9ja3MpIHtcbiAgICAgICAgICAgIGJsb2Nrc1trZXldID0gW107XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgYmxvY2tzW2tleV0ucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4uU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XS5tYXAoKHNvdXJjZSwgbnVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBrZXksIHNvdXJjZSwgbnVtLCBzY29wZTogJ1NoYWRlclByb2dyYW0nIH07XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldID0gW3sga2V5LCBzb3VyY2U6IFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0sIG51bTogMCwgc2NvcGU6ICdTaGFkZXJQcm9ncmFtJyB9XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb2dyYW0tc3BlY2lmaWMgYmxvY2tzXG4gICAgICAgIGZvciAoa2V5IGluIHRoaXMuYmxvY2tzKSB7XG4gICAgICAgICAgICBibG9ja3Nba2V5XSA9IGJsb2Nrc1trZXldIHx8IFtdO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmJsb2Nrc1trZXldKSkge1xuICAgICAgICAgICAgICAgIGxldCBzY29wZXMgPSAodGhpcy5ibG9ja19zY29wZXMgJiYgdGhpcy5ibG9ja19zY29wZXNba2V5XSkgfHwgW107XG4gICAgICAgICAgICAgICAgbGV0IGN1cl9zY29wZSA9IG51bGwsIG51bSA9IDA7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiPTA7IGIgPCB0aGlzLmJsb2Nrc1trZXldLmxlbmd0aDsgYisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvdW50IGJsb2NrcyByZWxhdGl2ZSB0byBjdXJyZW50IHNjb3BlXG4gICAgICAgICAgICAgICAgICAgIGlmIChzY29wZXNbYl0gIT09IGN1cl9zY29wZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3Njb3BlID0gc2NvcGVzW2JdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLmJsb2Nrc1trZXldW2JdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGU6IGN1cl9zY29wZSB8fCB0aGlzLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbnVtKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkcmVzcyBkaXNjcmVwYW5jeSBpbiBhcnJheSB2cy4gc2luZ2xlLXZhbHVlIGJsb2Nrc1xuICAgICAgICAgICAgICAgIC8vIHN0eWxlcyBhc3N1bWUgYXJyYXkgd2hlbiB0cmFja2luZyBibG9jayBzY29wZXNcbiAgICAgICAgICAgICAgICBibG9ja3Nba2V5XS5wdXNoKHsga2V5LCBzb3VyY2U6IHRoaXMuYmxvY2tzW2tleV0sIG51bTogMCwgc2NvcGU6IHRoaXMubmFtZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmxvY2tzO1xuICAgIH1cblxuICAgIC8vIERldGVjdCB1bmlmb3JtIGRlZmluaXRpb25zLCBpbmplY3QgYW55IG1pc3Npbmcgb25lc1xuICAgIGVuc3VyZVVuaWZvcm1zKHVuaWZvcm1zKSB7XG4gICAgICAgIGlmICghdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2cyA9IHN0cmlwKHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSk7XG4gICAgICAgIHZhciBmcyA9IHN0cmlwKHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlKTtcbiAgICAgICAgdmFyIGluamVjdCwgdnNfaW5qZWN0aW9ucyA9IFtdLCBmc19pbmplY3Rpb25zID0gW107XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIG1pc3NpbmcgdW5pZm9ybSBkZWZpbml0aW9uc1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHVuaWZvcm1zKSB7XG4gICAgICAgICAgICBpbmplY3QgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBDaGVjayB2ZXJ0ZXggc2hhZGVyXG4gICAgICAgICAgICBpZiAoIUdMU0wuaXNVbmlmb3JtRGVmaW5lZChuYW1lLCB2cykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWluamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBpbmplY3QgPSBHTFNMLmRlZmluZVVuaWZvcm0obmFtZSwgdW5pZm9ybXNbbmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFByb2dyYW0gJHt0aGlzLm5hbWV9OiAke25hbWV9IG5vdCBkZWZpbmVkIGluIHZlcnRleCBzaGFkZXIsIGluamVjdGluZzogJyR7aW5qZWN0fSdgKTtcbiAgICAgICAgICAgICAgICB2c19pbmplY3Rpb25zLnB1c2goaW5qZWN0KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2sgZnJhZ21lbnQgc2hhZGVyXG4gICAgICAgICAgICBpZiAoIUdMU0wuaXNVbmlmb3JtRGVmaW5lZChuYW1lLCBmcykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWluamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBpbmplY3QgPSBHTFNMLmRlZmluZVVuaWZvcm0obmFtZSwgdW5pZm9ybXNbbmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFByb2dyYW0gJHt0aGlzLm5hbWV9OiAke25hbWV9IG5vdCBkZWZpbmVkIGluIGZyYWdtZW50IHNoYWRlciwgaW5qZWN0aW5nOiAnJHtpbmplY3R9J2ApO1xuICAgICAgICAgICAgICAgIGZzX2luamVjdGlvbnMucHVzaChpbmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5qZWN0IG1pc3NpbmcgdW5pZm9ybXNcbiAgICAgICAgLy8gTk9URTogdGhlc2UgYXJlIGluamVjdGVkIGF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgc2hhZGVycywgZXZlbiBiZWZvcmUgYW55ICNkZWZpbmVzIG9yICNwcmFnbWFzIGFyZSBhZGRlZFxuICAgICAgICAvLyB0aGlzIGNvdWxkIGNhdXNlIHNvbWUgaXNzdWVzIHdpdGggY2VydGFpbiAjcHJhZ21hcywgb3Igb3RoZXIgZnVuY3Rpb25zIHRoYXQgbWlnaHQgZXhwZWN0ICNkZWZpbmVzXG4gICAgICAgIGlmICh2c19pbmplY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHZzX2luamVjdGlvbnMuam9pbignXFxuJykgKyB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnNfaW5qZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IGZzX2luamVjdGlvbnMuam9pbignXFxuJykgKyB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCB1bmlmb3JtcyBmcm9tIGEgSlMgb2JqZWN0LCB3aXRoIGluZmVycmVkIHR5cGVzXG4gICAgc2V0VW5pZm9ybXModW5pZm9ybXMsIHJlc2V0X3RleHR1cmVfdW5pdCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBvbmx5IHVwZGF0ZSB1bmlmb3JtcyB3aGVuIGNoYW5nZWRcblxuICAgICAgICAvLyBUZXh0dXJlIHVuaXRzIG11c3QgYmUgdHJhY2tlZCBhbmQgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgdGV4dHVyZSBzYW1wbGVyIHVuaWZvcm0gaXMgc2V0LlxuICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgdGV4dHVyZSB1bml0IGlzIHJlc2V0IHRvIDAgZWFjaCB0aW1lIHNldFVuaWZvcm1zIGlzIGNhbGxlZCwgYnV0IHRoZXkgY2FuXG4gICAgICAgIC8vIGFsc28gYmUgcHJlc2VydmVkLCBmb3IgZXhhbXBsZSBpbiBjYXNlcyB3aGVyZSBtdWx0aXBsZSBjYWxscyB0byBzZXRVbmlmb3JtcyBhcmUgZXhwZWN0ZWRcbiAgICAgICAgLy8gKGUuZy4gcHJvZ3JhbS1zcGVjaWZpYyB1bmlmb3JtcyBmb2xsb3dlZCBieSBtZXNoLXNwZWNpZmljIG9uZXMpLlxuICAgICAgICBpZiAocmVzZXRfdGV4dHVyZV91bml0KSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmVfdW5pdCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSB1bmlmb3JtIHR5cGVzIGFuZCB2YWx1ZXMgZnJvbSB0aGUgSlMgb2JqZWN0XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEdMU0wucGFyc2VVbmlmb3Jtcyh1bmlmb3Jtcyk7XG5cbiAgICAgICAgLy8gU2V0IGVhY2ggdW5pZm9ybVxuICAgICAgICBmb3IgKGxldCB1PTA7IHUgPCBwYXJzZWQubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaWZvcm0gPSBwYXJzZWRbdV07XG4gICAgICAgICAgICBpZiAodW5pZm9ybS50eXBlID09PSAnc2FtcGxlcjJEJykge1xuICAgICAgICAgICAgICAgIC8vIEZvciB0ZXh0dXJlcywgd2UgbmVlZCB0byB0cmFjayB0ZXh0dXJlIHVuaXRzLCBzbyB3ZSBoYXZlIGEgc3BlY2lhbCBzZXR0ZXJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRleHR1cmVVbmlmb3JtKHVuaWZvcm0ubmFtZSwgdW5pZm9ybS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuaWZvcm0odW5pZm9ybS5tZXRob2QsIHVuaWZvcm0ubmFtZSwgdW5pZm9ybS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWNoZSBzb21lIG9yIGFsbCB1bmlmb3JtIHZhbHVlcyBzbyB0aGV5IGNhbiBiZSByZXN0b3JlZFxuICAgIHNhdmVVbmlmb3JtcyhzdWJzZXQpIHtcbiAgICAgICAgbGV0IHVuaWZvcm1zID0gc3Vic2V0IHx8IHRoaXMudW5pZm9ybXM7XG4gICAgICAgIGZvciAobGV0IHUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1t1XTtcbiAgICAgICAgICAgIGlmICh1bmlmb3JtKSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybS5zYXZlZF92YWx1ZSA9IHVuaWZvcm0udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zYXZlZF90ZXh0dXJlX3VuaXQgPSB0aGlzLnRleHR1cmVfdW5pdCB8fCAwO1xuICAgIH1cblxuICAgIC8vIFJlc3RvcmUgc29tZSBvciBhbGwgdW5pZm9ybXMgdG8gc2F2ZWQgdmFsdWVzXG4gICAgcmVzdG9yZVVuaWZvcm1zKHN1YnNldCkge1xuICAgICAgICBsZXQgdW5pZm9ybXMgPSBzdWJzZXQgfHwgdGhpcy51bmlmb3JtcztcbiAgICAgICAgZm9yIChsZXQgdSBpbiB1bmlmb3Jtcykge1xuICAgICAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW3VdO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm0gJiYgdW5pZm9ybS5zYXZlZF92YWx1ZSkge1xuICAgICAgICAgICAgICAgIHVuaWZvcm0udmFsdWUgPSB1bmlmb3JtLnNhdmVkX3ZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVW5pZm9ybSh1bmlmb3JtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRleHR1cmVfdW5pdCA9IHRoaXMuc2F2ZWRfdGV4dHVyZV91bml0IHx8IDA7XG4gICAgfVxuXG4gICAgLy8gU2V0IGEgdGV4dHVyZSB1bmlmb3JtLCBmaW5kcyB0ZXh0dXJlIGJ5IG5hbWUgb3IgY3JlYXRlcyBhIG5ldyBvbmVcbiAgICBzZXRUZXh0dXJlVW5pZm9ybSh1bmlmb3JtX25hbWUsIHRleHR1cmVfbmFtZSkge1xuICAgICAgICB2YXIgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdGV4dHVyZV9uYW1lXTtcbiAgICAgICAgaWYgKHRleHR1cmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYENhbm5vdCBmaW5kIHRleHR1cmUgJyR7dGV4dHVyZV9uYW1lfSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRleHR1cmUuYmluZCh0aGlzLnRleHR1cmVfdW5pdCk7XG4gICAgICAgIHRoaXMudW5pZm9ybSgnMWknLCB1bmlmb3JtX25hbWUsIHRoaXMudGV4dHVyZV91bml0KTtcbiAgICAgICAgdGhpcy50ZXh0dXJlX3VuaXQrKzsgLy8gVE9ETzogdHJhY2sgbWF4IHRleHR1cmUgdW5pdHMgYW5kIGxvZy90aHJvdyBlcnJvcnNcbiAgICB9XG5cbiAgICAvLyBleDogcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAncG9zaXRpb24nLCBbeCwgeSwgel0pO1xuICAgIC8vIFRPRE86IG9ubHkgdXBkYXRlIHVuaWZvcm1zIHdoZW4gY2hhbmdlZFxuICAgIHVuaWZvcm0obWV0aG9kLCBuYW1lLCB2YWx1ZSkgeyAvLyAndmFsdWUnIGlzIGEgbWV0aG9kLWFwcHJvcHJpYXRlIGFyZ3VtZW50cyBsaXN0XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51bmlmb3Jtc1tuYW1lXSA9IHRoaXMudW5pZm9ybXNbbmFtZV0gfHwge307XG4gICAgICAgIGxldCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1tuYW1lXTtcbiAgICAgICAgdW5pZm9ybS5uYW1lID0gbmFtZTtcbiAgICAgICAgaWYgKHVuaWZvcm0ubG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdW5pZm9ybS5sb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5pZm9ybS5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHVuaWZvcm0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVVbmlmb3JtKHVuaWZvcm0pO1xuICAgIH1cblxuICAgIC8vIFNldCBhIHNpbmdsZSB1bmlmb3JtXG4gICAgdXBkYXRlVW5pZm9ybSh1bmlmb3JtKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF1bmlmb3JtIHx8IHVuaWZvcm0ubG9jYXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51c2UoKTtcbiAgICAgICAgdGhpcy5jb21taXRVbmlmb3JtKHVuaWZvcm0pO1xuICAgIH1cblxuICAgIC8vIENvbW1pdHMgdGhlIHVuaWZvcm0gdG8gdGhlIEdQVVxuICAgIGNvbW1pdFVuaWZvcm0odW5pZm9ybSl7XG4gICAgICAgIGxldCBsb2NhdGlvbiA9IHVuaWZvcm0ubG9jYXRpb247XG4gICAgICAgIGxldCB2YWx1ZSA9IHVuaWZvcm0udmFsdWU7XG5cbiAgICAgICAgc3dpdGNoICh1bmlmb3JtLm1ldGhvZCkge1xuICAgICAgICAgICAgY2FzZSAnMWknOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFpKGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxZic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzJmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0yZihsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzNmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0zZihsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICc0Zic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtNGYobG9jYXRpb24sIHZhbHVlWzBdLCB2YWx1ZVsxXSwgdmFsdWVbMl0sIHZhbHVlWzNdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzFpdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWl2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczaXYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTNpdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzJmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMmZ2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICczZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTNmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnNGZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm00ZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ01hdHJpeDNmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBmYWxzZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnTWF0cml4NGZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXg0ZnYobG9jYXRpb24sIGZhbHNlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWZyZXNoIHVuaWZvcm0gbG9jYXRpb25zIGFuZCBzZXQgdG8gbGFzdCBjYWNoZWQgdmFsdWVzXG4gICAgcmVmcmVzaFVuaWZvcm1zKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIHUgaW4gdGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW3VdO1xuICAgICAgICAgICAgdW5pZm9ybS5sb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgdSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVuaWZvcm0odW5pZm9ybSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWZyZXNoQXR0cmlidXRlcygpIHtcbiAgICAgICAgLy8gdmFyIGxlbiA9IHRoaXMuZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnByb2dyYW0sIHRoaXMuZ2wuQUNUSVZFX0FUVFJJQlVURVMpO1xuICAgICAgICAvLyBmb3IgKHZhciBpPTA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAvLyAgICAgdmFyIGEgPSB0aGlzLmdsLmdldEFjdGl2ZUF0dHJpYih0aGlzLnByb2dyYW0sIGkpO1xuICAgICAgICAvLyB9XG4gICAgICAgIHRoaXMuYXR0cmlicyA9IHt9O1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgbG9jYXRpb24gb2YgYSB2ZXJ0ZXggYXR0cmlidXRlXG4gICAgYXR0cmlidXRlKG5hbWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXR0cmliID0gKHRoaXMuYXR0cmlic1tuYW1lXSA9IHRoaXMuYXR0cmlic1tuYW1lXSB8fCB7fSk7XG4gICAgICAgIGlmIChhdHRyaWIubG9jYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF0dHJpYjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYi5uYW1lID0gbmFtZTtcbiAgICAgICAgYXR0cmliLmxvY2F0aW9uID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sIG5hbWUpO1xuXG4gICAgICAgIC8vIHZhciBpbmZvID0gdGhpcy5nbC5nZXRBY3RpdmVBdHRyaWIodGhpcy5wcm9ncmFtLCBhdHRyaWIubG9jYXRpb24pO1xuICAgICAgICAvLyBhdHRyaWIudHlwZSA9IGluZm8udHlwZTtcbiAgICAgICAgLy8gYXR0cmliLnNpemUgPSBpbmZvLnNpemU7XG5cbiAgICAgICAgcmV0dXJuIGF0dHJpYjtcbiAgICB9XG5cbiAgICAvLyBHZXQgc2hhZGVyIHNvdXJjZSBhcyBzdHJpbmdcbiAgICBzb3VyY2UodHlwZSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3ZlcnRleCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2ZyYWdtZW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IHNoYWRlciBzb3VyY2UgYXMgYXJyYXkgb2YgbGluZSBzdHJpbmdzXG4gICAgbGluZXModHlwZSkge1xuICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zb3VyY2UodHlwZSk7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3BsaXQoJ1xcbicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBHZXQgYSBzcGVjaWZpYyBsaW5lIGZyb20gc2hhZGVyIHNvdXJjZVxuICAgIGxpbmUodHlwZSwgbnVtKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLmxpbmVzKHR5cGUpO1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlW251bV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgaW5mbyBvbiB3aGljaCBzaGFkZXIgYmxvY2sgKGlmIGFueSkgYSBwYXJ0aWN1bGFyIGxpbmUgbnVtYmVyIGluIGEgc2hhZGVyIGlzIGluXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGluZm8gaWYgYSBibG9jayBpcyBmb3VuZDogeyBuYW1lLCBsaW5lLCBzb3VyY2UgfVxuICAgIC8vICBzY29wZTogd2hlcmUgdGhlIHNoYWRlciBibG9jayBvcmlnaW5hdGVkLCBlaXRoZXIgYSBzdHlsZSBuYW1lLCBvciBnbG9iYWwgc3VjaCBhcyBTaGFkZXJQcm9ncmFtXG4gICAgLy8gIG5hbWU6IHNoYWRlciBibG9jayBuYW1lIChlLmcuICdjb2xvcicsICdwb3NpdGlvbicsICdnbG9iYWwnKVxuICAgIC8vICBudW06IHRoZSBibG9jayBudW1iZXIgKndpdGhpbiogbG9jYWwgc2NvcGUgKGUuZy4gaWYgYSBzdHlsZSBoYXMgbXVsdGlwbGUgJ2NvbG9yJyBibG9ja3MpXG4gICAgLy8gIGxpbmU6IGxpbmUgbnVtYmVyICp3aXRoaW4qIHRoZSBzaGFkZXIgYmxvY2sgKG5vdCB0aGUgd2hvbGUgc2hhZGVyIHByb2dyYW0pLCB1c2VmdWwgZm9yIGVycm9yIGhpZ2hsaWdodGluZ1xuICAgIC8vICBzb3VyY2U6IHRoZSBjb2RlIGZvciB0aGUgbGluZVxuICAgIC8vIE5PVEU6IHRoaXMgZG9lcyBhIGJydXRlZm9yY2UgbG9vcCBvdmVyIHRoZSBzaGFkZXIgc291cmNlIGFuZCBsb29rcyBmb3Igc2hhZGVyIGJsb2NrIHN0YXJ0L2VuZCBtYXJrZXJzXG4gICAgLy8gV2UgY291bGQgdHJhY2sgbGluZSByYW5nZXMgZm9yIHNoYWRlciBibG9ja3MgYXMgdGhleSBhcmUgaW5zZXJ0ZWQsIGJ1dCBhcyB0aGlzIGNvZGUgaXMgb25seSB1c2VkIGZvclxuICAgIC8vIGVycm9yIGhhbmRsaW5nIG9uIGNvbXBpbGF0aW9uIGZhaWx1cmUsIGl0IHdhcyBzaW1wbGVyIHRvIGtlZXAgaXQgc2VwYXJhdGUgdGhhbiB0byBidXJkZW4gdGhlIGNvcmVcbiAgICAvLyBjb21waWxhdGlvbiBwYXRoLlxuICAgIGJsb2NrKHR5cGUsIG51bSkge1xuICAgICAgICBsZXQgbGluZXMgPSB0aGlzLmxpbmVzKHR5cGUpO1xuICAgICAgICBsZXQgYmxvY2s7XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG51bSAmJiBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbaV07XG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSBsaW5lLm1hdGNoKC9cXC9cXC8gdGFuZ3JhbS1ibG9jay1zdGFydDogKFtBLVphLXowLTlfLV0rKSwgKFtBLVphLXowLTlfLV0rKSwgKFxcZCspLyk7XG4gICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgY3VycmVudCBibG9ja1xuICAgICAgICAgICAgICAgIGJsb2NrID0ge1xuICAgICAgICAgICAgICAgICAgICBzY29wZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hdGNoWzJdLFxuICAgICAgICAgICAgICAgICAgICBudW06IG1hdGNoWzNdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hdGNoID0gbGluZS5tYXRjaCgvXFwvXFwvIHRhbmdyYW0tYmxvY2stZW5kOiAoW0EtWmEtejAtOV8tXSspLCAoW0EtWmEtejAtOV8tXSspLCAoXFxkKykvKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBibG9jayA9IG51bGw7IC8vIGNsZWFyIGN1cnJlbnQgYmxvY2tcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBsaW5lICMgYW5kIGNvbnRlbnRcbiAgICAgICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgICAgIC8vIGluaXQgdG8gLTEgc28gdGhhdCBsaW5lIDAgaXMgZmlyc3QgYWN0dWFsIGxpbmUgb2YgYmxvY2sgY29kZSwgYWZ0ZXIgY29tbWVudCBtYXJrZXJcbiAgICAgICAgICAgICAgICBibG9jay5saW5lID0gKGJsb2NrLmxpbmUgPT0gbnVsbCkgPyAtMSA6IGJsb2NrLmxpbmUgKyAxO1xuICAgICAgICAgICAgICAgIGJsb2NrLnNvdXJjZSA9IGxpbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJsb2NrO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgbGlzdCBvZiBhdmFpbGFibGUgZXh0ZW5zaW9ucyBmcm9tIHRob3NlIHJlcXVlc3RlZFxuICAgIC8vIFNldHMgaW50ZXJuYWwgI2RlZmluZXMgaW5kaWNhdGluZyBhdmFpbGFiaWxpdHkgb2YgZWFjaCByZXF1ZXN0ZWQgZXh0ZW5zaW9uXG4gICAgY2hlY2tFeHRlbnNpb25zKCkge1xuICAgICAgICBsZXQgZXh0cyA9IFtdO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbnMuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBleHQgPSBnZXRFeHRlbnNpb24odGhpcy5nbCwgbmFtZSk7XG4gICAgICAgICAgICBsZXQgZGVmID0gYFRBTkdSQU1fRVhURU5TSU9OXyR7bmFtZX1gO1xuXG4gICAgICAgICAgICB0aGlzLmRlZmluZXNbZGVmXSA9IChleHQgIT0gbnVsbCk7XG5cbiAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICBleHRzLnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYENvdWxkIG5vdCBlbmFibGUgZXh0ZW5zaW9uICcke25hbWV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGV4dHM7XG4gICAgfVxuXG59XG5cblxuLy8gU3RhdGljIG1ldGhvZHMgYW5kIHN0YXRlXG5TaGFkZXJQcm9ncmFtLmlkID0gMDsgICAgICAgICAgICAgICAgICAgLy8gYXNzaWduIGVhY2ggcHJvZ3JhbSBhIHVuaXF1ZSBpZFxuU2hhZGVyUHJvZ3JhbS5jdXJyZW50ID0gbnVsbDsgICAgICAgICAgIC8vIGN1cnJlbnRseSBib3VuZCBwcm9ncmFtXG5cbi8vIEdsb2JhbCBjb25maWcgYXBwbGllZCB0byBhbGwgcHJvZ3JhbXMgKGR1cGxpY2F0ZSBwcm9wZXJ0aWVzIGZvciBhIHNwZWNpZmljIHByb2dyYW0gd2lsbCB0YWtlIHByZWNlZGVuY2UpXG5TaGFkZXJQcm9ncmFtLmRlZmluZXMgPSB7fTtcblNoYWRlclByb2dyYW0uYmxvY2tzID0ge307XG5cbi8vIFJlc2V0IHByb2dyYW0gYW5kIHNoYWRlciBjYWNoZXNcblNoYWRlclByb2dyYW0ucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgU2hhZGVyUHJvZ3JhbS5wcm9ncmFtc19ieV9zb3VyY2UgPSB7fTsgIC8vIEdMIHByb2dyYW0gb2JqZWN0cyBieSBleGFjdCB2ZXJ0ZXggKyBmcmFnbWVudCBzaGFkZXIgc291cmNlXG4gICAgU2hhZGVyUHJvZ3JhbS5zaGFkZXJzX2J5X3NvdXJjZSA9IHt9OyAgIC8vIEdMIHNoYWRlciBvYmplY3RzIGJ5IGV4YWN0IHNvdXJjZVxufTtcblNoYWRlclByb2dyYW0ucmVzZXQoKTtcblxuLy8gVHVybiBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzIGludG8gc2luZ2xlIHN0cmluZyBvZiAjZGVmaW5lIHN0YXRlbWVudHNcblNoYWRlclByb2dyYW0uYnVpbGREZWZpbmVTdHJpbmcgPSBmdW5jdGlvbiAoZGVmaW5lcykge1xuICAgIHZhciBkZWZpbmVfc3RyID0gXCJcIjtcbiAgICBmb3IgKHZhciBkIGluIGRlZmluZXMpIHtcbiAgICAgICAgaWYgKGRlZmluZXNbZF0gPT0gbnVsbCB8fCBkZWZpbmVzW2RdID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlZmluZXNbZF0gPT09ICdib29sZWFuJyAmJiBkZWZpbmVzW2RdID09PSB0cnVlKSB7IC8vIGJvb2xlYW5zIGFyZSBzaW1wbGUgZGVmaW5lcyB3aXRoIG5vIHZhbHVlXG4gICAgICAgICAgICBkZWZpbmVfc3RyICs9IFwiI2RlZmluZSBcIiArIGQgKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmVzW2RdID09PSAnbnVtYmVyJyAmJiBNYXRoLmZsb29yKGRlZmluZXNbZF0pID09PSBkZWZpbmVzW2RdKSB7IC8vIGludCB0byBmbG9hdCBjb252ZXJzaW9uIHRvIHNhdGlzZnkgR0xTTCBmbG9hdHNcbiAgICAgICAgICAgIGRlZmluZV9zdHIgKz0gXCIjZGVmaW5lIFwiICsgZCArIFwiIFwiICsgZGVmaW5lc1tkXS50b0ZpeGVkKDEpICsgXCJcXG5cIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gYW55IG90aGVyIGZsb2F0IG9yIHN0cmluZyB2YWx1ZVxuICAgICAgICAgICAgZGVmaW5lX3N0ciArPSBcIiNkZWZpbmUgXCIgKyBkICsgXCIgXCIgKyBkZWZpbmVzW2RdICsgXCJcXG5cIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVmaW5lX3N0cjtcbn07XG5cbi8vIFR1cm4gYSBsaXN0IG9mIGV4dGVuc2lvbiBuYW1lcyBpbnRvIHNpbmdsZSBzdHJpbmcgb2YgI2V4dGVuc2lvbiBzdGF0ZW1lbnRzXG5TaGFkZXJQcm9ncmFtLmJ1aWxkRXh0ZW5zaW9uU3RyaW5nID0gZnVuY3Rpb24gKGV4dGVuc2lvbnMpIHtcbiAgICBleHRlbnNpb25zID0gZXh0ZW5zaW9ucyB8fCBbXTtcbiAgICBsZXQgc3RyID0gXCJcIjtcbiAgICBleHRlbnNpb25zLmZvckVhY2goZXh0ID0+IHtcbiAgICAgICAgc3RyICs9IGAjaWZkZWYgR0xfJHtleHR9XFxuI2V4dGVuc2lvbiBHTF8ke2V4dH0gOiBlbmFibGVcXG4jZW5kaWZcXG5gO1xuICAgIH0pO1xuICAgIHJldHVybiBzdHI7XG59O1xuXG5TaGFkZXJQcm9ncmFtLmFkZEJsb2NrID0gZnVuY3Rpb24gKGtleSwgLi4uYmxvY2tzKSB7XG4gICAgU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSA9IFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0gfHwgW107XG4gICAgU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XS5wdXNoKC4uLmJsb2Nrcyk7XG59O1xuXG4vLyBSZW1vdmUgYWxsIGdsb2JhbCBzaGFkZXIgYmxvY2tzIGZvciBhIGdpdmVuIGtleVxuU2hhZGVyUHJvZ3JhbS5yZW1vdmVCbG9jayA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldID0gW107XG59O1xuXG5TaGFkZXJQcm9ncmFtLnJlcGxhY2VCbG9jayA9IGZ1bmN0aW9uIChrZXksIC4uLmJsb2Nrcykge1xuICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soa2V5KTtcbiAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKGtleSwgLi4uYmxvY2tzKTtcbn07XG5cbi8vIENvbXBpbGUgJiBsaW5rIGEgV2ViR0wgcHJvZ3JhbSBmcm9tIHByb3ZpZGVkIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZXNcbi8vIHVwZGF0ZSBhIHByb2dyYW0gaWYgb25lIGlzIHBhc3NlZCBpbi4gQ3JlYXRlIG9uZSBpZiBub3QuIEFsZXJ0IGFuZCBkb24ndCB1cGRhdGUgYW55dGhpbmcgaWYgdGhlIHNoYWRlcnMgZG9uJ3QgY29tcGlsZS5cblNoYWRlclByb2dyYW0udXBkYXRlUHJvZ3JhbSA9IGZ1bmN0aW9uIChnbCwgcHJvZ3JhbSwgdmVydGV4X3NoYWRlcl9zb3VyY2UsIGZyYWdtZW50X3NoYWRlcl9zb3VyY2UpIHtcbiAgICAvLyBQcm9ncmFtIHdpdGggdGhpcyBleGFjdCB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlciBzb3VyY2VzIGFscmVhZHkgY2FjaGVkP1xuICAgIGxldCBrZXkgPSBnbC5fdGFuZ3JhbV9pZCArICc6OicgKyB2ZXJ0ZXhfc2hhZGVyX3NvdXJjZSArICc6OicgKyBmcmFnbWVudF9zaGFkZXJfc291cmNlO1xuICAgIGlmIChTaGFkZXJQcm9ncmFtLnByb2dyYW1zX2J5X3NvdXJjZVtrZXldKSB7XG4gICAgICAgIGxvZygndHJhY2UnLCAnUmV1c2luZyBpZGVudGljYWwgc291cmNlIEdMIHByb2dyYW0gb2JqZWN0Jyk7XG4gICAgICAgIHJldHVybiBTaGFkZXJQcm9ncmFtLnByb2dyYW1zX2J5X3NvdXJjZVtrZXldO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIHZhciB2ZXJ0ZXhfc2hhZGVyID0gU2hhZGVyUHJvZ3JhbS5jcmVhdGVTaGFkZXIoZ2wsIHZlcnRleF9zaGFkZXJfc291cmNlLCBnbC5WRVJURVhfU0hBREVSKTtcbiAgICAgICAgdmFyIGZyYWdtZW50X3NoYWRlciA9IFNoYWRlclByb2dyYW0uY3JlYXRlU2hhZGVyKGdsLCBmcmFnbWVudF9zaGFkZXJfc291cmNlLCBnbC5GUkFHTUVOVF9TSEFERVIpO1xuICAgIH1cbiAgICBjYXRjaChlcnIpIHtcbiAgICAgICAgbG9nKCdlcnJvcicsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIGdsLnVzZVByb2dyYW0obnVsbCk7XG4gICAgaWYgKHByb2dyYW0gIT0gbnVsbCkge1xuICAgICAgICB2YXIgb2xkX3NoYWRlcnMgPSBnbC5nZXRBdHRhY2hlZFNoYWRlcnMocHJvZ3JhbSk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBvbGRfc2hhZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZ2wuZGV0YWNoU2hhZGVyKHByb2dyYW0sIG9sZF9zaGFkZXJzW2ldKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG4gICAgfVxuXG4gICAgaWYgKHZlcnRleF9zaGFkZXIgPT0gbnVsbCB8fCBmcmFnbWVudF9zaGFkZXIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcHJvZ3JhbTtcbiAgICB9XG5cbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4X3NoYWRlcik7XG4gICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50X3NoYWRlcik7XG5cbiAgICBnbC5saW5rUHJvZ3JhbShwcm9ncmFtKTtcblxuICAgIC8vIFRPRE86IHJlZmVyZW5jZSBjb3VudCBhbmQgZGVsZXRlIHNoYWRlciBvYmplY3RzIHdoZW4gbm8gcHJvZ3JhbXMgcmVmZXJlbmNlIHRoZW1cblxuICAgIGlmICghZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUykpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgV2ViR0wgcHJvZ3JhbSBlcnJvcjpcbiAgICAgICAgICAgIFZBTElEQVRFX1NUQVRVUzogJHtnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLlZBTElEQVRFX1NUQVRVUyl9XG4gICAgICAgICAgICBFUlJPUjogJHtnbC5nZXRFcnJvcigpfVxuICAgICAgICAgICAgLS0tIFZlcnRleCBTaGFkZXIgLS0tXG4gICAgICAgICAgICAke3ZlcnRleF9zaGFkZXJfc291cmNlfVxuICAgICAgICAgICAgLS0tIEZyYWdtZW50IFNoYWRlciAtLS1cbiAgICAgICAgICAgICR7ZnJhZ21lbnRfc2hhZGVyX3NvdXJjZX1gKTtcblxuICAgICAgICBsZXQgZXJyb3IgPSB7IHR5cGU6ICdwcm9ncmFtJywgbWVzc2FnZSB9O1xuICAgICAgICBsb2coJ2Vycm9yJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIFNoYWRlclByb2dyYW0ucHJvZ3JhbXNfYnlfc291cmNlW2tleV0gPSBwcm9ncmFtOyAvLyBjYWNoZSBieSBleGFjdCBzb3VyY2VcbiAgICByZXR1cm4gcHJvZ3JhbTtcbn07XG5cbi8vIENvbXBpbGUgYSB2ZXJ0ZXggb3IgZnJhZ21lbnQgc2hhZGVyIGZyb20gcHJvdmlkZWQgc291cmNlXG5TaGFkZXJQcm9ncmFtLmNyZWF0ZVNoYWRlciA9IGZ1bmN0aW9uIChnbCwgc291cmNlLCBzdHlwZSkge1xuICAgIC8vIFByb2dyYW0gd2l0aCBpZGVudGljYWwgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIgc291cmNlcyBhbHJlYWR5IGNhY2hlZD9cbiAgICBsZXQga2V5ID0gZ2wuX3RhbmdyYW1faWQgKyAnOjonICsgc291cmNlO1xuICAgIGlmIChTaGFkZXJQcm9ncmFtLnNoYWRlcnNfYnlfc291cmNlW2tleV0pIHtcbiAgICAgICAgbG9nKCd0cmFjZScsICdSZXVzaW5nIGlkZW50aWNhbCBzb3VyY2UgR0wgc2hhZGVyIG9iamVjdCcpO1xuICAgICAgICByZXR1cm4gU2hhZGVyUHJvZ3JhbS5zaGFkZXJzX2J5X3NvdXJjZVtrZXldO1xuICAgIH1cblxuICAgIGxldCBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoc3R5cGUpO1xuXG4gICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlKTtcbiAgICBnbC5jb21waWxlU2hhZGVyKHNoYWRlcik7XG5cbiAgICBpZiAoIWdsLmdldFNoYWRlclBhcmFtZXRlcihzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSkge1xuICAgICAgICBsZXQgdHlwZSA9IChzdHlwZSA9PT0gZ2wuVkVSVEVYX1NIQURFUiA/ICd2ZXJ0ZXgnIDogJ2ZyYWdtZW50Jyk7XG4gICAgICAgIGxldCBtZXNzYWdlID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpO1xuICAgICAgICBsZXQgZXJyb3JzID0gcGFyc2VTaGFkZXJFcnJvcnMobWVzc2FnZSk7XG4gICAgICAgIHRocm93IHsgdHlwZSwgbWVzc2FnZSwgZXJyb3JzIH07XG4gICAgfVxuXG4gICAgU2hhZGVyUHJvZ3JhbS5zaGFkZXJzX2J5X3NvdXJjZVtrZXldID0gc2hhZGVyOyAvLyBjYWNoZSBieSBleGFjdCBzb3VyY2VcbiAgICByZXR1cm4gc2hhZGVyO1xufTtcbiIsIi8vIFRleHR1cmUgbWFuYWdlbWVudFxuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBzdWJzY3JpYmVNaXhpbiBmcm9tICcuLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuLi91dGlscy93b3JrZXJfYnJva2VyJztcblxuLy8gR0wgdGV4dHVyZSB3cmFwcGVyIG9iamVjdCBmb3Iga2VlcGluZyB0cmFjayBvZiBhIGdsb2JhbCBzZXQgb2YgdGV4dHVyZXMsIGtleWVkIGJ5IGEgdW5pcXVlIHVzZXItZGVmaW5lZCBuYW1lXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXh0dXJlIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCBuYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmluZCgpO1xuXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMucmV0YWluX2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb25maWdfdHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7ICAgIC8vIGEgUHJvbWlzZSBvYmplY3QgdG8gdHJhY2sgdGhlIGxvYWRpbmcgc3RhdGUgb2YgdGhpcyB0ZXh0dXJlXG4gICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7ICAgIC8vIHN1Y2Nlc3NmdWxseSBsb2FkZWQgYXMgZXhwZWN0ZWRcbiAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSBvcHRpb25zLmZpbHRlcmluZztcbiAgICAgICAgdGhpcy5zcHJpdGVzID0gb3B0aW9ucy5zcHJpdGVzO1xuICAgICAgICB0aGlzLnRleGNvb3JkcyA9IHt9OyAgICAvLyBzcHJpdGUgVVZzIChbMCwgMV0gcmFuZ2UpXG4gICAgICAgIHRoaXMuc2l6ZXMgPSB7fTsgICAgICAgIC8vIHNwcml0ZSBzaXplcyAocGl4ZWwgc2l6ZSlcblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGEgMS1waXhlbCBibGFjayB0ZXh0dXJlIHNvIHdlIGNhbiBzYWZlbHkgcmVuZGVyIHdoaWxlIHdlIHdhaXQgZm9yIGFuIGltYWdlIHRvIGxvYWRcbiAgICAgICAgLy8gU2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NzIyMjQ3L3dlYmdsLXdhaXQtZm9yLXRleHR1cmUtdG8tbG9hZFxuICAgICAgICB0aGlzLnNldERhdGEoMSwgMSwgbmV3IFVpbnQ4QXJyYXkoWzAsIDAsIDAsIDI1NV0pLCB7IGZpbHRlcmluZzogJ25lYXJlc3QnIH0pO1xuXG4gICAgICAgIC8vIERlc3Ryb3kgcHJldmlvdXMgdGV4dHVyZSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0pIHtcbiAgICAgICAgICAgIC8vIFByZXNlcnZlIHByZXZpb3VzIHJldGFpbiBjb3VudFxuICAgICAgICAgICAgdGhpcy5yZXRhaW5fY291bnQgPSBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0ucmV0YWluX2NvdW50O1xuICAgICAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLm5hbWVdLnJldGFpbl9jb3VudCA9IDA7IC8vIGFsbG93IHRvIGJlIGZyZWVkXG4gICAgICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0uZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FjaGUgdGV4dHVyZSBpbnN0YW5jZSBhbmQgZGVmaW5pdGlvblxuICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0gPSB0aGlzO1xuICAgICAgICBUZXh0dXJlLnRleHR1cmVfY29uZmlnc1t0aGlzLm5hbWVdID0gT2JqZWN0LmFzc2lnbih7IG5hbWUgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5sb2FkKG9wdGlvbnMpO1xuICAgICAgICBsb2coJ3RyYWNlJywgYGNyZWF0aW5nIFRleHR1cmUgJHt0aGlzLm5hbWV9YCk7XG4gICAgfVxuXG4gICAgLy8gRGVzdHJveSBhIHNpbmdsZSB0ZXh0dXJlIGluc3RhbmNlXG4gICAgZGVzdHJveSh7IGZvcmNlIH0gPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5fY291bnQgPiAwICYmICFmb3JjZSkge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiBkZXN0cm95aW5nIHRleHR1cmUgd2l0aCByZXRhaW4gY291bnQgb2YgJyR7dGhpcy5yZXRhaW5fY291bnR9J2ApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nbC5kZWxldGVUZXh0dXJlKHRoaXMudGV4dHVyZSk7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IG51bGw7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRhdGE7XG4gICAgICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgICAgIGRlbGV0ZSBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV07XG4gICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgbG9nKCd0cmFjZScsIGBkZXN0cm95aW5nIFRleHR1cmUgJHt0aGlzLm5hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0YWluICgpIHtcbiAgICAgICAgdGhpcy5yZXRhaW5fY291bnQrKztcbiAgICB9XG5cbiAgICByZWxlYXNlICgpIHtcbiAgICAgICAgaWYgKHRoaXMucmV0YWluX2NvdW50IDw9IDApIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBgVGV4dHVyZSAnJHt0aGlzLm5hbWV9JzogcmVsZWFzaW5nIHRleHR1cmUgd2l0aCByZXRhaW4gY291bnQgb2YgJyR7dGhpcy5yZXRhaW5fY291bnR9J2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXRhaW5fY291bnQtLTtcbiAgICAgICAgaWYgKHRoaXMucmV0YWluX2NvdW50IDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZCh1bml0ID0gMCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChUZXh0dXJlLmFjdGl2ZVVuaXQgIT09IHVuaXQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuYWN0aXZlVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkUwICsgdW5pdCk7XG4gICAgICAgICAgICBUZXh0dXJlLmFjdGl2ZVVuaXQgPSB1bml0O1xuICAgICAgICAgICAgVGV4dHVyZS5ib3VuZFRleHR1cmUgPSBudWxsOyAvLyB0ZXh0dXJlIG11c3QgYmUgcmUtYm91bmQgd2hlbiB1bml0IGNoYW5nZXNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChUZXh0dXJlLmJvdW5kVGV4dHVyZSAhPT0gdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICAgICAgICAgIFRleHR1cmUuYm91bmRUZXh0dXJlID0gdGhpcy50ZXh0dXJlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZChvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZyB8fCBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMudXJsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5jb25maWdfdHlwZSA9ICd1cmwnO1xuICAgICAgICAgICAgdGhpcy5zZXRVcmwob3B0aW9ucy51cmwsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWdfdHlwZSA9ICdlbGVtZW50JztcbiAgICAgICAgICAgIHRoaXMuc2V0RWxlbWVudChvcHRpb25zLmVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLndpZHRoICYmIG9wdGlvbnMuaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gJ2RhdGEnO1xuICAgICAgICAgICAgdGhpcy5zZXREYXRhKG9wdGlvbnMud2lkdGgsIG9wdGlvbnMuaGVpZ2h0LCBvcHRpb25zLmRhdGEsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID1cbiAgICAgICAgICAgICh0aGlzLmxvYWRpbmcgJiYgdGhpcy5sb2FkaW5nLnRoZW4oKCkgPT4geyB0aGlzLmNhbGN1bGF0ZVNwcml0ZXMoKTsgcmV0dXJuIHRoaXM7IH0pKSB8fFxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGV4dHVyZSBmcm9tIGFuIHVybFxuICAgIHNldFVybCh1cmwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXJsID0gdXJsOyAvLyBzYXZlIFVSTCByZWZlcmVuY2UgKHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiBlbGVtZW50IGlzIGxvYWRlZCBiZWxvdylcbiAgICAgICAgdGhpcy5zb3VyY2UgPSB0aGlzLnVybDtcbiAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9ICd1cmwnO1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RWxlbWVudChpbWFnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiBmYWlsZWQgdG8gbG9hZCB1cmw6ICcke3RoaXMuc291cmNlfSdgLCBlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd3YXJuaW5nJywgeyBtZXNzYWdlOiBgRmFpbGVkIHRvIGxvYWQgdGV4dHVyZSBmcm9tICR7dGhpcy5zb3VyY2V9YCwgZXJyb3I6IGUsIHRleHR1cmU6IG9wdGlvbnMgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9IGUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFdhcm4gYW5kIHJlc29sdmUgb24gZXJyb3JcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiBmYWlsZWQgdG8gbG9hZCB1cmw6ICcke3RoaXMuc291cmNlfSdgLCBlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3dhcm5pbmcnLCB7IG1lc3NhZ2U6IGBGYWlsZWQgdG8gbG9hZCB0ZXh0dXJlIGZyb20gJHt0aGlzLnNvdXJjZX1gLCBlcnJvcjogZSwgdGV4dHVyZTogb3B0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gU2FmYXJpIGhhcyBhIGJ1ZyBsb2FkaW5nIGRhdGEtVVJMIGltYWdlcyB3aXRoIENPUlMgZW5hYmxlZCwgc28gaXQgbXVzdCBiZSBkaXNhYmxlZCBpbiB0aGF0IGNhc2VcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjM5NzhcbiAgICAgICAgICAgIGlmICghKFV0aWxzLmlzU2FmYXJpKCkgJiYgdGhpcy5zb3VyY2Uuc2xpY2UoMCwgNSkgPT09ICdkYXRhOicpKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2UuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gdGhpcy5zb3VyY2U7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGV4dHVyZSB0byBhIHJhdyBpbWFnZSBidWZmZXJcbiAgICBzZXREYXRhKHdpZHRoLCBoZWlnaHQsIGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgIHRoaXMuc291cmNlID0gZGF0YTtcbiAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9ICdkYXRhJztcblxuICAgICAgICAvLyBDb252ZXJ0IHJlZ3VsYXIgYXJyYXkgdG8gdHlwZWQgYXJyYXlcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zb3VyY2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG5ldyBVaW50OEFycmF5KHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnNldEZpbHRlcmluZyhvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBTZXRzIHRoZSB0ZXh0dXJlIHRvIHRyYWNrIGEgZWxlbWVudCAoY2FudmFzL2ltYWdlKVxuICAgIHNldEVsZW1lbnQoZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgICBsZXQgZWwgPSBlbGVtZW50O1xuXG4gICAgICAgIC8vIGEgc3RyaW5nIGVsZW1lbnQgaXMgaW50ZXJwZXRlZCBhcyBhIENTUyBzZWxlY3RvclxuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHxcbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8XG4gICAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBlbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VfdHlwZSA9ICdlbGVtZW50JztcblxuICAgICAgICAgICAgdGhpcy51cGRhdGUob3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLnNldEZpbHRlcmluZyhvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbXNnID0gYHRoZSAnZWxlbWVudCcgcGFyYW1ldGVyIChcXGBlbGVtZW50OiAke0pTT04uc3RyaW5naWZ5KGVsKX1cXGApIG11c3QgYmUgYSBDU1MgYDtcbiAgICAgICAgICAgIG1zZyArPSBgc2VsZWN0b3Igc3RyaW5nLCBvciBhIDxjYW52YXM+LCA8aW1hZ2U+IG9yIDx2aWRlbz4gb2JqZWN0YDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiAke21zZ31gLCBvcHRpb25zKTtcbiAgICAgICAgICAgIFRleHR1cmUudHJpZ2dlcignd2FybmluZycsIHsgbWVzc2FnZTogYEZhaWxlZCB0byBsb2FkIHRleHR1cmUgYmVjYXVzZSAke21zZ31gLCB0ZXh0dXJlOiBvcHRpb25zIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gVXBsb2FkcyBjdXJyZW50IGltYWdlIG9yIGJ1ZmZlciB0byB0aGUgR1BVIChjYW4gYmUgdXNlZCB0byB1cGRhdGUgYW5pbWF0ZWQgdGV4dHVyZXMgb24gdGhlIGZseSlcbiAgICB1cGRhdGUob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5iaW5kKCk7XG4gICAgICAgIHRoaXMuZ2wucGl4ZWxTdG9yZWkodGhpcy5nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCAob3B0aW9ucy5VTlBBQ0tfRkxJUF9ZX1dFQkdMID09PSBmYWxzZSA/IGZhbHNlIDogdHJ1ZSkpO1xuICAgICAgICB0aGlzLmdsLnBpeGVsU3RvcmVpKHRoaXMuZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCBvcHRpb25zLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCB8fCBmYWxzZSk7XG5cbiAgICAgICAgLy8gSW1hZ2Ugb3IgQ2FudmFzIGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMuc291cmNlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgdGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50IHx8XG4gICAgICAgICAgICAodGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ICYmIHRoaXMuc291cmNlLmNvbXBsZXRlKSkge1xuXG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5zb3VyY2Uud2lkdGg7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuc291cmNlLmhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuZ2wudGV4SW1hZ2UyRCh0aGlzLmdsLlRFWFRVUkVfMkQsIDAsIHRoaXMuZ2wuUkdCQSwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSYXcgaW1hZ2UgYnVmZmVyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc291cmNlX3R5cGUgPT09ICdkYXRhJykge1xuICAgICAgICAgICAgdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFRleHR1cmUudHJpZ2dlcigndXBkYXRlJywgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lcyBhcHByb3ByaWF0ZSBmaWx0ZXJpbmcgbW9kZVxuICAgIHNldEZpbHRlcmluZyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLmZpbHRlcmluZyA9IG9wdGlvbnMuZmlsdGVyaW5nIHx8ICdsaW5lYXInO1xuXG4gICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIHRoaXMuYmluZCgpO1xuXG4gICAgICAgIC8vIEZvciBwb3dlci1vZi0yIHRleHR1cmVzLCB0aGUgZm9sbG93aW5nIHByZXNldHMgYXJlIGF2YWlsYWJsZTpcbiAgICAgICAgLy8gbWlwbWFwOiBsaW5lYXIgYmxlbmQgZnJvbSBuZWFyZXN0IG1pcFxuICAgICAgICAvLyBsaW5lYXI6IGxpbmVhciBibGVuZCBmcm9tIG9yaWdpbmFsIGltYWdlIChubyBtaXBzKVxuICAgICAgICAvLyBuZWFyZXN0OiBuZWFyZXN0IHBpeGVsIGZyb20gb3JpZ2luYWwgaW1hZ2UgKG5vIG1pcHMsICdibG9ja3knIGxvb2spXG4gICAgICAgIGlmIChVdGlscy5pc1Bvd2VyT2YyKHRoaXMud2lkdGgpICYmIFV0aWxzLmlzUG93ZXJPZjIodGhpcy5oZWlnaHQpKSB7XG4gICAgICAgICAgICB0aGlzLnBvd2VyX29mXzIgPSB0cnVlO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgb3B0aW9ucy5URVhUVVJFX1dSQVBfUyB8fCAob3B0aW9ucy5yZXBlYXQgJiYgZ2wuUkVQRUFUKSB8fCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIG9wdGlvbnMuVEVYVFVSRV9XUkFQX1QgfHwgKG9wdGlvbnMucmVwZWF0ICYmIGdsLlJFUEVBVCkgfHwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbHRlcmluZyA9PT0gJ21pcG1hcCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICdtaXBtYXAnO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVJfTUlQTUFQX0xJTkVBUik7IC8vIFRPRE86IHVzZSB0cmlsaW5lYXIgZmlsdGVyaW5nIGJ5IGRlZnVhbHQgaW5zdGVhZD9cbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbGluZWFyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ2xpbmVhcic7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmZpbHRlcmluZyA9PT0gJ25lYXJlc3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbmVhcmVzdCc7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlYkdMIGhhcyBzdHJpY3QgcmVxdWlyZW1lbnRzIG9uIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzOlxuICAgICAgICAgICAgLy8gTm8gbWlwbWFwcyBhbmQgbXVzdCBjbGFtcCB0byBlZGdlXG4gICAgICAgICAgICB0aGlzLnBvd2VyX29mXzIgPSBmYWxzZTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbHRlcmluZyA9PT0gJ25lYXJlc3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbmVhcmVzdCc7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyBkZWZhdWx0IHRvIGxpbmVhciBmb3Igbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXNcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICdsaW5lYXInO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd1cGRhdGUnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBQcmUtY2FsYyBzcHJpdGUgcmVnaW9ucyBmb3IgYSB0ZXh0dXJlIHNwcml0ZSBpbiBVViBbMCwgMV0gc3BhY2VcbiAgICBjYWxjdWxhdGVTcHJpdGVzKCkge1xuICAgICAgICBpZiAodGhpcy5zcHJpdGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzIGluIHRoaXMuc3ByaXRlcykge1xuICAgICAgICAgICAgICAgIGxldCBzcHJpdGUgPSB0aGlzLnNwcml0ZXNbc107XG5cbiAgICAgICAgICAgICAgICAvLyBNYXAgWzAsIDBdIHRvIFsxLCAxXSBjb29yZHMgdG8gdGhlIGFwcHJvcHJpYXRlIHNwcml0ZSBzdWItYXJlYSBvZiB0aGUgdGV4dHVyZVxuICAgICAgICAgICAgICAgIHRoaXMudGV4Y29vcmRzW3NdID0gVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUoXG4gICAgICAgICAgICAgICAgICAgIFtzcHJpdGVbMF0sIHNwcml0ZVsxXV0sXG4gICAgICAgICAgICAgICAgICAgIFtzcHJpdGVbMl0sIHNwcml0ZVszXV0sXG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLndpZHRoLCB0aGlzLmhlaWdodF1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gUGl4ZWwgc2l6ZSBvZiBzcHJpdGVcbiAgICAgICAgICAgICAgICB0aGlzLnNpemVzW3NdID0gW3Nwcml0ZVsyXSwgc3ByaXRlWzNdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5cbi8vIFN0YXRpYy9jbGFzcyBtZXRob2RzIGFuZCBzdGF0ZVxuXG5UZXh0dXJlLmNyZWF0ZSA9IGZ1bmN0aW9uIChnbCwgbmFtZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgVGV4dHVyZShnbCwgbmFtZSwgb3B0aW9ucyk7XG59O1xuXG5UZXh0dXJlLnJldGFpbiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRleHR1cmUudGV4dHVyZXNbbmFtZV0pIHtcbiAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1tuYW1lXS5yZXRhaW4oKTtcbiAgICB9XG59O1xuXG5UZXh0dXJlLnJlbGVhc2UgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmIChUZXh0dXJlLnRleHR1cmVzW25hbWVdKSB7XG4gICAgICAgIFRleHR1cmUudGV4dHVyZXNbbmFtZV0ucmVsZWFzZSgpO1xuICAgIH1cbn07XG5cbi8vIERlc3Ryb3kgYWxsIHRleHR1cmUgaW5zdGFuY2VzIGZvciBhIGdpdmVuIEdMIGNvbnRleHRcblRleHR1cmUuZGVzdHJveSA9IGZ1bmN0aW9uIChnbCkge1xuICAgIHZhciB0ZXh0dXJlcyA9IE9iamVjdC5rZXlzKFRleHR1cmUudGV4dHVyZXMpO1xuICAgIHRleHR1cmVzLmZvckVhY2godCA9PiB7XG4gICAgICAgIHZhciB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1t0XTtcbiAgICAgICAgaWYgKHRleHR1cmUuZ2wgPT09IGdsKSB7XG4gICAgICAgICAgICB0ZXh0dXJlLmRlc3Ryb3koeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuLy8gR2V0IHNwcml0ZSBwaXhlbCBzaXplIGFuZCBVVnNcblRleHR1cmUuZ2V0U3ByaXRlSW5mbyA9IGZ1bmN0aW9uICh0ZXhuYW1lLCBzcHJpdGUpIHtcbiAgICBsZXQgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdGV4bmFtZV07XG4gICAgcmV0dXJuIHRleHR1cmUgJiYgeyBzaXplOiB0ZXh0dXJlLnNpemVzW3Nwcml0ZV0sIHRleGNvb3JkczogdGV4dHVyZS50ZXhjb29yZHNbc3ByaXRlXSB9O1xufTtcblxuLy8gUmUtc2NhbGUgVVZzIGZyb20gWzAsIDFdIHJhbmdlIHRvIGEgc21hbGxlciBhcmVhIHdpdGhpbiB0aGUgaW1hZ2VcblRleHR1cmUuZ2V0VGV4Y29vcmRzRm9yU3ByaXRlID0gZnVuY3Rpb24gKGFyZWFfb3JpZ2luLCBhcmVhX3NpemUsIHRleF9zaXplKSB7XG4gICAgdmFyIGFyZWFfb3JpZ2luX3kgPSB0ZXhfc2l6ZVsxXSAtIGFyZWFfb3JpZ2luWzFdIC0gYXJlYV9zaXplWzFdO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgYXJlYV9vcmlnaW5bMF0gLyB0ZXhfc2l6ZVswXSxcbiAgICAgICAgYXJlYV9vcmlnaW5feSAvIHRleF9zaXplWzFdLFxuICAgICAgICAoYXJlYV9zaXplWzBdICsgYXJlYV9vcmlnaW5bMF0pIC8gdGV4X3NpemVbMF0sXG4gICAgICAgIChhcmVhX3NpemVbMV0gKyBhcmVhX29yaWdpbl95KSAvIHRleF9zaXplWzFdXG4gICAgXTtcbn07XG5cbi8vIENyZWF0ZSBhIHNldCBvZiB0ZXh0dXJlcyBrZXllZCBpbiBhbiBvYmplY3Rcbi8vIE9wdGlvbmFsbHkgbG9hZCBlYWNoIGlmIGl0IGhhcyBhIFVSTCBzcGVjaWZpZWRcblRleHR1cmUuY3JlYXRlRnJvbU9iamVjdCA9IGZ1bmN0aW9uIChnbCwgdGV4dHVyZXMpIHtcbiAgICBsZXQgbG9hZGluZyA9IFtdO1xuICAgIGlmICh0ZXh0dXJlcykge1xuICAgICAgICBmb3IgKGxldCB0ZXhuYW1lIGluIHRleHR1cmVzKSB7XG4gICAgICAgICAgICBsZXQgY29uZmlnID0gdGV4dHVyZXNbdGV4bmFtZV07XG5cbiAgICAgICAgICAgIC8vIElmIHRleHR1cmUgYWxyZWFkeSBleGlzdHMgYW5kIGRlZmluaXRpb24gaGFzbid0IGNoYW5nZWQsIG5vIG5lZWQgdG8gcmUtY3JlYXRlXG4gICAgICAgICAgICAvLyBOb3RlOiB0byBhdm9pZCBmbGlja2VyIHdoZW4gb3RoZXIgdGV4dHVyZXMvc2NlbmUgaXRlbXMgY2hhbmdlXG4gICAgICAgICAgICBpZiAoIVRleHR1cmUuY2hhbmdlZCh0ZXhuYW1lLCBjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS5jcmVhdGUoZ2wsIHRleG5hbWUsIGNvbmZpZyk7XG4gICAgICAgICAgICBsb2FkaW5nLnB1c2godGV4dHVyZS5sb2FkaW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwobG9hZGluZyk7XG59O1xuXG4vLyBDcmVhdGUgYSAnZGVmYXVsdCcgdGV4dHVyZSAoMXgxIHBpeGVsKSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXJcbi8vIChmb3IgZXhhbXBsZSB0byBwcmV2ZW50IEdMIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgdW5ib3VuZCB0ZXh0dXJlcylcblRleHR1cmUuZGVmYXVsdCA9ICdfX2RlZmF1bHQnO1xuVGV4dHVyZS5jcmVhdGVEZWZhdWx0ID0gZnVuY3Rpb24gKGdsKSB7XG4gICAgcmV0dXJuIFRleHR1cmUuY3JlYXRlKGdsLCBUZXh0dXJlLmRlZmF1bHQpO1xufTtcblxuLy8gSW5kaWNhdGUgaWYgYSB0ZXh0dXJlIGRlZmluaXRpb24gd291bGQgYmUgYSBjaGFuZ2UgZnJvbSB0aGUgY3VycmVudCBjYWNoZVxuVGV4dHVyZS5jaGFuZ2VkID0gZnVuY3Rpb24gKG5hbWUsIGNvbmZpZykge1xuICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1tuYW1lXTtcbiAgICBpZiAodGV4dHVyZSkgeyAvLyBjYWNoZWQgdGV4dHVyZVxuICAgICAgICAvLyBjYW52YXMvaW1hZ2UtYmFzZWQgdGV4dHVyZXMgYXJlIGNvbnNpZGVyZWQgZHluYW1pYyBhbmQgYWx3YXlzIHJlZnJlc2hcbiAgICAgICAgaWYgKHRleHR1cmUuY29uZmlnX3R5cGUgPT09ICdlbGVtZW50JyB8fCBjb25maWcuZWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbXBhcmUgZGVmaW5pdGlvbnNcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KFRleHR1cmUudGV4dHVyZV9jb25maWdzW25hbWVdKSA9PT1cbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KE9iamVjdC5hc3NpZ24oeyBuYW1lIH0sIGNvbmZpZykpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBHZXQgbWV0YWRhdGEgZm9yIGEgdGV4dHVyZSBieSBuYW1lXG4vLyBSZXR1cm5zIHZpYSBwcm9taXNlLCBpbiBjYXNlIHRleHR1cmUgaXMgc3RpbGwgbG9hZGluZ1xuLy8gQ2FuIGJlIGNhbGxlZCBvbiBtYWluIHRocmVhZCBmcm9tIHdvcmtlciwgdG8gc3luYyB0ZXh0dXJlIGluZm8gdG8gd29ya2VyXG5UZXh0dXJlLmdldEluZm8gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIC8vIEdldCBpbmZvIGZvciBhbGwgdGV4dHVyZXMgYnkgZGVmYXVsdFxuICAgIGlmICghbmFtZSkge1xuICAgICAgICBuYW1lID0gT2JqZWN0LmtleXMoVGV4dHVyZS50ZXh0dXJlcyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IG11bHRpcGxlIHRleHR1cmVzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG5hbWUubWFwKG4gPT4gVGV4dHVyZS5nZXRJbmZvKG4pKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHNpbmdsZSB0ZXh0dXJlXG4gICAgdmFyIHRleCA9IFRleHR1cmUudGV4dHVyZXNbbmFtZV07XG4gICAgaWYgKHRleCkge1xuICAgICAgICAvLyBXYWl0IGZvciB0aGlzIHRleHR1cmUgdG8gZmluaXNoIGxvYWRpbmcsIG9yIHJldHVybiBpbW1lZGlhdGVseVxuICAgICAgICB2YXIgbG9hZGluZyA9IHRleC5sb2FkaW5nIHx8IFByb21pc2UucmVzb2x2ZSh0ZXgpO1xuICAgICAgICByZXR1cm4gbG9hZGluZy50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFJldHVybiBhIHN1YnNldCBvZiB0ZXh0dXJlIGluZm9cbiAgICAgICAgICAgIC8vIChjb21wYXRpYmxlIHcvc3RydWN0dXJlZCBjbG9uaW5nLCBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBhIHdvcmtlcilcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGV4Lm5hbWUsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRleC53aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRleC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgc3ByaXRlczogdGV4LnNwcml0ZXMsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRzOiB0ZXgudGV4Y29vcmRzLFxuICAgICAgICAgICAgICAgIHNpemVzOiB0ZXguc2l6ZXMsXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiB0ZXguZmlsdGVyaW5nLFxuICAgICAgICAgICAgICAgIHBvd2VyX29mXzI6IHRleC5wb3dlcl9vZl8yLFxuICAgICAgICAgICAgICAgIHZhbGlkOiB0ZXgudmFsaWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gTm8gdGV4dHVyZSBmb3VuZFxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbn07XG5cbi8vIFN5bmMgdGV4dHVyZSBpbmZvIHRvIHdvcmtlclxuLy8gQ2FsbGVkIGZyb20gd29ya2VyLCBnZXRzIGluZm8gb24gb25lIG9yIG1vcmUgdGV4dHVyZXMgaW5mbyBmcm9tIG1haW4gdGhyZWFkIHZpYSByZW1vdGUgY2FsbCwgdGhlbiBzdG9yZXMgaXRcbi8vIGxvY2FsbHkgaW4gd29ya2VyLiAndGV4dHVyZXMnIGNhbiBiZSBhbiBhcnJheSBvZiB0ZXh0dXJlIG5hbWVzIHRvIHN5bmMsIG9yIGlmIG51bGwsIGFsbCB0ZXh0dXJlcyBhcmUgc3luY2VkLlxuVGV4dHVyZS5zeW5jVGV4dHVyZXNUb1dvcmtlciA9IGZ1bmN0aW9uIChuYW1lcykge1xuICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ1RleHR1cmUuZ2V0SW5mbycsIG5hbWVzKS5cbiAgICAgICAgdGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICB0ZXh0dXJlcy5mb3JFYWNoKHRleCA9PiB7XG4gICAgICAgICAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1t0ZXgubmFtZV0gPSB0ZXg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnRleHR1cmVzO1xuICAgICAgICB9KTtcbn07XG5cbi8vIFJlcG9ydCBtYXggdGV4dHVyZSBzaXplIGZvciBhIEdMIGNvbnRleHRcblRleHR1cmUuZ2V0TWF4VGV4dHVyZVNpemUgPSBmdW5jdGlvbiAoZ2wpIHtcbiAgICByZXR1cm4gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX1NJWkUpO1xufTtcblxuLy8gR2xvYmFsIHNldCBvZiB0ZXh0dXJlcywgYnkgbmFtZVxuVGV4dHVyZS50ZXh0dXJlcyA9IHt9O1xuVGV4dHVyZS50ZXh0dXJlX2NvbmZpZ3MgPSB7fTtcblRleHR1cmUuYm91bmRUZXh0dXJlID0gbnVsbDtcblRleHR1cmUuYWN0aXZlVW5pdCA9IG51bGw7XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ1RleHR1cmUnLCBUZXh0dXJlKTtcbnN1YnNjcmliZU1peGluKFRleHR1cmUpO1xuIiwiLy8gQ3JlYXRlcyBhIFZlcnRleCBBcnJheSBPYmplY3QgaWYgdGhlIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUsIG9yIGZhbGxzIGJhY2sgb24gc3RhbmRhcmQgYXR0cmlidXRlIGNhbGxzXG5cbmltcG9ydCBnZXRFeHRlbnNpb24gZnJvbSAnLi9leHRlbnNpb25zJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuZXhwb3J0IGRlZmF1bHQge1xuXG4gICAgZGlzYWJsZWQ6IGZhbHNlLCAvLyBzZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIFZBT3MgZXZlbiBpZiBleHRlbnNpb24gaXMgYXZhaWxhYmxlXG4gICAgYm91bmRfdmFvOiBbXSwgICAvLyBjdXJyZW50bHkgYm91bmQgVkFPLCBieSBHTCBjb250ZXh0XG5cbiAgICBpbml0IChnbCkge1xuICAgICAgICBsZXQgZXh0O1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgZXh0ID0gZ2V0RXh0ZW5zaW9uKGdsLCAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nKCdpbmZvJywgJ1ZlcnRleCBBcnJheSBPYmplY3QgZXh0ZW5zaW9uIGF2YWlsYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZGlzYWJsZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGxvZygnd2FybicsICdWZXJ0ZXggQXJyYXkgT2JqZWN0IGV4dGVuc2lvbiBOT1QgYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCAnVmVydGV4IEFycmF5IE9iamVjdCBleHRlbnNpb24gZm9yY2UgZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjcmVhdGUgKGdsLCBzZXR1cCwgdGVhcmRvd24pIHtcbiAgICAgICAgbGV0IHZhbyA9IHt9O1xuICAgICAgICB2YW8uc2V0dXAgPSBzZXR1cDtcbiAgICAgICAgdmFvLnRlYXJkb3duID0gdGVhcmRvd247XG5cbiAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbihnbCwgJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG4gICAgICAgIGlmIChleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFvLl92YW8gPSBleHQuY3JlYXRlVmVydGV4QXJyYXlPRVMoKTtcbiAgICAgICAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVModmFvLl92YW8pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFvLnNldHVwKHRydWUpO1xuXG4gICAgICAgIHJldHVybiB2YW87XG4gICAgfSxcblxuICAgIGdldEN1cnJlbnRCaW5kaW5nIChnbCkge1xuICAgICAgICBsZXQgYm91bmQgPSB0aGlzLmJvdW5kX3Zhby5maWx0ZXIoZSA9PiBlWzBdID09PSBnbClbMF07XG4gICAgICAgIHJldHVybiBib3VuZCAmJiBib3VuZFsxXTtcbiAgICB9LFxuXG4gICAgc2V0Q3VycmVudEJpbmRpbmcgKGdsLCB2YW8pIHtcbiAgICAgICAgbGV0IGJvdW5kX3ZhbyA9IHRoaXMuYm91bmRfdmFvO1xuICAgICAgICBsZXQgYmluZGluZyA9IGJvdW5kX3Zhby5maWx0ZXIoZSA9PiBlWzBdID09PSBnbClbMF07XG4gICAgICAgIGlmIChiaW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIGJvdW5kX3Zhby5wdXNoKFtnbCwgdmFvXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBiaW5kaW5nWzFdID0gdmFvO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGJpbmQgKGdsLCB2YW8pIHtcbiAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbihnbCwgJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG4gICAgICAgIGlmICh2YW8gIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGV4dCAhPSBudWxsICYmIHZhby5fdmFvICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBleHQuYmluZFZlcnRleEFycmF5T0VTKHZhby5fdmFvKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnJlbnRCaW5kaW5nKGdsLCB2YW8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFvLnNldHVwKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBib3VuZF92YW8gPSB0aGlzLmdldEN1cnJlbnRCaW5kaW5nKGdsKTtcbiAgICAgICAgICAgIGlmIChleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVMobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChib3VuZF92YW8gIT0gbnVsbCAmJiB0eXBlb2YgYm91bmRfdmFvLnRlYXJkb3duID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgYm91bmRfdmFvLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldEN1cnJlbnRCaW5kaW5nKGdsLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkZXN0cm95IChnbCwgdmFvKSB7XG4gICAgICAgIGxldCBleHQgPSBnZXRFeHRlbnNpb24oZ2wsICdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuICAgICAgICBpZiAoZXh0ICE9IG51bGwgJiYgdmFvICE9IG51bGwgJiYgdmFvLl92YW8gIT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0LmRlbGV0ZVZlcnRleEFycmF5T0VTKHZhby5fdmFvKTtcbiAgICAgICAgICAgIHZhby5fdmFvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBkZXN0cm95IGlzIGEgbm8tb3AgaWYgVkFPIGV4dGVuc2lvbiBpc24ndCBhdmFpbGFibGVcbiAgICB9XG5cbn07XG4iLCIvLyBNYW5hZ2UgcmVuZGVyaW5nIGZvciBwcmltaXRpdmVzXG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWZXJ0ZXhBcnJheU9iamVjdCBmcm9tICcuL3Zhbyc7XG5cbi8vIEEgc2luZ2xlIG1lc2gvVkJPLCBkZXNjcmliZWQgYnkgYSB2ZXJ0ZXggbGF5b3V0LCB0aGF0IGNhbiBiZSBkcmF3biB3aXRoIG9uZSBvciBtb3JlIHByb2dyYW1zXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWQk9NZXNoICB7XG5cbiAgICBjb25zdHJ1Y3RvcihnbCwgdmVydGV4X2RhdGEsIGVsZW1lbnRfZGF0YSwgdmVydGV4X2xheW91dCwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMudmVydGV4X2RhdGEgPSB2ZXJ0ZXhfZGF0YTsgLy8gdHlwZWQgYXJyYXlcbiAgICAgICAgdGhpcy5lbGVtZW50X2RhdGEgPSBlbGVtZW50X2RhdGE7IC8vIHR5cGVkIGFycmF5XG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IHZlcnRleF9sYXlvdXQ7XG4gICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuZHJhd19tb2RlID0gb3B0aW9ucy5kcmF3X21vZGUgfHwgdGhpcy5nbC5UUklBTkdMRVM7XG4gICAgICAgIHRoaXMuZGF0YV91c2FnZSA9IG9wdGlvbnMuZGF0YV91c2FnZSB8fCB0aGlzLmdsLlNUQVRJQ19EUkFXO1xuICAgICAgICB0aGlzLnZlcnRpY2VzX3Blcl9nZW9tZXRyeSA9IDM7IC8vIFRPRE86IHN1cHBvcnQgbGluZXMsIHN0cmlwLCBmYW4sIGV0Yy5cbiAgICAgICAgdGhpcy51bmlmb3JtcyA9IG9wdGlvbnMudW5pZm9ybXM7XG4gICAgICAgIHRoaXMucmV0YWluID0gb3B0aW9ucy5yZXRhaW4gfHwgZmFsc2U7IC8vIHdoZXRoZXIgdG8gcmV0YWluIG1lc2ggZGF0YSBpbiBDUFUgYWZ0ZXIgdXBsb2FkaW5nIHRvIEdQVVxuICAgICAgICB0aGlzLmNyZWF0ZWRfYXQgPSArbmV3IERhdGUoKTtcbiAgICAgICAgdGhpcy5mYWRlX2luX3RpbWUgPSBvcHRpb25zLmZhZGVfaW5fdGltZSB8fCAwOyAvLyBvcHRpb25hbCB0aW1lIHRvIGZhZGUgaW4gbWVzaFxuXG4gICAgICAgIHRoaXMudmVydGV4X2NvdW50ID0gdGhpcy52ZXJ0ZXhfZGF0YS5ieXRlTGVuZ3RoIC8gdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZTtcbiAgICAgICAgdGhpcy52YW9zID0ge307IC8vIG1hcCBvZiBWZXJ0ZXhBcnJheU9iamVjdHMsIGtleWVkIGJ5IHByb2dyYW1cblxuICAgICAgICB0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5ID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRfZGF0YSl7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudF9jb3VudCA9IHRoaXMuZWxlbWVudF9kYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZ2VvbWV0cnlfY291bnQgPSB0aGlzLmVsZW1lbnRfY291bnQgLyB0aGlzLnZlcnRpY2VzX3Blcl9nZW9tZXRyeTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudF90eXBlID0gKHRoaXMuZWxlbWVudF9kYXRhLmNvbnN0cnVjdG9yID09PSBVaW50MTZBcnJheSkgPyB0aGlzLmdsLlVOU0lHTkVEX1NIT1JUOiB0aGlzLmdsLlVOU0lHTkVEX0lOVDtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudF9idWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuZWxlbWVudF9idWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHRoaXMuZWxlbWVudF9kYXRhLCB0aGlzLmRhdGFfdXNhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZW9tZXRyeV9jb3VudCA9IHRoaXMudmVydGV4X2NvdW50IC8gdGhpcy52ZXJ0aWNlc19wZXJfZ2VvbWV0cnk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMudmVydGV4X2J1ZmZlcik7XG4gICAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0ZXhfZGF0YSwgdGhpcy5kYXRhX3VzYWdlKTtcblxuICAgICAgICBpZiAoIXRoaXMucmV0YWluKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy52ZXJ0ZXhfZGF0YTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmVsZW1lbnRfZGF0YTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIsIGJ5IGRlZmF1bHQgd2l0aCBjdXJyZW50bHkgYm91bmQgcHJvZ3JhbSwgb3Igb3RoZXJ3aXNlIHdpdGggb3B0aW9uYWxseSBwcm92aWRlZCBvbmVcbiAgICAvLyBSZXR1cm5zIHRydWUgaWYgbWVzaCByZXF1ZXN0cyBhIHJlbmRlciBvbiBuZXh0IGZyYW1lIChlLmcuIGZvciBmYWRlIGFuaW1hdGlvbnMpXG4gICAgcmVuZGVyKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwcm9ncmFtID0gb3B0aW9ucy5wcm9ncmFtIHx8IFNoYWRlclByb2dyYW0uY3VycmVudDtcbiAgICAgICAgcHJvZ3JhbS51c2UoKTtcblxuICAgICAgICBpZiAodGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgcHJvZ3JhbS5zYXZlVW5pZm9ybXModGhpcy51bmlmb3Jtcyk7XG4gICAgICAgICAgICBwcm9ncmFtLnNldFVuaWZvcm1zKHRoaXMudW5pZm9ybXMsIGZhbHNlKTsgLy8gZG9uJ3QgcmVzZXQgdGV4dHVyZSB1bml0XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmlzaWJsZV90aW1lID0gKCtuZXcgRGF0ZSgpIC0gdGhpcy5jcmVhdGVkX2F0KSAvIDEwMDA7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV92aXNpYmxlX3RpbWUnLCB2aXNpYmxlX3RpbWUpO1xuXG4gICAgICAgIHRoaXMuYmluZChwcm9ncmFtKTtcblxuICAgICAgICBpZiAodGhpcy50b2dnbGVfZWxlbWVudF9hcnJheSl7XG4gICAgICAgICAgICB0aGlzLmdsLmRyYXdFbGVtZW50cyh0aGlzLmRyYXdfbW9kZSwgdGhpcy5lbGVtZW50X2NvdW50LCB0aGlzLmVsZW1lbnRfdHlwZSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdsLmRyYXdBcnJheXModGhpcy5kcmF3X21vZGUsIDAsIHRoaXMudmVydGV4X2NvdW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmJpbmQodGhpcy5nbCwgbnVsbCk7XG5cbiAgICAgICAgaWYgKHRoaXMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHByb2dyYW0ucmVzdG9yZVVuaWZvcm1zKHRoaXMudW5pZm9ybXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVxdWVzdCBuZXh0IHJlbmRlciBpZiBtZXNoIGlzIGZhZGluZyBpblxuICAgICAgICByZXR1cm4gKHZpc2libGVfdGltZSA8IHRoaXMuZmFkZV9pbl90aW1lKTtcbiAgICB9XG5cbiAgICAvLyBCaW5kIGJ1ZmZlcnMgYW5kIHZlcnRleCBhdHRyaWJ1dGVzIHRvIHByZXBhcmUgZm9yIHJlbmRlcmluZ1xuICAgIGJpbmQocHJvZ3JhbSkge1xuICAgICAgICAvLyBCaW5kIFZBTyBmb3IgdGhpcyBwcm9nYW0sIG9yIGNyZWF0ZSBvbmVcbiAgICAgICAgbGV0IHZhbyA9IHRoaXMudmFvc1twcm9ncmFtLmlkXTtcbiAgICAgICAgaWYgKHZhbykge1xuICAgICAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuYmluZCh0aGlzLmdsLCB2YW8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YW9zW3Byb2dyYW0uaWRdID0gVmVydGV4QXJyYXlPYmplY3QuY3JlYXRlKHRoaXMuZ2wsIChmb3JjZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50b2dnbGVfZWxlbWVudF9hcnJheSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudmVydGV4X2xheW91dC5lbmFibGUodGhpcy5nbCwgcHJvZ3JhbSwgZm9yY2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgdiBpbiB0aGlzLnZhb3MpIHtcbiAgICAgICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmRlc3Ryb3kodGhpcy5nbCwgdGhpcy52YW9zW3ZdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZygndHJhY2UnLCAnVkJPTWVzaC5kZXN0cm95OiBkZWxldGUgYnVmZmVyJyArICh0aGlzLnZlcnRleF9kYXRhID8gYCBvZiBzaXplICR7dGhpcy52ZXJ0ZXhfZGF0YS5ieXRlTGVuZ3RofWAgOiAnJykpO1xuXG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlQnVmZmVyKHRoaXMudmVydGV4X2J1ZmZlcik7XG4gICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudF9idWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZGVsZXRlQnVmZmVyKHRoaXMuZWxlbWVudF9idWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2J1ZmZlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy52ZXJ0ZXhfZGF0YTtcbiAgICAgICAgZGVsZXRlIHRoaXMuZWxlbWVudF9kYXRhO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IGdsIGZyb20gJy4vY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBWZXJ0ZXhFbGVtZW50cyBmcm9tICcuL3ZlcnRleF9lbGVtZW50cyc7XG5cbi8vIE1hcHMgR0wgdHlwZXMgdG8gSlMgYXJyYXkgdHlwZXNcbmxldCBhcnJheV90eXBlcyA9IHtcbiAgICBbZ2wuRkxPQVRdOiBGbG9hdDMyQXJyYXksXG4gICAgW2dsLkJZVEVdOiBJbnQ4QXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX0JZVEVdOiBVaW50OEFycmF5LFxuICAgIFtnbC5JTlRdOiBJbnQzMkFycmF5LFxuICAgIFtnbC5VTlNJR05FRF9JTlRdOiBVaW50MzJBcnJheSxcbiAgICBbZ2wuU0hPUlRdOiBJbnQxNkFycmF5LFxuICAgIFtnbC5VTlNJR05FRF9TSE9SVF06IFVpbnQxNkFycmF5XG59O1xuXG4vLyBBbiBpbnRlcm1lZGlhcnkgb2JqZWN0IHRoYXQgaG9sZHMgdmVydGV4IGRhdGEgaW4gdHlwZWQgYXJyYXlzLCBhY2NvcmRpbmcgdG8gYSBnaXZlbiB2ZXJ0ZXggbGF5b3V0XG4vLyBVc2VkIHRvIGNvbnN0cnVjdCBhIG1lc2gvVkJPIGZvciByZW5kZXJpbmdcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlcnRleERhdGEge1xuXG4gICAgY29uc3RydWN0b3IgKHZlcnRleF9sYXlvdXQsIHsgcHJlYWxsb2MgPSA1MDAgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IHZlcnRleF9sYXlvdXQ7XG4gICAgICAgIHRoaXMudmVydGV4X2VsZW1lbnRzID0gbmV3IFZlcnRleEVsZW1lbnRzKCk7XG5cbiAgICAgICAgaWYgKFZlcnRleERhdGEuYXJyYXlfcG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSBWZXJ0ZXhEYXRhLmFycmF5X3Bvb2wucG9wKCk7XG4gICAgICAgICAgICB0aGlzLmJ5dGVfbGVuZ3RoID0gdGhpcy52ZXJ0ZXhfYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnNpemUgPSBNYXRoLmZsb29yKHRoaXMuYnl0ZV9sZW5ndGggLyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlKTtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgVmVydGV4RGF0YTogcmV1c2VkIGJ1ZmZlciBvZiBieXRlcyAke3RoaXMuYnl0ZV9sZW5ndGh9LCAke3RoaXMuc2l6ZX0gdmVydGljZXNgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IHByZWFsbG9jOyAvLyAjIG9mIHZlcnRpY2VzIHRvIGFsbG9jYXRlXG4gICAgICAgICAgICB0aGlzLmJ5dGVfbGVuZ3RoID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZSAqIHRoaXMuc2l6ZTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRoaXMuYnl0ZV9sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDsgICAgICAgICAgICAgLy8gYnl0ZSBvZmZzZXQgaW50byBjdXJyZW50bHkgYWxsb2NhdGVkIGJ1ZmZlclxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBjPTA7IGMgPCB0aGlzLnZlcnRleF9sYXlvdXQuY29tcG9uZW50cy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goWy4uLnRoaXMudmVydGV4X2xheW91dC5jb21wb25lbnRzW2NdXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52ZXJ0ZXhfY291bnQgPSAwO1xuICAgICAgICB0aGlzLnJlYWxsb2NfY291bnQgPSAwO1xuICAgICAgICB0aGlzLnNldEJ1ZmZlclZpZXdzKCk7XG4gICAgfVxuXG4gICAgLy8gKFJlLSlhbGxvY2F0ZSB0eXBlZCB2aWV3cyBpbnRvIHRoZSBtYWluIGJ1ZmZlciAtIG9ubHkgY3JlYXRlIHRoZSB0eXBlcyB3ZSBuZWVkIGZvciB0aGlzIGxheW91dFxuICAgIHNldEJ1ZmZlclZpZXdzICgpIHtcbiAgICAgICAgdGhpcy52aWV3cyA9IHt9O1xuICAgICAgICB0aGlzLnZpZXdzW2dsLlVOU0lHTkVEX0JZVEVdID0gdGhpcy52ZXJ0ZXhfYnVmZmVyO1xuICAgICAgICBmb3IgKGxldCBhPTA7IGEgPCB0aGlzLnZlcnRleF9sYXlvdXQuYXR0cmlicy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgY29uc3QgYXR0cmliID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LmF0dHJpYnNbYV07XG5cbiAgICAgICAgICAgIC8vIE5lZWQgdmlldyBmb3IgdGhpcyB0eXBlP1xuICAgICAgICAgICAgaWYgKHRoaXMudmlld3NbYXR0cmliLnR5cGVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJyYXlfdHlwZSA9IGFycmF5X3R5cGVzW2F0dHJpYi50eXBlXTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW2F0dHJpYi50eXBlXSA9IG5ldyBhcnJheV90eXBlKHRoaXMudmVydGV4X2J1ZmZlci5idWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCBidWZmZXIgcG9pbnRlcnNcbiAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgdGhpcy5jb21wb25lbnRzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNbY107XG4gICAgICAgICAgICBjb21wb25lbnRbMV0gPSB0aGlzLnZpZXdzW2NvbXBvbmVudFswXV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbGxvY2F0ZWQgYnVmZmVyIHNpemUsIGV4cGFuZC9yZWFsbG9jIGJ1ZmZlciBpZiBuZWVkZWRcbiAgICBjaGVja0J1ZmZlclNpemUgKCkge1xuICAgICAgICBpZiAoKHRoaXMub2Zmc2V0ICsgdGhpcy52ZXJ0ZXhfbGF5b3V0LnN0cmlkZSkgPiB0aGlzLmJ5dGVfbGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNpemUgPSBNYXRoLmZsb29yKHRoaXMuc2l6ZSAqIDEuNSk7XG4gICAgICAgICAgICB0aGlzLnNpemUgLT0gdGhpcy5zaXplICUgNDtcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlICogdGhpcy5zaXplO1xuICAgICAgICAgICAgdmFyIG5ld192aWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ieXRlX2xlbmd0aCk7XG4gICAgICAgICAgICBuZXdfdmlldy5zZXQodGhpcy52ZXJ0ZXhfYnVmZmVyKTsgLy8gY29weSBleGlzdGluZyBkYXRhIHRvIG5ldyBidWZmZXJcbiAgICAgICAgICAgIFZlcnRleERhdGEuYXJyYXlfcG9vbC5wdXNoKHRoaXMudmVydGV4X2J1ZmZlcik7IC8vIHNhdmUgcHJldmlvdXMgYnVmZmVyIGZvciB1c2UgYnkgbmV4dCB0aWxlXG4gICAgICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSBuZXdfdmlldztcbiAgICAgICAgICAgIHRoaXMuc2V0QnVmZmVyVmlld3MoKTtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvY19jb3VudCsrO1xuICAgICAgICAgICAgLy8gbG9nKCdpbmZvJywgYFZlcnRleERhdGE6IGV4cGFuZGVkIHZlcnRleCBibG9jayB0byAke3RoaXMuc2l6ZX0gdmVydGljZXNgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBhIHZlcnRleCwgY29waWVkIGZyb20gYSBwbGFpbiBKUyBhcnJheSBvZiBlbGVtZW50cyBtYXRjaGluZyB0aGUgb3JkZXIgb2YgdGhlIHZlcnRleCBsYXlvdXQuXG4gICAgLy8gTm90ZTogdXNlcyBwcmUtY2FsY3VsYXRlZCBpbmZvIGFib3V0IGVhY2ggYXR0cmlidXRlLCBpbmNsdWRpbmcgcG9pbnRlciB0byBhcHByb3ByaWF0ZSB0eXBlZCBhcnJheVxuICAgIC8vIHZpZXcgYW5kIG9mZnNldCBpbnRvIGl0LiBUaGlzIHdhcyB0aGUgZmFzdGVzdCBtZXRob2QgcHJvZmlsZWQgc28gZmFyIGZvciBmaWxsaW5nIGEgbWl4ZWQtdHlwZVxuICAgIC8vIHZlcnRleCBsYXlvdXQgKHRob3VnaCBzdGlsbCBzbG93ZXIgdGhhbiB0aGUgcHJldmlvdXMgbWV0aG9kIHRoYXQgb25seSBzdXBwb3J0ZWQgRmxvYXQzMkFycmF5IGF0dHJpYnV0ZXMpLlxuICAgIGFkZFZlcnRleCAodmVydGV4KSB7XG4gICAgICAgIHRoaXMuY2hlY2tCdWZmZXJTaXplKCk7XG4gICAgICAgIHZhciBpPTA7XG5cbiAgICAgICAgdmFyIGNsZW4gPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBjPTA7IGMgPCBjbGVuOyBjKyspIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNbY107XG4gICAgICAgICAgICBjb21wb25lbnRbMV1bKHRoaXMub2Zmc2V0ID4+IGNvbXBvbmVudFsyXSkgKyBjb21wb25lbnRbM11dID0gdmVydGV4W2krK107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9mZnNldCArPSB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlO1xuICAgICAgICB0aGlzLnZlcnRleF9jb3VudCsrO1xuICAgIH1cblxuICAgIC8vIEZpbmFsaXplIHZlcnRleCBidWZmZXIgZm9yIHVzZSBpbiBjb25zdHJ1Y3RpbmcgYSBtZXNoXG4gICAgZW5kICgpIHtcbiAgICAgICAgLy8gQ2xpcCB0aGUgYnVmZmVyIHRvIHNpemUgdXNlZCBmb3IgdGhpcyBWQk9cbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gdGhpcy52ZXJ0ZXhfYnVmZmVyLnN1YmFycmF5KDAsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5lbGVtZW50X2J1ZmZlciA9IHRoaXMudmVydGV4X2VsZW1lbnRzLmVuZCgpO1xuXG4gICAgICAgIGxvZygndHJhY2UnLCBgVmVydGV4RGF0YTogJHt0aGlzLnNpemV9IHZlcnRpY2VzIHRvdGFsLCByZWFsbG9jIGNvdW50ICR7dGhpcy5yZWFsbG9jX2NvdW50fWApO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxufVxuXG5WZXJ0ZXhEYXRhLmFycmF5X3Bvb2wgPSBbXTsgLy8gcG9vbCBvZiBjdXJyZW50bHkgYXZhaWxhYmxlIChwcmV2aW91c2x5IHVzZWQpIGJ1ZmZlcnMgKHVpbnQ4KVxuIiwiaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuLi91dGlscy93b3JrZXJfYnJva2VyJztcblxubGV0IE1BWF9WQUxVRSA9IE1hdGgucG93KDIsIDE2KSAtIDE7XG5sZXQgVWludDMyX2ZsYWcgPSBmYWxzZTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4RWxlbWVudHMge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5hcnJheSA9IFtdO1xuICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSBmYWxzZTtcbiAgICB9XG4gICAgcHVzaCAodmFsdWUpIHtcbiAgICAgICAgLy8gSWYgdmFsdWVzIGhhdmUgb3ZlcmZsb3duIGFuZCBubyBVaW50MzIgb3B0aW9uIGlzIGF2YWlsYWJsZSwgZG8gbm90IHB1c2ggdmFsdWVzXG4gICAgICAgIGlmICh0aGlzLmhhc19vdmVyZmxvd24gJiYgIVVpbnQzMl9mbGFnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIG92ZXJmbG93IGlmIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBVaW50MTYgbWF4XG4gICAgICAgIGlmICh2YWx1ZSA+IE1BWF9WQUxVRSkge1xuICAgICAgICAgICAgdGhpcy5oYXNfb3ZlcmZsb3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghVWludDMyX2ZsYWcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFycmF5LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbmQgKCkge1xuICAgICAgICBpZiAodGhpcy5hcnJheS5sZW5ndGgpe1xuICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlcih0aGlzLmFycmF5LCB0aGlzLmhhc19vdmVyZmxvd24pO1xuICAgICAgICAgICAgdGhpcy5hcnJheSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5oYXNfb3ZlcmZsb3duID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5WZXJ0ZXhFbGVtZW50cy5zZXRVaW50MzJGbGFnID0gZnVuY3Rpb24oZmxhZykge1xuICAgIFVpbnQzMl9mbGFnID0gZmxhZztcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlcihhcnJheSwgb3ZlcmZsb3duKSB7XG4gICAgdmFyIHR5cGVkQXJyYXkgPSAob3ZlcmZsb3duICYmIFVpbnQzMl9mbGFnKSA/IFVpbnQzMkFycmF5IDogVWludDE2QXJyYXk7XG4gICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5KGFycmF5KTtcbn1cblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnVmVydGV4RWxlbWVudHMnLCBWZXJ0ZXhFbGVtZW50cyk7XG4iLCJpbXBvcnQgZ2wgZnJvbSAnLi9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IFZlcnRleERhdGEgZnJvbSAnLi92ZXJ0ZXhfZGF0YSc7XG5cbi8vIERlc2NyaWJlcyBhIHZlcnRleCBsYXlvdXQgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIG1hbnkgZGlmZmVyZW50IEdMIHByb2dyYW1zLlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4TGF5b3V0IHtcbiAgICAvLyBBdHRyaWJzIGFyZSBhbiBhcnJheSwgaW4gbGF5b3V0IG9yZGVyLCBvZjogbmFtZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZFxuICAgIC8vIGV4OiB7IG5hbWU6ICdwb3NpdGlvbicsIHNpemU6IDMsIHR5cGU6IGdsLkZMT0FULCBub3JtYWxpemVkOiBmYWxzZSB9XG4gICAgY29uc3RydWN0b3IgKGF0dHJpYnMpIHtcbiAgICAgICAgdGhpcy5hdHRyaWJzID0gYXR0cmliczsgLy8gYXJyYXkgb2YgYXR0cmlidXRlcywgc3BlY2lmaWVkIGFzIHN0YW5kYXJkIEdMIGF0dHJpYiBvcHRpb25zXG4gICAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdOyAgIC8vIGxpc3Qgb2YgdHlwZSBhbmQgb2Zmc2V0IGluZm8gYWJvdXQgZWFjaCBhdHRyaWJ1dGUgY29tcG9uZW50XG4gICAgICAgIHRoaXMuaW5kZXggPSB7fTsgICAgICAgIC8vIGxpbmVhciBidWZmZXIgaW5kZXggb2YgZWFjaCBhdHRyaWJ1dGUgY29tcG9uZW50LCBlLmcuIHRoaXMuaW5kZXgucG9zaXRpb24ueFxuXG4gICAgICAgIC8vIENhbGMgdmVydGV4IHN0cmlkZVxuICAgICAgICB0aGlzLnN0cmlkZSA9IDA7XG5cbiAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgZm9yIChsZXQgYT0wOyBhIDwgdGhpcy5hdHRyaWJzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBsZXQgYXR0cmliID0gdGhpcy5hdHRyaWJzW2FdO1xuICAgICAgICAgICAgYXR0cmliLm9mZnNldCA9IHRoaXMuc3RyaWRlO1xuICAgICAgICAgICAgYXR0cmliLmJ5dGVfc2l6ZSA9IGF0dHJpYi5zaXplO1xuICAgICAgICAgICAgdmFyIHNoaWZ0ID0gMDtcblxuICAgICAgICAgICAgc3dpdGNoIChhdHRyaWIudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgZ2wuRkxPQVQ6XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5JTlQ6XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5VTlNJR05FRF9JTlQ6XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYi5ieXRlX3NpemUgKj0gNDtcbiAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGdsLlNIT1JUOlxuICAgICAgICAgICAgICAgIGNhc2UgZ2wuVU5TSUdORURfU0hPUlQ6XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYi5ieXRlX3NpemUgKj0gMjtcbiAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yY2UgNC1ieXRlIGFsaWdubWVudCBvbiBhdHRyaWJ1dGVzXG4gICAgICAgICAgICB0aGlzLnN0cmlkZSArPSBhdHRyaWIuYnl0ZV9zaXplO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RyaWRlICYgMykgeyAvLyBwYWQgdG8gbXVsdGlwbGUgb2YgNCBieXRlc1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyaWRlICs9IDQgLSAodGhpcy5zdHJpZGUgJiAzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIGluZm8gdG8gbGlzdCBvZiBhdHRyaWJ1dGUgY29tcG9uZW50c1xuICAgICAgICAgICAgLy8gVXNlZCB0byBidWlsZCB0aGUgdmVydGV4IGRhdGEsIHByb3ZpZGVzIHBvaW50ZXJzIGFuZCBvZmZzZXRzIGludG8gZWFjaCB0eXBlZCBhcnJheSB2aWV3XG4gICAgICAgICAgICAvLyBFYWNoIGNvbXBvbmVudCBpcyBhbiBhcnJheSBvZjpcbiAgICAgICAgICAgIC8vIFtHTCBhdHRyaWIgdHlwZSwgcG9pbnRlciB0byB0eXBlZCBhcnJheSB2aWV3LCBiaXRzIHRvIHNoaWZ0IHJpZ2h0IHRvIGRldGVybWluZSBidWZmZXIgb2Zmc2V0LCBhZGRpdGlvbmFsIGJ1ZmZlciBvZmZzZXQgZm9yIHRoZSBjb21wb25lbnRdXG4gICAgICAgICAgICB2YXIgb2Zmc2V0X3R5cGVkID0gYXR0cmliLm9mZnNldCA+PiBzaGlmdDtcbiAgICAgICAgICAgIGlmIChhdHRyaWIuc2l6ZSA+IDEpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBhdHRyaWIuc2l6ZTsgcysrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKFthdHRyaWIudHlwZSwgbnVsbCwgc2hpZnQsIG9mZnNldF90eXBlZCsrXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goW2F0dHJpYi50eXBlLCBudWxsLCBzaGlmdCwgb2Zmc2V0X3R5cGVkXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByb3ZpZGUgYW4gaW5kZXggaW50byB0aGUgdmVydGV4IGRhdGEgYnVmZmVyIGZvciBlYWNoIGF0dHJpYnV0ZSBjb21wb25lbnRcbiAgICAgICAgICAgIHRoaXMuaW5kZXhbYXR0cmliLm5hbWVdID0gY291bnQ7XG4gICAgICAgICAgICBjb3VudCArPSBhdHRyaWIuc2l6ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldHVwIGEgdmVydGV4IGxheW91dCBmb3IgYSBzcGVjaWZpYyBHTCBwcm9ncmFtXG4gICAgLy8gQXNzdW1lcyB0aGF0IHRoZSBkZXNpcmVkIHZlcnRleCBidWZmZXIgKFZCTykgaXMgYWxyZWFkeSBib3VuZFxuICAgIC8vIElmIGEgZ2l2ZW4gcHJvZ3JhbSBkb2Vzbid0IGluY2x1ZGUgYWxsIGF0dHJpYnV0ZXMsIGl0IGNhbiBzdGlsbCB1c2UgdGhlIHZlcnRleCBsYXlvdXRcbiAgICAvLyB0byByZWFkIHRob3NlIGF0dHJpYnMgdGhhdCBpdCBkb2VzIHJlY29nbml6ZSwgdXNpbmcgdGhlIGF0dHJpYiBvZmZzZXRzIHRvIHNraXAgb3RoZXJzLlxuICAgIGVuYWJsZSAoZ2wsIHByb2dyYW0sIGZvcmNlKVxuICAgIHtcbiAgICAgICAgdmFyIGF0dHJpYiwgbG9jYXRpb247XG5cbiAgICAgICAgLy8gRW5hYmxlIGFsbCBhdHRyaWJ1dGVzIGZvciB0aGlzIGxheW91dFxuICAgICAgICBmb3IgKHZhciBhPTA7IGEgPCB0aGlzLmF0dHJpYnMubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgIGF0dHJpYiA9IHRoaXMuYXR0cmlic1thXTtcbiAgICAgICAgICAgIGxvY2F0aW9uID0gcHJvZ3JhbS5hdHRyaWJ1dGUoYXR0cmliLm5hbWUpLmxvY2F0aW9uO1xuXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzW2xvY2F0aW9uXSB8fCBmb3JjZSkge1xuICAgICAgICAgICAgICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIobG9jYXRpb24sIGF0dHJpYi5zaXplLCBhdHRyaWIudHlwZSwgYXR0cmliLm5vcm1hbGl6ZWQsIHRoaXMuc3RyaWRlLCBhdHRyaWIub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzW2xvY2F0aW9uXSA9IHByb2dyYW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaXNhYmxlIGFueSBwcmV2aW91c2x5IGJvdW5kIGF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgZm9yIHRoaXMgbGF5b3V0XG4gICAgICAgIGZvciAobG9jYXRpb24gaW4gVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlicykge1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlVW51c2VkQXR0cmlidXRlKGdsLCBsb2NhdGlvbiwgcHJvZ3JhbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlIGFuIGF0dHJpYnV0ZSBpZiBpdCB3YXMgbm90IGVuYWJsZWQgZm9yIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbVxuICAgIC8vIE5PVEU6IHRoaXMgd2FzIG1vdmVkIG91dCBvZiB0aGUgaW5uZXIgbG9vcCBpbiBlbmFibGUoKSB0byBhc3Npc3Qgdy9WTSBvcHRpbWl6YXRpb25cbiAgICBkaXNhYmxlVW51c2VkQXR0cmlidXRlIChnbCwgbG9jYXRpb24sIHByb2dyYW0pIHtcbiAgICAgICAgaWYgKFZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dICE9PSBwcm9ncmFtKSB7XG4gICAgICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobG9jYXRpb24pO1xuICAgICAgICAgICAgZGVsZXRlIFZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlVmVydGV4RGF0YSAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmVydGV4RGF0YSh0aGlzKTtcbiAgICB9XG5cbn1cblxuLy8gVHJhY2sgY3VycmVudGx5IGVuYWJsZWQgYXR0cmlicywgYnkgdGhlIHByb2dyYW0gdGhleSBhcmUgYm91bmQgdG9cbi8vIFN0YXRpYyBjbGFzcyBwcm9wZXJ0eSB0byByZWZsZWN0IGdsb2JhbCBHTCBzdGF0ZVxuVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlicyA9IHt9O1xuIiwiaW1wb3J0IFJlcGVhdEdyb3VwIGZyb20gJy4vcmVwZWF0X2dyb3VwJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxudmFyIENvbGxpc2lvbjtcblxuZXhwb3J0IGRlZmF1bHQgQ29sbGlzaW9uID0ge1xuXG4gICAgdGlsZXM6IHt9LFxuXG4gICAgc3RhcnRUaWxlICh0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV0gPSB7XG4gICAgICAgICAgICBiYm94ZXM6IHsgICAgICAgICAgIC8vIGN1cnJlbnQgc2V0IG9mIHBsYWNlZCBib3VuZGluZyBib3hlc1xuICAgICAgICAgICAgICAgIGFhYmI6IFtdLFxuICAgICAgICAgICAgICAgIG9iYjogW11cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvYmplY3RzOiB7fSwgICAgICAgIC8vIG9iamVjdHMgdG8gY29sbGlkZSwgZ3JvdXBlZCBieSBwcmlvcml0eSwgdGhlbiBieSBzdHlsZVxuICAgICAgICAgICAga2VlcDoge30sICAgICAgICAgICAvLyBvYmplY3RzIHRoYXQgd2VyZSBrZXB0IGFmdGVyIGNvbGxpc2lvbiwgZ3JvdXBlZCBieSBzdHlsZVxuICAgICAgICAgICAgc3R5bGVzOiB7fSAgICAgICAgICAvLyBzdHlsZXMgY29udHJpYnV0aW5nIGNvbGxpc2lvbiBvYmplY3RzXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlZCB3aGVuIGFsbCByZWdpc3RlcmVkIHN0eWxlcyBoYXZlIGFkZGVkIG9iamVjdHNcbiAgICAgICAgc3RhdGUuY29tcGxldGUgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHN0YXRlLnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlc2V0VGlsZSAodGlsZSkge1xuICAgICAgICBkZWxldGUgdGhpcy50aWxlc1t0aWxlXTtcbiAgICB9LFxuXG4gICAgLy8gQWRkIGEgc3R5bGUgdG8gdGhlIHBlbmRpbmcgc2V0LCBjb2xsaXNpb24gd2lsbCBibG9jayBvbiBhbGwgc3R5bGVzIHN1Ym1pdHRpbmcgdG8gY29sbGlzaW9uIHNldFxuICAgIGFkZFN0eWxlIChzdHlsZSwgdGlsZSkge1xuICAgICAgICB0aGlzLnRpbGVzW3RpbGVdLnN0eWxlc1tzdHlsZV0gPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgY29sbGlzaW9uIG9iamVjdHMgZm9yIGEgc3R5bGVcbiAgICBjb2xsaWRlIChvYmplY3RzLCBzdHlsZSwgdGlsZSkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0NvbGxpc2lvbi5jb2xsaWRlKCkgY2FsbGVkIHdpdGggbnVsbCB0aWxlJywgdGlsZSwgdGhpcy50aWxlcywgc3R5bGUsIG9iamVjdHMpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHcm91cCBieSBwcmlvcml0eSBhbmQgc3R5bGVcbiAgICAgICAgbGV0IHRpbGVfb2JqZWN0cyA9IHN0YXRlLm9iamVjdHM7XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvYmogPSBvYmplY3RzW2ldO1xuICAgICAgICAgICAgbGV0IHByaW9yaXR5ID0gb2JqLmxhYmVsLmxheW91dC5wcmlvcml0eTtcbiAgICAgICAgICAgIHRpbGVfb2JqZWN0c1twcmlvcml0eV0gPSB0aWxlX29iamVjdHNbcHJpb3JpdHldIHx8IHt9O1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XVtzdHlsZV0gPSB0aWxlX29iamVjdHNbcHJpb3JpdHldW3N0eWxlXSB8fCBbXTtcbiAgICAgICAgICAgIHRpbGVfb2JqZWN0c1twcmlvcml0eV1bc3R5bGVdLnB1c2gob2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBmcm9tIHBlbmRpbmcgc3R5bGUgc2V0LCBpZiBubyBtb3JlIHN0eWxlcywgZG8gY29sbGlzaW9uICYgZmluaXNoIHRpbGVcbiAgICAgICAgZGVsZXRlIHN0YXRlLnN0eWxlc1tzdHlsZV07XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbmRUaWxlKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FpdCBmb3Igb2JqZWN0cyB0byBiZSBhZGRlZCBmcm9tIGFsbCBzdHlsZXNcbiAgICAgICAgcmV0dXJuIHN0YXRlLmNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmtlZXBbc3R5bGVdIHx8IFtdO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gVGVzdCBsYWJlbHMgZm9yIGNvbGxpc2lvbnMsIGhpZ2hlciB0byBsb3dlciBwcmlvcml0eVxuICAgIC8vIFdoZW4gdHdvIGNvbGxpZGUsIGRpc2NhcmQgdGhlIGxvd2VyLXByaW9yaXR5IGxhYmVsXG4gICAgZW5kVGlsZSAodGlsZSkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgICAgICBsZXQga2VlcCA9IHN0YXRlLmtlZXA7XG5cbiAgICAgICAgUmVwZWF0R3JvdXAuY2xlYXIodGlsZSk7XG5cbiAgICAgICAgLy8gUHJvY2VzcyBsYWJlbHMgYnkgcHJpb3JpdHksIHRoZW4gYnkgc3R5bGVcbiAgICAgICAgbGV0IHByaW9yaXRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5vYmplY3RzKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGZvciAobGV0IHA9MDsgcCA8IHByaW9yaXRpZXMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgIGxldCBzdHlsZV9vYmplY3RzID0gc3RhdGUub2JqZWN0c1twcmlvcml0aWVzW3BdXTtcbiAgICAgICAgICAgIGlmICghc3R5bGVfb2JqZWN0cykgeyAvLyBubyBsYWJlbHMgYXQgdGhpcyBwcmlvcml0eSwgc2tpcCB0byBuZXh0XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIHN0eWxlXG4gICAgICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiBzdHlsZV9vYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9iamVjdHMgPSBzdHlsZV9vYmplY3RzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBrZWVwW3N0eWxlXSA9IGtlZXBbc3R5bGVdIHx8IFtdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3QgPSBvYmplY3RzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5CZVBsYWNlZChvYmplY3QsIHRpbGUsIG9iamVjdC5saW5rZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIG9iamVjdCBpZiBpdCBpc24ndCBkZXBlbmRlbnQgb24gYSBwYXJlbnQgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC5saW5rZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwW3N0eWxlXS5wdXNoKG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZShvYmplY3QsIHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb2JqZWN0IGlzIGRlcGVuZGVudCBvbiBhIHBhcmVudCwgb25seSBrZWVwIGlmIGJvdGggY2FuIGJlIHBsYWNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jYW5CZVBsYWNlZChvYmplY3QubGlua2VkLCB0aWxlLCBvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcFtzdHlsZV0ucHVzaChvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2Uob2JqZWN0LCB0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlKG9iamVjdC5saW5rZWQsIHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICB9LFxuXG4gICAgLy8gUnVuIGNvbGxpc2lvbiBhbmQgcmVwZWF0IGNoZWNrIHRvIHNlZSBpZiBsYWJlbCBjYW4gY3VycmVudGx5IGJlIHBsYWNlZFxuICAgIGNhbkJlUGxhY2VkIChvYmplY3QsIHRpbGUsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGxldCBsYWJlbCA9IG9iamVjdC5sYWJlbDtcbiAgICAgICAgbGV0IGxheW91dCA9IG9iamVjdC5sYWJlbC5sYXlvdXQ7XG5cbiAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IHByb2Nlc3NlZCAoZS5nLiBieSBwYXJlbnQgb2JqZWN0KVxuICAgICAgICBpZiAobGFiZWwucGxhY2VkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsYWJlbC5wbGFjZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUZXN0IHRoZSBsYWJlbCBmb3IgaW50ZXJzZWN0aW9ucyB3aXRoIG90aGVyIGxhYmVscyBpbiB0aGUgdGlsZVxuICAgICAgICBsZXQgYmJveGVzID0gdGhpcy50aWxlc1t0aWxlXS5iYm94ZXM7XG4gICAgICAgIGlmICghbGF5b3V0LmNvbGxpZGUgfHwgIWxhYmVsLmRpc2NhcmQoYmJveGVzLCBleGNsdWRlICYmIGV4Y2x1ZGUubGFiZWwpKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBmb3IgcmVwZWF0c1xuICAgICAgICAgICAgbGV0IHJlcGVhdCA9IFJlcGVhdEdyb3VwLmNoZWNrKGxhYmVsLCBsYXlvdXQsIHRpbGUpO1xuICAgICAgICAgICAgaWYgKHJlcGVhdCkge1xuICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCBgZGlzY2FyZCBsYWJlbCAnJHtsYWJlbC50ZXh0fScsIChvbmVfcGVyX2dyb3VwOiAke3JlcGVhdC5vbmVfcGVyX2dyb3VwfSksIGRpc3QgJHtNYXRoLnNxcnQocmVwZWF0LmRpc3Rfc3EpL2xheW91dC51bml0c19wZXJfcGl4ZWx9IDwgJHtNYXRoLnNxcnQocmVwZWF0LnJlcGVhdF9kaXN0X3NxKS9sYXlvdXQudW5pdHNfcGVyX3BpeGVsfWApO1xuICAgICAgICAgICAgICAgIGxhYmVsLnBsYWNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGF5b3V0LmNvbGxpZGUpIHtcbiAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCBgZGlzY2FyZCBsYWJlbCAnJHtsYWJlbC50ZXh0fScgZHVlIHRvIGNvbGxpc2lvbmApO1xuICAgICAgICAgICAgbGFiZWwucGxhY2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhYmVsLnBsYWNlZDtcbiAgICB9LFxuXG4gICAgLy8gUGxhY2UgbGFiZWxcbiAgICBwbGFjZSAoeyBsYWJlbCB9LCB0aWxlKSB7XG4gICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBwcm9jZXNzZWQgKGUuZy4gYnkgcGFyZW50IG9iamVjdClcbiAgICAgICAgaWYgKGxhYmVsLnBsYWNlZCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWdpc3RlciBhcyBwbGFjZWQgZm9yIGZ1dHVyZSBjb2xsaXNpb24gYW5kIHJlcGVhdCBjdWxsaW5nXG4gICAgICAgIFJlcGVhdEdyb3VwLmFkZChsYWJlbCwgbGFiZWwubGF5b3V0LCB0aWxlKTtcbiAgICAgICAgbGFiZWwuYWRkKHRoaXMudGlsZXNbdGlsZV0uYmJveGVzKTtcbiAgICB9XG5cbn07XG4iLCJcbi8vIERvIEFBQkIgYGFgIGFuZCBgYmAgaW50ZXJzZWN0P1xuZXhwb3J0IGZ1bmN0aW9uIGJveEludGVyc2VjdHNCb3ggKGEsIGIpIHtcbiAgICBpZiAoYVsyXSA8IGJbMF0gfHwgLy8gYSBpcyBsZWZ0IG9mIGJcbiAgICAgICAgYVswXSA+IGJbMl0gfHwgLy8gYSBpcyByaWdodCBvZiBiXG4gICAgICAgIGFbM10gPCBiWzFdIHx8IC8vIGEgaXMgYWJvdmUgYlxuICAgICAgICBhWzFdID4gYlszXSkgeyAvLyBhIGlzIGJlbG93IGJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTsgLy8gYm94ZXMgb3ZlcmxhcFxufVxuXG4vLyBEb2VzIEFBQkIgYGFgIGludGVyc2VjdCBhbnkgb2YgdGhlIEFBQkJzIGluIGFycmF5IGBib3hlc2A/XG4vLyBJbnZva2VzIGBjYWxsYmFja2Agd2l0aCBpbmRleCBvZiBpbnRlcnNlY3RpbmcgYm94XG4vLyBTdG9wcyBpbnRlcnNlY3RpbmcgaWYgYGNhbGxiYWNrYCByZXR1cm5zIG5vbi1udWxsIHZhbHVlIChjb250aW51ZXMgb3RoZXJ3aXNlKVxuZXhwb3J0IGZ1bmN0aW9uIGJveEludGVyc2VjdHNMaXN0IChhLCBib3hlcywgY2FsbGJhY2spIHtcbiAgICBmb3IgKGxldCBpPTA7IGkgPCBib3hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYm94SW50ZXJzZWN0c0JveChhLCBib3hlc1tpXSkpIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjayhpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgUG9pbnRBbmNob3IgZnJvbSAnLi9wb2ludF9hbmNob3InO1xuaW1wb3J0IHtib3hJbnRlcnNlY3RzTGlzdH0gZnJvbSAnLi9pbnRlcnNlY3QnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBPQkIgZnJvbSAnLi4vdXRpbHMvb2JiJztcbi8vIGltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGFiZWwge1xuXG4gICAgY29uc3RydWN0b3IgKHNpemUsIGxheW91dCA9IHt9KSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbmNob3IgPSBBcnJheS5pc0FycmF5KHRoaXMubGF5b3V0LmFuY2hvcikgPyB0aGlzLmxheW91dC5hbmNob3JbMF0gOiB0aGlzLmxheW91dC5hbmNob3I7IC8vIGluaXRpYWwgYW5jaG9yXG4gICAgICAgIHRoaXMucGxhY2VkID0gbnVsbDtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBsYXlvdXQub2Zmc2V0O1xuICAgICAgICB0aGlzLmFhYmIgPSBudWxsO1xuICAgICAgICB0aGlzLm9iYiA9IG51bGw7XG4gICAgICAgIHRoaXMuYWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgdGhpcy50aHJvd19hd2F5ID0gZmFsc2U7ICAgIC8vIGlmIGxhYmVsIGRvZXMgbm90IGZpdCAoZXhjZWVkcyB0aWxlIGJvdW5kYXJ5LCBldGMpIHRoaXMgYm9vbGVhbiB3aWxsIGJlIHRydWVcbiAgICB9XG5cbiAgICB1cGRhdGUgKCkge1xuICAgICAgICB0aGlzLmFsaWduID0gdGhpcy5sYXlvdXQuYWxpZ24gfHwgUG9pbnRBbmNob3IuYWxpZ25Gb3JBbmNob3IodGhpcy5hbmNob3IpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGZvciBvdmVybGFwcyB3aXRoIG90aGVyIGxhYmVscyBpbiB0aGUgdGlsZVxuICAgIG9jY2x1ZGVkIChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGxldCBpbnRlcnNlY3QgPSBmYWxzZTtcbiAgICAgICAgbGV0IGFhYmJzID0gYmJveGVzLmFhYmI7XG4gICAgICAgIGxldCBvYmJzID0gYmJveGVzLm9iYjtcblxuICAgICAgICAvLyBCcm9hZCBwaGFzZVxuICAgICAgICBpZiAoYWFiYnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYm94SW50ZXJzZWN0c0xpc3QodGhpcy5hYWJiLCBhYWJicywgKGopID0+IHtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogYnJvYWQgcGhhc2UgY29sbGlkZScsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLmFhYmIsIGFhYmJzW2pdKTtcblxuICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgY29sbGlkaW5nIHdpdGggZXhjbHVkZWQgbGFiZWxcbiAgICAgICAgICAgICAgICBpZiAoZXhjbHVkZSAmJiBhYWJic1tqXSA9PT0gZXhjbHVkZS5hYWJiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBza2lwcGluZyBkdWUgdG8gZXhwbGljaXQgZXhjbHVzaW9uJywgdGhpcywgZXhjbHVkZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTa2lwIG5hcnJvdyBwaGFzZSBjb2xsaXNpb24gaWYgbm8gcm90YXRpb25cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vYmIuYW5nbGUgPT09IDAgJiYgb2Jic1tqXS5hbmdsZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogc2tpcCBuYXJyb3cgcGhhc2UgY29sbGlkZSBiZWNhdXNlIG5laXRoZXIgaXMgcm90YXRlZCcsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLm9iYiwgb2Jic1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGludGVyc2VjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5hcnJvdyBwaGFzZVxuICAgICAgICAgICAgICAgIGlmIChPQkIuaW50ZXJzZWN0KHRoaXMub2JiLCBvYmJzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgJ2NvbGxpc2lvbjogbmFycm93IHBoYXNlIGNvbGxpZGUnLCB0aGlzLmxheW91dC5pZCwgdGhpcywgdGhpcy5vYmIsIG9iYnNbal0pO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW50ZXJzZWN0O1xuICAgIH1cblxuICAgIC8vIEFkZCB0aGlzIGxhYmVsJ3MgYm91bmRpbmcgYm94IHRvIHRoZSBwcm92aWRlZCBzZXRcbiAgICBhZGQgKGJib3hlcykge1xuICAgICAgICB0aGlzLnBsYWNlZCA9IHRydWU7XG4gICAgICAgIGJib3hlcy5hYWJiLnB1c2godGhpcy5hYWJiKTtcbiAgICAgICAgYmJveGVzLm9iYi5wdXNoKHRoaXMub2JiKTtcbiAgICB9XG5cbiAgICAvLyBjaGVja3Mgd2hldGhlciB0aGUgbGFiZWwgaXMgd2l0aGluIHRoZSB0aWxlIGJvdW5kYXJpZXNcbiAgICBpblRpbGVCb3VuZHMgKCkge1xuICAgICAgICBsZXQgbWluID0gWyB0aGlzLmFhYmJbMF0sIHRoaXMuYWFiYlsxXSBdO1xuICAgICAgICBsZXQgbWF4ID0gWyB0aGlzLmFhYmJbMl0sIHRoaXMuYWFiYlszXSBdO1xuXG4gICAgICAgIGlmICghVXRpbHMucG9pbnRJblRpbGUobWluKSB8fCAhVXRpbHMucG9pbnRJblRpbGUobWF4KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gV2hldGhlciB0aGUgbGFiZWwgc2hvdWxkIGJlIGRpc2NhcmRlZFxuICAgIC8vIERlcGVuZHMgb24gd2hldGhlciBsYWJlbCBtdXN0IGZpdCBpbiB0aGUgdGlsZSBib3VuZHMsIGFuZCBpZiBzbywgY2FuIGl0IGJlIG1vdmVkIHRvIGZpdCB0aGVyZVxuICAgIGRpc2NhcmQoYmJveGVzLCBleGNsdWRlID0gbnVsbCkge1xuICAgICAgICBpZiAodGhpcy50aHJvd19hd2F5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5vY2NsdWRlZChiYm94ZXMsIGV4Y2x1ZGUpO1xuICAgIH1cbn1cblxuTGFiZWwuZXBzaWxvbiA9IDAuOTk5OTsgLy8gdG9sZXJhbmNlIGFyb3VuZCBjb2xsaXNpb24gYm94ZXMsIHByZXZlbnQgcGVyZmVjdGx5IGFkamFjZW50IG9iamVjdHMgZnJvbSBjb2xsaWRpbmdcbiIsImltcG9ydCBMYWJlbCBmcm9tICcuL2xhYmVsJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi4vdmVjdG9yJztcbmltcG9ydCBPQkIgZnJvbSAnLi4vdXRpbHMvb2JiJztcblxuY29uc3QgUExBQ0VNRU5UID0ge1xuICAgIE1JRF9QT0lOVDogMCxcbiAgICBDT1JORVI6IDFcbn07XG5cbmNvbnN0IE1BWF9BTkdMRSA9IE1hdGguUEkgLyAyOyAgICAgIC8vIG1heGltdW0gYW5nbGUgZm9yIGFydGljdWxhdGVkIGxhYmVsc1xuY29uc3QgTElORV9FWENFRURfU1RSQUlHSFQgPSAwLjc7ICAgLy8gbWluaW1hbCByYXRpbyBmb3Igc3RyYWlnaHQgbGFiZWxzIChsYWJlbCBsZW5ndGgpIC8gKGxpbmUgbGVuZ3RoKVxuY29uc3QgTElORV9FWENFRURfS0lOS0VEID0gMC42OyAgICAgLy8gbWluaW1hbCByYXRpbyBmb3Iga2lua2VkIGxhYmVsc1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbExpbmUge1xuXG4gICAgY29uc3RydWN0b3IgKHNpemUsIGxpbmVzLCBsYXlvdXQpIHtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIHRoaXMubGluZXMgPSBsaW5lcztcbiAgICAgICAgdGhpcy5zcGFjZV93aWR0aCA9IGxheW91dC5zcGFjZV93aWR0aDsgLy8gd2lkdGggb2Ygc3BhY2UgZm9yIHRoZSBmb250IHVzZWRcbiAgICAgICAgdGhpcy5udW1fc2VnbWVudHMgPSBzaXplLmxlbmd0aDsgLy8gbnVtYmVyIG9mIGxhYmVsIHNlZ21lbnRzXG4gICAgICAgIHRoaXMudG90YWxfbGVuZ3RoID0gc2l6ZS5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgbmV4dCl7IHJldHVybiBwcmV2ICsgbmV4dFswXTsgfSwgMCkgKyAoc2l6ZS5sZW5ndGggLSAxKSAqIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgIHRoaXMudG90YWxfaGVpZ2h0ID0gc2l6ZVswXVsxXTtcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAobGF5b3V0LnBsYWNlbWVudCA9PT0gdW5kZWZpbmVkKSA/IFBMQUNFTUVOVC5NSURfUE9JTlQgOiBsYXlvdXQucGxhY2VtZW50O1xuXG4gICAgICAgIHRoaXMua2lua19pbmRleCA9IDA7IC8vIGluZGV4IGF0IHdoaWNoIGFuIGFydGljdWxhdGVkIGxhYmVsIHdpbGwga2luayAoZS5nLiwgMSBtZWFucyBhIGtpbmsgX2FmdGVyXyB0aGUgZmlyc3Qgc2VnbWVudClcbiAgICAgICAgdGhpcy5zcHJlYWRfZmFjdG9yID0gMC41OyAvLyBzcGFjZXMgb3V0IGFkamFjZW50IHdvcmRzIHRvIHByZXZlbnQgb3ZlcmxhcFxuICAgICAgICB0aGlzLmZpdG5lc3MgPSAwOyAvLyBtZWFzdXJlIG9mIHF1YWxpdHkgb2YgZml0XG5cbiAgICAgICAgLy8gQXJyYXlzIGZvciBMYWJlbCBwcm9wZXJ0aWVzLiBUT0RPOiBjcmVhdGUgYXJyYXkgb2YgTGFiZWwgdHlwZXMsIHdoZXJlIExhYmVsTGluZSBhY3RzIGFzIGEgXCJncm91cGVkIGxhYmVsXCJcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFtdO1xuICAgICAgICB0aGlzLmFuZ2xlID0gW107XG4gICAgICAgIHRoaXMub2Zmc2V0cyA9IFtdO1xuICAgICAgICB0aGlzLm9iYnMgPSBbXTtcbiAgICAgICAgdGhpcy5hYWJicyA9IFtdO1xuXG4gICAgICAgIC8vIG9wdGlvbmFsbHkgbGltaXQgdGhlIGxpbmUgc2VnbWVudHMgdGhhdCB0aGUgbGFiZWwgbWF5IGJlIHBsYWNlZCBpbiwgYnkgc3BlY2lmeWluZyBhIHNlZ21lbnQgaW5kZXggcmFuZ2VcbiAgICAgICAgLy8gdXNlZCBhcyBhIGNvYXJzZSBzdWJkaXZpZGUgZm9yIHBsYWNpbmcgbXVsdGlwbGUgbGFiZWxzIHBlciBsaW5lIGdlb21ldHJ5XG4gICAgICAgIHRoaXMuc2VnbWVudF9pbmRleCA9IGxheW91dC5zZWdtZW50X2luZGV4IHx8IGxheW91dC5zZWdtZW50X3N0YXJ0IHx8IDA7XG4gICAgICAgIHRoaXMuc2VnbWVudF9tYXggPSBsYXlvdXQuc2VnbWVudF9lbmQgfHwgdGhpcy5saW5lcy5sZW5ndGg7XG5cbiAgICAgICAgLy8gRmlyc3QgZml0dGluZyBzZWdtZW50XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5nZXROZXh0Rml0dGluZ1NlZ21lbnQodGhpcy5nZXRDdXJyZW50U2VnbWVudCgpKTtcbiAgICAgICAgdGhpcy50aHJvd19hd2F5ID0gKCFzZWdtZW50KTtcbiAgICB9XG5cbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGxpbmUgZ2VvbWV0cnkgY3JlYXRpbmcgdGhlIG5leHQgdmFsaWQgbGFiZWwuXG4gICAgc3RhdGljIG5leHRMYWJlbChsYWJlbCkge1xuICAgICAgICAvLyBpbmNyZW1lbnQgc2VnbWVudFxuICAgICAgICBsZXQgaGFzTmV4dCA9IGxhYmVsLmdldE5leHRTZWdtZW50KCk7XG4gICAgICAgIGlmICghaGFzTmV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xvbmUgb3B0aW9uc1xuICAgICAgICBsZXQgbGF5b3V0ID0gT2JqZWN0LmNyZWF0ZShsYWJlbC5sYXlvdXQpO1xuICAgICAgICBsYXlvdXQuc2VnbWVudF9pbmRleCA9IGxhYmVsLnNlZ21lbnRfaW5kZXg7XG4gICAgICAgIGxheW91dC5wbGFjZW1lbnQgPSBsYWJlbC5wbGFjZW1lbnQ7XG5cbiAgICAgICAgLy8gY3JlYXRlIG5ldyBsYWJlbFxuICAgICAgICBsZXQgbmV4dExhYmVsID0gbmV3IExhYmVsTGluZShsYWJlbC5zaXplLCBsYWJlbC5saW5lcywgbGF5b3V0KTtcblxuICAgICAgICByZXR1cm4gKG5leHRMYWJlbC50aHJvd19hd2F5KSA/IGZhbHNlIDogbmV4dExhYmVsO1xuICAgIH1cblxuICAgIC8vIFN0cmF0ZWd5IGZvciByZXR1cm5pbmcgdGhlIG5leHQgc2VnbWVudC4gQXNzdW1lcyBhbiBcIm9yZGVyaW5nXCIgb2YgcG9zc2libGUgc2VnbWVudHNcbiAgICAvLyB0YWtpbmcgaW50byBhY2NvdW50IGJvdGggc3RyYWlnaHQgYW5kIGFydGljdWxhdGVkIHNlZ21lbnRzLiBSZXR1cm5zIGZhbHNlIGlmIGFsbCBwb3NzaWJpbGl0aWVzXG4gICAgLy8gaGF2ZSBiZWVuIGV4aGF1c3RlZFxuICAgIGdldE5leHRTZWdtZW50KCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSBQTEFDRU1FTlQuTUlEX1BPSU5UO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZ21lbnRfaW5kZXggPj0gdGhpcy5saW5lcy5sZW5ndGggLSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zaXplLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSBQTEFDRU1FTlQuQ09STkVSO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRfaW5kZXgrKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRTZWdtZW50KCk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyB0aGUgbGluZSBzZWdtZW50cyBuZWNlc3NhcnkgZm9yIG90aGVyIGNhbGN1bGF0aW9ucyBhdCB0aGUgY3VycmVudCBsaW5lIHNlZ21lbnQgaW5kZXguXG4gICAgLy8gVGhpcyBpcyB0aGUgY3VycmVudCBhbmQgbmV4dCBzZWdtZW50IGZvciBhIHN0cmFpZ2h0IGxpbmUsIGFuZCB0aGUgcHJldmlvdXMsIGN1cnJlbnQgYW5kIG5leHRcbiAgICAvLyBmb3IgYW4gYXJ0aWN1bGF0ZWQgc2VnbWVudC5cbiAgICBnZXRDdXJyZW50U2VnbWVudCgpIHtcbiAgICAgICAgbGV0IHAxLCBwMiwgc2VnbWVudDtcbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIHAxID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXggLSAxXTtcbiAgICAgICAgICAgICAgICBwMiA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4XTtcbiAgICAgICAgICAgICAgICBsZXQgcDMgPSB0aGlzLmxpbmVzW3RoaXMuc2VnbWVudF9pbmRleCArIDFdO1xuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBbIHAxLCBwMiwgcDMgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICBwMSA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4XTtcbiAgICAgICAgICAgICAgICBwMiA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4ICsgMV07XG4gICAgICAgICAgICAgICAgc2VnbWVudCA9IFsgcDEsIHAyIF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VnbWVudDtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIG5leHQgc2VnbWVudCB0aGF0IGlzIHZhbGlkICh3aXRoaW4gdGlsZSwgaW5zaWRlIGFuZ2xlIHJlcXVpcmVtZW50cyBhbmQgd2l0aGluIGxpbmUgZ2VvbWV0cnkpLlxuICAgIGdldE5leHRGaXR0aW5nU2VnbWVudChzZWdtZW50KSB7XG4gICAgICAgIHNlZ21lbnQgPSBzZWdtZW50IHx8IHRoaXMuZ2V0TmV4dFNlZ21lbnQoKTtcbiAgICAgICAgaWYgKCFzZWdtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kb2VzU2VnbWVudEZpdChzZWdtZW50KSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmluVGlsZUJvdW5kcygpICYmIHRoaXMuaW5BbmdsZUJvdW5kcygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlZ21lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXROZXh0Rml0dGluZ1NlZ21lbnQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGN1cnJlbnQgc2VnbWVudCBpcyB2YWxpZFxuICAgIGRvZXNTZWdtZW50Rml0KHNlZ21lbnQpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpdEtpbmtlZFNlZ21lbnQoc2VnbWVudCk7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZml0U3RyYWlnaHRTZWdtZW50KHNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBraW5rZWQgc2VnbWVudCBpcyB2YWxpZFxuICAgIC8vIEN5Y2xlcyB0aHJvdWdoIHZhcmlvdXMgd2F5cyBvZiBraW5raW5nIHRoZSBsYWJlbHMgYXJvdW5kIHRoZSBzZWdtZW50J3MgcGl2b3QsXG4gICAgLy8gZmluZGluZyB0aGUgYmVzdCBmaXQsIGFuZCBkZXRlcm1pbmVzIHRoZSBraW5rX2luZGV4LlxuICAgIGZpdEtpbmtlZFNlZ21lbnQoc2VnbWVudCkge1xuICAgICAgICBsZXQgdXBwID0gdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsO1xuXG4gICAgICAgIGxldCBwMHAxID0gVmVjdG9yLnN1YihzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICAgICAgbGV0IHAxcDIgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMV0sIHNlZ21lbnRbMl0pO1xuXG4gICAgICAgIC8vIERvbid0IGZpdCBpZiBzZWdtZW50IGRvZXNuJ3QgcGFzcyB0aGUgdmVydGljYWwgbGluZSB0ZXN0LCByZXN1bHRpbmcgaW4gdXBzaWRlLWRvd24gbGFiZWxzXG4gICAgICAgIGlmIChwMHAxWzBdICogcDFwMlswXSA8IDAgJiYgcDBwMVsxXSAqIHAxcDJbMV0gPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGluZV9sZW5ndGgxID0gVmVjdG9yLmxlbmd0aChwMHAxKSAvIHVwcDtcbiAgICAgICAgbGV0IGxpbmVfbGVuZ3RoMiA9IFZlY3Rvci5sZW5ndGgocDFwMikgLyB1cHA7XG5cbiAgICAgICAgLy8gYnJlYWsgdXAgbXVsdGlwbGUgc2VnbWVudHMgaW50byB0d28gY2h1bmtzIChOLTEgb3B0aW9ucylcbiAgICAgICAgbGV0IGxhYmVsX2xlbmd0aDEgPSB0aGlzLnRvdGFsX2xlbmd0aDtcbiAgICAgICAgbGV0IGxhYmVsX2xlbmd0aDIgPSAwO1xuICAgICAgICBsZXQgd2lkdGgsIGZpdG5lc3MgPSAwO1xuICAgICAgICBsZXQga2lua19pbmRleCA9IHRoaXMubnVtX3NlZ21lbnRzIC0gMTtcbiAgICAgICAgbGV0IGZpdG5lc3NlcyA9IFtdO1xuXG4gICAgICAgIHdoaWxlIChraW5rX2luZGV4ID4gMCkge1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLnNpemVba2lua19pbmRleF1bMF0gKyB0aGlzLnNwYWNlX3dpZHRoO1xuXG4gICAgICAgICAgICBsYWJlbF9sZW5ndGgxIC09IHdpZHRoO1xuICAgICAgICAgICAgbGFiZWxfbGVuZ3RoMiArPSB3aWR0aDtcblxuICAgICAgICAgICAgZml0bmVzcyA9IE1hdGgubWF4KGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoMSwgbGFiZWxfbGVuZ3RoMSksIGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoMiwgbGFiZWxfbGVuZ3RoMikpO1xuICAgICAgICAgICAgZml0bmVzc2VzLnVuc2hpZnQoZml0bmVzcyk7XG5cbiAgICAgICAgICAgIGtpbmtfaW5kZXgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXhfZml0bmVzcyA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGZpdG5lc3Nlcyk7XG5cbiAgICAgICAgaWYgKG1heF9maXRuZXNzIDwgTElORV9FWENFRURfS0lOS0VEKSB7XG4gICAgICAgICAgICB0aGlzLmtpbmtfaW5kZXggPSBmaXRuZXNzZXMuaW5kZXhPZihtYXhfZml0bmVzcykgKyAxO1xuICAgICAgICAgICAgdGhpcy5maXRuZXNzID0gbWF4X2ZpdG5lc3M7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMua2lua19pbmRleCA9IDA7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHN0cmFpZ2h0IHNlZ21lbnQgaXMgdmFsaWRcbiAgICAvLyBBIHN0cmFpZ2h0IHNlZ21lbnQgaXMgcGxhY2VkIGF0IHRoZSBtaWRwb2ludCBhbmQgaXMgdmFsaWQgaWYgdGhlIGxhYmVsJ3MgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBhXG4gICAgLy8gZmFjdG9yIChMSU5FX0VYQ0VFRF9TVFJBSUdIVCkgb2YgdGhlIGxpbmUgc2VnbWVudCdzIGxlbmd0aFxuICAgIGZpdFN0cmFpZ2h0U2VnbWVudChzZWdtZW50KSB7XG4gICAgICAgIGxldCB1cHAgPSB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWw7XG4gICAgICAgIGxldCBsaW5lX2xlbmd0aCA9IFZlY3Rvci5sZW5ndGgoVmVjdG9yLnN1YihzZWdtZW50WzBdLCBzZWdtZW50WzFdKSkgLyB1cHA7XG4gICAgICAgIGxldCBmaXRuZXNzID0gY2FsY0ZpdG5lc3MobGluZV9sZW5ndGgsIHRoaXMudG90YWxfbGVuZ3RoKTtcblxuICAgICAgICBpZiAoZml0bmVzcyA8IExJTkVfRVhDRUVEX1NUUkFJR0hUKXtcbiAgICAgICAgICAgIHRoaXMuZml0bmVzcyA9IGZpdG5lc3M7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uY2UgYSBmaXR0aW5nIHNlZ21lbnQgaXMgZm91bmQsIGRldGVybWluZSBpdHMgYW5nbGVzLCBwb3NpdGlvbnMgYW5kIGJvdW5kaW5nIGJveGVzXG4gICAgdXBkYXRlKCkge1xuICAgICAgICB0aGlzLmFuZ2xlID0gdGhpcy5nZXRDdXJyZW50QW5nbGUoKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHRoaXMuZ2V0Q3VycmVudFBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQkJveGVzKCk7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudEFuZ2xlKCkge1xuICAgICAgICBsZXQgc2VnbWVudCA9IHRoaXMuZ2V0Q3VycmVudFNlZ21lbnQoKTtcbiAgICAgICAgbGV0IGFuZ2xlcyA9IFtdO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBsZXQgdGhldGExID0gZ2V0QW5nbGVGcm9tU2VnbWVudChzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICAgICAgICAgICAgICBsZXQgdGhldGEyID0gZ2V0QW5nbGVGcm9tU2VnbWVudChzZWdtZW50WzFdLCBzZWdtZW50WzJdKTtcblxuICAgICAgICAgICAgICAgIGxldCBwMHAxID0gVmVjdG9yLnN1YihzZWdtZW50WzBdLCBzZWdtZW50WzFdKTtcbiAgICAgICAgICAgICAgICBsZXQgcDFwMiA9IFZlY3Rvci5zdWIoc2VnbWVudFsxXSwgc2VnbWVudFsyXSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgb3JpZW50YXRpb24gPSAocDBwMVswXSA+PSAwICYmIHAxcDJbMF0gPj0gMCkgPyAxIDogLTE7XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCB0aGlzLmtpbmtfaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSAob3JpZW50YXRpb24gPiAwKSA/IHRoZXRhMiA6IHRoZXRhMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gKG9yaWVudGF0aW9uID4gMCkgPyB0aGV0YTEgOiB0aGV0YTI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYW5nbGVzLnB1c2goYW5nbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICBsZXQgdGhldGEgPSBnZXRBbmdsZUZyb21TZWdtZW50KHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1fc2VnbWVudHM7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlcy5wdXNoKHRoZXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYW5nbGVzO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgbGFiZWxcbiAgICBnZXRDdXJyZW50UG9zaXRpb24oKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5nZXRDdXJyZW50U2VnbWVudCgpO1xuICAgICAgICBsZXQgcG9zaXRpb247XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gc2VnbWVudFsxXS5zbGljZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gW1xuICAgICAgICAgICAgICAgICAgICAwLjUgKiAoc2VnbWVudFswXVswXSArIHNlZ21lbnRbMV1bMF0pLFxuICAgICAgICAgICAgICAgICAgICAwLjUgKiAoc2VnbWVudFswXVsxXSArIHNlZ21lbnRbMV1bMV0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgYXJ0aWN1bGF0ZWQgbGFiZWxzIHRvIGJlIHdpdGhpbiBhbiBhbmdsZSByYW5nZSBbLU1BWF9BTkdMRSwgK01BWF9BTkdMRV1cbiAgICBpbkFuZ2xlQm91bmRzKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMCA9IHRoaXMuYW5nbGVbMF07XG4gICAgICAgICAgICAgICAgaWYgKGFuZ2xlMCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGUwICs9IDIgKiBNYXRoLlBJO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhbmdsZTEgPSB0aGlzLmFuZ2xlWzFdO1xuICAgICAgICAgICAgICAgIGlmIChhbmdsZTEgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlMSArPSAyICogTWF0aC5QSTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdGhldGEgPSBNYXRoLmFicyhhbmdsZTEgLSBhbmdsZTApO1xuICAgICAgICAgICAgICAgIHRoZXRhID0gTWF0aC5taW4oMiAqIE1hdGguUEkgLSB0aGV0YSwgdGhldGEpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoZXRhIDw9IE1BWF9BTkdMRTtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBib3VuZGluZyBib3hlc1xuICAgIHVwZGF0ZUJCb3hlcygpIHtcbiAgICAgICAgbGV0IHVwcCA9IHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcbiAgICAgICAgbGV0IGhlaWdodCA9ICh0aGlzLnRvdGFsX2hlaWdodCArIHRoaXMubGF5b3V0LmJ1ZmZlclsxXSAqIDIpICogdXBwICogTGFiZWwuZXBzaWxvbjtcblxuICAgICAgICAvLyByZXNldCBib3VuZGluZyBib3hlc1xuICAgICAgICB0aGlzLm9iYnMgPSBbXTtcbiAgICAgICAgdGhpcy5hYWJicyA9IFtdO1xuXG4gICAgICAgIC8vIGZ1ZGdlIHdpZHRoIHZhbHVlIGFzIHRleHQgbWF5IG92ZXJmbG93IGJvdW5kaW5nIGJveCBpZiBpdCBoYXMgaXRhbGljLCBib2xkLCBldGMgc3R5bGVcbiAgICAgICAgbGV0IGl0YWxpY3NfYnVmZmVyID0gKHRoaXMubGF5b3V0Lml0YWxpYykgPyA1ICogdXBwIDogMDtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMCA9IHRoaXMuYW5nbGVbdGhpcy5raW5rX2luZGV4IC0gMV07IC8vIGFuZ2xlIGJlZm9yZSBraW5rXG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMSA9IHRoaXMuYW5nbGVbdGhpcy5raW5rX2luZGV4XTsgLy8gYW5nbGUgYWZ0ZXIga2lua1xuICAgICAgICAgICAgICAgIGxldCB0aGV0YSA9IE1hdGguYWJzKGFuZ2xlMSAtIGFuZ2xlMCk7IC8vIGFuZ2xlIGRlbHRhXG5cbiAgICAgICAgICAgICAgICAvLyBBIHNwcmVhZCBmYWN0b3Igb2YgMCBwaXZvdHMgdGhlIGJveGVzIG9uIHRoZWlyIGhvcml6b250YWwgY2VudGVyLCBsb29raW5nIGxpa2U6IFwiWFwiXG4gICAgICAgICAgICAgICAgLy8gYSBzcHJlYWQgZmFjdG9yIG9mIDEgb2Zmc2V0cyB0aGUgYm94ZXMgc28gdGhhdCB0aGVpciBjb3JuZXJzIHRvdWNoLCBsb29raW5nIGxpa2U6IFwiXFwvXCIgb3IgXCIvXFxcIlxuICAgICAgICAgICAgICAgIGxldCBkeCA9IHRoaXMuc3ByZWFkX2ZhY3RvciAqIE1hdGguYWJzKHRoaXMudG90YWxfaGVpZ2h0ICogTWF0aC50YW4oMC41ICogdGhldGEpKTtcbiAgICAgICAgICAgICAgICBsZXQgbnVkZ2UgPSAwLjUgKiAoLWR4IC0gdGhpcy5zcGFjZV93aWR0aCk7XG5cbiAgICAgICAgICAgICAgICAvLyBQbGFjZSBsYWJlbHMgYmFja3dhcmRzIGZyb20ga2luayBpbmRleFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmtpbmtfaW5kZXggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGhfcHggPSB0aGlzLnNpemVbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IHRoaXMuYW5nbGVbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gKHdpZHRoX3B4ICsgMiAqIHRoaXMubGF5b3V0LmJ1ZmZlclswXSkgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuXG4gICAgICAgICAgICAgICAgICAgIG51ZGdlIC09IDAuNSAqIHdpZHRoX3B4O1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSBWZWN0b3Iucm90KFtudWRnZSAqIHVwcCwgMF0sIC1hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IFZlY3Rvci5hZGQodGhpcy5wb3NpdGlvbiwgb2Zmc2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JiID0gZ2V0T0JCKHBvc2l0aW9uLCB3aWR0aCArIGl0YWxpY3NfYnVmZmVyLCBoZWlnaHQsIGFuZ2xlLCB0aGlzLm9mZnNldCwgdXBwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFhYmIgPSBvYmIuZ2V0RXh0ZW50KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmJzLnB1c2gob2JiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hYWJicy5wdXNoKGFhYmIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFswXSArIG51ZGdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzFdXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgLT0gMC41ICogd2lkdGhfcHggKyB0aGlzLnNwYWNlX3dpZHRoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFBsYWNlIGxhYmVscyBmb3J3YXJkcyBmcm9tIGtpbmsgaW5kZXhcbiAgICAgICAgICAgICAgICBudWRnZSA9IDAuNSAqIChkeCArIHRoaXMuc3BhY2Vfd2lkdGgpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMua2lua19pbmRleDsgaSA8IHRoaXMubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGhfcHggPSB0aGlzLnNpemVbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IHRoaXMuYW5nbGVbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gKHdpZHRoX3B4ICsgMiAqIHRoaXMubGF5b3V0LmJ1ZmZlclswXSkgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuXG4gICAgICAgICAgICAgICAgICAgIG51ZGdlICs9IDAuNSAqIHdpZHRoX3B4O1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSBWZWN0b3Iucm90KFtudWRnZSAqIHVwcCwgMF0sIC1hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IFZlY3Rvci5hZGQodGhpcy5wb3NpdGlvbiwgb2Zmc2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JiID0gZ2V0T0JCKHBvc2l0aW9uLCB3aWR0aCArIGl0YWxpY3NfYnVmZmVyLCBoZWlnaHQsIGFuZ2xlLCB0aGlzLm9mZnNldCwgdXBwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFhYmIgPSBvYmIuZ2V0RXh0ZW50KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmJzLnB1c2gob2JiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hYWJicy5wdXNoKGFhYmIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFswXSArIG51ZGdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzFdXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgKz0gMC41ICogd2lkdGhfcHggKyB0aGlzLnNwYWNlX3dpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICBsZXQgc2hpZnQgPSAtMC41ICogdGhpcy50b3RhbF9sZW5ndGg7IC8vIHNoaWZ0IGZvciBjZW50ZXJpbmcgdGhlIGxhYmVsc1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoX3B4ID0gdGhpcy5zaXplW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSAod2lkdGhfcHggKyAyICogdGhpcy5sYXlvdXQuYnVmZmVyWzBdKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IHRoaXMuYW5nbGVbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgc2hpZnQgKz0gMC41ICogd2lkdGhfcHg7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IFZlY3Rvci5yb3QoW3NoaWZ0ICogdXBwLCAwXSwgLWFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gVmVjdG9yLmFkZCh0aGlzLnBvc2l0aW9uLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmIgPSBnZXRPQkIocG9zaXRpb24sIHdpZHRoICsgaXRhbGljc19idWZmZXIsIGhlaWdodCwgYW5nbGUsIHRoaXMub2Zmc2V0LCB1cHApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWFiYiA9IG9iYi5nZXRFeHRlbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iYnMucHVzaChvYmIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFhYmJzLnB1c2goYWFiYik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2ldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzBdICsgc2hpZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMV1cbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBzaGlmdCArPSAwLjUgKiB3aWR0aF9weCArIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVja3MgZWFjaCBzZWdtZW50IHRvIHNlZSBpZiBpdCBpcyB3aXRoaW4gdGhlIHRpbGUuIElmIGFueSBzZWdtZW50IGZhaWxzIHRoaXMgdGVzdCwgdGhleSBhbGwgZmFpbC5cbiAgICAvLyBUT0RPOiBsYWJlbCBncm91cFxuICAgIGluVGlsZUJvdW5kcygpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFhYmJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYWFiYiA9IHRoaXMuYWFiYnNbaV07XG4gICAgICAgICAgICBsZXQgb2JqID0geyBhYWJiIH07XG4gICAgICAgICAgICBsZXQgaW5fYm91bmRzID0gTGFiZWwucHJvdG90eXBlLmluVGlsZUJvdW5kcy5jYWxsKG9iaik7XG4gICAgICAgICAgICBpZiAoIWluX2JvdW5kcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBBZGRzIGVhY2ggc2VnbWVudCB0byB0aGUgY29sbGlzaW9uIHBhc3MgYXMgaXRzIG93biBib3VuZGluZyBib3hcbiAgICAvLyBUT0RPOiBsYWJlbCBncm91cFxuICAgIGFkZChiYm94ZXMpIHtcbiAgICAgICAgdGhpcy5wbGFjZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYWFiYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBhYWJiID0gdGhpcy5hYWJic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmIgPSB0aGlzLm9iYnNbaV07XG4gICAgICAgICAgICBsZXQgb2JqID0geyBhYWJiLCBvYmIgfTtcbiAgICAgICAgICAgIExhYmVsLnByb3RvdHlwZS5hZGQuY2FsbChvYmosIGJib3hlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVja3MgZWFjaCBzZWdtZW50IHRvIHNlZSBpZiBpdCBzaG91bGQgYmUgZGlzY2FyZGVkICh2aWEgY29sbGlzaW9uKS4gSWYgYW55IHNlZ21lbnQgZmFpbHMgdGhpcyB0ZXN0LCB0aGV5IGFsbCBmYWlsLlxuICAgIC8vIFRPRE86IGxhYmVsIGdyb3VwXG4gICAgZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLnRocm93X2F3YXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9iYnMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgbGV0IGFhYmIgPSB0aGlzLmFhYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iYiA9IHRoaXMub2Jic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmogPSB7IGFhYmIsIG9iYiB9O1xuXG4gICAgICAgICAgICBsZXQgc2hvdWxkRGlzY2FyZCA9IExhYmVsLnByb3RvdHlwZS5vY2NsdWRlZC5jYWxsKG9iaiwgYmJveGVzLCBleGNsdWRlKTtcbiAgICAgICAgICAgIGlmIChzaG91bGREaXNjYXJkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLy8gUHJpdmF0ZSBtZXRob2QgdG8gY2FsY3VsYXRlIG9yaWVudGVkIGJvdW5kaW5nIGJveFxuZnVuY3Rpb24gZ2V0T0JCKHBvc2l0aW9uLCB3aWR0aCwgaGVpZ2h0LCBhbmdsZSwgb2Zmc2V0LCB1cHApIHtcbiAgICBsZXQgcDAsIHAxO1xuICAgIC8vIGFwcGx5IG9mZnNldCwgeCBwb3NpdGl2ZSwgeSBwb2ludGluZyBkb3duXG4gICAgaWYgKG9mZnNldCAmJiAob2Zmc2V0WzBdICE9PSAwIHx8IG9mZnNldFsxXSAhPT0gMCkpIHtcbiAgICAgICAgb2Zmc2V0ID0gVmVjdG9yLnJvdChvZmZzZXQsIGFuZ2xlKTtcbiAgICAgICAgcDAgPSBwb3NpdGlvblswXSArIChvZmZzZXRbMF0gKiB1cHApO1xuICAgICAgICBwMSA9IHBvc2l0aW9uWzFdIC0gKG9mZnNldFsxXSAqIHVwcCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwMCA9IHBvc2l0aW9uWzBdO1xuICAgICAgICBwMSA9IHBvc2l0aW9uWzFdO1xuICAgIH1cblxuICAgIC8vIHRoZSBhbmdsZSBvZiB0aGUgb2JiIGlzIG5lZ2F0aXZlIHNpbmNlIGl0J3MgdGhlIHRpbGUgc3lzdGVtIHkgYXhpcyBpcyBwb2ludGluZyBkb3duXG4gICAgcmV0dXJuIG5ldyBPQkIocDAsIHAxLCAtYW5nbGUsIHdpZHRoLCBoZWlnaHQpO1xufVxuXG4vLyBQcml2YXRlIG1ldGhvZCB0byBjYWxjdWxhdGUgdGhlIGFuZ2xlIG9mIGEgc2VnbWVudC5cbi8vIFRyYW5zZm9ybXMgdGhlIGFuZ2xlIHRvIGxpZSB3aXRoaW4gdGhlIHJhbmdlIFswLCBQSS8yXSBhbmQgWzMqUEkvMiwgMipQSV0gKDFzdCBvciA0dGggcXVhZHJhbnRzKVxuLy8gYXMgb3RoZXIgcmFuZ2VzIHByb2R1Y2UgXCJ1cHNpZGUgZG93blwiIGxhYmVsc1xuZnVuY3Rpb24gZ2V0QW5nbGVGcm9tU2VnbWVudChwdDEsIHB0Mikge1xuICAgIGxldCBQSSA9IE1hdGguUEk7XG4gICAgbGV0IFBJXzIgPSBQSSAvIDI7XG4gICAgbGV0IHAxcDIgPSBWZWN0b3Iuc3ViKHB0MSwgcHQyKTtcbiAgICBsZXQgdGhldGEgPSBNYXRoLmF0YW4yKHAxcDJbMF0sIHAxcDJbMV0pICsgUElfMjtcblxuICAgIGlmICh0aGV0YSA+IFBJXzIpIHtcbiAgICAgICAgLy8gSWYgaW4gMm5kIHF1YWRyYW50LCBtb3ZlIHRvIDR0aCBxdWFkcmFudFxuICAgICAgICB0aGV0YSArPSBQSTtcbiAgICAgICAgdGhldGEgJT0gMiAqIE1hdGguUEk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoZXRhIDwgMCkge1xuICAgICAgICAvLyBJZiBpbiA0dGggcXVhZHJhbnQsIG1ha2UgYSBwb3NpdGl2ZSBhbmdsZVxuICAgICAgICB0aGV0YSArPSAyICogUEk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoZXRhO1xufVxuXG5mdW5jdGlvbiBjYWxjRml0bmVzcyhsaW5lX2xlbmd0aCwgbGFiZWxfbGVuZ3RoKXtcbiAgICByZXR1cm4gMSAtIGxpbmVfbGVuZ3RoIC8gbGFiZWxfbGVuZ3RoO1xufVxuIiwiaW1wb3J0IExhYmVsIGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IFBvaW50QW5jaG9yIGZyb20gJy4vcG9pbnRfYW5jaG9yJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCBPQkIgZnJvbSAnLi4vdXRpbHMvb2JiJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbFBvaW50IGV4dGVuZHMgTGFiZWwge1xuXG4gICAgY29uc3RydWN0b3IgKHBvc2l0aW9uLCBzaXplLCBsYXlvdXQpIHtcbiAgICAgICAgc3VwZXIoc2l6ZSwgbGF5b3V0KTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IFtwb3NpdGlvblswXSwgcG9zaXRpb25bMV1dO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHRoaXMubGF5b3V0LnBhcmVudDtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcblxuICAgICAgICB0aGlzLnN0YXJ0X2FuY2hvcl9pbmRleCA9IDE7XG4gICAgICAgIHRoaXMuZGVnZW5lcmF0ZSA9ICF0aGlzLnNpemVbMF0gJiYgIXRoaXMuc2l6ZVsxXSAmJiAhdGhpcy5sYXlvdXQuYnVmZmVyWzBdICYmICF0aGlzLmxheW91dC5idWZmZXJbMV07XG4gICAgICAgIHRoaXMudGhyb3dfYXdheSA9ICF0aGlzLmdldE5leHRGaXQoKTtcbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHN1cGVyLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLmNvbXB1dGVPZmZzZXQoKTtcbiAgICAgICAgdGhpcy51cGRhdGVCQm94ZXMoKTtcbiAgICB9XG5cbiAgICBjb21wdXRlT2Zmc2V0ICgpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBbdGhpcy5sYXlvdXQub2Zmc2V0WzBdLCB0aGlzLmxheW91dC5vZmZzZXRbMV1dO1xuXG4gICAgICAgIC8vIEFkZGl0aW9uYWwgYW5jaG9yL29mZnNldCBmb3IgcG9pbnQ6XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgICAgICAgICAgLy8gcG9pbnQncyBvd24gYW5jaG9yLCB0ZXh0IGFuY2hvciBhcHBsaWVkIHRvIHBvaW50LCBhZGRpdGlvbmFsIHBvaW50IG9mZnNldFxuICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBQb2ludEFuY2hvci5jb21wdXRlT2Zmc2V0KHRoaXMub2Zmc2V0LCBwYXJlbnQuc2l6ZSwgcGFyZW50LmFuY2hvciwgUG9pbnRBbmNob3IuemVyb19idWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBQb2ludEFuY2hvci5jb21wdXRlT2Zmc2V0KHRoaXMub2Zmc2V0LCBwYXJlbnQuc2l6ZSwgdGhpcy5hbmNob3IsIFBvaW50QW5jaG9yLnplcm9fYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQub2Zmc2V0ICE9PSBTdHlsZVBhcnNlci56ZXJvUGFpcikgeyAgICAgICAgLy8gcG9pbnQgaGFzIGFuIG9mZnNldFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldCA9PT0gU3R5bGVQYXJzZXIuemVyb1BhaXIpIHsgICAgICAvLyBubyB0ZXh0IG9mZnNldCwgdXNlIHBvaW50J3NcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBwYXJlbnQub2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGV4dCBoYXMgb2Zmc2V0LCBhZGQgcG9pbnQnc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldFswXSArPSBwYXJlbnQub2Zmc2V0WzBdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldFsxXSArPSBwYXJlbnQub2Zmc2V0WzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gUG9pbnRBbmNob3IuY29tcHV0ZU9mZnNldCh0aGlzLm9mZnNldCwgdGhpcy5zaXplLCB0aGlzLmFuY2hvcik7XG4gICAgfVxuXG4gICAgdXBkYXRlQkJveGVzICgpIHtcbiAgICAgICAgbGV0IHdpZHRoID0gKHRoaXMuc2l6ZVswXSArIHRoaXMubGF5b3V0LmJ1ZmZlclswXSAqIDIpICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsICogTGFiZWwuZXBzaWxvbjtcbiAgICAgICAgbGV0IGhlaWdodCA9ICh0aGlzLnNpemVbMV0gKyB0aGlzLmxheW91dC5idWZmZXJbMV0gKiAyKSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbCAqIExhYmVsLmVwc2lsb247XG5cbiAgICAgICAgLy8gZnVkZ2Ugd2lkdGggdmFsdWUgYXMgdGV4dCBtYXkgb3ZlcmZsb3cgYm91bmRpbmcgYm94IGlmIGl0IGhhcyBpdGFsaWMsIGJvbGQsIGV0YyBzdHlsZVxuICAgICAgICBpZiAodGhpcy5sYXlvdXQuaXRhbGljKXtcbiAgICAgICAgICAgIHdpZHRoICs9IDUgKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcCA9IFtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMF0gKyAodGhpcy5vZmZzZXRbMF0gKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWwpLFxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblsxXSAtICh0aGlzLm9mZnNldFsxXSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLm9iYiA9IG5ldyBPQkIocFswXSwgcFsxXSwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuYWFiYiA9IHRoaXMub2JiLmdldEV4dGVudCgpO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBtb3ZlIHRoZSBsYWJlbCBpbnRvIHRoZSB0aWxlIGJvdW5kc1xuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBsYWJlbCB3YXMgbW92ZWQgaW50byB0aWxlLCBmYWxzZSBpZiBpdCBjb3VsZG4ndCBiZSBtb3ZlZFxuICAgIG1vdmVJbnRvVGlsZSAoKSB7XG4gICAgICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlswXSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMF0gKz0gLXRoaXMuYWFiYlswXTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlsyXSA+PSBHZW8udGlsZV9zY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblswXSAtPSB0aGlzLmFhYmJbMl0gLSBHZW8udGlsZV9zY2FsZSArIDE7XG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFhYmJbM10gPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzFdIC09IHRoaXMuYWFiYlszXTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlsxXSA8PSAtR2VvLnRpbGVfc2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMV0gLT0gdGhpcy5hYWJiWzFdICsgR2VvLnRpbGVfc2NhbGUgLSAxO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCQm94ZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH1cblxuICAgIGdldE5leHRGaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXQuY3VsbF9mcm9tX3RpbGUgfHwgdGhpcy5pblRpbGVCb3VuZHMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXlvdXQubW92ZV9pbnRvX3RpbGUpe1xuICAgICAgICAgICAgdGhpcy5tb3ZlSW50b1RpbGUoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5sYXlvdXQuYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG9uIHNlY29uZCBhbmNob3IgKGZpcnN0IGFuY2hvciB3YXMgc2V0IG9uIGNyZWF0aW9uKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5sYXlvdXQuYW5jaG9yLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5jaG9yID0gdGhpcy5sYXlvdXQuYW5jaG9yW2ldO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRfYW5jaG9yX2luZGV4ID0gaTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pblRpbGVCb3VuZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vIGFuY2hvcnMgcmVzdWx0IGluIGZpdFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzY2FyZCAoYmJveGVzLCBleGNsdWRlID0gbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5kZWdlbmVyYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3VwZXIuZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUpKSB7XG4gICAgICAgICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIGFuY2hvciBzcGVjaWZpZWQsIHRyeSB0aGVtIGluIG9yZGVyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmxheW91dC5hbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgb24gc2Vjb25kIGFuY2hvciAoZmlyc3QgYW5jaG9yIHdhcyBzZXQgb24gY3JlYXRpb24pXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT10aGlzLnN0YXJ0X2FuY2hvcl9pbmRleDsgaSA8IHRoaXMubGF5b3V0LmFuY2hvci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuY2hvciA9IHRoaXMubGF5b3V0LmFuY2hvcltpXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXlvdXQuY3VsbF9mcm9tX3RpbGUgJiYgIXRoaXMuaW5UaWxlQm91bmRzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdXBlci5kaXNjYXJkKGJib3hlcywgZXhjbHVkZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbn1cblxuLy8gUGxhY2VtZW50IHN0cmF0ZWdpZXNcbkxhYmVsUG9pbnQuUExBQ0VNRU5UID0ge1xuICAgIFZFUlRFWDogMCwgICAgICAgICAgLy8gcGxhY2UgbGFiZWxzIGF0IGVuZHBvaW50cyBvZiBsaW5lIHNlZ21lbnRzXG4gICAgTUlEUE9JTlQ6IDEsICAgICAgICAvLyBwbGFjZSBsYWJlbHMgYXQgbWlkcG9pbnRzIG9mIGxpbmUgc2VnbWVudHNcbiAgICBTUEFDRUQ6IDIsICAgICAgICAgIC8vIHBsYWNlIGxhYmVscyBlcXVhbGx5IHNwYWNlZCBhbG9uZyBsaW5lXG4gICAgQ0VOVFJPSUQ6IDMgICAgICAgICAvLyBwbGFjZSBsYWJlbHMgYXQgY2VudGVyIG9mIHBvbHlnb25zXG59O1xuIiwiLy8gU2V0cyBvZiB2YWx1ZXMgdG8gbWF0Y2ggZm9yIGRpcmVjdGlvbmFsIGFuZCBjb3JuZXIgYW5jaG9yc1xuY29uc3QgbGVmdHMgPSBbJ2xlZnQnLCAndG9wLWxlZnQnLCAnYm90dG9tLWxlZnQnXTtcbmNvbnN0IHJpZ2h0cyA9IFsncmlnaHQnLCAndG9wLXJpZ2h0JywgJ2JvdHRvbS1yaWdodCddO1xuY29uc3QgdG9wcyA9IFsndG9wJywgJ3RvcC1sZWZ0JywgJ3RvcC1yaWdodCddO1xuY29uc3QgYm90dG9tcyA9IFsnYm90dG9tJywgJ2JvdHRvbS1sZWZ0JywgJ2JvdHRvbS1yaWdodCddO1xuXG5sZXQgUG9pbnRBbmNob3I7XG5cbmV4cG9ydCBkZWZhdWx0IFBvaW50QW5jaG9yID0ge1xuXG4gICAgY29tcHV0ZU9mZnNldCAob2Zmc2V0LCBzaXplLCBhbmNob3IsIGJ1ZmZlciA9IG51bGwpIHtcbiAgICAgICAgaWYgKCFhbmNob3IgfHwgYW5jaG9yID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvZmZzZXQyID0gW29mZnNldFswXSwgb2Zmc2V0WzFdXTtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyIHx8IHRoaXMuZGVmYXVsdF9idWZmZXI7XG5cbiAgICAgICAgLy8gQW4gb3B0aW9uYWwgbGVmdC9yaWdodCBvZmZzZXRcbiAgICAgICAgaWYgKHRoaXMuaXNMZWZ0QW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgIG9mZnNldDJbMF0gLT0gc2l6ZVswXSAvIDI7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzBdIC09IGJ1ZmZlclswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzUmlnaHRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlswXSArPSBzaXplWzBdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzBdICs9IGJ1ZmZlclsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFuIG9wdGlvbmFsIHRvcC9ib3R0b20gb2Zmc2V0XG4gICAgICAgIGlmICh0aGlzLmlzVG9wQW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgIG9mZnNldDJbMV0gLT0gc2l6ZVsxXSAvIDI7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID09PSAndG9wJykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMV0gLT0gYnVmZmVyWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNCb3R0b21BbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlsxXSArPSBzaXplWzFdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0MlsxXSArPSBidWZmZXJbM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2Zmc2V0MjtcbiAgICB9LFxuXG4gICAgYWxpZ25Gb3JBbmNob3IgKGFuY2hvcikge1xuICAgICAgICBpZiAoYW5jaG9yICYmIGFuY2hvciAhPT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGVmdEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzUmlnaHRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdjZW50ZXInO1xuICAgIH0sXG5cbiAgICBpc0xlZnRBbmNob3IgKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gKGxlZnRzLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgaXNSaWdodEFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAocmlnaHRzLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgaXNUb3BBbmNob3IgKGFuY2hvcikge1xuICAgICAgICByZXR1cm4gKHRvcHMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICBpc0JvdHRvbUFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAoYm90dG9tcy5pbmRleE9mKGFuY2hvcikgPiAtMSk7XG4gICAgfSxcblxuICAgIC8vIEJ1ZmZlcnM6IFtsZWZ0LCByaWdodCwgdG9wLCBib3R0b21dXG4gICAgZGVmYXVsdF9idWZmZXI6IFsyLjUsIDIuNSwgMS41LCAwLjc1XSxcbiAgICB6ZXJvX2J1ZmZlcjogWzAsIDAsIDAsIDBdXG5cbn07XG4iLCIvLyBMb2dpYyBmb3IgcGxhY2luZyBwb2ludCBsYWJlbHMgYWxvbmcgYSBsaW5lIGdlb21ldHJ5XG5cbmltcG9ydCBMYWJlbFBvaW50IGZyb20gJy4vbGFiZWxfcG9pbnQnO1xuaW1wb3J0IHtpc0Nvb3JkT3V0c2lkZVRpbGV9IGZyb20gJy4uL2J1aWxkZXJzL2NvbW1vbic7XG5cbmNvbnN0IFBMQUNFTUVOVCA9IExhYmVsUG9pbnQuUExBQ0VNRU5UO1xuY29uc3QgZGVmYXVsdF9zcGFjaW5nID0gODA7IC8vIHNwYWNpbmcgb2YgcG9pbnRzIGFsb25nIGxpbmUgaW4gcGl4ZWxzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBsYWNlUG9pbnRzT25MaW5lIChsaW5lLCBzaXplLCBvcHRpb25zKSB7XG4gICAgbGV0IGxhYmVscyA9IFtdO1xuICAgIGxldCBzdHJhdGVneSA9IG9wdGlvbnMucGxhY2VtZW50O1xuICAgIGxldCBtaW5fbGVuZ3RoID0gTWF0aC5tYXgoc2l6ZVswXSwgc2l6ZVsxXSkgKiBvcHRpb25zLnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvICogb3B0aW9ucy51bml0c19wZXJfcGl4ZWw7XG5cbiAgICBzd2l0Y2ggKHN0cmF0ZWd5KXtcbiAgICAgICAgY2FzZSBQTEFDRU1FTlQuU1BBQ0VEOlxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGdldFBvc2l0aW9uc0FuZEFuZ2xlcyhsaW5lLCBtaW5fbGVuZ3RoLCBvcHRpb25zKTtcbiAgICAgICAgICAgIC8vIGZhbHNlIHdpbGwgYmUgcmV0dXJuZWQgaWYgbGluZSBoYXZlIG5vIGxlbmd0aFxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBwb3NpdGlvbnMgPSByZXN1bHQucG9zaXRpb25zO1xuICAgICAgICAgICAgbGV0IGFuZ2xlcyA9IHJlc3VsdC5hbmdsZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gcG9zaXRpb25zW2ldO1xuICAgICAgICAgICAgICAgIGxldCBhbmdsZSA9IGFuZ2xlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aWxlX2VkZ2VzID09PSB0cnVlIHx8ICFpc0Nvb3JkT3V0c2lkZVRpbGUocG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IG5ldyBMYWJlbFBvaW50KHBvc2l0aW9uLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBhbmdsZTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBMQUNFTUVOVC5WRVJURVg6XG4gICAgICAgICAgICBsZXQgcCwgcSwgbGFiZWw7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKXtcbiAgICAgICAgICAgICAgICBwID0gbGluZVtpXTtcbiAgICAgICAgICAgICAgICBxID0gbGluZVtpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGlsZV9lZGdlcyA9PT0gdHJ1ZSB8fCAhaXNDb29yZE91dHNpZGVUaWxlKHApKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbmV3IExhYmVsUG9pbnQocCwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLmFuZ2xlID0gZ2V0QW5nbGUocCwgcSwgb3B0aW9ucy5hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFkZCBsYXN0IGVuZHBvaW50XG4gICAgICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbFBvaW50KHEsIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBnZXRBbmdsZShwLCBxLCBvcHRpb25zLmFuZ2xlKTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURQT0lOVDpcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspe1xuICAgICAgICAgICAgICAgIGxldCBwID0gbGluZVtpXTtcbiAgICAgICAgICAgICAgICBsZXQgcSA9IGxpbmVbaSArIDFdO1xuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9IFtcbiAgICAgICAgICAgICAgICAgICAgMC41ICogKHBbMF0gKyBxWzBdKSxcbiAgICAgICAgICAgICAgICAgICAgMC41ICogKHBbMV0gKyBxWzFdKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGlsZV9lZGdlcyA9PT0gdHJ1ZSB8fCAhaXNDb29yZE91dHNpZGVUaWxlKHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW1pbl9sZW5ndGggfHwgbm9ybShwLCBxKSA+IG1pbl9sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IG5ldyBMYWJlbFBvaW50KHBvc2l0aW9uLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLmFuZ2xlID0gZ2V0QW5nbGUocCwgcSwgb3B0aW9ucy5hbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGxhYmVscztcbn1cblxuZnVuY3Rpb24gZ2V0UG9zaXRpb25zQW5kQW5nbGVzKGxpbmUsIG1pbl9sZW5ndGgsIG9wdGlvbnMpe1xuICAgIGxldCB1cHAgPSBvcHRpb25zLnVuaXRzX3Blcl9waXhlbDtcbiAgICBsZXQgc3BhY2luZyA9IChvcHRpb25zLnBsYWNlbWVudF9zcGFjaW5nIHx8IGRlZmF1bHRfc3BhY2luZykgKiB1cHA7XG5cbiAgICBsZXQgbGVuZ3RoID0gZ2V0TGluZUxlbmd0aChsaW5lKTtcbiAgICBpZiAobGVuZ3RoIDw9IG1pbl9sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBudW1fbGFiZWxzID0gTWF0aC5tYXgoTWF0aC5mbG9vcihsZW5ndGggLyBzcGFjaW5nKSwgMSk7XG4gICAgbGV0IHJlbWFpbmRlciA9IGxlbmd0aCAtIChudW1fbGFiZWxzIC0gMSkgKiBzcGFjaW5nO1xuICAgIGxldCBwb3NpdGlvbnMgPSBbXTtcbiAgICBsZXQgYW5nbGVzID0gW107XG5cbiAgICBsZXQgZGlzdGFuY2UgPSAwLjUgKiByZW1haW5kZXI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1fbGFiZWxzOyBpKyspe1xuICAgICAgICBsZXQge3Bvc2l0aW9uLCBhbmdsZX0gPSBpbnRlcnBvbGF0ZUxpbmUobGluZSwgZGlzdGFuY2UsIG1pbl9sZW5ndGgsIG9wdGlvbnMpO1xuICAgICAgICBpZiAocG9zaXRpb24gIT0gbnVsbCAmJiBhbmdsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaChwb3NpdGlvbik7XG4gICAgICAgICAgICBhbmdsZXMucHVzaChhbmdsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGlzdGFuY2UgKz0gc3BhY2luZztcbiAgICB9XG5cbiAgICByZXR1cm4ge3Bvc2l0aW9ucywgYW5nbGVzfTtcbn1cblxuZnVuY3Rpb24gZ2V0QW5nbGUocCwgcSwgYW5nbGUgPSAwKXtcbiAgICByZXR1cm4gKGFuZ2xlID09PSAnYXV0bycpID8gTWF0aC5hdGFuMihxWzBdIC0gcFswXSwgcVsxXSAtIHBbMV0pIDogYW5nbGU7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVMZW5ndGgobGluZSl7XG4gICAgbGV0IGRpc3RhbmNlID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKXtcbiAgICAgICAgZGlzdGFuY2UgKz0gbm9ybShsaW5lW2ldLCBsaW5lW2krMV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGlzdGFuY2U7XG59XG5cbmZ1bmN0aW9uIG5vcm0ocCwgcSl7XG4gICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhwWzBdIC0gcVswXSwgMikgKyBNYXRoLnBvdyhwWzFdIC0gcVsxXSwgMikpO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUxpbmUobGluZSwgZGlzdGFuY2UsIG1pbl9sZW5ndGgsIG9wdGlvbnMpe1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGxldCBwb3NpdGlvbiwgYW5nbGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aC0xOyBpKyspe1xuICAgICAgICBsZXQgcCA9IGxpbmVbaV07XG4gICAgICAgIGxldCBxID0gbGluZVtpKzFdO1xuXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IG5vcm0ocCwgcSk7XG4gICAgICAgIGlmIChsZW5ndGggPD0gbWluX2xlbmd0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBzdW0gKz0gbGVuZ3RoO1xuXG4gICAgICAgIGlmIChzdW0gPiBkaXN0YW5jZSl7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGludGVycG9sYXRlU2VnbWVudChwLCBxLCBzdW0gLSBkaXN0YW5jZSk7XG4gICAgICAgICAgICBhbmdsZSA9IGdldEFuZ2xlKHAsIHEsIG9wdGlvbnMuYW5nbGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtwb3NpdGlvbiwgYW5nbGV9O1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZVNlZ21lbnQocCwgcSwgZGlzdGFuY2Upe1xuICAgIGxldCBsZW5ndGggPSBub3JtKHAsIHEpO1xuICAgIGxldCByYXRpbyA9IGRpc3RhbmNlIC8gbGVuZ3RoO1xuICAgIHJldHVybiBbXG4gICAgICAgIHJhdGlvICogcFswXSArICgxIC0gcmF0aW8pICogcVswXSxcbiAgICAgICAgcmF0aW8gKiBwWzFdICsgKDEgLSByYXRpbykgKiBxWzFdXG4gICAgXTtcbn1cbiIsImltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwZWF0R3JvdXAge1xuXG4gICAgY29uc3RydWN0b3IgKGtleSwgcmVwZWF0X2Rpc3QsIG1heF9yZXBlYXRfZGlzdCkge1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5yZXBlYXRfZGlzdCA9IHJlcGVhdF9kaXN0O1xuICAgICAgICB0aGlzLnJlcGVhdF9kaXN0X3NxID0gdGhpcy5yZXBlYXRfZGlzdCAqIHRoaXMucmVwZWF0X2Rpc3Q7XG4gICAgICAgIHRoaXMubWF4X3JlcGVhdF9kaXN0X3NxID0gbWF4X3JlcGVhdF9kaXN0ICogbWF4X3JlcGVhdF9kaXN0O1xuICAgICAgICB0aGlzLm9uZV9wZXJfZ3JvdXAgPSAodGhpcy5yZXBlYXRfZGlzdF9zcSA+PSB0aGlzLm1heF9yZXBlYXRfZGlzdF9zcSkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gW107XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYW4gb2JqZWN0IHRvIHNlZSBpZiBpdCdzIGEgcmVwZWF0IGluIHRoaXMgZ3JvdXBcbiAgICBjaGVjayAob2JqKSB7XG4gICAgICAgIC8vIElmIG9ubHkgb25lIG9iamVjdCBhbGxvd2VkIHBlciBncm91cCwgc2hvcnRjdXQgZGlzdGFuY2UgbG9naWNcbiAgICAgICAgaWYgKHRoaXMub25lX3Blcl9ncm91cCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyByZXBvcnRlZCBkaXN0YW5jZSBtYXhlcyBvdXQgYXQgdGhyZXNob2xkIGluIHRoaXMgY2FzZVxuICAgICAgICAgICAgICAgIC8vIChub3QgdHJ1ZSBkaXN0IHZhbHVlIHNpbmNlIHdlIHNraXBwZWQgY2FsY3VsYXRpbmcgaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzdF9zcTogdGhpcy5tYXhfcmVwZWF0X2Rpc3Rfc3EsXG4gICAgICAgICAgICAgICAgICAgIHJlcGVhdF9kaXN0X3NxOiB0aGlzLnJlcGVhdF9kaXN0X3NxLFxuICAgICAgICAgICAgICAgICAgICBvbmVfcGVyX2dyb3VwOiB0aGlzLm9uZV9wZXJfZ3JvdXBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBvYmplY3QgZm9yIHRoaXMgZ3JvdXAgeWV0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBkaXN0YW5jZSBmcm9tIG5ldyBvYmplY3QgdG8gb2JqZWN0cyBhbHJlYWR5IGluIGdyb3VwXG4gICAgICAgIGxldCBwMSA9IG9iai5wb3NpdGlvbjtcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdGhpcy5wb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwMiA9IHRoaXMucG9zaXRpb25zW2ldO1xuICAgICAgICAgICAgbGV0IGR4ID0gcDFbMF0gLSBwMlswXTtcbiAgICAgICAgICAgIGxldCBkeSA9IHAxWzFdIC0gcDJbMV07XG4gICAgICAgICAgICBsZXQgZGlzdF9zcSA9IGR4ICogZHggKyBkeSAqIGR5O1xuXG4gICAgICAgICAgICAvLyBGb3VuZCBhbiBleGlzdGluZyBvYmplY3Qgd2l0aGluIGFsbG93ZWQgZGlzdGFuY2VcbiAgICAgICAgICAgIGlmIChkaXN0X3NxIDwgdGhpcy5yZXBlYXRfZGlzdF9zcSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Rfc3EsXG4gICAgICAgICAgICAgICAgICAgIHJlcGVhdF9kaXN0X3NxOiB0aGlzLnJlcGVhdF9kaXN0X3NxXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBvYmplY3QgdG8gdGhpcyBncm91cFxuICAgIGFkZCAob2JqKSB7XG4gICAgICAgIC8vIG9ubHkgc3RvcmUgb2JqZWN0J3MgcG9zaXRpb24sIHRvIHNhdmUgc3BhY2UgLyBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKG9iaiAmJiBvYmoucG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25zLnB1c2gob2JqLnBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0YXRpYyBtZXRob2RzIGFyZSB1c2VkIHRvIG1hbmFnZSByZXBlYXQgZ3JvdXBzLCB3aXRoaW4gYW5kIGFjcm9zcyB0aWxlc1xuXG4gICAgLy8gUmVzZXQgYWxsIGdyb3VwcyBmb3IgdGhpcyB0aWxlXG4gICAgc3RhdGljIGNsZWFyICh0aWxlKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBzW3RpbGVdID0ge307XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYW4gb2JqZWN0IHRvIHNlZSBpZiBpdCdzIGEgcmVwZWF0IHdpdGhpbiBpdHMgZGVzaWduYXRlZCBncm91cFxuICAgIHN0YXRpYyBjaGVjayAob2JqLCBsYXlvdXQsIHRpbGUpIHtcbiAgICAgICAgaWYgKGxheW91dC5yZXBlYXRfZGlzdGFuY2UgJiYgbGF5b3V0LnJlcGVhdF9ncm91cCAmJiB0aGlzLmdyb3Vwc1t0aWxlXVtsYXlvdXQucmVwZWF0X2dyb3VwXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdLmNoZWNrKG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgYW4gb2JqZWN0IHRvIGl0cyBkZXNpZ25hdGVkIGdyb3VwXG4gICAgc3RhdGljIGFkZCAob2JqLCBsYXlvdXQsIHRpbGUpIHtcbiAgICAgICAgaWYgKGxheW91dC5yZXBlYXRfZGlzdGFuY2UgJiYgbGF5b3V0LnJlcGVhdF9ncm91cCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3Vwc1t0aWxlXVtsYXlvdXQucmVwZWF0X2dyb3VwXSA9IG5ldyBSZXBlYXRHcm91cChcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9ncm91cCxcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9kaXN0YW5jZSxcbiAgICAgICAgICAgICAgICAgICAgUmVwZWF0R3JvdXAubWF4X3JlcGVhdF9kaXN0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdLmFkZChvYmopO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbi8vIEN1cnJlbnQgc2V0IG9mIHJlcGVhdCBncm91cHMsIGdyb3VwZWQgYW5kIGtleWVkIGJ5IHRpbGVcblJlcGVhdEdyb3VwLmdyb3VwcyA9IHt9O1xuXG4vLyBNYXggcmVwZWF0IGRpc3Q6IGZvciBncm91cHMgd2l0aCBhIHJlcGVhdCBkaXN0IGJleW9uZCB0aGlzIHRocmVzaG9sZCwgb25seSBvbmUgbGFiZWxcbi8vIHdpbGwgYmUgYWxsb3dlZCBwZXIgZ3JvdXAsIGUuZy4gc2V0IHRvIHRpbGUgc2l6ZSBmb3Igb25lLWxhYmVsLXBlci10aWxlXG5SZXBlYXRHcm91cC5tYXhfcmVwZWF0X2Rpc3QgPSBHZW8udGlsZV9zY2FsZTtcbiIsImltcG9ydCBUaHJlYWQgZnJvbSAnLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFNjZW5lIGZyb20gJy4vc2NlbmUnO1xuaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5cbi8vIEV4cG9ydHMgbXVzdCBhcHBlYXIgb3V0c2lkZSBhIGZ1bmN0aW9uLCBidXQgd2lsbCBvbmx5IGJlIGRlZmluZWQgaW4gbWFpbiB0aHJlYWQgKGJlbG93KVxuZXhwb3J0IHZhciBMZWFmbGV0TGF5ZXI7XG5leHBvcnQgZnVuY3Rpb24gbGVhZmxldExheWVyKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZXh0ZW5kTGVhZmxldChvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kTGVhZmxldChvcHRpb25zKSB7XG5cbiAgICAvLyBJZiBMZWFmbGV0TGF5ZXIgaXMgYWxyZWFkeSBkZWZpbmVkIHdoZW4gdGhpcyBpcyBjYWxsZWQganVzdCByZXR1cm4gdGhhdCBpbW1lZGlhdGVseVxuICAgIC8vIGUuZy4gaWYgeW91IGNhbGwgbGVhZmxldExheWVyIG11bHRpcGxlIHRpbWVzICh3aGljaCBpcyB2YWxpZClcbiAgICBpZiAodHlwZW9mIExlYWZsZXRMYXllciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMZWFmbGV0TGF5ZXIob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gTGVhZmxldCBsYXllciBmdW5jdGlvbmFsaXR5IGlzIG9ubHkgZGVmaW5lZCBpbiBtYWluIHRocmVhZFxuICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuXG4gICAgICAgIGxldCBMID0gb3B0aW9ucy5sZWFmbGV0IHx8IHdpbmRvdy5MO1xuXG4gICAgICAgIC8vIERldGVybWluZSBpZiB3ZSBhcmUgZXh0ZW5kaW5nIHRoZSBsZWFmbGV0IDAuNy54IFRpbGVMYXllciBjbGFzcywgb3IgdGhlIG5ld2VyXG4gICAgICAgIC8vIGxlYWZsZXQgMS54IEdyaWRMYXllciBjbGFzcy5cbiAgICAgICAgbGV0IGxheWVyQmFzZUNsYXNzID0gTC5HcmlkTGF5ZXIgPyBMLkdyaWRMYXllciA6IEwuVGlsZUxheWVyO1xuICAgICAgICBsZXQgbGVhZmxldFZlcnNpb24gPSBsYXllckJhc2VDbGFzcyA9PT0gTC5HcmlkTGF5ZXIgPyAnMS54JyA6ICcwLjcueCc7XG4gICAgICAgIGxldCBsYXllckNsYXNzQ29uZmlnID0ge307XG5cbiAgICAgICAgLy8gSWYgZXh0ZW5kaW5nIGxlYWZsZXQgMC43LnggVGlsZUxheWVyLCBhZGRpdGlvbmFsIG1vZGlmaWNhdGlvbnMgYXJlIG5lZWRlZFxuICAgICAgICBpZiAobGF5ZXJCYXNlQ2xhc3MgPT09IEwuVGlsZUxheWVyKSB7XG4gICAgICAgICAgICBsYXllckNsYXNzQ29uZmlnLl9hZGRUaWxlID0gZnVuY3Rpb24oKXt9O1xuICAgICAgICAgICAgbGF5ZXJDbGFzc0NvbmZpZy5fcmVtb3ZlVGlsZSA9IGZ1bmN0aW9uKCl7fTtcbiAgICAgICAgICAgIGxheWVyQ2xhc3NDb25maWcuX3Jlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJCYXNlQ2xhc3MucHJvdG90eXBlLl9yZXNldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIC8vIHJlLWFkZCB0aGUgY2FudmFzIHNpbmNlIGJhc2UgY2xhc3MgYHZpZXdyZXNldGAgZXZlbnQgY2FuIHJlbW92ZSBpdFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lICYmIHRoaXMuc2NlbmUuY29udGFpbmVyICYmIHRoaXMuc2NlbmUuY2FudmFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2NlbmUuY2FudmFzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmaW5lIGN1c3RvbSBsYXllciBtZXRob2RzXG4gICAgICAgIE9iamVjdC5hc3NpZ24obGF5ZXJDbGFzc0NvbmZpZywge1xuXG4gICAgICAgICAgICBpbml0aWFsaXplIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNob3dEZWJ1ZyA9ICghb3B0aW9ucy5zaG93RGVidWcgPyBmYWxzZSA6IHRydWUpO1xuXG4gICAgICAgICAgICAgICAgTC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU2NlbmUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgLy8gRm9yY2UgbGVhZmxldCB6b29tIGFuaW1hdGlvbnMgb2ZmXG4gICAgICAgICAgICAgICAgdGhpcy5fem9vbUFuaW1hdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjcmVhdGVTY2VuZSAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZSA9IFNjZW5lLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNjZW5lLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW1Xb3JrZXJzOiB0aGlzLm9wdGlvbnMubnVtV29ya2VycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZVVwZGF0ZTogdGhpcy5vcHRpb25zLnByZVVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RVcGRhdGU6IHRoaXMub3B0aW9ucy5wb3N0VXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91c1pvb206IChMZWFmbGV0TGF5ZXIubGVhZmxldFZlcnNpb24gPT09ICcxLngnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hEZW5zaXR5RGlzcGxheTogdGhpcy5vcHRpb25zLmhpZ2hEZW5zaXR5RGlzcGxheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0xldmVsOiB0aGlzLm9wdGlvbnMubG9nTGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRyb3NwZWN0aW9uOiB0aGlzLm9wdGlvbnMuaW50cm9zcGVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2VkIG9wdGlvbiwgYXBwIHdpbGwgaGF2ZSB0byBtYW51YWxseSBjYWxsZWQgc2NlbmUudXBkYXRlKCkgcGVyIGZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUmVuZGVyTG9vcDogdGhpcy5vcHRpb25zLmRpc2FibGVSZW5kZXJMb29wLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZWQgb3B0aW9uLCB3aWxsIHJlcXVpcmUgbGlicmFyeSB0byBiZSBzZXJ2ZWQgYXMgc2FtZSBob3N0IGFzIHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93Q3Jvc3NEb21haW5Xb3JrZXJzOiB0aGlzLm9wdGlvbnMuYWxsb3dDcm9zc0RvbWFpbldvcmtlcnNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBGaW5pc2ggaW5pdGlhbGl6aW5nIHNjZW5lIGFuZCBzZXR1cCBldmVudHMgd2hlbiBsYXllciBpcyBhZGRlZCB0byBtYXBcbiAgICAgICAgICAgIG9uQWRkIChtYXApIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTY2VuZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxheWVyQmFzZUNsYXNzLnByb3RvdHlwZS5vbkFkZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5yZXNpemUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdyZXNpemUnLCB0aGlzLmhvb2tzLnJlc2l6ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLm1vdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl91cGRhdGluZ190YW5ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBtYXAuZ2V0Q2VudGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuem9vbSA9IE1hdGgubWluKG1hcC5nZXRab29tKCksIG1hcC5nZXRNYXhab29tKCkgfHwgR2VvLmRlZmF1bHRfdmlld19tYXhfem9vbSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS52aWV3LnNldFZpZXcodmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuaW1tZWRpYXRlUmVkcmF3KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJzZVRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ21vdmUnLCB0aGlzLmhvb2tzLm1vdmUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy56b29tc3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl91cGRhdGluZ190YW5ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS52aWV3LnN0YXJ0Wm9vbSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ3pvb21zdGFydCcsIHRoaXMuaG9va3Muem9vbXN0YXJ0KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MuZHJhZ3N0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0UGFubmluZyh0cnVlKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignZHJhZ3N0YXJ0JywgdGhpcy5ob29rcy5kcmFnc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5tb3ZlZW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0UGFubmluZyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5ob29rcy5tb3ZlZW5kKTtcblxuICAgICAgICAgICAgICAgIC8vIEZvcmNlIGxlYWZsZXQgem9vbSBhbmltYXRpb25zIG9mZlxuICAgICAgICAgICAgICAgIG1hcC5fem9vbUFuaW1hdGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBNb2RpZnkgZGVmYXVsdCBMZWFmbGV0IGJlaGF2aW9yc1xuICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5U2Nyb2xsV2hlZWxCZWhhdmlvcihtYXApO1xuICAgICAgICAgICAgICAgIHRoaXMubW9kaWZ5RG91YmxlQ2xpY2tab29tKG1hcCk7XG5cbiAgICAgICAgICAgICAgICAvLyBTZXR1cCBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dXBTZWxlY3Rpb25FdmVudEhhbmRsZXJzKG1hcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25FdmVudHModGhpcy5vcHRpb25zLmV2ZW50cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgR0wgY2FudmFzIHRvIGxheWVyIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcblxuICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgdmlld1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplT25GaXJzdFZpc2libGUoKTtcblxuICAgICAgICAgICAgICAgIC8vIFN1YnNjcmliZSB0byB0YW5ncmFtIGV2ZW50c1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZTogdGhpcy5vblRhbmdyYW1WaWV3VXBkYXRlLmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIFVzZSBsZWFmbGV0J3MgZXhpc3RpbmcgZXZlbnQgc3lzdGVtIGFzIHRoZSBjYWxsYmFjayBtZWNoYW5pc21cbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmxvYWQodGhpcy5vcHRpb25zLnNjZW5lLFxuICAgICAgICAgICAgICAgICAgICB7IGNvbmZpZ19wYXRoOiB0aGlzLm9wdGlvbnMuc2NlbmVCYXNlUGF0aCwgYmxvY2tpbmc6IGZhbHNlIH0pLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXZlcnNlVHJhbnNmb3JtKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnaW5pdCcpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9uUmVtb3ZlIChtYXApIHtcbiAgICAgICAgICAgICAgICBsYXllckJhc2VDbGFzcy5wcm90b3R5cGUub25SZW1vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ3Jlc2l6ZScsIHRoaXMuaG9va3MucmVzaXplKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdtb3ZlJywgdGhpcy5ob29rcy5tb3ZlKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCd6b29tc3RhcnQnLCB0aGlzLmhvb2tzLnpvb21zdGFydCk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignZHJhZ3N0YXJ0JywgdGhpcy5ob29rcy5kcmFnc3RhcnQpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ21vdmVlbmQnLCB0aGlzLmhvb2tzLm1vdmVlbmQpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ2NsaWNrJywgdGhpcy5ob29rcy5jbGljayk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW91c2Vtb3ZlJywgdGhpcy5ob29rcy5tb3VzZW1vdmUpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ21vdXNlb3V0JywgdGhpcy5ob29rcy5tb3VzZW91dCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMuaG9va3MudmlzaWJpbGl0eWNoYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNyZWF0ZVRpbGUgKGNvb3Jkcykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBjb29yZHMueCArICcvJyArIGNvb3Jkcy55ICsgJy8nICsgY29vcmRzLno7XG4gICAgICAgICAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGlsZS1rZXknLCBrZXkpO1xuICAgICAgICAgICAgICAgIGRpdi5zdHlsZS53aWR0aCA9ICcyNTZweCc7XG4gICAgICAgICAgICAgICAgZGl2LnN0eWxlLmhlaWdodCA9ICcyNTZweCc7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dEZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVidWdfb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnRleHRDb250ZW50ID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5sZWZ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS50b3AgPSAwO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLmNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5mb250U2l6ZSA9ICcxNnB4JztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS50ZXh0T3V0bGluZSA9ICcxcHggIzAwMDAwMCc7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUucGFkZGluZyA9ICc4cHgnO1xuXG4gICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChkZWJ1Z19vdmVybGF5KTtcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlclN0eWxlID0gJ3NvbGlkJztcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlckNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgICAgICAgICAgICAgZGl2LnN0eWxlLmJvcmRlcldpZHRoID0gJzFweCc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpdjtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIE1vZGlmeSBsZWFmbGV0J3MgZGVmYXVsdCBzY3JvbGwgd2hlZWwgYmVoYXZpb3IgdG8gcmVuZGVyIGZyYW1lcyBtb3JlIGZyZXF1ZW50bHlcbiAgICAgICAgICAgIC8vIChzaG91bGQgZ2VuZXJhbGx5IGxlYWQgdG8gc21vb3RoZXIgc2Nyb2xsIHdpdGggVGFuZ3JhbSBmcmFtZSByZS1yZW5kZXIpXG4gICAgICAgICAgICBtb2RpZnlTY3JvbGxXaGVlbEJlaGF2aW9yIChtYXApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZS52aWV3LmNvbnRpbnVvdXNfem9vbSAmJiBtYXAuc2Nyb2xsV2hlZWxab29tICYmIHRoaXMub3B0aW9ucy5tb2RpZnlTY3JvbGxXaGVlbCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwLm9wdGlvbnMuem9vbVNuYXAgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSBtYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5kaXNhYmxlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hyb21lIGFuZCBTYWZhcmkgaGF2ZSBzbW9vdGhlciBzY3JvbGwtem9vbSB3aXRob3V0IGFjdGl2ZWx5IHRocm90dGxpbmcgdGhlIG1vdXNlIHdoZWVsLFxuICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZSBGRiBhbmQgRWRnZS9JRSBkbyBiZXR0ZXIgd2l0aCB0aHJvdHRsaW5nLlxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYXkgYmUgcmVsYXRlZCB0byBzeW5jaW5nIGRpZmZlcmVuY2VzIHdpdGggcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGxvb3AsIGludmVzdGlnYXRlIGZ1cnRoZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKEwuQnJvd3Nlci5jaHJvbWUgfHwgTC5Ccm93c2VyLnNhZmFyaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5fb25XaGVlbFNjcm9sbCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbHRhID0gTC5Eb21FdmVudC5nZXRXaGVlbERlbHRhKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbHRhICs9IGRlbHRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RNb3VzZVBvcyA9IHRoaXMuX21hcC5tb3VzZUV2ZW50VG9Db250YWluZXJQb2ludChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wZXJmb3JtWm9vbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQuc3RvcChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAub3B0aW9ucy53aGVlbERlYm91bmNlVGltZSA9IDIwOyAvLyBiZXR0ZXIgZGVmYXVsdCBmb3IgRkYgYW5kIEVkZ2UvSUVcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1hcC5zY3JvbGxXaGVlbFpvb20uX3BlcmZvcm1ab29tID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tID0gbWFwLmdldFpvb20oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLl9zdG9wKCk7IC8vIHN0b3AgcGFubmluZyBhbmQgZmx5IGFuaW1hdGlvbnMgaWYgYW55XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWx0YSA9IHRoaXMuX2RlbHRhIC8gKHRoaXMuX21hcC5vcHRpb25zLndoZWVsUHhQZXJab29tTGV2ZWwgKiA0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbHRhID0gMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh6b29tICsgZGVsdGEpID49IHRoaXMuX21hcC5nZXRNYXhab29tKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IHRoaXMuX21hcC5nZXRNYXhab29tKCkgLSB6b29tOyAvLyBkb24ndCBnbyBwYXN0IG1heCB6b29tXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVsdGEpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXAub3B0aW9ucy5zY3JvbGxXaGVlbFpvb20gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNldFpvb20oem9vbSArIGRlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNldFpvb21Bcm91bmQodGhpcy5fbGFzdE1vdXNlUG9zLCB6b29tICsgZGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gTW9kaWZ5IGxlYWZsZXQncyBkZWZhdWx0IGRvdWJsZS1jbGljayB6b29tIGJlaGF2aW9yLCB0byBtYXRjaCB0eXBpY2FsIHZlY3RvciBiYXNlbWFwIHByb2R1Y3RzXG4gICAgICAgICAgICBtb2RpZnlEb3VibGVDbGlja1pvb20gKG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLnZpZXcuY29udGludW91c196b29tICYmIG1hcC5kb3VibGVDbGlja1pvb20gJiYgdGhpcy5vcHRpb25zLm1vZGlmeURvdWJsZUNsaWNrWm9vbSAhPT0gZmFsc2UpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNb2RpZmllZCB2ZXJzaW9uIG9mIExlYWZsZXQncyBzZXRab29tQXJvdW5kIHRoYXQgZG9lc24ndCB0cmlnZ2VyIGEgbW92ZUVuZCBldmVudFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXRab29tQXJvdW5kTm9Nb3ZlRW5kID0gZnVuY3Rpb24gKG1hcCwgbGF0bG5nLCB6b29tLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGUgPSBtYXAuZ2V0Wm9vbVNjYWxlKHpvb20pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdIYWxmID0gbWFwLmdldFNpemUoKS5kaXZpZGVCeSgyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJQb2ludCA9IGxhdGxuZyBpbnN0YW5jZW9mIEwuUG9pbnQgPyBsYXRsbmcgOiBtYXAubGF0TG5nVG9Db250YWluZXJQb2ludChsYXRsbmcpLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyT2Zmc2V0ID0gY29udGFpbmVyUG9pbnQuc3VidHJhY3Qodmlld0hhbGYpLm11bHRpcGx5QnkoMSAtIDEgLyBzY2FsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2VudGVyID0gbWFwLmNvbnRhaW5lclBvaW50VG9MYXRMbmcodmlld0hhbGYuYWRkKGNlbnRlck9mZnNldCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLl9tb3ZlKG5ld0NlbnRlciwgem9vbSwgeyBmbHlUbzogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbGlmaWVkIHZlcnNpb24gb2YgTGVhZmxldCdzIGZseVRvLCBmb3Igc2hvcnQgYW5pbWF0aW9ucyB6b29taW5nIGFyb3VuZCBhIHBvaW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZseUFyb3VuZCA9IGZ1bmN0aW9uIChtYXAsIHRhcmdldENlbnRlciwgdGFyZ2V0Wm9vbSwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRlID09PSBmYWxzZSB8fCAhTC5Ccm93c2VyLmFueTNkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcC5zZXRWaWV3KHRhcmdldENlbnRlciwgdGFyZ2V0Wm9vbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5fc3RvcCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnRab29tID0gbWFwLl96b29tO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDZW50ZXIgPSBMLmxhdExuZyh0YXJnZXRDZW50ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Wm9vbSA9IHRhcmdldFpvb20gPT09IHVuZGVmaW5lZCA/IHN0YXJ0Wm9vbSA6IHRhcmdldFpvb207XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRab29tID0gTWF0aC5taW4odGFyZ2V0Wm9vbSwgbWFwLmdldE1heFpvb20oKSk7IC8vIGRvbid0IGdvIHBhc3QgbWF4IHpvb21cblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZyb20gPSBtYXAucHJvamVjdChtYXAuZ2V0Q2VudGVyKCksIHN0YXJ0Wm9vbSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gPSBtYXAucHJvamVjdCh0YXJnZXRDZW50ZXIsIHN0YXJ0Wm9vbSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uID8gMTAwMCAqIG9wdGlvbnMuZHVyYXRpb24gOiA3NTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZnJhbWUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIGR1cmF0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXVzZSBpbnRlcm5hbCBmbHlUbyBmcmFtZSB0byBlbnN1cmUgdGhlc2UgYW5pbWF0aW9ucyBhcmUgY2FuY2VsZWQgbGlrZSBvdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLl9mbHlUb0ZyYW1lID0gTC5VdGlsLnJlcXVlc3RBbmltRnJhbWUoZnJhbWUsIG1hcCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlbnRlciA9IGZyb20uYWRkKHRvLnN1YnRyYWN0KGZyb20pLm11bHRpcGx5QnkodCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBbY2VudGVyLngsIGNlbnRlci55XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gR2VvLm1ldGVyc1RvTGF0TG5nKGNlbnRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFpvb21Bcm91bmROb01vdmVFbmQobWFwLCB0YXJnZXRDZW50ZXIsIHN0YXJ0Wm9vbSArICh0YXJnZXRab29tIC0gc3RhcnRab29tKSAqIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFpvb21Bcm91bmROb01vdmVFbmQobWFwLCB0YXJnZXRDZW50ZXIsIHRhcmdldFpvb20pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuX21vdmVFbmQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuX21vdmVTdGFydCh0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuY2FsbChtYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNb2RpZnkgdGhlIGRvdWJsZS1jbGljayB6b29tIGhhbmRsZXIgdG8gZG8gYSBzaG9ydCB6b29tIGFuaW1hdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmFibGVkID0gbWFwLmRvdWJsZUNsaWNrWm9vbS5lbmFibGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5kb3VibGVDbGlja1pvb20uZGlzYWJsZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIG1hcC5kb3VibGVDbGlja1pvb20uX29uRG91YmxlQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMuX21hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRab29tID0gbWFwLmdldFpvb20oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IG1hcC5vcHRpb25zLnpvb21EZWx0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tID0gZS5vcmlnaW5hbEV2ZW50LnNoaWZ0S2V5ID8gb2xkWm9vbSAtIGRlbHRhIDogb2xkWm9vbSArIGRlbHRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwLm9wdGlvbnMuZG91YmxlQ2xpY2tab29tID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZseUFyb3VuZChtYXAsIG1hcC5nZXRDZW50ZXIoKSwgem9vbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZseUFyb3VuZChtYXAsIG1hcC5jb250YWluZXJQb2ludFRvTGF0TG5nKGUuY29udGFpbmVyUG9pbnQpLCB6b29tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmRvdWJsZUNsaWNrWm9vbS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHVwZGF0ZVZpZXcgKCkge1xuICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gdGhpcy5fbWFwLmdldENlbnRlcigpO1xuICAgICAgICAgICAgICAgIHZpZXcuem9vbSA9IE1hdGgubWluKHRoaXMuX21hcC5nZXRab29tKCksIHRoaXMuX21hcC5nZXRNYXhab29tKCkgfHwgR2VvLmRlZmF1bHRfdmlld19tYXhfem9vbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS52aWV3LnNldFZpZXcodmlldyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB1cGRhdGVTaXplICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5yZXNpemVNYXAoc2l6ZS54LCBzaXplLnkpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcmVzaXplT25GaXJzdFZpc2libGUgKCkge1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdF92aXNpYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLnZpc2liaWxpdHljaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdF92aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF92aXNpYmlsaXR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5ob29rcy52aXNpYmlsaXR5Y2hhbmdlKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9uVGFuZ3JhbVZpZXdVcGRhdGUgKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWFwIHx8IHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFZpZXcgY2hhbmdlZD9cbiAgICAgICAgICAgICAgICBsZXQgbWFwX2NlbnRlciA9IHRoaXMuX21hcC5nZXRDZW50ZXIoKTtcbiAgICAgICAgICAgICAgICBsZXQgdmlld19jZW50ZXIgPSB0aGlzLnNjZW5lLnZpZXcuY2VudGVyO1xuICAgICAgICAgICAgICAgIGlmIChtYXBfY2VudGVyLmxuZyA9PT0gdmlld19jZW50ZXIubG5nICYmXG4gICAgICAgICAgICAgICAgICAgIG1hcF9jZW50ZXIubGF0ID09PSB2aWV3X2NlbnRlci5sYXQgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLmdldFpvb20oKSA9PT0gdGhpcy5zY2VuZS52aWV3Lnpvb20pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5zZXRWaWV3KFt0aGlzLnNjZW5lLnZpZXcuY2VudGVyLmxhdCwgdGhpcy5zY2VuZS52aWV3LmNlbnRlci5sbmddLCB0aGlzLnNjZW5lLnZpZXcuem9vbSwgeyBhbmltYXRlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJldmVyc2VUcmFuc2Zvcm0oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICByZW5kZXIgKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudXBkYXRlKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBSZXZlcnNlIHRoZSBDU1MgcG9zaXRpb25pbmcgTGVhZmxldCBhcHBsaWVzIHRvIHRoZSBsYXllciwgc2luY2UgVGFuZ3JhbSdzIFdlYkdMIGNhbnZhc1xuICAgICAgICAgICAgLy8gaXMgZXhwZWN0ZWQgdG8gYmUgJ2Fic29sdXRlbHknIHBvc2l0aW9uZWQuXG4gICAgICAgICAgICByZXZlcnNlVHJhbnNmb3JtICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21hcCB8fCAhdGhpcy5zY2VuZSB8fCAhdGhpcy5zY2VuZS5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciB0b3BfbGVmdCA9IHRoaXMuX21hcC5jb250YWluZXJQb2ludFRvTGF5ZXJQb2ludChbMCwgMF0pO1xuICAgICAgICAgICAgICAgIEwuRG9tVXRpbC5zZXRQb3NpdGlvbih0aGlzLnNjZW5lLmNvbnRhaW5lciwgdG9wX2xlZnQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gVGllIExlYWZsZXQgZXZlbnQgaGFuZGxlcnMgdG8gVGFuZ3JhbSBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICAgICAgc2V0dXBTZWxlY3Rpb25FdmVudEhhbmRsZXJzIChtYXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzID0ge307XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLmNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5jbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRGZWF0dXJlQXQoZXZlbnQuY29udGFpbmVyUG9pbnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4oc2VsZWN0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBPYmplY3QuYXNzaWduKHt9LCBzZWxlY3Rpb24sIHsgbGVhZmxldF9ldmVudDogZXZlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuY2xpY2socmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignY2xpY2snLCB0aGlzLmhvb2tzLmNsaWNrKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MubW91c2Vtb3ZlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3ZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5nZXRGZWF0dXJlQXQoZXZlbnQuY29udGFpbmVyUG9pbnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4oc2VsZWN0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBPYmplY3QuYXNzaWduKHt9LCBzZWxlY3Rpb24sIHsgbGVhZmxldF9ldmVudDogZXZlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIocmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignbW91c2Vtb3ZlJywgdGhpcy5ob29rcy5tb3VzZW1vdmUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5tb3VzZW91dCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIG1vdXNlIGxlYXZlcyBtYXAsIHNlbmQgYW4gYWRkaXRpb25hbCBzZWxlY3Rpb24gZXZlbnQgdG8gaW5kaWNhdGUgbm8gZmVhdHVyZSBpcyBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMuaG92ZXIoeyBjaGFuZ2VkOiB0cnVlLCBsZWFmbGV0X2V2ZW50OiBldmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdtb3VzZW91dCcsIHRoaXMuaG9va3MubW91c2VvdXQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gU2V0IHVzZXItZGVmaW5lZCBoYW5kbGVycyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24gZXZlbnRzXG4gICAgICAgICAgICAvLyBDdXJyZW50bHkgb25seSBvbmUgaGFuZGxlciBjYW4gYmUgZGVmaW5lZCBmb3IgZWFjaCBldmVudCB0eXBlXG4gICAgICAgICAgICAvLyBFdmVudCB0eXBlcyBhcmU6IGBjbGlja2AsIGBob3ZlcmAgKGxlYWZsZXQgYG1vdXNlbW92ZWApXG4gICAgICAgICAgICBzZXRTZWxlY3Rpb25FdmVudHMgKGV2ZW50cykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMgPSBPYmplY3QuYXNzaWduKHRoaXMuX3NlbGVjdGlvbl9ldmVudHMsIGV2ZW50cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBsYXllciBjbGFzc1xuICAgICAgICBMZWFmbGV0TGF5ZXIgPSBsYXllckJhc2VDbGFzcy5leHRlbmQobGF5ZXJDbGFzc0NvbmZpZyk7XG5cbiAgICAgICAgLy8gUG9seWZpbGwgc29tZSAxLjAgbWV0aG9kc1xuICAgICAgICBpZiAodHlwZW9mIExlYWZsZXRMYXllci5yZW1vdmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIExlYWZsZXRMYXllci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgncmVtb3ZlJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgTGVhZmxldExheWVyLmxheWVyQmFzZUNsYXNzID0gbGF5ZXJCYXNlQ2xhc3M7XG4gICAgICAgIExlYWZsZXRMYXllci5sZWFmbGV0VmVyc2lvbiA9IGxlYWZsZXRWZXJzaW9uO1xuXG4gICAgICAgIHJldHVybiBuZXcgTGVhZmxldExheWVyKG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsImltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbC9nbHNsJztcbmltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuL3ZlY3Rvcic7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuXG5jb25zdCBzaGFkZXJTcmNfYW1iaWVudExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9hbWJpZW50TGlnaHQuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfZGlyZWN0aW9uYWxMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvZGlyZWN0aW9uYWxMaWdodC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19wb2ludExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9wb2ludExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3Nwb3RMaWdodCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvc3BvdExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuXG4vLyBBYnN0cmFjdCBsaWdodFxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcblxuICAgICAgICBpZiAoY29uZmlnLmFtYmllbnQgPT0gbnVsbCB8fCB0eXBlb2YgY29uZmlnLmFtYmllbnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmFtYmllbnQgPSBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLmFtYmllbnQgfHwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFtYmllbnQgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGNvbmZpZy5hbWJpZW50KS5zbGljZSgwLCAzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuZGlmZnVzZSA9PSBudWxsIHx8IHR5cGVvZiBjb25maWcuZGlmZnVzZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuZGlmZnVzZSA9IEdMU0wuZXhwYW5kVmVjMyhjb25maWcuZGlmZnVzZSAhPSBudWxsID8gY29uZmlnLmRpZmZ1c2UgOiAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlmZnVzZSA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoY29uZmlnLmRpZmZ1c2UpLnNsaWNlKDAsIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5zcGVjdWxhciA9PSBudWxsIHx8IHR5cGVvZiBjb25maWcuc3BlY3VsYXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLnNwZWN1bGFyID0gR0xTTC5leHBhbmRWZWMzKGNvbmZpZy5zcGVjdWxhciB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3BlY3VsYXIgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGNvbmZpZy5zcGVjdWxhcikuc2xpY2UoMCwgMyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBsaWdodCBieSB0eXBlIG5hbWUsIGZhY3Rvcnktc3R5bGVcbiAgICAvLyAnY29uZmlnJyBtdXN0IGluY2x1ZGUgJ25hbWUnIGFuZCAndHlwZScsIGFsb25nIHdpdGggYW55IG90aGVyIHR5cGUtc3BlY2lmaWMgcHJvcGVydGllc1xuICAgIHN0YXRpYyBjcmVhdGUgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBpZiAoTGlnaHQudHlwZXNbY29uZmlnLnR5cGVdKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpZ2h0LnR5cGVzW2NvbmZpZy50eXBlXSh2aWV3LCBjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGxpZ2h0IGZvciBhIHN0eWxlOiBmcmFnbWVudCBsaWdodGluZywgdmVydGV4IGxpZ2h0aW5nLCBvciBub25lXG4gICAgc3RhdGljIHNldE1vZGUgKG1vZGUsIHN0eWxlKSB7XG4gICAgICAgIGlmIChtb2RlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBtb2RlID0gJ2ZyYWdtZW50JztcbiAgICAgICAgfVxuICAgICAgICBtb2RlID0gTGlnaHQuZW5hYmxlZCAmJiAoKG1vZGUgIT0gbnVsbCkgPyBtb2RlIDogJ2ZyYWdtZW50Jyk7IC8vIGRlZmF1bHQgdG8gZnJhZ21lbnQgbGlnaHRpbmdcbiAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9MSUdIVElOR19GUkFHTUVOVCddID0gKG1vZGUgPT09ICdmcmFnbWVudCcpO1xuICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX0xJR0hUSU5HX1ZFUlRFWCddID0gKG1vZGUgPT09ICd2ZXJ0ZXgnKTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3QgYWxsIHByb3ZpZGVkIGxpZ2h0IGRlZmluaXRpb25zLCBhbmQgY2FsY3VsYXRlIGN1bXVsYXRpdmUgbGlnaHQgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0IChsaWdodHMpIHtcbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgaW5qZWN0aW9uc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKExpZ2h0LmJsb2NrKTtcblxuICAgICAgICAvLyBJZiBsaWdodGluZyBpcyBnbG9iYWxseSBkaXNhYmxlZCwgbm90aGluZyBpcyBpbmplY3RlZCAobW9zdGx5IGZvciBkZWJ1Z2dpbmcgb3IgbGl2ZSBlZGl0aW5nKVxuICAgICAgICBpZiAoIUxpZ2h0LmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnN0cnVjdCBjb2RlIHRvIGNhbGN1bGF0ZSBlYWNoIGxpZ2h0IGluc3RhbmNlXG4gICAgICAgIGxldCBjYWxjdWxhdGVMaWdodHMgPSBcIlwiO1xuICAgICAgICBpZiAobGlnaHRzICYmIE9iamVjdC5rZXlzKGxpZ2h0cykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gQ29sbGVjdCB1bmlxdWVzIHR5cGVzIG9mIGxpZ2h0c1xuICAgICAgICAgICAgbGV0IHR5cGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBsaWdodF9uYW1lIGluIGxpZ2h0cykge1xuICAgICAgICAgICAgICAgIHR5cGVzW2xpZ2h0c1tsaWdodF9uYW1lXS50eXBlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluamVjdCBlYWNoIHR5cGUgb2YgbGlnaHRcbiAgICAgICAgICAgIGZvciAobGV0IHR5cGUgaW4gdHlwZXMpIHtcbiAgICAgICAgICAgICAgICBMaWdodC50eXBlc1t0eXBlXS5pbmplY3QoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IHBlci1pbnN0YW5jZSBibG9ja3MgYW5kIGNvbnN0cnVjdCB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlIGVhY2ggbGlnaHRcbiAgICAgICAgICAgIGZvciAobGV0IGxpZ2h0X25hbWUgaW4gbGlnaHRzKSB7XG4gICAgICAgICAgICAgICAgLy8gRGVmaW5lIGluc3RhbmNlXG4gICAgICAgICAgICAgICAgbGlnaHRzW2xpZ2h0X25hbWVdLmluamVjdCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjYWxjdWxhdGlvbiBmdW5jdGlvbiB0byB0aGUgbGlzdFxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUxpZ2h0cyArPSBgY2FsY3VsYXRlTGlnaHQoJHtsaWdodF9uYW1lfSwgX2V5ZVRvUG9pbnQsIF9ub3JtYWwpO1xcbmA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHbHVlIHRvZ2V0aGVyIHRoZSBmaW5hbCBsaWdodGluZyBmdW5jdGlvbiB0aGF0IHN1bXMgYWxsIHRoZSBsaWdodHNcbiAgICAgICAgbGV0IGNhbGN1bGF0ZUZ1bmN0aW9uID0gYFxuICAgICAgICAgICAgdmVjNCBjYWxjdWxhdGVMaWdodGluZyhpbiB2ZWMzIF9leWVUb1BvaW50LCBpbiB2ZWMzIF9ub3JtYWwsIGluIHZlYzQgX2NvbG9yKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBEbyBpbml0aWFsIG1hdGVyaWFsIGNhbGN1bGF0aW9ucyBvdmVyIG5vcm1hbCwgZW1pc3Npb24sIGFtYmllbnQsIGRpZmZ1c2UgYW5kIHNwZWN1bGFyIHZhbHVlc1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU1hdGVyaWFsKF9leWVUb1BvaW50LF9ub3JtYWwpO1xuXG4gICAgICAgICAgICAgICAgLy8gVW4gcm9sbCB0aGUgbG9vcCBvZiBpbmRpdmlkdWFsIGxpZ3RocyB0byBjYWxjdWxhdGVcbiAgICAgICAgICAgICAgICAke2NhbGN1bGF0ZUxpZ2h0c31cblxuICAgICAgICAgICAgICAgIC8vICBGaW5hbCBsaWdodCBpbnRlbnNpdHkgY2FsY3VsYXRpb25cbiAgICAgICAgICAgICAgICB2ZWM0IGNvbG9yID0gdmVjNCh2ZWMzKDAuKSwgX2NvbG9yLmEpOyAvLyBzdGFydCB3aXRoIHZlcnRleCBjb2xvciBhbHBoYVxuXG4gICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfRU1JU1NJT05cbiAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiID0gbWF0ZXJpYWwuZW1pc3Npb24ucmdiO1xuICAgICAgICAgICAgICAgICAgICBjb2xvci5hICo9IG1hdGVyaWFsLmVtaXNzaW9uLmE7XG4gICAgICAgICAgICAgICAgI2VuZGlmXG5cbiAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9BTUJJRU5UXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLnJnYiArPSBsaWdodF9hY2N1bXVsYXRvcl9hbWJpZW50LnJnYiAqIF9jb2xvci5yZ2IgKiBtYXRlcmlhbC5hbWJpZW50LnJnYjtcbiAgICAgICAgICAgICAgICAgICAgY29sb3IuYSAqPSBtYXRlcmlhbC5hbWJpZW50LmE7XG4gICAgICAgICAgICAgICAgI2Vsc2VcbiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRVxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX2FtYmllbnQucmdiICogX2NvbG9yLnJnYiAqIG1hdGVyaWFsLmRpZmZ1c2UucmdiO1xuICAgICAgICAgICAgICAgICAgICAjZW5kaWZcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0VcbiAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX2RpZmZ1c2UucmdiICogX2NvbG9yLnJnYiAqIG1hdGVyaWFsLmRpZmZ1c2UucmdiO1xuICAgICAgICAgICAgICAgICAgICBjb2xvci5hICo9IG1hdGVyaWFsLmRpZmZ1c2UuYTtcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX1NQRUNVTEFSXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLnJnYiArPSBsaWdodF9hY2N1bXVsYXRvcl9zcGVjdWxhci5yZ2IgKiBtYXRlcmlhbC5zcGVjdWxhci5yZ2I7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLmEgKj0gbWF0ZXJpYWwuc3BlY3VsYXIuYTtcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgIC8vIENsYW1wIGZpbmFsIGNvbG9yXG4gICAgICAgICAgICAgICAgY29sb3IgPSBjbGFtcChjb2xvciwgMC4wLCAxLjApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yO1xuICAgICAgICAgICAgfWA7XG5cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgY2FsY3VsYXRlRnVuY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIENvbW1vbiBpbnN0YW5jZSBkZWZpbml0aW9uXG4gICAgaW5qZWN0ICgpIHtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gIGBcbiAgICAgICAgICAgIHVuaWZvcm0gJHt0aGlzLnN0cnVjdF9uYW1lfSB1XyR7dGhpcy5uYW1lfTtcbiAgICAgICAgICAgICR7dGhpcy5zdHJ1Y3RfbmFtZX0gJHt0aGlzLm5hbWV9O1xuICAgICAgICAgICAgYDtcbiAgICAgICAgbGV0IGFzc2lnbiA9IGBcbiAgICAgICAgICAgICR7dGhpcy5uYW1lfSA9IHVfJHt0aGlzLm5hbWV9O1xcblxuICAgICAgICBgO1xuXG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIGluc3RhbmNlKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnc2V0dXAnLCBhc3NpZ24pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlICgpIHtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgb25jZSBwZXIgZnJhbWUgcGVyIHByb2dyYW0gKGUuZy4gZm9yIG1haW4gcmVuZGVyIHBhc3MsIHRoZW4gZm9yIGVhY2ggYWRkaXRpb25hbFxuICAgIC8vIHBhc3MgZm9yIGZlYXR1cmUgc2VsZWN0aW9uLCBldGMuKVxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgLy8gIFRocmVlIGNvbW1vbiBsaWdodCBwcm9wZXJ0aWVzXG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5hbWJpZW50YCwgdGhpcy5hbWJpZW50KTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmRpZmZ1c2VgLCB0aGlzLmRpZmZ1c2UpO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uc3BlY3VsYXJgLCB0aGlzLnNwZWN1bGFyKTtcbiAgICB9XG5cbn1cblxuTGlnaHQudHlwZXMgPSB7fTsgLy8gcmVmZXJlbmNlcyB0byBzdWJjbGFzc2VzIGJ5IHNob3J0IG5hbWVcbkxpZ2h0LmJsb2NrID0gJ2xpZ2h0aW5nJzsgLy8gc2hhZGVyIGJsb2NrIG5hbWVcbkxpZ2h0LmVuYWJsZWQgPSB0cnVlOyAvLyBsaWdodGluZyBjYW4gYmUgZ2xvYmFsbHkgZW5hYmxlZC9kaXNhYmxlZFxuXG5cbi8vIExpZ2h0IHN1YmNsYXNzZXNcbmNsYXNzIEFtYmllbnRMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnYW1iaWVudCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnQW1iaWVudExpZ2h0JztcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0KCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfYW1iaWVudExpZ2h0KTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5hbWJpZW50YCwgdGhpcy5hbWJpZW50KTtcbiAgICB9XG5cbn1cbkxpZ2h0LnR5cGVzWydhbWJpZW50J10gPSBBbWJpZW50TGlnaHQ7XG5cbmNsYXNzIERpcmVjdGlvbmFsTGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3VwZXIodmlldywgY29uZmlnKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2RpcmVjdGlvbmFsJztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdEaXJlY3Rpb25hbExpZ2h0JztcblxuICAgICAgICBpZiAoY29uZmlnLmRpcmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gY29uZmlnLmRpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgZGlyZWN0aW9uYWwgbGlnaHQgbWFpbnRhaW5zIGZ1bGwgaW50ZW5zaXR5IG9uIGdyb3VuZCwgd2l0aCBiYXNpYyBleHRydXNpb24gc2hhZGluZ1xuICAgICAgICAgICAgbGV0IHRoZXRhID0gMTM1OyAvLyBhbmdsZSBvZiBsaWdodCBpbiB4eSBwbGFuZSAocm90YXRlZCBhcm91bmQgeiBheGlzKVxuICAgICAgICAgICAgbGV0IHNjYWxlID0gTWF0aC5zaW4oTWF0aC5QSSo2MC8xODApOyAvLyBzY2FsaW5nIGZhY3RvciB0byBrZWVwIHRvdGFsIGRpcmVjdGlvbmFsIGludGVuc2l0eSB0byAwLjVcbiAgICAgICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IFtcbiAgICAgICAgICAgICAgICBNYXRoLmNvcyhNYXRoLlBJKnRoZXRhLzE4MCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICBNYXRoLnNpbihNYXRoLlBJKnRoZXRhLzE4MCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICAtMC41XG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICBpZiAoY29uZmlnLmFtYmllbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYW1iaWVudCA9IEdMU0wuZXhwYW5kVmVjMygwLjUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gdGhpcy5fZGlyZWN0aW9uLm1hcChwYXJzZUZsb2F0KTtcbiAgICB9XG5cbiAgICBnZXQgZGlyZWN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpcmVjdGlvbjtcbiAgICB9XG5cbiAgICBzZXQgZGlyZWN0aW9uICh2KSB7XG4gICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IFZlY3Rvci5ub3JtYWxpemUodik7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IHN0cnVjdCBhbmQgY2FsY3VsYXRlIGZ1bmN0aW9uXG4gICAgc3RhdGljIGluamVjdCgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX2RpcmVjdGlvbmFsTGlnaHQpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgc3VwZXIuc2V0dXBQcm9ncmFtKF9wcm9ncmFtKTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmRpcmVjdGlvbmAsIHRoaXMuZGlyZWN0aW9uKTtcbiAgICB9XG5cbn1cbkxpZ2h0LnR5cGVzWydkaXJlY3Rpb25hbCddID0gRGlyZWN0aW9uYWxMaWdodDtcblxuXG5jbGFzcyBQb2ludExpZ2h0IGV4dGVuZHMgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAncG9pbnQnO1xuICAgICAgICB0aGlzLnN0cnVjdF9uYW1lID0gJ1BvaW50TGlnaHQnO1xuXG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBjb25maWcucG9zaXRpb24gfHwgWzAsIDAsICcxMDBweCddO1xuICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZSA9IFtdOyAvLyBwb3NpdGlvbiBpbiBleWVzcGFjZVxuICAgICAgICB0aGlzLm9yaWdpbiA9IGNvbmZpZy5vcmlnaW4gfHwgJ2dyb3VuZCc7XG4gICAgICAgIHRoaXMuYXR0ZW51YXRpb24gPSAhaXNOYU4ocGFyc2VGbG9hdChjb25maWcuYXR0ZW51YXRpb24pKSA/IHBhcnNlRmxvYXQoY29uZmlnLmF0dGVudWF0aW9uKSA6IDA7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5yYWRpdXMpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5yYWRpdXMpICYmIGNvbmZpZy5yYWRpdXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSBjb25maWcucmFkaXVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSBbbnVsbCwgY29uZmlnLnJhZGl1c107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJhZGl1cyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0ICgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX3BvaW50TGlnaHQpO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBpc250YW5jZS1zcGVjaWZpYyBzZXR0aW5nc1xuICAgIGluamVjdCgpIHtcbiAgICAgICAgc3VwZXIuaW5qZWN0KCk7XG5cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fRVhQT05FTlQnXSA9ICh0aGlzLmF0dGVudWF0aW9uICE9PSAwKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fSU5ORVJfUkFESVVTJ10gPSAodGhpcy5yYWRpdXMgIT0gbnVsbCAmJiB0aGlzLnJhZGl1c1swXSAhPSBudWxsKTtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fT1VURVJfUkFESVVTJ10gPSAodGhpcy5yYWRpdXMgIT0gbnVsbCk7XG4gICAgfVxuXG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVFeWVQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIHVwZGF0ZUV5ZVBvc2l0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMub3JpZ2luID09PSAnd29ybGQnKSB7XG4gICAgICAgICAgICAvLyBGb3Igd29ybGQgb3JpZ2luLCBmb3JtYXQgaXM6IFtsb25naXR1ZGUsIGxhdGl0dWRlLCBtZXRlcnMgKGRlZmF1bHQpIG9yIHBpeGVscyB3L3B4IHVuaXRzXVxuXG4gICAgICAgICAgICAvLyBNb3ZlIGxpZ2h0J3Mgd29ybGQgcG9zaXRpb24gaW50byBjYW1lcmEgc3BhY2VcbiAgICAgICAgICAgIGxldCBbeCwgeV0gPSBHZW8ubGF0TG5nVG9NZXRlcnModGhpcy5wb3NpdGlvbik7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVswXSA9IHggLSB0aGlzLnZpZXcuY2FtZXJhLnBvc2l0aW9uX21ldGVyc1swXTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzFdID0geSAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzFdO1xuXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsyXSA9IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh0aGlzLnBvc2l0aW9uWzJdLFxuICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSk7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsyXSA9IHRoaXMucG9zaXRpb25fZXllWzJdIC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMl07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5vcmlnaW4gPT09ICdncm91bmQnIHx8IHRoaXMub3JpZ2luID09PSAnY2FtZXJhJykge1xuICAgICAgICAgICAgLy8gRm9yIGNhbWVyYSBvciBncm91bmQgb3JpZ2luLCBmb3JtYXQgaXM6IFt4LCB5LCB6XSBpbiBtZXRlcnMgKGRlZmF1bHQpIG9yIHBpeGVscyB3L3B4IHVuaXRzXG5cbiAgICAgICAgICAgIC8vIExpZ2h0IGlzIGluIGNhbWVyYSBzcGFjZSBieSBkZWZhdWx0XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZSA9IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh0aGlzLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9yaWdpbiA9PT0gJ2dyb3VuZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBMZWF2ZSBsaWdodCdzIHh5IGluIGNhbWVyYSBzcGFjZSwgYnV0IHogbmVlZHMgdG8gYmUgbW92ZWQgcmVsYXRpdmUgdG8gZ3JvdW5kIHBsYW5lXG4gICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMl0gPSB0aGlzLnBvc2l0aW9uX2V5ZVsyXSAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zaXRpb25fZXllWzNdID0gMTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIHN1cGVyLnNldHVwUHJvZ3JhbShfcHJvZ3JhbSk7XG5cbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnNGZ2JywgYHVfJHt0aGlzLm5hbWV9LnBvc2l0aW9uYCwgdGhpcy5wb3NpdGlvbl9leWUpO1xuXG4gICAgICAgIGlmKFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX0VYUE9ORU5UJ10pIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LmF0dGVudWF0aW9uRXhwb25lbnRgLCB0aGlzLmF0dGVudWF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX0lOTkVSX1JBRElVUyddKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5pbm5lclJhZGl1c2AsXG4gICAgICAgICAgICAgICAgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucmFkaXVzWzBdLFxuICAgICAgICAgICAgICAgICAgICB7IHpvb206IHRoaXMudmlldy56b29tLCBtZXRlcnNfcGVyX3BpeGVsOiBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy52aWV3Lnpvb20pIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKFNoYWRlclByb2dyYW0uZGVmaW5lc1snVEFOR1JBTV9QT0lOVExJR0hUX0FUVEVOVUFUSU9OX09VVEVSX1JBRElVUyddKSB7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5vdXRlclJhZGl1c2AsXG4gICAgICAgICAgICAgICAgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucmFkaXVzWzFdLFxuICAgICAgICAgICAgICAgICAgICB7IHpvb206IHRoaXMudmlldy56b29tLCBtZXRlcnNfcGVyX3BpeGVsOiBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy52aWV3Lnpvb20pIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkxpZ2h0LnR5cGVzWydwb2ludCddID0gUG9pbnRMaWdodDtcblxuXG5jbGFzcyBTcG90TGlnaHQgZXh0ZW5kcyBQb2ludExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yICh2aWV3LCBjb25maWcpIHtcbiAgICAgICAgc3VwZXIodmlldywgY29uZmlnKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3Nwb3RsaWdodCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnU3BvdExpZ2h0JztcblxuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHRoaXMuX2RpcmVjdGlvbiA9IChjb25maWcuZGlyZWN0aW9uIHx8IFswLCAwLCAtMV0pLm1hcChwYXJzZUZsb2F0KTsgLy8gW3gsIHksIHpdXG4gICAgICAgIHRoaXMuZXhwb25lbnQgPSBjb25maWcuZXhwb25lbnQgPyBwYXJzZUZsb2F0KGNvbmZpZy5leHBvbmVudCkgOiAwLjI7XG4gICAgICAgIHRoaXMuYW5nbGUgPSBjb25maWcuYW5nbGUgPyBwYXJzZUZsb2F0KGNvbmZpZy5hbmdsZSkgOiAyMDtcbiAgICB9XG5cbiAgICBnZXQgZGlyZWN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpcmVjdGlvbjtcbiAgICB9XG5cbiAgICBzZXQgZGlyZWN0aW9uICh2KSB7XG4gICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IFZlY3Rvci5ub3JtYWxpemUodik7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IHN0cnVjdCBhbmQgY2FsY3VsYXRlIGZ1bmN0aW9uXG4gICAgc3RhdGljIGluamVjdCAoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIHNoYWRlclNyY19zcG90TGlnaHQpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgc3VwZXIuc2V0dXBQcm9ncmFtKF9wcm9ncmFtKTtcblxuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uZGlyZWN0aW9uYCwgdGhpcy5kaXJlY3Rpb24pO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5zcG90Q29zQ3V0b2ZmYCwgTWF0aC5jb3ModGhpcy5hbmdsZSAqIDMuMTQxNTkgLyAxODApKTtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCBgdV8ke3RoaXMubmFtZX0uc3BvdEV4cG9uZW50YCwgdGhpcy5leHBvbmVudCk7XG4gICAgfVxuXG59XG5MaWdodC50eXBlc1snc3BvdGxpZ2h0J10gPSBTcG90TGlnaHQ7XG4iLCJpbXBvcnQgR0xTTCBmcm9tICcuL2dsL2dsc2wnO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoYWRlclNyY19tYXRlcmlhbCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL2dsL3NoYWRlcnMvbWF0ZXJpYWwuZ2xzbCcsICd1dGY4Jyk7XG5cbmNvbnN0IG1hdGVyaWFsX3Byb3BzID0gWydlbWlzc2lvbicsICdhbWJpZW50JywgJ2RpZmZ1c2UnLCAnc3BlY3VsYXInXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWF0ZXJpYWwge1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcpIHtcblxuICAgICAgICBjb25maWcgPSBjb25maWcgfHwge307XG5cbiAgICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBhbGwgaGF2ZSB0aGUgc2FtZSBkZWZhdWx0cywgc28gdGhleSBjYW4gYmUgc2V0IGluIGJ1bGtcbiAgICAgICAgbWF0ZXJpYWxfcHJvcHMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW3Byb3BdO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUudGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZTogdmFsdWUudGV4dHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmc6IHZhbHVlLm1hcHBpbmcgfHwgJ3NwaGVyZW1hcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZTogR0xTTC5leHBhbmRWZWMzKHZhbHVlLnNjYWxlICE9IG51bGwgPyB2YWx1ZS5zY2FsZSA6IDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50OiBHTFNMLmV4cGFuZFZlYzQodmFsdWUuYW1vdW50ICE9IG51bGwgPyB2YWx1ZS5hbW91bnQgOiAxKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcF0gPSB7IGFtb3VudDogR0xTTC5leHBhbmRWZWM0KHZhbHVlKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcF0gPSB7IGFtb3VudDogU3R5bGVQYXJzZXIucGFyc2VDb2xvcih2YWx1ZSkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4dHJhIHNwZWN1bGFyIHByb3BzXG4gICAgICAgIGlmICh0aGlzLnNwZWN1bGFyKSB7XG4gICAgICAgICAgICB0aGlzLnNwZWN1bGFyLnNoaW5pbmVzcyA9IGNvbmZpZy5zaGluaW5lc3MgPyBwYXJzZUZsb2F0KGNvbmZpZy5zaGluaW5lc3MpIDogMC4yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hcHBpbmdcbiAgICAgICAgaWYgKGNvbmZpZy5ub3JtYWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5ub3JtYWwgPSB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZTogY29uZmlnLm5vcm1hbC50ZXh0dXJlLFxuICAgICAgICAgICAgICAgIG1hcHBpbmc6IGNvbmZpZy5ub3JtYWwubWFwcGluZyB8fCAndHJpcGxhbmFyJyxcbiAgICAgICAgICAgICAgICBzY2FsZTogR0xTTC5leHBhbmRWZWMzKGNvbmZpZy5ub3JtYWwuc2NhbGUgIT0gbnVsbCA/IGNvbmZpZy5ub3JtYWwuc2NhbGUgOiAxKSxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IGNvbmZpZy5ub3JtYWwuYW1vdW50ICE9IG51bGwgPyBjb25maWcubm9ybWFsLmFtb3VudCA6IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgYSBtYXRlcmlhbCBjb25maWcgYmxvY2sgaGFzIHN1ZmZpY2llbnQgcHJvcGVydGllcyB0byBjcmVhdGUgYSBtYXRlcmlhbFxuICAgIHN0YXRpYyBpc1ZhbGlkIChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLmVtaXNzaW9uID09IG51bGwgJiZcbiAgICAgICAgICAgIGNvbmZpZy5hbWJpZW50ID09IG51bGwgJiZcbiAgICAgICAgICAgIGNvbmZpZy5kaWZmdXNlID09IG51bGwgJiZcbiAgICAgICAgICAgIGNvbmZpZy5zcGVjdWxhciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpbmplY3QgKHN0eWxlKSB7XG4gICAgICAgIC8vIEZvciBlYWNoIHByb3BlcnR5LCBzZXRzIGRlZmluZXMgdG8gY29uZmlndXJlIHRleHR1cmUgbWFwcGluZywgd2l0aCBhIHBhdHRlcm4gbGlrZTpcbiAgICAgICAgLy8gICBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0UsIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRV9URVhUVVJFLCBUQU5HUkFNX01BVEVSSUFMX0RJRkZVU0VfVEVYVFVSRV9TUEhFUkVNQVBcbiAgICAgICAgLy8gQWxzbyBzZXRzIGZsYWdzIHRvIGtlZXAgdHJhY2sgb2YgZWFjaCB1bmlxdWUgbWFwcGluZyB0eXBlIGJlaW5nIHVzZWQsIGUuZy46XG4gICAgICAgIC8vICAgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFX1NQSEVSRU1BUFxuICAgICAgICAvLyBFbmFibGVzIHRleHR1cmUgY29vcmRpbmF0ZXMgaWYgbmVlZGVkIGFuZCBub3QgYWxyZWFkeSBvblxuICAgICAgICBtYXRlcmlhbF9wcm9wcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgbGV0IGRlZiA9IGBUQU5HUkFNX01BVEVSSUFMXyR7cHJvcC50b1VwcGVyQ2FzZSgpfWA7XG4gICAgICAgICAgICBsZXQgdGV4ZGVmID0gZGVmICsgJ19URVhUVVJFJztcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbZGVmXSA9ICh0aGlzW3Byb3BdICE9IG51bGwpO1xuICAgICAgICAgICAgaWYgKHRoaXNbcHJvcF0gJiYgdGhpc1twcm9wXS50ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1t0ZXhkZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdHlsZS5kZWZpbmVzW3RleGRlZiArICdfJyArIHRoaXNbcHJvcF0ubWFwcGluZy50b1VwcGVyQ2FzZSgpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1tgVEFOR1JBTV9NQVRFUklBTF9URVhUVVJFXyR7dGhpc1twcm9wXS5tYXBwaW5nLnRvVXBwZXJDYXNlKCl9YF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHN0eWxlLnRleGNvb3JkcyB8fCAodGhpc1twcm9wXS5tYXBwaW5nID09PSAndXYnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hcHBpbmdcbiAgICAgICAgLy8gQXMgYW5vdmUsIHNldHMgZmxhZ3MgdG8ga2VlcCB0cmFjayBvZiBlYWNoIHVuaXF1ZSBtYXBwaW5nIHR5cGUgYmVpbmcgdXNlZCwgZS5nLjpcbiAgICAgICAgLy8gICBUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfU1BIRVJFTUFQXG4gICAgICAgIGlmICh0aGlzLm5vcm1hbCAmJiB0aGlzLm5vcm1hbC50ZXh0dXJlKSB7XG4gICAgICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX01BVEVSSUFMX05PUk1BTF9URVhUVVJFJ10gPSB0cnVlO1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1snVEFOR1JBTV9NQVRFUklBTF9OT1JNQUxfVEVYVFVSRV8nICsgdGhpcy5ub3JtYWwubWFwcGluZy50b1VwcGVyQ2FzZSgpXSA9IHRydWU7XG4gICAgICAgICAgICBzdHlsZS5kZWZpbmVzW2BUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfJHt0aGlzLm5vcm1hbC5tYXBwaW5nLnRvVXBwZXJDYXNlKCl9YF0gPSB0cnVlO1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gc3R5bGUudGV4Y29vcmRzIHx8ICh0aGlzLm5vcm1hbC5tYXBwaW5nID09PSAndXYnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnJlcGxhY2VTaGFkZXJCbG9jayhNYXRlcmlhbC5ibG9jaywgc2hhZGVyU3JjX21hdGVyaWFsLCAnTWF0ZXJpYWwnKTtcbiAgICAgICAgc3R5bGUuYWRkU2hhZGVyQmxvY2soJ3NldHVwJywgJ1xcbm1hdGVyaWFsID0gdV9tYXRlcmlhbDtcXG4nLCAnTWF0ZXJpYWwnKTtcbiAgICB9XG5cbiAgICBzZXR1cFByb2dyYW0gKF9wcm9ncmFtKSB7XG4gICAgICAgIC8vIEZvciBlYWNoIHByb3BlcnR5LCBzZXRzIHVuaWZvcm1zIGluIHRoZSBwYXR0ZXJuOlxuICAgICAgICAvLyB1X21hdGVyaWFsLmRpZmZ1c2UsIHVfbWF0ZXJpYWwuZGlmZnVzZVNjYWxlIHVfbWF0ZXJpYWxfZGlmZnVzZV90ZXh0dXJlXG4gICAgICAgIG1hdGVyaWFsX3Byb3BzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICBpZiAodGhpc1twcm9wXSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW3Byb3BdLnRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3Byb2dyYW0uc2V0VGV4dHVyZVVuaWZvcm0oYHVfbWF0ZXJpYWxfJHtwcm9wfV90ZXh0dXJlYCwgdGhpc1twcm9wXS50ZXh0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfbWF0ZXJpYWwuJHtwcm9wfVNjYWxlYCwgdGhpc1twcm9wXS5zY2FsZSk7XG4gICAgICAgICAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzRmdicsIGB1X21hdGVyaWFsLiR7cHJvcH1gLCB0aGlzW3Byb3BdLmFtb3VudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzW3Byb3BdLmFtb3VudCkge1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCc0ZnYnLCBgdV9tYXRlcmlhbC4ke3Byb3B9YCwgdGhpc1twcm9wXS5hbW91bnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRXh0cmEgc3BlY3VsYXIgcHJvcHNcbiAgICAgICAgaWYgKHRoaXMuc3BlY3VsYXIpIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfbWF0ZXJpYWwuc2hpbmluZXNzJywgdGhpcy5zcGVjdWxhci5zaGluaW5lc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hcHBpbmdcbiAgICAgICAgaWYgKHRoaXMubm9ybWFsICYmIHRoaXMubm9ybWFsLnRleHR1cmUpIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnNldFRleHR1cmVVbmlmb3JtKCd1X21hdGVyaWFsX25vcm1hbF90ZXh0dXJlJywgdGhpcy5ub3JtYWwudGV4dHVyZSk7XG4gICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9tYXRlcmlhbC5ub3JtYWxTY2FsZScsIHRoaXMubm9ybWFsLnNjYWxlKTtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfbWF0ZXJpYWwubm9ybWFsQW1vdW50JywgdGhpcy5ub3JtYWwuYW1vdW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuTWF0ZXJpYWwuYmxvY2sgPSAnbWF0ZXJpYWwnO1xuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuaW1wb3J0ICcuL3V0aWxzL3BvbHlmaWxscyc7XG5cbi8vIFRoZSBsZWFmbGV0IGxheWVyIHBsdWdpbiBpcyBjdXJyZW50bHkgdGhlIHByaW1hcnkgcHVibGljIEFQSVxuaW1wb3J0IHtsZWFmbGV0TGF5ZXJ9IGZyb20gJy4vbGVhZmxldF9sYXllcic7XG5cbi8vIFRoZSBzY2VuZSB3b3JrZXIgaXMgb25seSBhY3RpdmF0ZWQgd2hlbiBhIHdvcmtlciB0aHJlYWQgaXMgaW5zdGFudGlhdGVkLCBidXQgbXVzdCBhbHdheXMgYmUgbG9hZGVkXG5pbXBvcnQgU2NlbmUgZnJvbSAnLi9zY2VuZSc7XG5pbXBvcnQge1NjZW5lV29ya2VyfSBmcm9tICcuL3NjZW5lX3dvcmtlcic7XG5cbi8vIEFkZGl0aW9uYWwgbW9kdWxlcyBhcmUgZXhwb3NlZCBmb3IgZGVidWdnaW5nXG5pbXBvcnQgdmVyc2lvbiBmcm9tICcuL3V0aWxzL3ZlcnNpb24nO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuL3ZlY3Rvcic7XG5pbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL3NvdXJjZXMvZGF0YV9zb3VyY2UnO1xuaW1wb3J0ICcuL3NvdXJjZXMvZ2VvanNvbic7XG5pbXBvcnQgJy4vc291cmNlcy90b3BvanNvbic7XG5pbXBvcnQgJy4vc291cmNlcy9tdnQnO1xuaW1wb3J0ICcuL3NvdXJjZXMvcmFzdGVyJztcbmltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWZXJ0ZXhEYXRhIGZyb20gJy4vZ2wvdmVydGV4X2RhdGEnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC90ZXh0dXJlJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuL21hdGVyaWFsJztcbmltcG9ydCBMaWdodCBmcm9tICcuL2xpZ2h0JztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCB7bGF5ZXJfY2FjaGV9IGZyb20gJy4vc3R5bGVzL2xheWVyJztcbmltcG9ydCB7U3R5bGVNYW5hZ2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgRmVhdHVyZVNlbGVjdGlvbiBmcm9tICcuL3NlbGVjdGlvbic7XG5pbXBvcnQgQ2FudmFzVGV4dCBmcm9tICcuL3N0eWxlcy90ZXh0L2NhbnZhc190ZXh0JztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4vdXRpbHMvZGVidWdfc2V0dGluZ3MnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBKU1ppcCBmcm9tICdqc3ppcCc7XG5cbi8vIE1ha2Ugc29tZSBtb2R1bGVzIGFjY2Vzc2libGUgZm9yIGRlYnVnZ2luZ1xudmFyIGRlYnVnID0ge1xuICAgIGxvZyxcbiAgICB5YW1sLFxuICAgIFRocmVhZCxcbiAgICBVdGlscyxcbiAgICBHZW8sXG4gICAgVmVjdG9yLFxuICAgIERhdGFTb3VyY2UsXG4gICAgR0xTTCxcbiAgICBTaGFkZXJQcm9ncmFtLFxuICAgIFZlcnRleERhdGEsXG4gICAgVGV4dHVyZSxcbiAgICBNYXRlcmlhbCxcbiAgICBMaWdodCxcbiAgICBTY2VuZSxcbiAgICBTY2VuZVdvcmtlcixcbiAgICBXb3JrZXJCcm9rZXIsXG4gICAgbGF5ZXJfY2FjaGUsXG4gICAgU3R5bGVNYW5hZ2VyLFxuICAgIFN0eWxlUGFyc2VyLFxuICAgIENvbGxpc2lvbixcbiAgICBGZWF0dXJlU2VsZWN0aW9uLFxuICAgIENhbnZhc1RleHQsXG4gICAgZGVidWdTZXR0aW5nc1xufTtcblxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgVXRpbHMucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoKTtcblxuICAgIC8vIEF0dGFjaCBQcm9taXNlIHBvbHlmaWxsIHRvIHdpbmRvd1xuICAgIC8vIEFsbG93cyBGb250RmFjZU9ic2VydmVyIHRvIHVzZSBwb2x5ZmlsbCAod2l0aG91dCBuZWVkaW5nIHRvIGluY2x1ZGUgaXRzIG93biBkdXBsaWNhdGUgcG9seWZpbGwpXG4gICAgaWYgKHdpbmRvdy5Qcm9taXNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgd2luZG93LlByb21pc2UgPSBQcm9taXNlO1xuICAgICAgICBKU1ppcC5leHRlcm5hbC5Qcm9taXNlID0gUHJvbWlzZTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGxlYWZsZXRMYXllcixcbiAgICBkZWJ1ZyxcbiAgICB2ZXJzaW9uXG59O1xuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgKiBhcyBVUkxzIGZyb20gJy4vdXRpbHMvdXJscyc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IENvbnRleHQgZnJvbSAnLi9nbC9jb250ZXh0JztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWZXJ0ZXhBcnJheU9iamVjdCBmcm9tICcuL2dsL3Zhbyc7XG5pbXBvcnQge1N0eWxlTWFuYWdlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQge1N0eWxlfSBmcm9tICcuL3N0eWxlcy9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFNjZW5lTG9hZGVyIGZyb20gJy4vc2NlbmVfbG9hZGVyJztcbmltcG9ydCBWaWV3IGZyb20gJy4vdmlldyc7XG5pbXBvcnQgTGlnaHQgZnJvbSAnLi9saWdodCc7XG5pbXBvcnQgVGlsZU1hbmFnZXIgZnJvbSAnLi90aWxlX21hbmFnZXInO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9zb3VyY2VzL2RhdGFfc291cmNlJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCBSZW5kZXJTdGF0ZU1hbmFnZXIgZnJvbSAnLi9nbC9yZW5kZXJfc3RhdGUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vc3R5bGVzL3RleHQvZm9udF9tYW5hZ2VyJztcbmltcG9ydCBNZWRpYUNhcHR1cmUgZnJvbSAnLi91dGlscy9tZWRpYV9jYXB0dXJlJztcblxuLy8gTG9hZCBzY2VuZSBkZWZpbml0aW9uOiBwYXNzIGFuIG9iamVjdCBkaXJlY3RseSwgb3IgYSBVUkwgYXMgc3RyaW5nIHRvIGxvYWQgcmVtb3RlbHlcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjZW5lIHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ19zb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHN1YnNjcmliZU1peGluKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuaWQgPSBTY2VuZS5pZCsrO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gbnVsbDsgLy8gd2lsbCBiZSBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNjZW5lIGlzIGxvYWRlZFxuICAgICAgICB0aGlzLnNvdXJjZXMgPSB7fTtcblxuICAgICAgICB0aGlzLnZpZXcgPSBuZXcgVmlldyh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50aWxlX21hbmFnZXIgPSBuZXcgVGlsZU1hbmFnZXIoeyBzY2VuZTogdGhpcywgdmlldzogdGhpcy52aWV3IH0pO1xuICAgICAgICB0aGlzLm51bV93b3JrZXJzID0gb3B0aW9ucy5udW1Xb3JrZXJzIHx8IDI7XG4gICAgICAgIHRoaXMud29ya2VyX3VybCA9IG9wdGlvbnMud29ya2VyVXJsO1xuICAgICAgICBpZiAob3B0aW9ucy5kaXNhYmxlVmVydGV4QXJyYXlPYmplY3RzID09PSB0cnVlKSB7XG4gICAgICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBVdGlscy51c2VfaGlnaF9kZW5zaXR5X2Rpc3BsYXkgPSBvcHRpb25zLmhpZ2hEZW5zaXR5RGlzcGxheSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5oaWdoRGVuc2l0eURpc3BsYXkgOiB0cnVlO1xuICAgICAgICBVdGlscy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvKCk7XG5cbiAgICAgICAgdGhpcy5jb25maWcgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbmZpZ19zb3VyY2UgPSBjb25maWdfc291cmNlO1xuICAgICAgICB0aGlzLmNvbmZpZ19idW5kbGUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbmZpZ19zZXJpYWxpemVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19zb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuc3R5bGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyID0gbmV3IFN0eWxlTWFuYWdlcigpO1xuXG4gICAgICAgIHRoaXMuYnVpbGRpbmcgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNrcyBjdXJyZW50IHNjZW5lIGJ1aWxkaW5nIHN0YXRlICh0aWxlcyBiZWluZyBidWlsdCwgZXRjLilcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBhIHJlZHJhd1xuICAgICAgICB0aGlzLmFuaW1hdGVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IHJlZHJhdyBldmVyeSBmcmFtZVxuICAgICAgICB0aGlzLnByZVVwZGF0ZSA9IG9wdGlvbnMucHJlVXBkYXRlOyAgICAgICAgICAgICAvLyBvcHRpb25hbCBwcmUtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICB0aGlzLnBvc3RVcGRhdGUgPSBvcHRpb25zLnBvc3RVcGRhdGU7ICAgICAgICAgICAvLyBvcHRpb25hbCBwb3N0LXJlbmRlciBsb29wIGhvb2tcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcCA9ICFvcHRpb25zLmRpc2FibGVSZW5kZXJMb29wOyAgLy8gZGlzYWJsZSByZW5kZXIgbG9vcCAtIGFwcCB3aWxsIGhhdmUgdG8gbWFudWFsbHkgY2FsbCBTY2VuZS5yZW5kZXIoKSBwZXIgZnJhbWVcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9zdG9wID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyX2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5sYXN0X3JlbmRlcl9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mcmFtZSA9IDA7XG4gICAgICAgIHRoaXMubWVkaWFfY2FwdHVyZSA9IG5ldyBNZWRpYUNhcHR1cmUoKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmludHJvc3BlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldFRpbWUoKTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyO1xuXG4gICAgICAgIHRoaXMubGlnaHRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gbnVsbDtcblxuICAgICAgICB0aGlzLmNyZWF0ZUxpc3RlbmVycygpO1xuICAgICAgICB0aGlzLnVwZGF0aW5nID0gMDtcbiAgICAgICAgdGhpcy5nZW5lcmF0aW9uID0gU2NlbmUuZ2VuZXJhdGlvbjsgLy8gYW4gaWQgdGhhdCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgdGhlIHNjZW5lIGNvbmZpZyBpcyBpbnZhbGlkYXRlZFxuICAgICAgICB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbiA9IFNjZW5lLmdlbmVyYXRpb247IC8vIGxhc3QgZ2VuZXJhdGlvbiBpZCB3aXRoIGEgY29tcGxldGUgdmlld1xuICAgICAgICB0aGlzLnNldHVwRGVidWcoKTtcblxuICAgICAgICB0aGlzLmxvZ19sZXZlbCA9IG9wdGlvbnMubG9nTGV2ZWwgfHwgJ3dhcm4nO1xuICAgICAgICBsb2cuc2V0TGV2ZWwodGhpcy5sb2dfbGV2ZWwpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGUgKGNvbmZpZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NlbmUoY29uZmlnLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHNjZW5lIChvciByZWxvYWQgZXhpc3Rpbmcgc2NlbmUgaWYgbm8gbmV3IHNvdXJjZSBzcGVjaWZpZWQpXG4gICAgLy8gT3B0aW9uczpcbiAgICAvLyAgIGBjb25maWdfcGF0aGA6IGJhc2UgVVJMIGFnYWluc3Qgd2hpY2ggcm9vIHNjZW5lIHJlc291cmNlcyBzaG91bGQgYmUgcmVzb2x2ZWQgKHVzZWZ1bCBmb3IgUGxheSkgKGRlZmF1bHQgbnVsbGwpXG4gICAgLy8gICBgYmxvY2tpbmdgOiBzaG91bGQgcmVuZGVyaW5nIGJsb2NrIG9uIHNjZW5lIGxvYWQgY29tcGxldGlvbiAoZGVmYXVsdCB0cnVlKVxuICAgIGxvYWQoY29uZmlnX3NvdXJjZSA9IG51bGwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXppbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRpbmcrKztcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsdHkgZm9yIHBhc3NpbmcgYGNvbmZpZ19wYXRoYCBzdHJpbmcgYXMgc2Vjb25kIGFyZ3VtZW50XG4gICAgICAgIC8vIChzaW5jZSB0cmFuc2l0aW9uZWQgdG8gdXNpbmcgb3B0aW9ucyBhcmd1bWVudCB0byBhY2NlcHQgbW9yZSBwYXJhbWV0ZXJzKVxuICAgICAgICBvcHRpb25zID0gKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykgPyB7IGNvbmZpZ19wYXRoOiBvcHRpb25zIH0gOiBvcHRpb25zO1xuICAgICAgICBsZXQgY29uZmlnX3BhdGggPSBvcHRpb25zLmNvbmZpZ19wYXRoO1xuXG4gICAgICAgIC8vIFNob3VsZCByZW5kZXJpbmcgYmxvY2sgb24gbG9hZCAobm90IGRlc2lyYWJsZSBmb3IgaW5pdGlhbCBsb2FkLCBvZnRlbiBkZXNpcmVkIGZvciBsaXZlIHN0eWxlLXN3aXRjaGluZylcbiAgICAgICAgb3B0aW9ucy5ibG9ja2luZyA9IChvcHRpb25zLmJsb2NraW5nICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5ibG9ja2luZyA6IHRydWU7XG5cbiAgICAgICAgLy8gTG9hZCBzY2VuZSBkZWZpbml0aW9uIChzb3VyY2VzLCBzdHlsZXMsIGV0Yy4pLCB0aGVuIGNyZWF0ZSBzdHlsZXMgJiB3b3JrZXJzXG4gICAgICAgIHRoaXMuY3JlYXRlQ2FudmFzKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gdGhpcy5sb2FkU2NlbmUoY29uZmlnX3NvdXJjZSwgY29uZmlnX3BhdGgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmNyZWF0ZVdvcmtlcnMoKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmVhdHVyZVNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgLy8gU2NlbmUgbG9hZGVkIGZyb20gYSBKUyBvYmplY3QsIG9yIG1vZGlmaWVkIGJ5IGEgYGxvYWRgIGV2ZW50LCBtYXkgY29udGFpbiBjb21waWxlZCBKUyBmdW5jdGlvbnNcbiAgICAgICAgICAgICAgICAvLyB3aGljaCBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQsIHdoaWxlIG9uZSBsb2FkZWQgb25seSBmcm9tIGEgVVJMIGRvZXMgbm90LlxuICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZV9mdW5jcyA9ICgodHlwZW9mIHRoaXMuY29uZmlnX3NvdXJjZSA9PT0gJ29iamVjdCcpIHx8IHRoaXMuaGFzU3Vic2NyaWJlcnNGb3IoJ2xvYWQnKSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGluZyA9IHRoaXMudXBkYXRlQ29uZmlnKHsgc2VyaWFsaXplX2Z1bmNzLCBmYWRlX2luOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2NraW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0aW5nLS07XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlID0gdGhpcy5jb25maWdfc291cmNlO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdF92YWxpZF9jb25maWdfcGF0aCA9IHRoaXMuY29uZmlnX3BhdGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJfbG9vcCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR1cFJlbmRlckxvb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6aW5nID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmcgPSAwO1xuXG4gICAgICAgICAgICAvLyBSZXBvcnQgYW5kIHJldmVydCB0byBsYXN0IHZhbGlkIGNvbmZpZyBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGxldCB0eXBlLCBtZXNzYWdlO1xuICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdZQU1MRXhjZXB0aW9uJykge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAneWFtbCc7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICdFcnJvciBwYXJzaW5nIHNjZW5lIFlBTUwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogbW9yZSBlcnJvciB0eXBlc1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnRXJyb3IgaW5pdGlhbGl6aW5nIHNjZW5lJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignZXJyb3InLCB7IHR5cGUsIG1lc3NhZ2UsIGVycm9yLCB1cmw6IHRoaXMuY29uZmlnX3NvdXJjZSB9KTtcblxuICAgICAgICAgICAgbWVzc2FnZSA9IGBTY2VuZS5sb2FkKCkgZmFpbGVkIHRvIGxvYWQgJHt0aGlzLmNvbmZpZ19zb3VyY2V9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3NvdXJjZSkge1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBsb2coJ2luZm8nLCBgU2NlbmUubG9hZCgpIHJldmVydGluZyB0byBsYXN0IHZhbGlkIGNvbmZpZ3VyYXRpb25gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkKHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlLCB0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3BhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nKCdlcnJvcicsIG1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXppbmc7XG4gICAgfVxuXG4gICAgLy8gRm9yIEFQSSBjb21wYXRpYmlsaXR5XG4gICAgcmVsb2FkKGNvbmZpZ19zb3VyY2UgPSBudWxsLCBjb25maWdfcGF0aCA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZChjb25maWdfc291cmNlLCBjb25maWdfcGF0aCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX3N0b3AgPSB0cnVlOyAvLyBzY2hlZHVsZSByZW5kZXIgbG9vcCB0byBzdG9wXG5cbiAgICAgICAgdGhpcy5kZXN0cm95TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzICYmIHRoaXMuY2FudmFzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jYW52YXMpO1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdsKSB7XG4gICAgICAgICAgICBUZXh0dXJlLmRlc3Ryb3kodGhpcy5nbCk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuZGVzdHJveSh0aGlzLmdsKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzID0ge307XG5cbiAgICAgICAgICAgIFNoYWRlclByb2dyYW0ucmVzZXQoKTtcblxuICAgICAgICAgICAgLy8gRm9yY2UgY29udGV4dCBsb3NzXG4gICAgICAgICAgICBsZXQgZXh0ID0gdGhpcy5nbC5nZXRFeHRlbnNpb24oJ1dFQkdMX2xvc2VfY29udGV4dCcpO1xuICAgICAgICAgICAgaWYgKGV4dCkge1xuICAgICAgICAgICAgICAgIGV4dC5sb3NlQ29udGV4dCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmdsID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc291cmNlcyA9IHt9O1xuXG4gICAgICAgIHRoaXMuZGVzdHJveVdvcmtlcnMoKTtcbiAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnRpbGVfbWFuYWdlciA9IG51bGw7XG4gICAgfVxuXG4gICAgY3JlYXRlQ2FudmFzKCkge1xuICAgICAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5jb250YWluZXIgfHwgZG9jdW1lbnQuYm9keTtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS50b3AgPSAwO1xuICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5sZWZ0ID0gMDtcblxuICAgICAgICAvLyBGb3JjZSB0YW5ncmFtIGNhbnZhcyB1bmRlcm5lYXRoIGFsbCBsZWFmbGV0IGxheWVycywgYW5kIHNldCBiYWNrZ3JvdW5kIHRvIHRyYW5zcGFyZW50XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY2FudmFzKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5nbCA9IENvbnRleHQuZ2V0Q29udGV4dCh0aGlzLmNhbnZhcywge1xuICAgICAgICAgICAgICAgIGFscGhhOiB0cnVlLCBwcmVtdWx0aXBsaWVkQWxwaGE6IHRydWUsIC8vIFRPRE86IHZhcnkgdy9zY2VuZSBhbHBoYVxuICAgICAgICAgICAgICAgIGRldmljZV9waXhlbF9yYXRpbzogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJDb3VsZG4ndCBjcmVhdGUgV2ViR0wgY29udGV4dC4gXCIgK1xuICAgICAgICAgICAgICAgIFwiWW91ciBicm93c2VyIG1heSBub3Qgc3VwcG9ydCBXZWJHTCwgb3IgaXQncyB0dXJuZWQgb2ZmPyBcIiArXG4gICAgICAgICAgICAgICAgXCJWaXNpdCBodHRwOi8vd2ViZ2xyZXBvcnQuY29tLyBmb3IgbW9yZSBpbmZvLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNpemVNYXAodGhpcy5jb250YWluZXIuY2xpZW50V2lkdGgsIHRoaXMuY29udGFpbmVyLmNsaWVudEhlaWdodCk7XG4gICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmluaXQodGhpcy5nbCk7XG4gICAgICAgIHRoaXMucmVuZGVyX3N0YXRlcyA9IG5ldyBSZW5kZXJTdGF0ZU1hbmFnZXIodGhpcy5nbCk7XG4gICAgICAgIHRoaXMubWVkaWFfY2FwdHVyZS5zZXRDYW52YXModGhpcy5jYW52YXMpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgVVJMIHRvIGxvYWQgdGhlIHdlYiB3b3JrZXIgZnJvbVxuICAgIGdldFdvcmtlclVybCgpIHtcbiAgICAgICAgbGV0IHdvcmtlcl91cmwgPSB0aGlzLndvcmtlcl91cmwgfHwgVVJMcy5maW5kQ3VycmVudFVSTCgndGFuZ3JhbS5kZWJ1Zy5qcycsICd0YW5ncmFtLm1pbi5qcycpO1xuXG4gICAgICAgIGlmICghd29ya2VyX3VybCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgbG9hZCB3b3JrZXIgYmVjYXVzZSBjb3VsZG4ndCBmaW5kIGJhc2UgVVJMIHRoYXQgbGlicmFyeSB3YXMgbG9hZGVkIGZyb21cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbXBvcnQgY3VzdG9tIGRhdGEgc291cmNlIHNjcmlwdHMgYWxvbmdzaWRlIGNvcmUgbGlicmFyeVxuICAgICAgICAvLyBOT1RFOiB3b3JrYXJvdW5kIGZvciBpc3N1ZSB3aGVyZSBsYXJnZSBsaWJyYXJpZXMgaW50ZXJtaXR0ZW50bHkgZmFpbCB0byBsb2FkIGluIHdlYiB3b3JrZXJzLFxuICAgICAgICAvLyB3aGVuIG11bHRpcGxlIGltcG9ydFNjcmlwdHMoKSBjYWxscyBhcmUgdXNlZC4gTG9hZGluZyBhbGwgc2NyaXB0cyAoaW5jbHVkaW5nIFRhbmdyYW0gaXRzZWxmKVxuICAgICAgICAvLyBpbiBvbmUgY2FsbCBhdCBhdCB3b3JrZXIgY3JlYXRpb24gdGltZSBoYXMgbm90IGV4aGliaXRlZCB0aGUgc2FtZSBpc3N1ZS5cbiAgICAgICAgbGV0IHVybHMgPSBbLi4udGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzXTtcbiAgICAgICAgdXJscy5wdXNoKHdvcmtlcl91cmwpOyAvLyBsb2FkIFRhbmdyYW0gKmxhc3QqIChoYXMgYmVlbiBtb3JlIHJlbGlhYmxlLCB0aG91Z2ggcmVhc29uIHVua25vd24pXG4gICAgICAgIGxldCBib2R5ID0gYGltcG9ydFNjcmlwdHMoJHt1cmxzLm1hcCh1cmwgPT4gYCcke3VybH0nYCkuam9pbignLCcpfSk7YDtcbiAgICAgICAgcmV0dXJuIFVSTHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtib2R5XSwgeyB0eXBlOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcgfSkpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBsaXN0IG9mIGFueSBjdXN0b20gZGF0YSBzb3VyY2Ugc2NyaXB0cyAoaWYgYW55KVxuICAgIHVwZGF0ZURhdGFTb3VyY2VTY3JpcHRzICgpIHtcbiAgICAgICAgbGV0IHByZXZfc2NyaXB0cyA9IFsuLi4odGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzfHxbXSldOyAvLyBzYXZlIGxpc3Qgb2YgcHJldmlvdXNseSBsb2FkZWQgc2NyaXB0c1xuICAgICAgICBsZXQgc2NyaXB0cyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLnNvdXJjZXMpLm1hcChzID0+IHRoaXMuY29uZmlnLnNvdXJjZXNbc10uc2NyaXB0cykuZmlsdGVyKHggPT4geCk7XG4gICAgICAgIGlmIChzY3JpcHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCAnbG9hZGluZyBjdXN0b20gZGF0YSBzb3VyY2Ugc2NyaXB0cyBpbiB3b3JrZXI6Jywgc2NyaXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzID0gW10uY29uY2F0KC4uLnNjcmlwdHMpLnNvcnQoKTtcblxuICAgICAgICAvLyBTY3JpcHRzIGNoYW5nZWQ/XG4gICAgICAgIHJldHVybiAhKHRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0cy5sZW5ndGggPT09IHByZXZfc2NyaXB0cy5sZW5ndGggJiZcbiAgICAgICAgICAgIHRoaXMuZGF0YV9zb3VyY2Vfc2NyaXB0cy5ldmVyeSgodiwgaSkgPT4gdiA9PT0gcHJldl9zY3JpcHRzW2ldKSk7XG4gICAgfVxuXG4gICAgLy8gV2ViIHdvcmtlcnMgaGFuZGxlIGhlYXZ5IGR1dHkgdGlsZSBjb25zdHJ1Y3Rpb246IG5ldHdvcmtpbmcsIGdlb21ldHJ5IHByb2Nlc3NpbmcsIGV0Yy5cbiAgICBjcmVhdGVXb3JrZXJzKCkge1xuICAgICAgICAvLyBSZXNldCBvbGQgd29ya2VycyAoaWYgYW55KSBpZiB3ZSBuZWVkIHRvIHJlLWluc3RhbnRpYXRlIHdpdGggbmV3IGV4dGVybmFsIHNjcmlwdHNcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlRGF0YVNvdXJjZVNjcmlwdHMoKSkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95V29ya2VycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLndvcmtlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VXb3JrZXJzKHRoaXMuZ2V0V29ya2VyVXJsKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICAvLyBJbnN0YW50aWF0ZSB3b3JrZXJzIGZyb20gVVJMLCBpbml0IGV2ZW50IGhhbmRsZXJzXG4gICAgbWFrZVdvcmtlcnModXJsKSB7XG4gICAgICAgIHZhciBxdWV1ZSA9IFtdO1xuXG4gICAgICAgIHRoaXMud29ya2VycyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpZD0wOyBpZCA8IHRoaXMubnVtX3dvcmtlcnM7IGlkKyspIHtcbiAgICAgICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKHVybCk7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnNbaWRdID0gd29ya2VyO1xuXG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIuYWRkV29ya2VyKHdvcmtlcik7XG5cbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgU2NlbmUubWFrZVdvcmtlcnM6IGluaXRpYWxpemluZyB3b3JrZXIgJHtpZH1gKTtcbiAgICAgICAgICAgIGxldCBfaWQgPSBpZDtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2goV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHdvcmtlciwgJ3NlbGYuaW5pdCcsIHRoaXMuaWQsIGlkLCB0aGlzLm51bV93b3JrZXJzLCB0aGlzLmxvZ19sZXZlbCwgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKS50aGVuKFxuICAgICAgICAgICAgICAgIChpZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYFNjZW5lLm1ha2VXb3JrZXJzOiBpbml0aWFsaXplZCB3b3JrZXIgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBgU2NlbmUubWFrZVdvcmtlcnM6IGZhaWxlZCB0byBpbml0aWFsaXplIHdvcmtlciAke19pZH06YCwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZXh0X3dvcmtlciA9IDA7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChxdWV1ZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBsb2cuc2V0V29ya2Vycyh0aGlzLndvcmtlcnMpO1xuXG4gICAgICAgICAgICAvLyBMZXQgVmVydGV4RWxlbWVudHMga25vdyBpZiAzMiBiaXQgaW5kaWNlcyBmb3IgZWxlbWVudCBhcnJheXMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgICAgbGV0IFVpbnQzMl9mbGFnID0gdGhpcy5nbC5nZXRFeHRlbnNpb24oXCJPRVNfZWxlbWVudF9pbmRleF91aW50XCIpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ1ZlcnRleEVsZW1lbnRzLnNldFVpbnQzMkZsYWcnLCBVaW50MzJfZmxhZyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlc3Ryb3lXb3JrZXJzKCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLndvcmtlcnMpKSB7XG4gICAgICAgICAgICBsb2cuc2V0V29ya2VycyhudWxsKTtcbiAgICAgICAgICAgIHRoaXMud29ya2Vycy5mb3JFYWNoKCh3b3JrZXIpID0+IHtcbiAgICAgICAgICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud29ya2VycyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBc3NpZ24gdGlsZSB0byB3b3JrZXIgdGhyZWFkIGJhc2VkIG9uIGRhdGEgc291cmNlXG4gICAgZ2V0V29ya2VyRm9yRGF0YVNvdXJjZShzb3VyY2UpIHtcbiAgICAgICAgbGV0IHdvcmtlcjtcblxuICAgICAgICBpZiAoc291cmNlLnRpbGVkKSB7XG4gICAgICAgICAgICAvLyBSb3VuZCByb2JpbiB0aWxlZCBzb3VyY2VzIGFjcm9zcyBhbGwgd29ya2Vyc1xuICAgICAgICAgICAgd29ya2VyID0gdGhpcy53b3JrZXJzW3RoaXMubmV4dF93b3JrZXJdO1xuICAgICAgICAgICAgdGhpcy5uZXh0X3dvcmtlciA9ICh0aGlzLm5leHRfd29ya2VyICsgMSkgJSB0aGlzLndvcmtlcnMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gUGluIGFsbCB0aWxlcyBmcm9tIGVhY2ggbm9uLXRpbGVkIHNvdXJjZSB0byBhIHNpbmdsZSB3b3JrZXJcbiAgICAgICAgICAgIC8vIFByZXZlbnRzIGRhdGEgZm9yIHRoZXNlIHNvdXJjZXMgZnJvbSBiZWluZyBsb2FkZWQgbW9yZSB0aGFuIG9uY2VcbiAgICAgICAgICAgIHdvcmtlciA9IHRoaXMud29ya2Vyc1tzb3VyY2UuaWQgJSB0aGlzLndvcmtlcnMubGVuZ3RoXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfVxuXG4gICAgLy8gU2NlbmUgaXMgcmVhZHkgZm9yIHJlbmRlcmluZ1xuICAgIHJlYWR5KCkge1xuICAgICAgICBpZiAoIXRoaXMudmlldy5yZWFkeSgpIHx8IE9iamVjdC5rZXlzKHRoaXMuc291cmNlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlc2l6ZSB0aGUgbWFwIHdoZW4gZGV2aWNlIHBpeGVsIHJhdGlvIGNoYW5nZXMsIGUuZy4gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBkaXNwbGF5c1xuICAgIHVwZGF0ZURldmljZVBpeGVsUmF0aW8gKCkge1xuICAgICAgICBpZiAoVXRpbHMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpKSB7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi51cGRhdGVEZXZpY2VQaXhlbFJhdGlvJywgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucmVidWlsZCgpKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucmVzaXplTWFwKHRoaXMudmlldy5zaXplLmNzcy53aWR0aCwgdGhpcy52aWV3LnNpemUuY3NzLmhlaWdodCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzaXplTWFwKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgaWYgKHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMudmlldy5zZXRWaWV3cG9ydFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGlmICh0aGlzLmdsKSB7XG4gICAgICAgICAgICBDb250ZXh0LnJlc2l6ZSh0aGlzLmdsLCB3aWR0aCwgaGVpZ2h0LCBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVxdWVzdCBzY2VuZSBiZSByZWRyYXduIGF0IG5leHQgYW5pbWF0aW9uIGxvb3BcbiAgICByZXF1ZXN0UmVkcmF3KCkge1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZWRyYXcgc2NlbmUgaW1tZWRpYXRlbHkgLSBkb24ndCB3YWl0IGZvciBhbmltYXRpb24gbG9vcFxuICAgIC8vIFVzZSBzcGFyaW5nbHksIGJ1dCBmb3IgY2FzZXMgd2hlcmUgeW91IG5lZWQgdGhlIGNsb3Nlc3QgcG9zc2libGUgc3luYyB3aXRoIG90aGVyIFVJIGVsZW1lbnRzLFxuICAgIC8vIHN1Y2ggYXMgb3RoZXIsIG5vbi1XZWJHTCBtYXAgbGF5ZXJzIChlLmcuIExlYWZsZXQgcmFzdGVyIGxheWVycywgbWFya2VycywgZXRjLilcbiAgICBpbW1lZGlhdGVSZWRyYXcoKSB7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHJlbmRlckxvb3AgKCkge1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX2FjdGl2ZSA9IHRydWU7IC8vIG9ubHkgbGV0IHRoZSByZW5kZXIgbG9vcCBpbnN0YW50aWF0ZSBvbmNlXG5cbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgc2NlbmVcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXF1ZXN0IHRoZSBuZXh0IGZyYW1lIGlmIG5vdCBzY2hlZHVsZWQgdG8gc3RvcFxuICAgICAgICBpZiAoIXRoaXMucmVuZGVyX2xvb3Bfc3RvcCkge1xuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJlbmRlckxvb3AuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcl9sb29wX3N0b3AgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2xvb3BfYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXR1cCB0aGUgcmVuZGVyIGxvb3BcbiAgICBzZXR1cFJlbmRlckxvb3AoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnJlbmRlckxvb3AoKTsgfSwgMCk7IC8vIGRlbGF5IHN0YXJ0IGJ5IG9uZSB0aWNrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIC8vIFJlbmRlciBvbiBkZW1hbmRcbiAgICAgICAgdmFyIHdpbGxfcmVuZGVyID0gIShcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID09PSBmYWxzZSB8fFxuICAgICAgICAgICAgdGhpcy51cGRhdGluZyA+IDAgfHxcbiAgICAgICAgICAgIHRoaXMucmVhZHkoKSA9PT0gZmFsc2VcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBQcmUtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnByZVVwZGF0ZSh3aWxsX3JlbmRlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCYWlsIGlmIG5vIG5lZWQgdG8gcmVuZGVyXG4gICAgICAgIGlmICghd2lsbF9yZW5kZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7IC8vIHN1YmNsYXNzZXMgY2FuIHNldCB0aGlzIGJhY2sgdG8gdHJ1ZSB3aGVuIGFuaW1hdGlvbiBpcyBuZWVkZWRcblxuICAgICAgICAvLyBSZW5kZXIgdGhlIHNjZW5lXG4gICAgICAgIHRoaXMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdDb21wbGV0ZSgpOyAvLyBmaXJlcyBldmVudCB3aGVuIHJlbmRlcmVkIHRpbGUgc2V0IG9yIHN0eWxlIGNoYW5nZXNcbiAgICAgICAgdGhpcy5tZWRpYV9jYXB0dXJlLmNvbXBsZXRlU2NyZWVuc2hvdCgpOyAvLyBjb21wbGV0ZXMgc2NyZWVuc2hvdCBjYXB0dXJlIGlmIHJlcXVlc3RlZFxuXG4gICAgICAgIC8vIFBvc3QtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucG9zdFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5wb3N0VXBkYXRlKHdpbGxfcmVuZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlZHJhdyBldmVyeSBmcmFtZSBpZiBhbmltYXRpbmdcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZWQgPT09IHRydWUgfHwgdGhpcy52aWV3LmlzQW5pbWF0aW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mcmFtZSsrO1xuICAgICAgICBsb2coJ3RyYWNlJywgJ1NjZW5lLnJlbmRlcigpJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcblxuICAgICAgICAvLyBVcGRhdGUgc3R5bGVzLCBjYW1lcmEsIGxpZ2h0c1xuICAgICAgICB0aGlzLnZpZXcudXBkYXRlKCk7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMubGlnaHRzKS5mb3JFYWNoKGkgPT4gdGhpcy5saWdodHNbaV0udXBkYXRlKCkpO1xuXG4gICAgICAgIC8vIFJlbmRlciBtYWluIHBhc3NcbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnQgPSB0aGlzLnJlbmRlclBhc3MoKTtcblxuICAgICAgICAvLyBSZW5kZXIgc2VsZWN0aW9uIHBhc3MgKGlmIG5lZWRlZClcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLnBlbmRpbmdSZXF1ZXN0cygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3LnBhbm5pbmcgfHwgdGhpcy52aWV3Lnpvb21pbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhclBlbmRpbmdSZXF1ZXN0cygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uYmluZCgpOyAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBGQk9cbiAgICAgICAgICAgIHRoaXMucmVuZGVyUGFzcyhcbiAgICAgICAgICAgICAgICAnc2VsZWN0aW9uX3Byb2dyYW0nLCAgICAgICAgICAgICAgICAvLyByZW5kZXIgdy9hbHRlcm5hdGUgcHJvZ3JhbVxuICAgICAgICAgICAgICAgIHsgYWxsb3dfYmxlbmQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVhZCgpOyAgICAgICAgICAgICAgICAgIC8vIHJlYWQgcmVzdWx0cyBmcm9tIHNlbGVjdGlvbiBidWZmZXJcblxuICAgICAgICAgICAgLy8gUmVzZXQgdG8gc2NyZWVuIGJ1ZmZlclxuICAgICAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICAgICAgICAgIGdsLnZpZXdwb3J0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnRfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5yZW5kZXJfY291bnQgIT09IHRoaXMubGFzdF9yZW5kZXJfY291bnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB0aGlzLmdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplKCkudGhlbihzaXplID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZSkgeyAvLyByZXR1cm5zIHVuZGVmaW5lZCBpZiBwcmV2aW91cyByZXF1ZXN0IHBlbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdpbmZvJywgYFNjZW5lOiByZW5kZXJlZCAke3RoaXMucmVuZGVyX2NvdW50fSBwcmltaXRpdmVzICgke3NpemV9IGZlYXR1cmVzIGluIHNlbGVjdGlvbiBtYXApYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0X3JlbmRlcl9jb3VudCA9IHRoaXMucmVuZGVyX2NvdW50O1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBhbGwgYWN0aXZlIHN0eWxlcywgZ3JvdXBlZCBieSBibGVuZC9kZXB0aCB0eXBlIChvcGFxdWUsIG92ZXJsYXksIGV0Yy4pIGFuZCBieSBwcm9ncmFtIChzdHlsZSlcbiAgICAvLyBDYWxsZWQgYm90aCBmb3IgbWFpbiByZW5kZXIgcGFzcywgYW5kIGZvciBzZWNvbmRhcnkgcGFzc2VzIGxpa2Ugc2VsZWN0aW9uIGJ1ZmZlclxuICAgIHJlbmRlclBhc3MocHJvZ3JhbV9rZXkgPSAncHJvZ3JhbScsIHsgYWxsb3dfYmxlbmQgfSA9IHt9KSB7XG4gICAgICAgIC8vIG9wdGlvbmFsbHkgZm9yY2UgYWxwaGEgb2ZmIChlLmcuIGZvciBzZWxlY3Rpb24gcGFzcylcbiAgICAgICAgYWxsb3dfYmxlbmQgPSAoYWxsb3dfYmxlbmQgPT0gbnVsbCkgPyB0cnVlIDogYWxsb3dfYmxlbmQ7XG5cbiAgICAgICAgdGhpcy5jbGVhckZyYW1lKHsgY2xlYXJfY29sb3I6IHRydWUsIGNsZWFyX2RlcHRoOiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIFNvcnQgc3R5bGVzIGJ5IGJsZW5kIG9yZGVyXG4gICAgICAgIGxldCBzdHlsZXMgPSB0aGlzLnRpbGVfbWFuYWdlci5nZXRBY3RpdmVTdHlsZXMoKS5cbiAgICAgICAgICAgIG1hcChzID0+IHRoaXMuc3R5bGVzW3NdKS5cbiAgICAgICAgICAgIGZpbHRlcihzID0+IHMpLiAvLyBndWFyZCBhZ2FpbnN0IG1pc3Npbmcgc3R5bGVzLCBzdWNoIGFzIHdoaWxlIGxvYWRpbmcgYSBuZXcgc2NlbmVcbiAgICAgICAgICAgIHNvcnQoU3R5bGUuYmxlbmRPcmRlclNvcnQpO1xuXG4gICAgICAgIC8vIFJlbmRlciBzdHlsZXNcbiAgICAgICAgbGV0IGNvdW50ID0gMDsgLy8gaG93IG1hbnkgcHJpbWl0aXZlcyB3ZXJlIHJlbmRlcmVkXG4gICAgICAgIGxldCBsYXN0X2JsZW5kO1xuICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzdHlsZXMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHN0eWxlc1tzXTtcblxuICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgcmVuZGVyIHN0YXRlIHdoZW4gYmxlbmQgbW9kZSBjaGFuZ2VzXG4gICAgICAgICAgICBpZiAoc3R5bGUuYmxlbmQgIT09IGxhc3RfYmxlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LFxuICAgICAgICAgICAgICAgICAgICBTdHlsZS5yZW5kZXJfc3RhdGVzW3N0eWxlLmJsZW5kXSwgICAgICAgLy8gcmVuZGVyIHN0YXRlIGZvciBibGVuZCBtb2RlXG4gICAgICAgICAgICAgICAgICAgIHsgYmxlbmQ6IChhbGxvd19ibGVuZCAmJiBzdHlsZS5ibGVuZCkgfSAvLyBlbmFibGUvZGlzYWJsZSBibGVuZGluZyAoZS5nLiBubyBibGVuZCBmb3Igc2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJTdGF0ZShzdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3VudCArPSB0aGlzLnJlbmRlclN0eWxlKHN0eWxlLm5hbWUsIHByb2dyYW1fa2V5KTtcbiAgICAgICAgICAgIGxhc3RfYmxlbmQgPSBzdHlsZS5ibGVuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG5cbiAgICByZW5kZXJTdHlsZShzdHlsZV9uYW1lLCBwcm9ncmFtX2tleSkge1xuICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLnN0eWxlc1tzdHlsZV9uYW1lXTtcbiAgICAgICAgbGV0IGZpcnN0X2Zvcl9zdHlsZSA9IHRydWU7XG4gICAgICAgIGxldCByZW5kZXJfY291bnQgPSAwO1xuICAgICAgICBsZXQgcHJvZ3JhbTtcblxuICAgICAgICAvLyBSZW5kZXIgdGlsZSBHTCBnZW9tZXRyaWVzXG4gICAgICAgIGxldCByZW5kZXJhYmxlX3RpbGVzID0gdGhpcy50aWxlX21hbmFnZXIuZ2V0UmVuZGVyYWJsZVRpbGVzKCk7XG4gICAgICAgIGZvciAobGV0IHQ9MDsgdCA8IHJlbmRlcmFibGVfdGlsZXMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gcmVuZGVyYWJsZV90aWxlc1t0XTtcblxuICAgICAgICAgICAgaWYgKHRpbGUubWVzaGVzW3N0eWxlX25hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3R5bGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgICAgIC8vIE9ubHkgc2V0dXAgc3R5bGUgaWYgcmVuZGVyaW5nIGZvciBmaXJzdCB0aW1lIHRoaXMgZnJhbWVcbiAgICAgICAgICAgIC8vIChsYXp5IGluaXQsIG5vdCBhbGwgc3R5bGVzIHdpbGwgYmUgdXNlZCBpbiBhbGwgc2NyZWVuIHZpZXdzOyBzb21lIHN0eWxlcyBtaWdodCBiZSBkZWZpbmVkIGJ1dCBuZXZlciB1c2VkKVxuICAgICAgICAgICAgaWYgKGZpcnN0X2Zvcl9zdHlsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGZpcnN0X2Zvcl9zdHlsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHByb2dyYW0gPSB0aGlzLnNldHVwU3R5bGUoc3R5bGUsIHByb2dyYW1fa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIXByb2dyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTa2lwIHByb3h5IHRpbGVzIGlmIG5ldyB0aWxlcyBoYXZlIGZpbmlzaGVkIGxvYWRpbmcgdGhpcyBzdHlsZVxuICAgICAgICAgICAgaWYgKCF0aWxlLnNob3VsZFByb3h5Rm9yU3R5bGUoc3R5bGVfbmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ3RyYWNlJywgYFNjZW5lLnJlbmRlclN0eWxlKCk6IFNraXAgcHJveHkgdGlsZSBmb3Igc3R5bGUgJyR7c3R5bGVfbmFtZX0nIGAsIHRpbGUsIHRpbGUucHJveHlfZm9yKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGlsZS1zcGVjaWZpYyBzdGF0ZVxuICAgICAgICAgICAgdGhpcy52aWV3LnNldHVwVGlsZSh0aWxlLCBwcm9ncmFtKTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIHRpbGVcbiAgICAgICAgICAgIGxldCBtZXNoID0gdGlsZS5tZXNoZXNbc3R5bGVfbmFtZV07XG4gICAgICAgICAgICBpZiAoc3R5bGUucmVuZGVyKG1lc2gpKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgaW5jdXIgYWRkaXRpb25hbCByZW5kZXJzIHdoaWxlIHZpZXdwb3J0IGlzIG1vdmluZ1xuICAgICAgICAgICAgICAgIGlmICghKHRoaXMudmlldy5wYW5uaW5nIHx8IHRoaXMudmlldy56b29taW5nKSkge1xuICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlbmRlcl9jb3VudCArPSBtZXNoLmdlb21ldHJ5X2NvdW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlbmRlcl9jb3VudDtcbiAgICB9XG5cbiAgICBzZXR1cFN0eWxlKHN0eWxlLCBwcm9ncmFtX2tleSkge1xuICAgICAgICAvLyBHZXQgc2hhZGVyIHByb2dyYW0gZnJvbSBzdHlsZSwgbGF6aWx5IGNvbXBpbGluZyBpZiBuZWNlc3NhcnlcbiAgICAgICAgbGV0IHByb2dyYW07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwcm9ncmFtID0gc3R5bGUuZ2V0UHJvZ3JhbShwcm9ncmFtX2tleSk7XG4gICAgICAgICAgICBpZiAoIXByb2dyYW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignd2FybmluZycsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3R5bGVzJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgY29tcGlsaW5nIHN0eWxlICR7c3R5bGUubmFtZX1gLFxuICAgICAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgICAgIHNoYWRlcl9lcnJvcnM6IHN0eWxlLnByb2dyYW0gJiYgc3R5bGUucHJvZ3JhbS5zaGFkZXJfZXJyb3JzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2dyYW0udXNlKCk7XG4gICAgICAgIHN0eWxlLnNldHVwKCk7XG5cbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3RpbWUnLCB0aGlzLmFuaW1hdGVkID8gKCgoK25ldyBEYXRlKCkpIC0gdGhpcy5zdGFydF90aW1lKSAvIDEwMDApIDogMCk7XG4gICAgICAgIHRoaXMudmlldy5zZXR1cFByb2dyYW0ocHJvZ3JhbSk7XG4gICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5saWdodHMpIHtcbiAgICAgICAgICAgIHRoaXMubGlnaHRzW2ldLnNldHVwUHJvZ3JhbShwcm9ncmFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH1cblxuICAgIGNsZWFyRnJhbWUoeyBjbGVhcl9jb2xvciwgY2xlYXJfZGVwdGggfSA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgY2xlYXJfY29sb3IgPSAoY2xlYXJfY29sb3IgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTsgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGNsZWFyX2RlcHRoID0gKGNsZWFyX2RlcHRoID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7IC8vIGRlZmF1bHQgdHJ1ZVxuXG4gICAgICAgIC8vIFNldCBHTCBzdGF0ZVxuICAgICAgICB0aGlzLnJlbmRlcl9zdGF0ZXMuZGVwdGhfd3JpdGUuc2V0KHsgZGVwdGhfd3JpdGU6IGNsZWFyX2RlcHRoIH0pO1xuXG4gICAgICAgIGxldCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGlmIChjbGVhcl9jb2xvciB8fCBjbGVhcl9kZXB0aCkge1xuICAgICAgICAgICAgbGV0IG1hc2sgPSAoY2xlYXJfY29sb3IgJiYgZ2wuQ09MT1JfQlVGRkVSX0JJVCkgfCAoY2xlYXJfZGVwdGggJiYgZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG4gICAgICAgICAgICBnbC5jbGVhcihtYXNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFJlbmRlclN0YXRlKHsgZGVwdGhfdGVzdCwgZGVwdGhfd3JpdGUsIGN1bGxfZmFjZSwgYmxlbmQgfSA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdHNcbiAgICAgICAgLy8gVE9ETzogd2hlbiB3ZSBhYnN0cmFjdCBvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgcmVuZGVyIHBhc3NlcywgdGhlc2UgY2FuIGJlIHBlci1wYXNzIGNvbmZpZyBvcHRpb25zXG4gICAgICAgIGxldCByZW5kZXJfc3RhdGVzID0gdGhpcy5yZW5kZXJfc3RhdGVzO1xuICAgICAgICBkZXB0aF90ZXN0ID0gKGRlcHRoX3Rlc3QgPT09IGZhbHNlKSA/IGZhbHNlIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5kZXB0aF90ZXN0OyAgICAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBkZXB0aF93cml0ZSA9IChkZXB0aF93cml0ZSA9PT0gZmFsc2UpID8gZmFsc2UgOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmRlcHRoX3dyaXRlOyAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBjdWxsX2ZhY2UgPSAoY3VsbF9mYWNlID09PSBmYWxzZSkgPyBmYWxzZSA6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuY3VsbGluZzsgICAgICAgICAgIC8vIGRlZmF1bHQgdHJ1ZVxuICAgICAgICBibGVuZCA9IChibGVuZCAhPSBudWxsKSA/IGJsZW5kIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5ibGVuZGluZzsgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgZmFsc2VcblxuICAgICAgICAvLyBSZXNldCBmcmFtZSBzdGF0ZVxuICAgICAgICBsZXQgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgIHJlbmRlcl9zdGF0ZXMuZGVwdGhfdGVzdC5zZXQoeyBkZXB0aF90ZXN0OiBkZXB0aF90ZXN0IH0pO1xuICAgICAgICByZW5kZXJfc3RhdGVzLmRlcHRoX3dyaXRlLnNldCh7IGRlcHRoX3dyaXRlOiBkZXB0aF93cml0ZSB9KTtcbiAgICAgICAgcmVuZGVyX3N0YXRlcy5jdWxsaW5nLnNldCh7IGN1bGw6IGN1bGxfZmFjZSwgZmFjZTogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5jdWxsaW5nX2ZhY2UgfSk7XG5cbiAgICAgICAgLy8gQmxlbmRpbmcgb2YgYWxwaGEgY2hhbm5lbCBpcyBtb2RpZmllZCB0byBhY2NvdW50IGZvciBXZWJHTCBhbHBoYSBiZWhhdmlvciwgc2VlOlxuICAgICAgICAvLyBodHRwOi8vd2ViZ2xmdW5kYW1lbnRhbHMub3JnL3dlYmdsL2xlc3NvbnMvd2ViZ2wtYW5kLWFscGhhLmh0bWxcbiAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTE1MzM0MTZcbiAgICAgICAgaWYgKGJsZW5kKSB7XG4gICAgICAgICAgICAvLyBPcGFxdWU6IGFsbCBzb3VyY2UsIG5vIGRlc3RpbmF0aW9uXG4gICAgICAgICAgICBpZiAoYmxlbmQgPT09ICdvcGFxdWUnKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRyYWRpdGlvbmFsIGFscGhhIGJsZW5kaW5nXG4gICAgICAgICAgICBlbHNlIGlmIChibGVuZCA9PT0gJ292ZXJsYXknIHx8IGJsZW5kID09PSAnaW5sYXknKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBnbC5TUkNfQUxQSEEsIGRzdDogZ2wuT05FX01JTlVTX1NSQ19BTFBIQSxcbiAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhOiBnbC5PTkUsIGRzdF9hbHBoYTogZ2wuT05FX01JTlVTX1NSQ19BTFBIQVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWRkaXRpdmUgYmxlbmRpbmdcbiAgICAgICAgICAgIGVsc2UgaWYgKGJsZW5kID09PSAnYWRkJykge1xuICAgICAgICAgICAgICAgIHJlbmRlcl9zdGF0ZXMuYmxlbmRpbmcuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYmxlbmQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNyYzogZ2wuT05FLCBkc3Q6IGdsLk9ORVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTXVsdGlwbGljYXRpdmUgYmxlbmRpbmdcbiAgICAgICAgICAgIGVsc2UgaWYgKGJsZW5kID09PSAnbXVsdGlwbHknKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBnbC5aRVJPLCBkc3Q6IGdsLlNSQ19DT0xPUlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoeyBibGVuZDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXF1ZXN0IGZlYXR1cmUgc2VsZWN0aW9uIGF0IGdpdmVuIHBpeGVsLiBSdW5zIGFzeW5jIGFuZCByZXR1cm5zIHJlc3VsdHMgdmlhIGEgcHJvbWlzZS5cbiAgICBnZXRGZWF0dXJlQXQocGl4ZWwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgXCJTY2VuZS5nZXRGZWF0dXJlQXQoKSBjYWxsZWQgYmVmb3JlIHNjZW5lIHdhcyBpbml0aWFsaXplZFwiKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBvaW50IHNjYWxlZCB0byBbMC4uMV0gcmFuZ2VcbiAgICAgICAgdmFyIHBvaW50ID0ge1xuICAgICAgICAgICAgeDogcGl4ZWwueCAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAvIHRoaXMudmlldy5zaXplLmRldmljZS53aWR0aCxcbiAgICAgICAgICAgIHk6IHBpeGVsLnkgKiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gLyB0aGlzLnZpZXcuc2l6ZS5kZXZpY2UuaGVpZ2h0XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7IC8vIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBzY2VuZSByZS1yZW5kZXJzIGZvciB0aGVzZSB0byBiZSBwcm9jZXNzZWRcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uLmdldEZlYXR1cmVBdChwb2ludCkuXG4gICAgICAgICAgICB0aGVuKHNlbGVjdGlvbiA9PiBPYmplY3QuYXNzaWduKHNlbGVjdGlvbiwgeyBwaXhlbCB9KSkuXG4gICAgICAgICAgICBjYXRjaChlcnJvciA9PiBQcm9taXNlLnJlc29sdmUoeyBlcnJvciB9KSk7XG4gICAgfVxuXG4gICAgLy8gUmVidWlsZCBnZW9tZXRyeSwgd2l0aG91dCByZS1wYXJzaW5nIHRoZSBjb25maWcgb3IgcmUtY29tcGlsaW5nIHN0eWxlc1xuICAgIC8vIFRPRE86IGRldGVjdCB3aGljaCBlbGVtZW50cyBuZWVkIHRvIGJlIHJlZnJlc2hlZC9yZWJ1aWx0IChzdHlsZXNoZWV0IGNoYW5nZXMsIGV0Yy4pXG4gICAgcmVidWlsZChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYnVpbGRHZW9tZXRyeShvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBSZWJ1aWxkIGFsbCB0aWxlc1xuICAgIC8vIHN5bmM6IGJvb2xlYW4gb2Ygd2hldGhlciB0byBzeW5jIHRoZSBjb25maWcgb2JqZWN0IHRvIHRoZSB3b3JrZXJcbiAgICAvLyBzb3VyY2VzOiBvcHRpb25hbCBhcnJheSBvZiBkYXRhIHNvdXJjZXMgdG8gc2VsZWN0aXZlbHkgcmVidWlsZCAoYnkgZGVmYXVsdCBhbGwgb3VyIHJlYnVpbHQpXG4gICAgcmVidWlsZEdlb21ldHJ5KHsgc3luYyA9IHRydWUsIHNvdXJjZXMgPSBudWxsLCBzZXJpYWxpemVfZnVuY3MsIHByb2ZpbGUgPSBmYWxzZSwgZmFkZV9pbiA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gU2tpcCByZWJ1aWxkIGlmIGFscmVhZHkgaW4gcHJvZ3Jlc3NcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gUXVldWUgdXAgdG8gb25lIHJlYnVpbGQgY2FsbCBhdCBhIHRpbWUsIG9ubHkgc2F2ZSBsYXN0IHJlcXVlc3RcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5idWlsZGluZy5xdWV1ZWQgJiYgdGhpcy5idWlsZGluZy5xdWV1ZWQucmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBwcmV2aW91cyByZXF1ZXN0IHRoYXQgaXQgZGlkIG5vdCBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgJ1NjZW5lLnJlYnVpbGQ6IHJlcXVlc3Qgc3VwZXJjZWRlZCBieSBhIG5ld2VyIGNhbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZGluZy5xdWV1ZWQucmVzb2x2ZShmYWxzZSk7IC8vIGZhbHNlIGZsYWcgaW5kaWNhdGVzIHJlYnVpbGQgcmVxdWVzdCB3YXMgc3VwZXJjZWRlZFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNhdmUgcXVldWVkIHJlcXVlc3RcbiAgICAgICAgICAgICAgICBsZXQgb3B0aW9ucyA9IHsgc3luYywgc291cmNlcywgc2VyaWFsaXplX2Z1bmNzLCBwcm9maWxlLCBmYWRlX2luIH07XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZGluZy5xdWV1ZWQgPSB7IHJlc29sdmUsIHJlamVjdCwgb3B0aW9ucyB9O1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU2NlbmUucmVidWlsZCgpOiBxdWV1aW5nIHJlcXVlc3RgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHRpbGUgYnVpbGQgc3RhdGVcbiAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcgPSB7IHJlc29sdmUsIHJlamVjdCB9O1xuXG4gICAgICAgICAgICAvLyBQcm9maWxpbmdcbiAgICAgICAgICAgIGlmIChwcm9maWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZmlsZSgnU2NlbmUucmVidWlsZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgY29uZmlnIChpbiBjYXNlIEpTIG9iamVjdHMgd2VyZSBtYW5pcHVsYXRlZCBkaXJlY3RseSlcbiAgICAgICAgICAgIGlmIChzeW5jKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jQ29uZmlnVG9Xb3JrZXIoeyBzZXJpYWxpemVfZnVuY3MgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlc2V0RmVhdHVyZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5yZXNldFRpbWUoKTtcblxuICAgICAgICAgICAgLy8gUmVidWlsZCB2aXNpYmxlIHRpbGVzXG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5wcnVuZVRvVmlzaWJsZVRpbGVzKCk7XG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5mb3JFYWNoVGlsZSh0aWxlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZXMgfHwgc291cmNlcy5pbmRleE9mKHRpbGUuc291cmNlLm5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuYnVpbGRUaWxlKHRpbGUsIHsgZmFkZV9pbiB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLnVwZGF0ZVRpbGVzRm9yVmlldygpOyAvLyBwaWNrcyB1cCBhZGRpdGlvbmFsIHRpbGVzIGZvciBhbnkgbmV3L2NoYW5nZWQgZGF0YSBzb3VyY2VzXG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5jaGVja0J1aWxkUXVldWUoKTsgICAgLy8gcmVzb2x2ZSBpbW1lZGlhdGVseSBpZiBubyB0aWxlcyB0byBidWlsZFxuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFByb2ZpbGluZ1xuICAgICAgICAgICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9maWxlRW5kKCdTY2VuZS5yZWJ1aWxkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRpbGUgbWFuYWdlciBmaW5pc2hlZCBidWlsZGluZyB0aWxlc1xuICAgIC8vIFRPRE8gbW92ZSB0byB0aWxlIG1hbmFnZXJcbiAgICB0aWxlTWFuYWdlckJ1aWxkRG9uZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmcpIHtcbiAgICAgICAgICAgIGxvZygnaW5mbycsIGBTY2VuZTogYnVpbGQgZ2VvbWV0cnkgZmluaXNoZWRgKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nLnJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkaW5nLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFub3RoZXIgcmVidWlsZCBxdWV1ZWQ/XG4gICAgICAgICAgICB2YXIgcXVldWVkID0gdGhpcy5idWlsZGluZy5xdWV1ZWQ7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkaW5nID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChxdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYFNjZW5lOiBzdGFydGluZyBxdWV1ZWQgcmVidWlsZCgpIHJlcXVlc3RgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGQocXVldWVkLm9wdGlvbnMpLnRoZW4ocXVldWVkLnJlc29sdmUsIHF1ZXVlZC5yZWplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgTG9hZCAob3IgcmVsb2FkKSB0aGUgc2NlbmUgY29uZmlnXG4gICAgICAgQHJldHVybiB7UHJvbWlzZX1cbiAgICAqL1xuICAgIGxvYWRTY2VuZShjb25maWdfc291cmNlID0gbnVsbCwgY29uZmlnX3BhdGggPSBudWxsKSB7XG4gICAgICAgIHRoaXMuY29uZmlnX3NvdXJjZSA9IGNvbmZpZ19zb3VyY2UgfHwgdGhpcy5jb25maWdfc291cmNlO1xuICAgICAgICB0aGlzLmNvbmZpZ19nbG9iYWxzX2FwcGxpZWQgPSBbXTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlnX3NvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3BhdGggPSBVUkxzLnBhdGhGb3JVUkwoY29uZmlnX3BhdGggfHwgdGhpcy5jb25maWdfc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3BhdGggPSBVUkxzLnBhdGhGb3JVUkwoY29uZmlnX3BhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFNjZW5lTG9hZGVyLmxvYWRTY2VuZSh0aGlzLmNvbmZpZ19zb3VyY2UsIHRoaXMuY29uZmlnX3BhdGgpLnRoZW4oKHtjb25maWcsIGJ1bmRsZX0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgdGhpcy5jb25maWdfYnVuZGxlID0gYnVuZGxlO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdsb2FkJywgeyBjb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc291cmNlIHRvIGEgc2NlbmUsIGFyZ3VtZW50cyBgbmFtZWAgYW5kIGBjb25maWdgIG5lZWQgdG8gYmUgcHJvdmlkZWQ6XG4gICAgLy8gIC0gSWYgdGhlIG5hbWUgZG9lc24ndCBtYXRjaCBhIHNvdXJjZXMgaXQgd2lsbCBjcmVhdGUgaXRcbiAgICAvLyAgLSB0aGUgYGNvbmZpZ2Agb2JqIGZvbGxvdyB0aGUgWUFNTCBzY2VuZSBzcGVjLCBleDogYGBge3R5cGU6ICdUb3BvSlNPTicsIHVybDogXCIvL3ZlY3Rvci5tYXB6ZW4uY29tL29zbS9hbGwve3p9L3t4fS97eX0udG9wb2pzb25cIl19YGBgXG4gICAgLy8gICAgdGhhdCBsb29rcyBsaWtlOlxuICAgIC8vXG4gICAgLy8gICAgICBzY2VuZS5zZXREYXRhU291cmNlKFwib3NtXCIsIHt0eXBlOiAnVG9wb0pTT04nLCB1cmw6IFwiLy92ZWN0b3IubWFwemVuLmNvbS9vc20vYWxsL3t6fS97eH0ve3l9LnRvcG9qc29uXCIgfSk7XG4gICAgLy9cbiAgICAvLyAgLSBhbHNvIGNhbiBiZSBwYXNzIGEgYGBgZGF0YWBgYCBvYmo6IGBgYHt0eXBlOiAnR2VvSlNPTicsIGRhdGE6IEpTT2JqIF19YGBgXG4gICAgLy9cbiAgICAvLyAgICAgIHZhciBnZW9qc29uX2RhdGEgPSB7fTtcbiAgICAvLyAgICAgIC4uLlxuICAgIC8vICAgICAgc2NlbmUuc2V0RGF0YVNvdXJjZShcImR5bmFtaWNfZGF0YVwiLCB7dHlwZTogJ0dlb0pTT04nLCBkYXRhOiBnZW9qc29uX2RhdGEgfSk7XG4gICAgLy9cbiAgICBzZXREYXRhU291cmNlIChuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKCFuYW1lIHx8ICFjb25maWcgfHwgIWNvbmZpZy50eXBlIHx8ICghY29uZmlnLnVybCAmJiAhY29uZmlnLmRhdGEpKSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgXCJObyBuYW1lIHByb3ZpZGVkIG9yIG5vdCBhIHZhbGlkIGNvbmZpZzpcIiwgbmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2FkID0gKHRoaXMuY29uZmlnLnNvdXJjZXNbbmFtZV0gPT0gbnVsbCk7XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLmNvbmZpZy5zb3VyY2VzW25hbWVdID0gT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnKTtcblxuICAgICAgICAvLyBDb252ZXJ0IHJhdyBkYXRhIGludG8gYmxvYiBVUkxcbiAgICAgICAgaWYgKHNvdXJjZS5kYXRhICYmIHR5cGVvZiBzb3VyY2UuZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHNvdXJjZS51cmwgPSBVUkxzLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoc291cmNlLmRhdGEpXSkpO1xuICAgICAgICAgICAgZGVsZXRlIHNvdXJjZS5kYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBwYXRocyByZWxhdGl2ZSB0byByb290IHNjZW5lIGJ1bmRsZVxuICAgICAgICBTY2VuZUxvYWRlci5ub3JtYWxpemVEYXRhU291cmNlKHNvdXJjZSwgdGhpcy5jb25maWdfYnVuZGxlKTtcblxuICAgICAgICBpZiAobG9hZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ29uZmlnKHsgcmVidWlsZDogeyBzb3VyY2VzOiBbbmFtZV0gfSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYnVpbGQoeyBzb3VyY2VzOiBbbmFtZV0gfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVEYXRhU291cmNlcygpIHtcbiAgICAgICAgbGV0IHJlc2V0ID0gW107IC8vIHNvdXJjZXMgdG8gcmVzZXRcbiAgICAgICAgbGV0IHByZXZfc291cmNlX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKTtcbiAgICAgICAgbGV0IHNvdXJjZV9pZCA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzLmNvbmZpZy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gdGhpcy5jb25maWcuc291cmNlc1tuYW1lXTtcbiAgICAgICAgICAgIGxldCBwcmV2X3NvdXJjZSA9IHRoaXMuc291cmNlc1tuYW1lXTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgc291cmNlLCB7IG5hbWUsIGlkOiBzb3VyY2VfaWQrKyB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZXNbbmFtZV0gPSBEYXRhU291cmNlLmNyZWF0ZShjb25maWcsIHRoaXMuc291cmNlcyk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNvdXJjZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNvdXJjZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgQ291bGQgbm90IGNyZWF0ZSBkYXRhIHNvdXJjZTogJHtlLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgU2NlbmU6ICR7bWVzc2FnZX1gLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcignd2FybmluZycsIHsgdHlwZTogJ3NvdXJjZXMnLCBzb3VyY2UsIG1lc3NhZ2UgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERhdGEgc291cmNlIGNoYW5nZWQ/XG4gICAgICAgICAgICBpZiAoRGF0YVNvdXJjZS5jaGFuZ2VkKHRoaXMuc291cmNlc1tuYW1lXSwgcHJldl9zb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgcmVzZXQucHVzaChuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvdXJjZXMgdGhhdCB3ZXJlIHJlbW92ZWRcbiAgICAgICAgcHJldl9zb3VyY2VfbmFtZXMuZm9yRWFjaChzID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcuc291cmNlc1tzXSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNvdXJjZXNbc107IC8vIFRPRE86IHJlbW92ZSBmcm9tIHdvcmtlcnMgdG9vP1xuICAgICAgICAgICAgICAgIHJlc2V0LnB1c2gocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aWxlcyBmcm9tIHNvdXJjZXMgdGhhdCBoYXZlIGNoYW5nZWRcbiAgICAgICAgaWYgKHJlc2V0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLnJlbW92ZVRpbGVzKHRpbGUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAocmVzZXQuaW5kZXhPZih0aWxlLnNvdXJjZS5uYW1lKSA+IC0xKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFyayBzb3VyY2VzIHRoYXQgd2lsbCBnZW5lcmF0ZSBnZW9tZXRyeSB0aWxlc1xuICAgICAgICAvLyAoYWxsIGV4Y2VwdCB0aG9zZSB0aGF0IGFyZSBvbmx5IHJhc3RlciBzb3VyY2VzIGF0dGFjaGVkIHRvIG90aGVyIHNvdXJjZXMpXG4gICAgICAgIGZvciAobGV0IGxuIGluIHRoaXMuY29uZmlnLmxheWVycykge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gdGhpcy5jb25maWcubGF5ZXJzW2xuXTtcbiAgICAgICAgICAgIGlmIChsYXllci5kYXRhICYmIHRoaXMuc291cmNlc1tsYXllci5kYXRhLnNvdXJjZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZXNbbGF5ZXIuZGF0YS5zb3VyY2VdLmJ1aWxkc19nZW9tZXRyeV90aWxlcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2FkIGFsbCB0ZXh0dXJlcyBpbiB0aGUgc2NlbmUgZGVmaW5pdGlvblxuICAgIGxvYWRUZXh0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIFRleHR1cmUuY3JlYXRlRnJvbU9iamVjdCh0aGlzLmdsLCB0aGlzLmNvbmZpZy50ZXh0dXJlcykuXG4gICAgICAgICAgICB0aGVuKCgpID0+IFRleHR1cmUuY3JlYXRlRGVmYXVsdCh0aGlzLmdsKSk7IC8vIGNyZWF0ZSBhICdkZWZhdWx0JyB0ZXh0dXJlIGZvciBwbGFjZWhvbGRlcnNcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgKGN1cnJlbnRseSBtYW51YWxseSkgYWZ0ZXIgc3R5bGVzIGFyZSB1cGRhdGVkIGluIHN0eWxlc2hlZXRcbiAgICB1cGRhdGVTdHlsZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplZCAmJiAhdGhpcy5pbml0aWFsaXppbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2NlbmUudXBkYXRlU3R5bGVzKCkgY2FsbGVkIGJlZm9yZSBzY2VuZSB3YXMgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIChSZSlidWlsZCBzdHlsZXMgZnJvbSBjb25maWdcbiAgICAgICAgdGhpcy5zdHlsZXMgPSB0aGlzLnN0eWxlX21hbmFnZXIuYnVpbGQodGhpcy5jb25maWcuc3R5bGVzKTtcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyLmluaXRTdHlsZXModGhpcyk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWxseSBzZXQgR0wgY29udGV4dCAodXNlZCB3aGVuIGluaXRpYWxpemluZyBvciByZS1pbml0aWFsaXppbmcgR0wgcmVzb3VyY2VzKVxuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5zdHlsZXNbc3R5bGVdLnNldEdMKHRoaXMuZ2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIGV4cGxpY2l0bHkgc2V0IHNjZW5lIGFuaW1hdGlvbiBmbGFnIGlmIGRlZmluZWQsIG90aGVyd2lzZSB0dXJuIG9uIGFuaW1hdGlvbiBpZiB0aGVyZSBhcmUgYW55IGFuaW1hdGVkIHN0eWxlc1xuICAgICAgICB0aGlzLmFuaW1hdGVkID1cbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNjZW5lLmFuaW1hdGVkICE9PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNjZW5lLmFuaW1hdGVkIDpcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnN0eWxlcykuc29tZShzID0+IHRoaXMuc3R5bGVzW3NdLmFuaW1hdGVkKTtcblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgYWN0aXZlIGNhbWVyYSAtIGZvciBwdWJsaWMgQVBJXG4gICAgZ2V0QWN0aXZlQ2FtZXJhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBhY3RpdmUgY2FtZXJhIC0gZm9yIHB1YmxpYyBBUElcbiAgICBzZXRBY3RpdmVDYW1lcmEobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LnNldEFjdGl2ZUNhbWVyYShuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbGlnaHRpbmdcbiAgICBjcmVhdGVMaWdodHMoKSB7XG4gICAgICAgIHRoaXMubGlnaHRzID0ge307XG4gICAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5jb25maWcubGlnaHRzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmxpZ2h0c1tpXSB8fCB0eXBlb2YgdGhpcy5jb25maWcubGlnaHRzW2ldICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGxpZ2h0ID0gdGhpcy5jb25maWcubGlnaHRzW2ldO1xuICAgICAgICAgICAgbGlnaHQubmFtZSA9IGkucmVwbGFjZSgnLScsICdfJyk7IC8vIGxpZ2h0IG5hbWVzIGFyZSBpbmplY3RlZCBpbiBzaGFkZXJzLCBjYW4ndCBoYXZlIGh5cGhlbnNcbiAgICAgICAgICAgIGxpZ2h0LnZpc2libGUgPSAobGlnaHQudmlzaWJsZSA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICAgICAgaWYgKGxpZ2h0LnZpc2libGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpZ2h0c1tsaWdodC5uYW1lXSA9IExpZ2h0LmNyZWF0ZSh0aGlzLnZpZXcsIGxpZ2h0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBMaWdodC5pbmplY3QodGhpcy5saWdodHMpO1xuICAgIH1cblxuICAgIC8vIFNldCBiYWNrZ3JvdW5kIGNvbG9yXG4gICAgc2V0QmFja2dyb3VuZCgpIHtcbiAgICAgICAgbGV0IGJnID0gdGhpcy5jb25maWcuc2NlbmUuYmFja2dyb3VuZDtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0ge307XG4gICAgICAgIGlmIChiZyAmJiBiZy5jb2xvcikge1xuICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLmNvbG9yID0gU3R5bGVQYXJzZXIucGFyc2VDb2xvcihiZy5jb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmJhY2tncm91bmQuY29sb3IpIHtcbiAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZC5jb2xvciA9IFswLCAwLCAwLCAwXTsgLy8gZGVmYXVsdCBiYWNrZ3JvdW5kIFRPRE86IHZhcnkgdy9zY2VuZSBhbHBoYVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgYmFja2dyb3VuZCBpcyBmdWxseSBvcGFxdWUsIHNldCBjYW52YXMgYmFja2dyb3VuZCB0byBtYXRjaFxuICAgICAgICBpZiAodGhpcy5iYWNrZ3JvdW5kLmNvbG9yWzNdID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPVxuICAgICAgICAgICAgICAgIGByZ2JhKCR7dGhpcy5iYWNrZ3JvdW5kLmNvbG9yLm1hcChjID0+IE1hdGguZmxvb3IoYyAqIDI1NSkpLmpvaW4oJywgJyl9KWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbC5jbGVhckNvbG9yKC4uLnRoaXMuYmFja2dyb3VuZC5jb2xvcik7XG4gICAgfVxuXG4gICAgLy8gVHVybiBpbnRyb3NwZWN0aW9uIG1vZGUgb24vb2ZmXG4gICAgc2V0SW50cm9zcGVjdGlvbiAodmFsKSB7XG4gICAgICAgIHRoaXMuaW50cm9zcGVjdGlvbiA9IHZhbCB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGluZysrO1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVDb25maWcoKS50aGVuKCgpID0+IHRoaXMudXBkYXRpbmctLSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHNjZW5lIGNvbmZpZywgYW5kIG9wdGlvbmFsbHkgcmVidWlsZCBnZW9tZXRyeVxuICAgIC8vIHJlYnVpbGQgY2FuIGJlIGJvb2xlYW4sIG9yIGFuIG9iamVjdCBjb250YWluaW5nIHJlYnVpbGQgb3B0aW9ucyB0byBwYXNzdGhyb3VnaFxuICAgIHVwZGF0ZUNvbmZpZyh7IHJlYnVpbGQgPSB0cnVlLCBzZXJpYWxpemVfZnVuY3MsIGZhZGVfaW4gPSBmYWxzZSB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0aW9uID0gKytTY2VuZS5nZW5lcmF0aW9uO1xuICAgICAgICB0aGlzLnVwZGF0aW5nKys7XG5cbiAgICAgICAgdGhpcy5jb25maWcgPSBTY2VuZUxvYWRlci5hcHBseUdsb2JhbFByb3BlcnRpZXModGhpcy5jb25maWcsIHRoaXMuY29uZmlnX2dsb2JhbHNfYXBwbGllZCk7XG4gICAgICAgIFNjZW5lTG9hZGVyLmhvaXN0VGV4dHVyZXModGhpcy5jb25maWcpOyAvLyBtb3ZlIGlubGluZSB0ZXh0dXJlcyBpbnRvIGdsb2JhbCB0ZXh0dXJlIHNldFxuICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuaW5pdCgpO1xuICAgICAgICB0aGlzLnZpZXcucmVzZXQoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVMaWdodHMoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVEYXRhU291cmNlcygpO1xuICAgICAgICB0aGlzLmxvYWRUZXh0dXJlcygpO1xuICAgICAgICB0aGlzLnNldEJhY2tncm91bmQoKTtcbiAgICAgICAgRm9udE1hbmFnZXIubG9hZEZvbnRzKHRoaXMuY29uZmlnLmZvbnRzKTtcblxuICAgICAgICAvLyBUT0RPOiBkZXRlY3QgY2hhbmdlcyB0byBzdHlsZXM/IGFscmVhZHkgKGN1cnJlbnRseSkgbmVlZCB0byByZWNvbXBpbGUgYW55d2F5IHdoZW4gY2FtZXJhIG9yIGxpZ2h0cyBjaGFuZ2VcbiAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoKTtcblxuICAgICAgICAvLyBPcHRpb25hbGx5IHJlYnVpbGQgZ2VvbWV0cnlcbiAgICAgICAgbGV0IGRvbmUgPSByZWJ1aWxkID9cbiAgICAgICAgICAgIHRoaXMucmVidWlsZChPYmplY3QuYXNzaWduKHsgc2VyaWFsaXplX2Z1bmNzLCBmYWRlX2luIH0sIHR5cGVvZiByZWJ1aWxkID09PSAnb2JqZWN0JyAmJiByZWJ1aWxkKSkgOlxuICAgICAgICAgICAgdGhpcy5zeW5jQ29uZmlnVG9Xb3JrZXIoeyBzZXJpYWxpemVfZnVuY3MgfSk7IC8vIHJlYnVpbGQoKSBhbHNvIHN5bmNzIGNvbmZpZ1xuXG4gICAgICAgIC8vIEZpbmlzaCBieSB1cGRhdGluZyBib3VuZHMgYW5kIHJlLXJlbmRlcmluZ1xuICAgICAgICB0aGlzLnVwZGF0aW5nLS07XG4gICAgICAgIHRoaXMudmlldy51cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG5cbiAgICAgICAgcmV0dXJuIGRvbmU7XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIGNvbmZpZyBhbmQgc2VuZCB0byB3b3JrZXJcbiAgICBzeW5jQ29uZmlnVG9Xb3JrZXIoeyBzZXJpYWxpemVfZnVuY3MgPSB0cnVlIH0gPSB7fSkge1xuICAgICAgICAvLyBUZWxsIHdvcmtlcnMgd2UncmUgYWJvdXQgdG8gcmVidWlsZCAoc28gdGhleSBjYW4gdXBkYXRlIHN0eWxlcywgZXRjLilcbiAgICAgICAgdGhpcy5jb25maWdfc2VyaWFsaXplZCA9XG4gICAgICAgICAgICBzZXJpYWxpemVfZnVuY3MgPyBVdGlscy5zZXJpYWxpemVXaXRoRnVuY3Rpb25zKHRoaXMuY29uZmlnKSA6IEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnVwZGF0ZUNvbmZpZycsIHtcbiAgICAgICAgICAgIGNvbmZpZzogdGhpcy5jb25maWdfc2VyaWFsaXplZCxcbiAgICAgICAgICAgIGdlbmVyYXRpb246IHRoaXMuZ2VuZXJhdGlvbixcbiAgICAgICAgICAgIGludHJvc3BlY3Rpb246IHRoaXMuaW50cm9zcGVjdGlvblxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBMaXN0ZW4gdG8gcmVsYXRlZCBvYmplY3RzXG4gICAgY3JlYXRlTGlzdGVuZXJzICgpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSB7fTtcblxuICAgICAgICB0aGlzLmxpc3RlbmVycy52aWV3ID0ge1xuICAgICAgICAgICAgbW92ZTogKCkgPT4gdGhpcy50cmlnZ2VyKCdtb3ZlJylcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy52aWV3LnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy52aWV3KTtcblxuICAgICAgICB0aGlzLmxpc3RlbmVycy50ZXh0dXJlID0ge1xuICAgICAgICAgICAgdXBkYXRlOiAoKSA9PiB0aGlzLmRpcnR5ID0gdHJ1ZSxcbiAgICAgICAgICAgIHdhcm5pbmc6IChkYXRhKSA9PiB0aGlzLnRyaWdnZXIoJ3dhcm5pbmcnLCBPYmplY3QuYXNzaWduKHsgdHlwZTogJ3RleHR1cmVzJyB9LCBkYXRhKSlcbiAgICAgICAgfTtcbiAgICAgICAgVGV4dHVyZS5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudGV4dHVyZSk7XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuc2NlbmVfbG9hZGVyID0ge1xuICAgICAgICAgICAgZXJyb3I6IChkYXRhKSA9PiB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgT2JqZWN0LmFzc2lnbih7IHR5cGU6ICdzY2VuZScgfSwgZGF0YSkpXG4gICAgICAgIH07XG4gICAgICAgIFNjZW5lTG9hZGVyLnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy5zY2VuZV9sb2FkZXIpO1xuICAgIH1cblxuICAgIGRlc3Ryb3lMaXN0ZW5lcnMgKCkge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlQWxsKCk7XG4gICAgICAgIHRoaXMudmlldy51bnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy52aWV3KTtcbiAgICAgICAgVGV4dHVyZS51bnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy50ZXh0dXJlKTtcbiAgICAgICAgU2NlbmVMb2FkZXIudW5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMuc2NlbmVfbG9hZGVyKTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBudWxsO1xuICAgIH1cblxuICAgIHJlc2V0RmVhdHVyZVNlbGVjdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBuZXcgRmVhdHVyZVNlbGVjdGlvbih0aGlzLmdsLCB0aGlzLndvcmtlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMud29ya2Vycykge1xuICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYucmVzZXRGZWF0dXJlU2VsZWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXRzIHRoZSBjdXJyZW50IGZlYXR1cmUgc2VsZWN0aW9uIG1hcCBzaXplIGFjcm9zcyBhbGwgd29ya2Vycy4gUmV0dXJucyBhIHByb21pc2UuXG4gICAgZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmZldGNoaW5nX3NlbGVjdGlvbl9tYXApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgLy8gcmV0dXJuIHVuZGVmaW5lZCBpZiBhbHJlYWR5IHBlbmRpbmdcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZldGNoaW5nX3NlbGVjdGlvbl9tYXAgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi5nZXRGZWF0dXJlU2VsZWN0aW9uTWFwU2l6ZScpXG4gICAgICAgICAgICAudGhlbihzaXplcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaGluZ19zZWxlY3Rpb25fbWFwID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpemVzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgaW50ZXJuYWwgY2xvY2ssIG1vc3RseSB1c2VmdWwgZm9yIGNvbnNpc3RlbnQgZXhwZXJpZW5jZSB3aGVuIGNoYW5naW5nIHN0eWxlcy9kZWJ1Z2dpbmdcbiAgICByZXNldFRpbWUoKSB7XG4gICAgICAgIHRoaXMuc3RhcnRfdGltZSA9ICtuZXcgRGF0ZSgpO1xuICAgIH1cblxuICAgIC8vIEZpcmVzIGV2ZW50IHdoZW4gcmVuZGVyZWQgdGlsZSBzZXQgb3Igc3R5bGUgY2hhbmdlc1xuICAgIHVwZGF0ZVZpZXdDb21wbGV0ZSAoKSB7XG4gICAgICAgIGlmICgodGhpcy5yZW5kZXJfY291bnRfY2hhbmdlZCB8fCB0aGlzLmdlbmVyYXRpb24gIT09IHRoaXMubGFzdF9jb21wbGV0ZV9nZW5lcmF0aW9uKSAmJlxuICAgICAgICAgICAgIXRoaXMudGlsZV9tYW5hZ2VyLmlzTG9hZGluZ1Zpc2libGVUaWxlcygpKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbiA9IHRoaXMuZ2VuZXJhdGlvbjtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcigndmlld19jb21wbGV0ZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRWaWV3Q29tcGxldGUgKCkge1xuICAgICAgICB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gVGFrZSBhIHNjcmVlbnNob3RcbiAgICAvLyBBc3luY2hyb25vdXMgYmVjYXVzZSB3ZSBoYXZlIHRvIHdhaXQgZm9yIG5leHQgcmVuZGVyIHRvIGNhcHR1cmUgYnVmZmVyXG4gICAgLy8gUmV0dXJucyBhIHByb21pc2VcbiAgICBzY3JlZW5zaG90ICgpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lZGlhX2NhcHR1cmUuc2NyZWVuc2hvdCgpO1xuICAgIH1cblxuICAgIHN0YXJ0VmlkZW9DYXB0dXJlICgpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lZGlhX2NhcHR1cmUuc3RhcnRWaWRlb0NhcHR1cmUoKTtcbiAgICB9XG5cbiAgICBzdG9wVmlkZW9DYXB0dXJlICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVkaWFfY2FwdHVyZS5zdG9wVmlkZW9DYXB0dXJlKCk7XG4gICAgfVxuXG5cbiAgICAvLyBTdGF0cy9kZWJ1Zy9wcm9maWxpbmcgbWV0aG9kc1xuXG4gICAgLy8gUHJvZmlsZSBoZWxwZXJzLCBpc3N1ZXMgYSBwcm9maWxlIG9uIG1haW4gdGhyZWFkICYgYWxsIHdvcmtlcnNcbiAgICBfcHJvZmlsZShuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZShgbWFpbiB0aHJlYWQ6ICR7bmFtZX1gKTtcbiAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYucHJvZmlsZScsIG5hbWUpO1xuICAgIH1cblxuICAgIF9wcm9maWxlRW5kKG5hbWUpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlRW5kKGBtYWluIHRocmVhZDogJHtuYW1lfWApO1xuICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi5wcm9maWxlRW5kJywgbmFtZSk7XG4gICAgfVxuXG4gICAgLy8gRGVidWcgY29uZmlnIGFuZCBmdW5jdGlvbnNcbiAgICBzZXR1cERlYnVnICgpIHtcbiAgICAgICAgbGV0IHNjZW5lID0gdGhpcztcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IHtcbiAgICAgICAgICAgIC8vIFJlYnVpbGQgZ2VvbWV0cnkgYSBnaXZlbiAjIG9mIHRpbWVzIGFuZCBwcmludCBhdmVyYWdlLCBtaW4sIG1heCB0aW1pbmdzXG4gICAgICAgICAgICB0aW1lUmVidWlsZCAobnVtID0gMSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICAgICAgbGV0IHRpbWVzID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGN5Y2xlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSArbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgc2NlbmUucmVidWlsZChvcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzLnB1c2goK25ldyBEYXRlKCkgLSBzdGFydCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lcy5sZW5ndGggPCBudW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeWNsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF2ZyA9IH5+KHRpbWVzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIpIC8gdGltZXMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ2luZm8nLCBgUHJvZmlsZWQgcmVidWlsZCAke251bX0gdGltZXM6ICR7YXZnfSBhdmcgKCR7TWF0aC5taW4oLi4udGltZXMpfSBtaW4sICR7TWF0aC5tYXgoLi4udGltZXMpfSBtYXgpYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY3ljbGUoKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIFJldHVybiBnZW9tZXRyeSBjb3VudHMgb2YgdmlzaWJsZSB0aWxlcywgZ3JvdXBlZCBieSBzdHlsZSBuYW1lXG4gICAgICAgICAgICBnZW9tZXRyeUNvdW50QnlTdHlsZSAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvdW50cyA9IHt9O1xuICAgICAgICAgICAgICAgIHNjZW5lLnRpbGVfbWFuYWdlci5nZXRSZW5kZXJhYmxlVGlsZXMoKS5mb3JFYWNoKHRpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0aWxlLm1lc2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzW3N0eWxlXSA9IGNvdW50c1tzdHlsZV0gfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1tzdHlsZV0gKz0gdGlsZS5tZXNoZXNbc3R5bGVdLmdlb21ldHJ5X2NvdW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50cztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdlb21ldHJ5Q291bnRCeUJhc2VTdHlsZSAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlX2NvdW50cyA9IHNjZW5lLmRlYnVnLmdlb21ldHJ5Q291bnRCeVN0eWxlKCk7XG4gICAgICAgICAgICAgICAgbGV0IGNvdW50cyA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHN0eWxlX2NvdW50cykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZSA9IHNjZW5lLnN0eWxlc1tzdHlsZV0uYmFzZVN0eWxlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50c1tiYXNlXSA9IGNvdW50c1tiYXNlXSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICBjb3VudHNbYmFzZV0gKz0gc3R5bGVfY291bnRzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbn1cblxuU2NlbmUuaWQgPSAwOyAgICAgICAgIC8vIHVuaXF1ZSBpZCBmb3IgYSBzY2VuZSBpbnN0YW5jZVxuU2NlbmUuZ2VuZXJhdGlvbiA9IDA7IC8vIGlkIHRoYXQgaXMgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIGEgc2NlbmUgY29uZmlnIGlzIHJlLXBhcnNlZFxuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0ICogYXMgVVJMcyBmcm9tICcuL3V0aWxzL3VybHMnO1xuXG5pbXBvcnQgSlNaaXAgZnJvbSAnanN6aXAnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmV4cG9ydCBjbGFzcyBTY2VuZUJ1bmRsZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIHBhdGgsIHBhcmVudCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG5cbiAgICAgICAgLy8gSWYgYSBiYXNlIHBhdGggd2FzIHByb3ZpZGVkLCB1c2UgaXQgZm9yIHJlc29sdmluZyBsb2NhbCBidW5kbGUgcmVzb3VyY2VzIG9ubHkgaWZcbiAgICAgICAgLy8gdGhlIGJhc2UgcGF0aCBpcyBhYnNvbHV0ZSwgb3IgdGhpcyBidW5kbGUncyBwYXRoIGlzIHJlbGF0aXZlXG4gICAgICAgIGlmIChwYXRoICYmICghVVJMcy5pc1JlbGF0aXZlVVJMKHBhdGgpIHx8IFVSTHMuaXNSZWxhdGl2ZVVSTCh0aGlzLnVybCkpKSB7XG4gICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYXRoID0gVVJMcy5wYXRoRm9yVVJMKHRoaXMudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGF0aF9mb3JfcGFyZW50ID0gcGF0aCB8fCB0aGlzLnBhdGg7IC8vIGZvciByZXNvbHZpbmcgcGF0aHMgcmVsYXRpdmUgdG8gYSBwYXJlbnQgYnVuZGxlXG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXG4gICAgICAgIC8vIEFuIGFuY2VzdG9yIGJ1bmRsZSBtYXkgYmUgYSBjb250YWluZXIgKGUuZy4gemlwIGZpbGUpIHRoYXQgbmVlZHMgdG8gcmVzb2x2ZSByZWxhdGl2ZSBwYXRoc1xuICAgICAgICAvLyBmb3IgYW55IHNjZW5lcyBpdCBjb250YWlucywgZS5nLiBgcm9vdC56aXBgIGhhcyBhIGByb290LnlhbWxgIHRoYXQgaW5jbHVkZXMgYSBgZm9sZGVyL2NoaWxkLnlhbWxgOlxuICAgICAgICAvLyByZXNvdXJjZXMgd2l0aGluIGBjaGlsZC55YW1sYCBtdXN0IGJlIHJlc29sdmVkIHRocm91Z2ggdGhlIGJ1bmRsZSBmb3IgYHJvb3QuemlwYFxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50LmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYXJlbnQuY29udGFpbmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wYXJlbnQuaXNDb250YWluZXIoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICByZXR1cm4gbG9hZFJlc291cmNlKHRoaXMudXJsKTtcbiAgICB9XG5cbiAgICAvLyBJbmZvIGZvciByZXRyaWV2aW5nIGEgc3BlY2lmaWMgcmVzb3VyY2UgZnJvbSB0aGlzIGJ1bmRsZVxuICAgIC8vIHVybDogZnVsbHkgcXVhbGlmaWVkIFVSTCB0byByZXRyaWV2ZSB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UgKGUuZy4gemlwcyB3aWxsIHRyYW5zZm9ybSB0aGlzIHRvIGJsb2IgVVJMKVxuICAgIC8vIHBhdGg6IG9yaWdpbmFsIHBhdGggb2YgdGhlIHJlc291cmNlIHdpdGhpbiB0aGUgYnVuZGxlIChmb3IgcmVzb2x2aW5nIHBhdGhzIHVwIHRoZSBidW5kbGUgdHJlZSlcbiAgICAvLyB0eXBlOiBmaWxlIGV4dGVuc2lvbiAodXNlZCBmb3IgZGV0ZXJtaW5pbmcgYnVuZGxlIHR5cGUsIGB5YW1sYCBvciBgemlwYClcbiAgICByZXNvdXJjZUZvcih1cmwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVybDogdGhpcy51cmxGb3IodXJsKSxcbiAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aEZvcih1cmwpLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlRm9yKHVybClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB1cmxGb3IodXJsKSB7XG4gICAgICAgIGlmIChpc0dsb2JhbCh1cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFVSTHMuaXNSZWxhdGl2ZVVSTCh1cmwpICYmIHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQudXJsRm9yKHRoaXMucGF0aF9mb3JfcGFyZW50ICsgdXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVVJMcy5hZGRCYXNlVVJMKHVybCwgdGhpcy5wYXRoKTtcbiAgICB9XG5cbiAgICBwYXRoRm9yKHVybCkge1xuICAgICAgICByZXR1cm4gVVJMcy5wYXRoRm9yVVJMKHVybCk7XG4gICAgfVxuXG4gICAgdHlwZUZvcih1cmwpIHtcbiAgICAgICAgcmV0dXJuIFVSTHMuZXh0ZW5zaW9uRm9yVVJMKHVybCk7XG4gICAgfVxuXG4gICAgaXNDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIFppcFNjZW5lQnVuZGxlIGV4dGVuZHMgU2NlbmVCdW5kbGUge1xuXG4gICAgY29uc3RydWN0b3IodXJsLCBwYXRoLCBwYXJlbnQpIHtcbiAgICAgICAgc3VwZXIodXJsLCBwYXRoLCBwYXJlbnQpO1xuICAgICAgICB0aGlzLnppcCA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5yb290ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wYXRoID0gJyc7XG4gICAgfVxuXG4gICAgaXNDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHRoaXMuemlwID0gbmV3IEpTWmlwKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5pbyh0aGlzLnVybCwgNjAwMDAsICdhcnJheWJ1ZmZlcicpXG4gICAgICAgICAgICAgICAgLnRoZW4oYm9keSA9PiB0aGlzLnppcC5sb2FkQXN5bmMoYm9keSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5wYXJzZVppcEZpbGVzKCkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5sb2FkUm9vdCgpKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlID0+IFByb21pc2UucmVqZWN0KGUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cmxGb3IodXJsKSB7XG4gICAgICAgIGlmIChpc0dsb2JhbCh1cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFVSTHMuaXNSZWxhdGl2ZVVSTCh1cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51cmxGb3JaaXBGaWxlKFVSTHMuZmxhdHRlblJlbGF0aXZlVVJMKHVybCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci51cmxGb3IodXJsKTtcbiAgICB9XG5cbiAgICB0eXBlRm9yKHVybCkge1xuICAgICAgICBpZiAoVVJMcy5pc1JlbGF0aXZlVVJMKHVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGVGb3JaaXBGaWxlKHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLnR5cGVGb3IodXJsKTtcbiAgICB9XG5cbiAgICBsb2FkUm9vdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFJvb3QoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gbG9hZFJlc291cmNlKHRoaXMudXJsRm9yWmlwRmlsZSh0aGlzLnJvb3QpKSk7XG4gICAgfVxuXG4gICAgZmluZFJvb3QoKSB7XG4gICAgICAgIC8vIFRoZXJlIG11c3QgYmUgYSBzaW5nbGUgWUFNTCBmaWxlIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHppcFxuICAgICAgICBjb25zdCB5YW1scyA9IE9iamVjdC5rZXlzKHRoaXMuZmlsZXMpXG4gICAgICAgICAgICAuZmlsdGVyKHBhdGggPT4gdGhpcy5maWxlc1twYXRoXS5kZXB0aCA9PT0gMClcbiAgICAgICAgICAgIC5maWx0ZXIocGF0aCA9PiBVUkxzLmV4dGVuc2lvbkZvclVSTChwYXRoKSA9PT0gJ3lhbWwnKTtcblxuICAgICAgICBpZiAoeWFtbHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSB5YW1sc1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIHJvb3QgZm91bmRcbiAgICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIGxldCBtc2cgPSBgQ291bGQgbm90IGZpbmQgcm9vdCBzY2VuZSBmb3IgYnVuZGxlICcke3RoaXMudXJsfSc6IGA7XG4gICAgICAgICAgICBtc2cgKz0gYFRoZSB6aXAgYXJjaGl2ZSdzIHJvb3QgbGV2ZWwgbXVzdCBjb250YWluIGEgc2luZ2xlIHNjZW5lIGZpbGUgd2l0aCB0aGUgJy55YW1sJyBleHRlbnNpb24uIGA7XG4gICAgICAgICAgICBpZiAoeWFtbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG1zZyArPSBgRm91bmQgbXVsdGlwbGUgWUFNTCBmaWxlcyBhdCB0aGUgcm9vdCBsZXZlbDogJHt5YW1scy5tYXAociA9PiAnXFwnJyArIHIgKyAnXFwnJyApLmpvaW4oJywgJyl9LmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYEZvdW5kIE5PIFlBTUwgZmlsZXMgYXQgdGhlIHJvb3QgbGV2ZWwuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChFcnJvcihtc2cpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcGFyc2VaaXBGaWxlcygpIHtcbiAgICAgICAgbGV0IHBhdGhzID0gW107XG4gICAgICAgIGxldCBxdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLnppcC5mb3JFYWNoKChwYXRoLCBmaWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZpbGUuZGlyKSB7XG4gICAgICAgICAgICAgICAgcGF0aHMucHVzaChwYXRoKTtcbiAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKGZpbGUuYXN5bmMoJ2FycmF5YnVmZmVyJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocXVldWUpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBwYXRoc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwdGggPSBwYXRoLnNwbGl0KCcvJykubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3BhdGhdID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBVUkxzLmV4dGVuc2lvbkZvclVSTChwYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgZGVwdGhcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1cmxGb3JaaXBGaWxlKGZpbGUpIHtcbiAgICAgICAgaWYgKHRoaXMuZmlsZXNbZmlsZV0pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5maWxlc1tmaWxlXS51cmwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW2ZpbGVdLnVybCA9IFVSTHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0aGlzLmZpbGVzW2ZpbGVdLmRhdGFdKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGVzW2ZpbGVdLnVybDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHR5cGVGb3JaaXBGaWxlKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZXNbZmlsZV0gJiYgdGhpcy5maWxlc1tmaWxlXS50eXBlO1xuICAgIH1cblxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQsIHR5cGUgPSBudWxsKSB7XG4gICAgaWYgKHR5cGUgPT09ICd6aXAnIHx8ICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiBVUkxzLmV4dGVuc2lvbkZvclVSTCh1cmwpID09PSAnemlwJykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBaaXBTY2VuZUJ1bmRsZSh1cmwsIHBhdGgsIHBhcmVudCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQpO1xufVxuXG4vLyBSZWZlcmVuY2VzIGEgZ2xvYmFsIHByb3BlcnR5P1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2xvYmFsICh2YWwpIHtcbiAgICBpZiAodmFsICYmIHZhbC5zbGljZSgwLCA3KSA9PT0gJ2dsb2JhbC4nKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVzb3VyY2UgKGJvZHkpIHtcbiAgICB2YXIgZGF0YTtcbiAgICB0cnkge1xuICAgICAgICAvLyBqc3lhbWwgJ2pzb24nIG9wdGlvbiBhbGxvd3MgZHVwbGljYXRlIGtleXNcbiAgICAgICAgLy8gS2VlcGluZyB0aGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IHNob3VsZCBjb25zaWRlciBtaWdyYXRpbmcgdG8gcmVxdWlyaW5nXG4gICAgICAgIC8vIHVuaXF1ZSBrZXlzLCBhcyB0aGlzIGlzIFlBTUwgc3BlYy4gQnV0IFRhbmdyYW0gRVMgY3VycmVudGx5IGFjY2VwdHMgZHVwZSBrZXlzIGFzIHdlbGwsXG4gICAgICAgIC8vIHNvIHNob3VsZCBjb25zaWRlciBob3cgYmVzdCB0byB1bmlmeS5cbiAgICAgICAgZGF0YSA9IHlhbWwuc2FmZUxvYWQoYm9keSwgeyBqc29uOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGxvYWRSZXNvdXJjZSAoc291cmNlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBVdGlscy5pbyhzb3VyY2UpLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHBhcnNlUmVzb3VyY2UoYm9keSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsImltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbC9nbHNsJztcbmltcG9ydCAqIGFzIFVSTHMgZnJvbSAnLi91dGlscy91cmxzJztcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi91dGlscy9tZXJnZSc7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IHtjcmVhdGVTY2VuZUJ1bmRsZSwgaXNHbG9iYWx9IGZyb20gJy4vc2NlbmVfYnVuZGxlJztcblxudmFyIFNjZW5lTG9hZGVyO1xuXG5leHBvcnQgZGVmYXVsdCBTY2VuZUxvYWRlciA9IHtcblxuICAgIC8vIExvYWQgc2NlbmVzIGRlZmluaXRpb25zIGZyb20gVVJMICYgcHJvcHJvY2Vzc1xuICAgIGxvYWRTY2VuZSh1cmwsIHBhdGggPSBudWxsKSB7XG4gICAgICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZFNjZW5lUmVjdXJzaXZlKHsgdXJsLCBwYXRoIH0sIG51bGwsIGVycm9ycykuXG4gICAgICAgICAgICB0aGVuKHJlc3VsdCA9PiB0aGlzLmZpbmFsaXplKHJlc3VsdCkpLlxuICAgICAgICAgICAgdGhlbigoeyBjb25maWcsIGJ1bmRsZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcm9vdCBzY2VuZSBmYWlsZWQgdG8gbG9hZCwgcmVqZWN0IHdpdGggZmlyc3QgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yc1swXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNjZW5lIGxvYWRlZCwgYnV0IHNvbWUgaW1wb3J0cyBoYWQgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5mb3JFYWNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYEZhaWxlZCB0byBpbXBvcnQgc2NlbmU6ICR7ZXJyb3IudXJsfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ2Vycm9yJywgbWVzc2FnZSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdlcnJvcicsIHsgdHlwZTogJ3NjZW5lX2ltcG9ydCcsIG1lc3NhZ2UsIGVycm9yLCB1cmw6IGVycm9yLnVybCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGNvbmZpZywgYnVuZGxlIH07XG4gICAgICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gTG9hZHMgc2NlbmUgZmlsZXMgZnJvbSBVUkwsIHJlY3Vyc2l2ZWx5IGxvYWRpbmcgJ2ltcG9ydCcgc2NlbmVzXG4gICAgLy8gT3B0aW9uYWwgKmluaXRpYWwqIHBhdGggb25seSAod29uJ3QgYmUgcGFzc2VkIHRvIHJlY3Vyc2l2ZSAnaW1wb3J0JyBjYWxscylcbiAgICAvLyBVc2VmdWwgZm9yIGxvYWRpbmcgcmVzb3VyY2VzIGluIGJhc2Ugc2NlbmUgZmlsZSBmcm9tIGEgc2VwYXJhdGUgbG9jYXRpb25cbiAgICAvLyAoZS5nLiBpbiBUYW5ncmFtIFBsYXksIHdoZW4gbW9kaWZpZWQgbG9jYWwgc2NlbmUgc2hvdWxkIHN0aWxsIHJlZmVyIHRvIG9yaWdpbmFsIHJlc291cmNlIFVSTHMpXG4gICAgbG9hZFNjZW5lUmVjdXJzaXZlKHsgdXJsLCBwYXRoLCB0eXBlIH0sIHBhcmVudCwgZXJyb3JzID0gW10pIHtcbiAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJ1bmRsZSA9IGNyZWF0ZVNjZW5lQnVuZGxlKHVybCwgcGF0aCwgcGFyZW50LCB0eXBlKTtcblxuICAgICAgICByZXR1cm4gYnVuZGxlLmxvYWQoKS50aGVuKGNvbmZpZyA9PiB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLmltcG9ydCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWNjZXB0IHNpbmdsZSBlbnRyeSBvciBhcnJheVxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5pbXBvcnQpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmltcG9ydCA9IFtjb25maWcuaW1wb3J0XTsgLy8gY29udmVydCB0byBhcnJheVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb2xsZWN0IFVSTHMgb2Ygc2NlbmVzIHRvIGltcG9ydFxuICAgICAgICAgICAgbGV0IGltcG9ydHMgPSBbXTtcbiAgICAgICAgICAgIGNvbmZpZy5pbXBvcnQuZm9yRWFjaCh1cmwgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgc2NlbmUgb2JqZWN0cyB0byBVUkxzXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IFVSTHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeSh1cmwpXSkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGltcG9ydHMucHVzaChidW5kbGUucmVzb3VyY2VGb3IodXJsKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuaW1wb3J0OyAvLyBkb24ndCB3YW50IHRvIG1lcmdlIHRoaXMgcHJvcGVydHlcblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuXG4gICAgICAgICAgICAgICAgYWxsKGltcG9ydHMubWFwKHJlc291cmNlID0+IHRoaXMubG9hZFNjZW5lUmVjdXJzaXZlKHJlc291cmNlLCBidW5kbGUsIGVycm9ycykpKS5cbiAgICAgICAgICAgICAgICAgICAgdGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25maWdzID0gcmVzdWx0cy5tYXAociA9PiByLmNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBtZXJnZU9iamVjdHMoe30sIC4uLmNvbmZpZ3MsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgLy8gQ29sbGVjdCBzY2VuZSBsb2FkIGVycm9ycyBhcyB3ZSBnb1xuICAgICAgICAgICAgZXJyb3IudXJsID0gdXJsO1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gTm9ybWFsaXplIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgYWRqdXN0IHdpdGhpbiBlYWNoIGxvY2FsIHNjZW5lIGZpbGUgKHVzdWFsbHkgYnkgcGF0aClcbiAgICBub3JtYWxpemUoY29uZmlnLCBidW5kbGUpIHtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVEYXRhU291cmNlcyhjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplRm9udHMoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZVRleHR1cmVzKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgcmV0dXJuIHsgY29uZmlnLCBidW5kbGUgfTtcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIHBhdGhzIGZvciBkYXRhIHNvdXJjZVxuICAgIG5vcm1hbGl6ZURhdGFTb3VyY2VzKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIGNvbmZpZy5zb3VyY2VzID0gY29uZmlnLnNvdXJjZXMgfHwge307XG5cbiAgICAgICAgZm9yIChsZXQgc24gaW4gY29uZmlnLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplRGF0YVNvdXJjZShjb25maWcuc291cmNlc1tzbl0sIGJ1bmRsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0sXG5cbiAgICBub3JtYWxpemVEYXRhU291cmNlKHNvdXJjZSwgYnVuZGxlKSB7XG4gICAgICAgIHNvdXJjZS51cmwgPSBidW5kbGUudXJsRm9yKHNvdXJjZS51cmwpO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZS5zY3JpcHRzKSkge1xuICAgICAgICAgICAgc291cmNlLnNjcmlwdHMgPSBzb3VyY2Uuc2NyaXB0cy5tYXAodXJsID0+IGJ1bmRsZS51cmxGb3IodXJsKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH0sXG5cbiAgICAvLyBFeHBhbmQgcGF0aHMgZm9yIGZvbnRzXG4gICAgbm9ybWFsaXplRm9udHMoY29uZmlnLCBidW5kbGUpIHtcbiAgICAgICAgY29uZmlnLmZvbnRzID0gY29uZmlnLmZvbnRzIHx8IHt9O1xuXG4gICAgICAgIGZvciAobGV0IGZhbWlseSBpbiBjb25maWcuZm9udHMpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZy5mb250c1tmYW1pbHldKSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5mb250c1tmYW1pbHldLmZvckVhY2goZmFjZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZhY2UudXJsID0gZmFjZS51cmwgJiYgYnVuZGxlLnVybEZvcihmYWNlLnVybCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZmFjZSA9IGNvbmZpZy5mb250c1tmYW1pbHldO1xuICAgICAgICAgICAgICAgIGZhY2UudXJsID0gZmFjZS51cmwgJiYgYnVuZGxlLnVybEZvcihmYWNlLnVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0sXG5cbiAgICAvLyBFeHBhbmQgcGF0aHMgYW5kIGNlbnRyYWxpemUgdGV4dHVyZSBkZWZpbml0aW9ucyBmb3IgYSBzY2VuZSBvYmplY3RcbiAgICBub3JtYWxpemVUZXh0dXJlcyhjb25maWcsIGJ1bmRsZSkge1xuICAgICAgICBjb25maWcudGV4dHVyZXMgPSBjb25maWcudGV4dHVyZXMgfHwge307XG5cbiAgICAgICAgLy8gQWRkIGN1cnJlbnQgc2NlbmUncyBiYXNlIHBhdGggdG8gZ2xvYmFsbHkgZGVmaW5lZCB0ZXh0dXJlc1xuICAgICAgICAvLyBPbmx5IGFkZHMgcGF0aCBmb3IgdGV4dHVyZXMgd2l0aCByZWxhdGl2ZSBVUkxzLCBzbyB0ZXh0dXJlcyBpbiBpbXBvcnRlZCBzY2VuZXMgZ2V0IHRoZSBiYXNlXG4gICAgICAgIC8vIHBhdGggb2YgdGhlaXIgaW1tZWRpYXRlIHNjZW5lIGZpbGVcbiAgICAgICAgaWYgKGNvbmZpZy50ZXh0dXJlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgdG4gaW4gY29uZmlnLnRleHR1cmVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHR1cmUgPSBjb25maWcudGV4dHVyZXNbdG5dO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlLnVybCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLnVybCA9IGJ1bmRsZS51cmxGb3IodGV4dHVyZS51cmwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgVVJMcyBmb3IgaW5saW5lIHRleHR1cmVzXG4gICAgICAgIGlmIChjb25maWcuc3R5bGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzbiBpbiBjb25maWcuc3R5bGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gY29uZmlnLnN0eWxlc1tzbl07XG5cbiAgICAgICAgICAgICAgICAvLyBTdHlsZSBgdGV4dHVyZWBcbiAgICAgICAgICAgICAgICBsZXQgdGV4ID0gc3R5bGUudGV4dHVyZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRleCA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t0ZXhdICYmICFpc0dsb2JhbCh0ZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnRleHR1cmUgPSBidW5kbGUudXJsRm9yKHRleCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTWF0ZXJpYWxcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUubWF0ZXJpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgWydlbWlzc2lvbicsICdhbWJpZW50JywgJ2RpZmZ1c2UnLCAnc3BlY3VsYXInLCAnbm9ybWFsJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGVyaWFsIHByb3BlcnR5IGhhcyBhIHRleHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXggPSBzdHlsZS5tYXRlcmlhbFtwcm9wXSAhPSBudWxsICYmIHN0eWxlLm1hdGVyaWFsW3Byb3BdLnRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRleCA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t0ZXhdICYmICFpc0dsb2JhbCh0ZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUubWF0ZXJpYWxbcHJvcF0udGV4dHVyZSA9IGJ1bmRsZS51cmxGb3IodGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2hhZGVyIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBHTFNMLnBhcnNlVW5pZm9ybXMoc3R5bGUuc2hhZGVycy51bmlmb3JtcykuZm9yRWFjaCgoe3R5cGUsIHZhbHVlLCBrZXksIHVuaWZvcm1zfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGV4dHVyZSBieSBVUkwgKHN0cmluZy1uYW1lZCB0ZXh0dXJlIG5vdCByZWZlcmVuY2luZyBleGlzdGluZyB0ZXh0dXJlIGRlZmluaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NhbXBsZXIyRCcgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3ZhbHVlXSAmJiAhaXNHbG9iYWwodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXNba2V5XSA9IGJ1bmRsZS51cmxGb3IodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0sXG5cbiAgICAvLyBTdWJzdGl0dXRlcyBnbG9iYWwgc2NlbmUgcHJvcGVydGllcyAodGhvc2UgZGVmaW5lZCBpbiB0aGUgYGNvbmZpZy5nbG9iYWxgIG9iamVjdCkgZm9yIGFueSBzdHlsZSB2YWx1ZXNcbiAgICAvLyBvZiB0aGUgZm9ybSBgZ2xvYmFsLmAsIGZvciBleGFtcGxlIGBjb2xvcjogZ2xvYmFsLnBhcmtfY29sb3JgIHdvdWxkIGJlIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIChpZiBhbnkpXG4gICAgLy8gZGVmaW5lZCBmb3IgdGhlIGBwYXJrX2NvbG9yYCBwcm9wZXJ0eSBpbiBgY29uZmlnLmdsb2JhbC5wYXJrX2NvbG9yYC5cbiAgICBhcHBseUdsb2JhbFByb3BlcnRpZXMoY29uZmlnLCBhcHBsaWVkKSB7XG4gICAgICAgIGlmICghY29uZmlnLmdsb2JhbCB8fCBPYmplY3Qua2V5cyhjb25maWcuZ2xvYmFsKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb25maWc7IC8vIG5vIGdsb2JhbCBwcm9wZXJ0aWVzIHRvIHRyYW5zZm9ybVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2UgcHJvcGVydGllcyBmcm9tIGdsb2JhbHNcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gJzonO1xuICAgICAgICBjb25zdCBwcm9wcyA9IGZsYXR0ZW5Qcm9wZXJ0aWVzKGNvbmZpZy5nbG9iYWwsIHNlcGFyYXRvcik7XG5cbiAgICAgICAgLy8gUmUtYXBwbHkgcHJldmlvdXNseSBhcHBsaWVkIHByb3BlcnRpZXNcbiAgICAgICAgLy8gTkI6IGEgY3VycmVudCBzaG9ydGNvbWluZyBoZXJlIGlzIHRoYXQgeW91IGNhbm5vdCBcInVuLWxpbmtcIiBhIHRhcmdldCBwcm9wZXJ0eSBmcm9tIGEgZ2xvYmFsXG4gICAgICAgIC8vIGF0IHJ1bi10aW1lLiBPbmNlIGEgZ2xvYmFsIHByb3BlcnR5IHN1YnN0aXR1dGlvbiBoYXMgYmVlbiByZWNvcmRlcmQsIGl0IHdpbGwgYWx3YXlzIGJlIHJlLWFwcGxpZWRcbiAgICAgICAgLy8gb24gc3Vic2VxdWVudCBzY2VuZSB1cGRhdGVzLCBldmVuIGlmIHRoZSB0YXJnZXQgcHJvcGVydHkgd2FzIHVwZGF0ZWQgdG8gYW5vdGhlciBsaXRlcmFsIHZhbHVlLlxuICAgICAgICAvLyBUaGlzIGlzIHVubGlrZWx5IHRvIGJlIGEgY29tbW9uIG9jY3VycmVuY2UgYW4gYWNjZXB0YWJsZSBsaW1pdGF0aW9uIGZvciBub3cuXG4gICAgICAgIGFwcGxpZWQuZm9yRWFjaCgoeyBwcm9wLCB0YXJnZXQsIGtleSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBwcm9wc1twcm9wXTtcbiAgICAgICAgICAgICAgICAvLyBsb2coJ2luZm8nLCBgUmUtYXBwbHlpbmcgJHtwcm9wfSB3aXRoIHZhbHVlICR7cHJvcHNbcHJvcF19IHRvIGtleSAke2tleX0gaW5gLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBGaW5kIGFuZCBhcHBseSBuZXcgcHJvcGVydGllc1xuICAgICAgICBmdW5jdGlvbiBhcHBseVByb3BzIChvYmosIHRhcmdldCwga2V5KSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IHN0cmluZ1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcCA9IChvYmouc2xpY2UoMCwgNykgPT09ICdnbG9iYWwuJykgJiYgKG9iai5zbGljZSg3KS5yZXBsYWNlKC9cXC4vZywgc2VwYXJhdG9yKSk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgJiYgcHJvcHNbcHJvcF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHJlY29yZCBvZiB3aGVyZSBwcm9wZXJ0eSBpcyBhcHBsaWVkXG4gICAgICAgICAgICAgICAgICAgIGFwcGxpZWQucHVzaCh7IHByb3AsIHRhcmdldCwga2V5IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IHByb3BzW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBvYmplY3QgcHJvcGVydGllc1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwIGluIG9iaikge1xuICAgICAgICAgICAgICAgICAgICBvYmpbcF0gPSBhcHBseVByb3BzKG9ialtwXSwgb2JqLCBwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcGx5UHJvcHMoY29uZmlnKTtcbiAgICB9LFxuXG4gICAgLy8gTW92ZSBpbmxpbmUgKFVSTCBzdHJpbmcpIHRleHR1cmVzIHRvIHRoZSBzY2VuZSdzIHRvcC1sZXZlbCBzZXQgb2YgdGV4dHVyZXMgKGNvbmZpZy50ZXh0dXJlcykuXG4gICAgLy8gVGhlcmUgYXJlIDMgc3VjaCBjYXNlcyBvZiB0ZXh0dXJlczpcbiAgICAvLyAtIGluIGEgc3R5bGUncyBgdGV4dHVyZWAgcHJvcGVydHlcbiAgICAvLyAtIGluIGEgc3R5bGUncyBgbWF0ZXJpYWxgIHByb3BlcnRpZXNcbiAgICAvLyAtIGluIGEgc3R5bGUncyBjdXN0b20gdW5pZm9ybXMgKGBzaGFkZXJzLnVuaWZvcm1zYClcbiAgICBob2lzdFRleHR1cmVzIChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNuIGluIGNvbmZpZy5zdHlsZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBjb25maWcuc3R5bGVzW3NuXTtcblxuICAgICAgICAgICAgICAgIC8vIFN0eWxlIGB0ZXh0dXJlYFxuICAgICAgICAgICAgICAgIGxldCB0ZXggPSBzdHlsZS50ZXh0dXJlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGV4ID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3RleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHRleDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpc0dsb2JhbCh1cmwpID8gYHRleHR1cmUtJHt1cmx9YCA6IHVybDtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRleHR1cmVzW25hbWVdID0geyB1cmwgfTtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4dHVyZSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTWF0ZXJpYWxcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUubWF0ZXJpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgWydlbWlzc2lvbicsICdhbWJpZW50JywgJ2RpZmZ1c2UnLCAnc3BlY3VsYXInLCAnbm9ybWFsJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGVyaWFsIHByb3BlcnR5IGhhcyBhIHRleHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXggPSBzdHlsZS5tYXRlcmlhbFtwcm9wXSAhPSBudWxsICYmIHN0eWxlLm1hdGVyaWFsW3Byb3BdLnRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRleCA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t0ZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGlzR2xvYmFsKHVybCkgPyBgdGV4dHVyZS0ke3VybH1gIDogdXJsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50ZXh0dXJlc1tuYW1lXSA9IHsgdXJsIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUubWF0ZXJpYWxbcHJvcF0udGV4dHVyZSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNoYWRlciB1bmlmb3Jtc1xuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgICAgICAgICAgR0xTTC5wYXJzZVVuaWZvcm1zKHN0eWxlLnNoYWRlcnMudW5pZm9ybXMpLmZvckVhY2goKHt0eXBlLCB2YWx1ZSwga2V5LCB1bmlmb3Jtc30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRleHR1cmUgYnkgVVJMIChzdHJpbmctbmFtZWQgdGV4dHVyZSBub3QgcmVmZXJlbmNpbmcgZXhpc3RpbmcgdGV4dHVyZSBkZWZpbml0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzYW1wbGVyMkQnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIWNvbmZpZy50ZXh0dXJlc1t2YWx1ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpc0dsb2JhbCh1cmwpID8gYHRleHR1cmUtJHt1cmx9YCA6IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudGV4dHVyZXNbbmFtZV0gPSB7IHVybCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zW2tleV0gPSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gTm9ybWFsaXplIHNvbWUgc2NlbmUtd2lkZSBzZXR0aW5ncyB0aGF0IGFwcGx5IHRvIHRoZSBmaW5hbCwgbWVyZ2VkIHNjZW5lXG4gICAgZmluYWxpemUoeyBjb25maWcsIGJ1bmRsZSB9KSB7XG4gICAgICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdG9wLWxldmVsIHByb3BlcnRpZXNcbiAgICAgICAgY29uZmlnLnNjZW5lID0gY29uZmlnLnNjZW5lIHx8IHt9O1xuICAgICAgICBjb25maWcuY2FtZXJhcyA9IGNvbmZpZy5jYW1lcmFzIHx8IHt9O1xuICAgICAgICBjb25maWcubGlnaHRzID0gY29uZmlnLmxpZ2h0cyB8fCB7fTtcbiAgICAgICAgY29uZmlnLnN0eWxlcyA9IGNvbmZpZy5zdHlsZXMgfHwge307XG4gICAgICAgIGNvbmZpZy5sYXllcnMgPSBjb25maWcubGF5ZXJzIHx8IHt9O1xuXG4gICAgICAgIC8vIElmIG9ubHkgb25lIGNhbWVyYSBzcGVjaWZpZWQsIHNldCBpdCBhcyBkZWZhdWx0XG4gICAgICAgIGlmIChjb25maWcuY2FtZXJhKSB7XG4gICAgICAgICAgICBjb25maWcuY2FtZXJhcy5kZWZhdWx0ID0gY29uZmlnLmNhbWVyYTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIGNhbWVyYXMgc3BlY2lmaWVkLCBjcmVhdGUgb25lXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjb25maWcuY2FtZXJhcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25maWcuY2FtZXJhcy5kZWZhdWx0ID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBubyBsaWdodHMgc3BlY2lmaWVkLCBjcmVhdGUgZGVmYXVsdFxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlnLmxpZ2h0cykubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcubGlnaHRzKS5ldmVyeShpID0+IGNvbmZpZy5saWdodHNbaV0udmlzaWJsZSA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICBjb25maWcubGlnaHRzLmRlZmF1bHRfbGlnaHQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2RpcmVjdGlvbmFsJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGNvbmZpZywgYnVuZGxlIH07XG4gICAgfVxuXG59O1xuXG4vLyBGbGF0dGVuIG5lc3RlZCBwcm9wZXJ0aWVzIGZvciBzaW1wbGVyIHN0cmluZyBsb29rLXVwc1xuLy8gZS5nLiBnbG9iYWwuYmFja2dyb3VuZC5jb2xvciAtPiAnZ2xvYmFsOmJhY2tncm91bmQ6Y29sb3InXG5mdW5jdGlvbiBmbGF0dGVuUHJvcGVydGllcyAob2JqLCBzZXBhcmF0b3IgPSAnOicsIHByZWZpeCA9IG51bGwsIHByb3BzID0ge30pIHtcbiAgICBwcmVmaXggPSBwcmVmaXggPyAocHJlZml4ICsgc2VwYXJhdG9yKSA6ICcnO1xuXG4gICAgZm9yIChsZXQgcCBpbiBvYmopIHtcbiAgICAgICAgbGV0IGtleSA9IHByZWZpeCArIHA7XG4gICAgICAgIGxldCB2YWwgPSBvYmpbcF07XG4gICAgICAgIHByb3BzW2tleV0gPSB2YWw7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGZsYXR0ZW5Qcm9wZXJ0aWVzKHZhbCwgc2VwYXJhdG9yLCBrZXksIHByb3BzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcHM7XG59XG5cbnN1YnNjcmliZU1peGluKFNjZW5lTG9hZGVyKTtcbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi91dGlscy9tZXJnZSc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9zb3VyY2VzL2RhdGFfc291cmNlJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQge1N0eWxlTWFuYWdlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfbWFuYWdlcic7XG5pbXBvcnQge3BhcnNlTGF5ZXJzfSBmcm9tICcuL3N0eWxlcy9sYXllcic7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuXG5leHBvcnQgdmFyIFNjZW5lV29ya2VyID0gc2VsZjtcblxuLy8gV29ya2VyIGZ1bmN0aW9uYWxpdHkgd2lsbCBvbmx5IGJlIGRlZmluZWQgaW4gd29ya2VyIHRocmVhZFxuaWYgKFRocmVhZC5pc193b3JrZXIpIHtcblxuT2JqZWN0LmFzc2lnbihzZWxmLCB7XG5cbiAgICBGZWF0dXJlU2VsZWN0aW9uLFxuXG4gICAgc291cmNlczoge30sXG4gICAgc3R5bGVzOiB7fSxcbiAgICBsYXllcnM6IHt9LFxuICAgIHRpbGVzOiB7fSxcbiAgICBvYmplY3RzOiB7fSxcbiAgICBjb25maWc6IHt9LCAgICAgLy8gcmF3IGNvbmZpZyAoZS5nLiBmdW5jdGlvbnMsIGV0Yy4gbm90IGV4cGFuZGVkKVxuXG4gICAgLy8gSW5pdGlhbGl6ZSB3b3JrZXJcbiAgICBpbml0IChzY2VuZV9pZCwgd29ya2VyX2lkLCBudW1fd29ya2VycywgbG9nX2xldmVsLCBkZXZpY2VfcGl4ZWxfcmF0aW8pIHtcbiAgICAgICAgc2VsZi5zY2VuZV9pZCA9IHNjZW5lX2lkO1xuICAgICAgICBzZWxmLl93b3JrZXJfaWQgPSB3b3JrZXJfaWQ7XG4gICAgICAgIHNlbGYubnVtX3dvcmtlcnMgPSBudW1fd29ya2VycztcbiAgICAgICAgbG9nLnNldExldmVsKGxvZ19sZXZlbCk7XG4gICAgICAgIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyA9IGRldmljZV9waXhlbF9yYXRpbztcbiAgICAgICAgRmVhdHVyZVNlbGVjdGlvbi5zZXRQcmVmaXgoc2VsZi5fd29ya2VyX2lkKTtcbiAgICAgICAgc2VsZi5zdHlsZV9tYW5hZ2VyID0gbmV3IFN0eWxlTWFuYWdlcigpO1xuICAgICAgICByZXR1cm4gd29ya2VyX2lkO1xuICAgIH0sXG5cbiAgICAvLyBTdGFydHMgYSBjb25maWcgcmVmcmVzaFxuICAgIHVwZGF0ZUNvbmZpZyAoeyBjb25maWcsIGdlbmVyYXRpb24sIGludHJvc3BlY3Rpb24gfSkge1xuICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZyk7XG5cbiAgICAgICAgc2VsZi5sYXN0X2NvbmZpZyA9IG1lcmdlT2JqZWN0cyh7fSwgc2VsZi5jb25maWcpO1xuICAgICAgICBzZWxmLmNvbmZpZyA9IG1lcmdlT2JqZWN0cyh7fSwgY29uZmlnKTtcbiAgICAgICAgc2VsZi5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjtcbiAgICAgICAgc2VsZi5pbnRyb3NwZWN0aW9uID0gaW50cm9zcGVjdGlvbjtcblxuICAgICAgICAvLyBEYXRhIGJsb2NrIGZ1bmN0aW9ucyBhcmUgbm90IGNvbnRleHQgd3JhcHBlZCBsaWtlIHRoZSByZXN0IG9mIHRoZSBzdHlsZSBmdW5jdGlvbnMgYXJlXG4gICAgICAgIC8vIFRPRE86IHByb2JhYmx5IHdhbnQgYSBjbGVhbmVyIHdheSB0byBleGNsdWRlIHRoZXNlXG4gICAgICAgIGZvciAobGV0IGxheWVyIGluIGNvbmZpZy5sYXllcnMpIHtcbiAgICAgICAgICAgIGlmIChjb25maWcubGF5ZXJzW2xheWVyXSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5sYXllcnNbbGF5ZXJdLmRhdGEgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLmxheWVyc1tsYXllcl0uZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHBhbmQgZ2xvYmFsIHByb3BlcnRpZXNcbiAgICAgICAgc2VsZi5nbG9iYWwgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLmdsb2JhbCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGRhdGEgc291cmNlc1xuICAgICAgICBzZWxmLmNyZWF0ZURhdGFTb3VyY2VzKGNvbmZpZyk7XG5cbiAgICAgICAgLy8gRXhwYW5kIHN0eWxlc1xuICAgICAgICBjb25maWcuc3R5bGVzID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKGNvbmZpZy5zdHlsZXMsIFN0eWxlUGFyc2VyLndyYXBGdW5jdGlvbik7XG4gICAgICAgIHNlbGYuc3R5bGVzID0gc2VsZi5zdHlsZV9tYW5hZ2VyLmJ1aWxkKGNvbmZpZy5zdHlsZXMpO1xuICAgICAgICBzZWxmLnN0eWxlX21hbmFnZXIuaW5pdFN0eWxlcyh7XG4gICAgICAgICAgICBnZW5lcmF0aW9uOiBzZWxmLmdlbmVyYXRpb24sXG4gICAgICAgICAgICBzdHlsZXM6IHNlbGYuc3R5bGVzLFxuICAgICAgICAgICAgc291cmNlczogc2VsZi5zb3VyY2VzLFxuICAgICAgICAgICAgaW50cm9zcGVjdGlvbjogc2VsZi5pbnRyb3NwZWN0aW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFBhcnNlIGVhY2ggdG9wLWxldmVsIGxheWVyIGFzIGEgc2VwYXJhdGUgdHJlZVxuICAgICAgICBzZWxmLmxheWVycyA9IHBhcnNlTGF5ZXJzKGNvbmZpZy5sYXllcnMsIHNlbGYuc3R5bGVfbWFuYWdlci5zdHlsZXMpO1xuXG4gICAgICAgIC8vIFN5bmMgdGV0eHVyZSBpbmZvIGZyb20gbWFpbiB0aHJlYWRcbiAgICAgICAgc2VsZi5zeW5jaW5nX3RleHR1cmVzID0gc2VsZi5zeW5jVGV4dHVyZXMoY29uZmlnLnRleHR1cmVzKTtcblxuICAgICAgICAvLyBSZXR1cm4gcHJvbWlzZSBmb3Igd2hlbiBjb25maWcgcmVmcmVzaCBmaW5pc2hlc1xuICAgICAgICBzZWxmLmNvbmZpZ3VyaW5nID0gc2VsZi5zeW5jaW5nX3RleHR1cmVzLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGB1cGRhdGVkIGNvbmZpZ2ApO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gQ3JlYXRlIGRhdGEgc291cmNlcyBhbmQgY2xlYXIgdGlsZSBjYWNoZSBpZiBuZWNlc3NhcnlcbiAgICBjcmVhdGVEYXRhU291cmNlcyAoY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5zb3VyY2VzID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKGNvbmZpZy5zb3VyY2VzKTsgLy8gcGFyc2UgbmV3IHNvdXJjZXNcbiAgICAgICAgc2VsZi5zb3VyY2VzID0ge307IC8vIGNsZWFyIHByZXZpb3VzIHNvdXJjZXNcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBjb25maWcuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IHNvdXJjZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc291cmNlID0gRGF0YVNvdXJjZS5jcmVhdGUoT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnLnNvdXJjZXNbbmFtZV0sIHtuYW1lfSksIHNlbGYuc291cmNlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLnNvdXJjZXNbbmFtZV0gPSBzb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciB0aWxlIGNhY2hlIGlmIGRhdGEgc291cmNlIGNvbmZpZyBjaGFuZ2VkXG4gICAgICAgIGlmICghc2VsZi5jb25maWcuc291cmNlcyB8fFxuICAgICAgICAgICAgIXNlbGYubGFzdF9jb25maWcuc291cmNlcyB8fFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc2VsZi5jb25maWcuc291cmNlcykuc29tZShzID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2VsZi5jb25maWcuc291cmNlc1tzXSkgIT09IEpTT04uc3RyaW5naWZ5KHNlbGYubGFzdF9jb25maWcuc291cmNlc1tzXSk7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgc2VsZi50aWxlcyA9IHt9O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgd2hlbiBjb25maWcgcmVmcmVzaCBpcyBmaW5pc2hlZFxuICAgIGF3YWl0Q29uZmlndXJhdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNvbmZpZ3VyaW5nO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBhIHRpbGU6IGxvYWQgZnJvbSB0aWxlIHNvdXJjZSBpZiBidWlsZGluZyBmb3IgZmlyc3QgdGltZSwgb3RoZXJ3aXNlIHJlYnVpbGQgd2l0aCBleGlzdGluZyBkYXRhXG4gICAgYnVpbGRUaWxlICh7IHRpbGUgfSkge1xuICAgICAgICAvLyBUaWxlIGNhY2hlZD9cbiAgICAgICAgaWYgKHNlbGYuZ2V0VGlsZSh0aWxlLmtleSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBsb2FkaW5nP1xuICAgICAgICAgICAgaWYgKHNlbGYuZ2V0VGlsZSh0aWxlLmtleSkubG9hZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSB0aWxlIGNhY2hlXG4gICAgICAgIHRpbGUgPSBzZWxmLnRpbGVzW3RpbGUua2V5XSA9IE9iamVjdC5hc3NpZ24oc2VsZi5nZXRUaWxlKHRpbGUua2V5KSB8fCB7fSwgdGlsZSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGNvbmZpZyAoc3R5bGVzLCBldGMuKSwgdGhlbiBidWlsZCB0aWxlXG4gICAgICAgIHJldHVybiBzZWxmLmF3YWl0Q29uZmlndXJhdGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBidWlsZGluZyB0aGUgdGlsZVxuICAgICAgICAgICAgaWYgKHRpbGUubG9hZGVkICE9PSB0cnVlKSB7XG5cbiAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRpbGUubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGlsZS5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICBzZWxmLmxvYWRUaWxlU291cmNlRGF0YSh0aWxlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmdldFRpbGUodGlsZS5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHN0b3AgdGlsZSBidWlsZCBhZnRlciBkYXRhIHNvdXJjZSBsb2FkIGJlY2F1c2UgdGlsZSB3YXMgcmVtb3ZlZDogJHt0aWxlLmtleX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFdhcm4gYW5kIGNvbnRpbnVlIG9uIGRhdGEgc291cmNlIGVycm9yXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlLnNvdXJjZV9kYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgdGlsZSBsb2FkIGVycm9yKHMpIGZvciAke3RpbGUua2V5fTogJHt0aWxlLnNvdXJjZV9kYXRhLmVycm9yfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgVGlsZS5idWlsZEdlb21ldHJ5KHRpbGUsIHNlbGYpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5lcnJvciA9IGVycm9yLnN0YWNrO1xuICAgICAgICAgICAgICAgICAgICBsb2coJ2Vycm9yJywgYHRpbGUgbG9hZCBlcnJvciBmb3IgJHt0aWxlLmtleX06ICR7dGlsZS5lcnJvcn1gKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGVycm9yIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShgVGlsZU1hbmFnZXJfJHtzZWxmLnNjZW5lX2lkfS5idWlsZFRpbGVFcnJvcmAsIFRpbGUuc2xpY2UodGlsZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGlsZSBhbHJlYWR5IGxvYWRlZCwganVzdCByZWJ1aWxkXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHVzZWQgd29ya2VyIGNhY2hlIGZvciB0aWxlICR7dGlsZS5rZXl9YCk7XG5cbiAgICAgICAgICAgICAgICAvLyBCdWlsZCBnZW9tZXRyeVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIFRpbGUuYnVpbGRHZW9tZXRyeSh0aWxlLCBzZWxmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBlcnJvciB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgICAgICAgICB0aWxlLmVycm9yID0gZXJyb3IudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKGBUaWxlTWFuYWdlcl8ke3NlbGYuc2NlbmVfaWR9LmJ1aWxkVGlsZUVycm9yYCwgVGlsZS5zbGljZSh0aWxlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gTG9hZCB0aGlzIHRpbGUncyBkYXRhIHNvdXJjZVxuICAgIGxvYWRUaWxlU291cmNlRGF0YSAodGlsZSkge1xuICAgICAgICBpZiAoc2VsZi5zb3VyY2VzW3RpbGUuc291cmNlXSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc291cmNlc1t0aWxlLnNvdXJjZV0ubG9hZCh0aWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRpbGUuc291cmNlX2RhdGEgPSB7fTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGlsZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0VGlsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYudGlsZXNba2V5XTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZlIHRpbGVcbiAgICByZW1vdmVUaWxlIChrZXkpIHtcbiAgICAgICAgdmFyIHRpbGUgPSBzZWxmLnRpbGVzW2tleV07XG5cbiAgICAgICAgaWYgKHRpbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ2FuY2VsIGlmIGxvYWRpbmdcbiAgICAgICAgICAgIGlmICh0aWxlLmxvYWRpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYGNhbmNlbCB0aWxlIGxvYWQgZm9yICR7a2V5fWApO1xuICAgICAgICAgICAgICAgIHRpbGUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIFRpbGUuY2FuY2VsKHRpbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBjYWNoZVxuICAgICAgICAgICAgRmVhdHVyZVNlbGVjdGlvbi5jbGVhclRpbGUoa2V5KTtcbiAgICAgICAgICAgIGRlbGV0ZSBzZWxmLnRpbGVzW2tleV07XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYHJlbW92ZSB0aWxlIGZyb20gY2FjaGUgZm9yICR7a2V5fWApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEdldCBhIGZlYXR1cmUgZnJvbSB0aGUgc2VsZWN0aW9uIG1hcFxuICAgIGdldEZlYXR1cmVTZWxlY3Rpb24gKHsgaWQsIGtleSB9ID0ge30pIHtcbiAgICAgICAgdmFyIHNlbGVjdGlvbiA9IEZlYXR1cmVTZWxlY3Rpb24ubWFwW2tleV07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIGZlYXR1cmU6IChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmZlYXR1cmUpXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8vIFJlc2V0cyB0aGUgZmVhdHVyZSBzZWxlY3Rpb24gc3RhdGVcbiAgICByZXNldEZlYXR1cmVTZWxlY3Rpb24gKCkge1xuICAgICAgICBGZWF0dXJlU2VsZWN0aW9uLnJlc2V0KCk7XG4gICAgfSxcblxuICAgIC8vIFNlbGVjdGlvbiBtYXAgc2l6ZSBmb3IgdGhpcyB3b3JrZXJcbiAgICBnZXRGZWF0dXJlU2VsZWN0aW9uTWFwU2l6ZSAoKSB7XG4gICAgICAgIHJldHVybiBGZWF0dXJlU2VsZWN0aW9uLmdldE1hcFNpemUoKTtcbiAgICB9LFxuXG4gICAgLy8gVGV4dHVyZSBpbmZvIG5lZWRzIHRvIGJlIHN5bmNlZCBmcm9tIG1haW4gdGhyZWFkLCBlLmcuIHdpZHRoL2hlaWdodCwgd2hpY2ggd2Ugb25seSBrbm93IGFmdGVyIHRoZSB0ZXh0dXJlIGxvYWRzXG4gICAgc3luY1RleHR1cmVzICh0ZXhfY29uZmlnKSB7XG4gICAgICAgIGxldCB0ZXh0dXJlcyA9IFtdO1xuICAgICAgICBpZiAodGV4X2NvbmZpZykge1xuICAgICAgICAgICAgdGV4dHVyZXMucHVzaCguLi5PYmplY3Qua2V5cyh0ZXhfY29uZmlnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2coJ3RyYWNlJywgJ3N5bmMgdGV4dHVyZXMgdG8gd29ya2VyOicsIHRleHR1cmVzKTtcbiAgICAgICAgaWYgKHRleHR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnN5bmNUZXh0dXJlc1RvV29ya2VyKHRleHR1cmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfSxcblxuICAgIC8vIFN5bmMgZGV2aWNlIHBpeGVsIHJhdGlvIGZyb20gbWFpbiB0aHJlYWRcbiAgICB1cGRhdGVEZXZpY2VQaXhlbFJhdGlvIChkZXZpY2VfcGl4ZWxfcmF0aW8pIHtcbiAgICAgICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvID0gZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgIH0sXG5cbiAgICAvLyBQcm9maWxpbmcgaGVscGVyc1xuICAgIHByb2ZpbGUgKG5hbWUpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlKGB3b3JrZXIgJHtzZWxmLl93b3JrZXJfaWR9OiAke25hbWV9YCk7XG4gICAgfSxcblxuICAgIHByb2ZpbGVFbmQgKG5hbWUpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlRW5kKGB3b3JrZXIgJHtzZWxmLl93b3JrZXJfaWR9OiAke25hbWV9YCk7XG4gICAgfVxuXG59KTtcblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnc2VsZicsIHNlbGYpO1xuXG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZlYXR1cmVTZWxlY3Rpb24ge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIHdvcmtlcnMpIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLndvcmtlcnMgPSB3b3JrZXJzOyAvLyBwb29sIG9mIHdvcmtlcnMgdG8gcmVxdWVzdCBmZWF0dXJlIGxvb2stdXBzIGZyb20sIGtleWVkIGJ5IGlkXG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIC8vIFNlbGVjdGlvbiBzdGF0ZSB0cmFja2luZ1xuICAgICAgICB0aGlzLnJlcXVlc3RzID0ge307IC8vIHBlbmRpbmcgc2VsZWN0aW9uIHJlcXVlc3RzXG4gICAgICAgIHRoaXMuZmVhdHVyZSA9IG51bGw7IC8vIGN1cnJlbnRseSBzZWxlY3RlZCBmZWF0dXJlXG4gICAgICAgIHRoaXMucmVhZF9kZWxheSA9IDA7IC8vIGRlbGF5IHRpbWUgZnJvbSBzZWxlY3Rpb24gcmVuZGVyIHRvIGZyYW1lYnVmZmVyIHNhbXBsZSwgdG8gYXZvaWQgQ1BVL0dQVSBzeW5jIGxvY2tcbiAgICAgICAgdGhpcy5yZWFkX2RlbGF5X3RpbWVyID0gbnVsbDsgLy8gY3VycmVudCB0aW1lciAoc2V0VGltZW91dCkgZm9yIGRlbGF5ZWQgc2VsZWN0aW9uIHJlYWRzXG5cbiAgICAgICAgdGhpcy5waXhlbCA9IG5ldyBVaW50OEFycmF5KDQpO1xuICAgICAgICB0aGlzLnBpeGVsMzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMucGl4ZWwuYnVmZmVyKTtcblxuICAgICAgICAvLyBGcmFtZSBidWZmZXIgZm9yIHNlbGVjdGlvblxuICAgICAgICAvLyBUT0RPOiBpbml0aWF0ZSBsYXppbHkgaW4gY2FzZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueSBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5mYm8gPSB0aGlzLmdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG4gICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZmJvKTtcbiAgICAgICAgdGhpcy5mYm9fc2l6ZSA9IHsgd2lkdGg6IDI1NiwgaGVpZ2h0OiAyNTYgfTsgLy8gVE9ETzogbWFrZSBjb25maWd1cmFibGUgLyBhZGFwdGl2ZSBiYXNlZCBvbiBjYW52YXMgc2l6ZVxuICAgICAgICB0aGlzLmZib19zaXplLmFzcGVjdCA9IHRoaXMuZmJvX3NpemUud2lkdGggLyB0aGlzLmZib19zaXplLmhlaWdodDtcblxuICAgICAgICAvLyBUZXh0dXJlIGZvciB0aGUgRkJPIGNvbG9yIGF0dGFjaG1lbnRcbiAgICAgICAgdmFyIGZib190ZXh0dXJlID0gVGV4dHVyZS5jcmVhdGUoIHRoaXMuZ2wsICdzZWxlY3Rpb25fZmJvJywgeyBmaWx0ZXJpbmc6ICduZWFyZXN0JyB9KTtcbiAgICAgICAgZmJvX3RleHR1cmUuc2V0RGF0YSh0aGlzLmZib19zaXplLndpZHRoLCB0aGlzLmZib19zaXplLmhlaWdodCwgbnVsbCwgeyBmaWx0ZXJpbmc6ICduZWFyZXN0JyB9KTtcbiAgICAgICAgdGhpcy5nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCh0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmdsLkNPTE9SX0FUVEFDSE1FTlQwLCB0aGlzLmdsLlRFWFRVUkVfMkQsIGZib190ZXh0dXJlLnRleHR1cmUsIDApO1xuXG4gICAgICAgIC8vIFJlbmRlcmJ1ZmZlciBmb3IgdGhlIEZCTyBkZXB0aCBhdHRhY2htZW50XG4gICAgICAgIHZhciBmYm9fZGVwdGhfcmIgPSB0aGlzLmdsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmdsLmJpbmRSZW5kZXJidWZmZXIodGhpcy5nbC5SRU5ERVJCVUZGRVIsIGZib19kZXB0aF9yYik7XG4gICAgICAgIHRoaXMuZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSh0aGlzLmdsLlJFTkRFUkJVRkZFUiwgdGhpcy5nbC5ERVBUSF9DT01QT05FTlQxNiwgdGhpcy5mYm9fc2l6ZS53aWR0aCwgdGhpcy5mYm9fc2l6ZS5oZWlnaHQpO1xuICAgICAgICB0aGlzLmdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZ2wuREVQVEhfQVRUQUNITUVOVCwgdGhpcy5nbC5SRU5ERVJCVUZGRVIsIGZib19kZXB0aF9yYik7XG5cbiAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2wgJiYgdGhpcy5mYm8pIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5mYm8pO1xuICAgICAgICAgICAgdGhpcy5mYm8gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBmcmVlIHRleHR1cmU/XG4gICAgfVxuXG4gICAgYmluZCgpIHtcbiAgICAgICAgLy8gU3dpdGNoIHRvIEZCT1xuICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCB0aGlzLmZibyk7XG4gICAgICAgIHRoaXMuZ2wudmlld3BvcnQoMCwgMCwgdGhpcy5mYm9fc2l6ZS53aWR0aCwgdGhpcy5mYm9fc2l6ZS5oZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAvLyBSdW5zIGFzeW5jaHJvbm91c2x5LCBzY2hlZHVsZXMgc2VsZWN0aW9uIGJ1ZmZlciB0byBiZSB1cGRhdGVkXG4gICAgZ2V0RmVhdHVyZUF0KHBvaW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBRdWV1ZSByZXF1ZXN0cyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24sIGFuZCB0aGV5IHdpbGwgYmUgcGlja2VkIHVwIGJ5IHRoZSByZW5kZXIgbG9vcFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZCA9ICh0aGlzLnNlbGVjdGlvbl9yZXF1ZXN0X2lkICsgMSkgfHwgMDtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdHNbdGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZF0gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3BvaW50JyxcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5zZWxlY3Rpb25fcmVxdWVzdF9pZCxcbiAgICAgICAgICAgICAgICBwb2ludCxcbiAgICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQW55IHBlbmRpbmcgc2VsZWN0aW9uIHJlcXVlc3RzXG4gICAgcGVuZGluZ1JlcXVlc3RzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZXF1ZXN0cykubGVuZ3RoICYmIHRoaXMucmVxdWVzdHM7XG4gICAgfVxuXG4gICAgY2xlYXJQZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgICAgIGZvciAodmFyIHIgaW4gdGhpcy5yZXF1ZXN0cykge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW3JdO1xuXG4gICAgICAgICAgICAvLyBUaGlzIHJlcXVlc3Qgd2FzIGFscmVhZHkgc2VudCB0byB0aGUgd29ya2VyLCB3ZSdyZSBqdXN0IGF3YWl0aW5nIGl0cyByZXBseVxuICAgICAgICAgICAgaWYgKHJlcXVlc3Quc2VudCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZWplY3QgcmVxdWVzdCBzaW5jZSBpdCB3aWxsIG5ldmVyIGJlIGZ1bGZpbGxlZFxuICAgICAgICAgICAgLy8gVE9ETzogcGFzcyBhIHJlYXNvbiBmb3IgcmVqZWN0aW9uP1xuICAgICAgICAgICAgcmVxdWVzdC5yZWplY3QoeyByZXF1ZXN0IH0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVxdWVzdHNbcl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWFkIHBlbmRpbmcgcmVzdWx0cyBmcm9tIHRoZSBzZWxlY3Rpb24gYnVmZmVyLiBDYWxsZWQgYWZ0ZXIgcmVuZGVyaW5nIHRvIHNlbGVjdGlvbiBidWZmZXIuXG4gICAgcmVhZCgpIHtcbiAgICAgICAgLy8gRGVsYXkgcmVhZGluZyB0aGUgcGl4ZWwgcmVzdWx0IGZyb20gdGhlIHNlbGVjdGlvbiBidWZmZXIgdG8gYXZvaWQgQ1BVL0dQVSBzeW5jIGxvY2suXG4gICAgICAgIC8vIENhbGxpbmcgcmVhZFBpeGVscyBzeW5jaHJvbm91c2x5IGNhdXNlZCBhIG1hc3NpdmUgcGVyZm9ybWFuY2UgaGl0LCBwcmVzdW1hYmx5IHNpbmNlIGl0XG4gICAgICAgIC8vIGZvcmNlZCB0aGlzIGZ1bmN0aW9uIHRvIHdhaXQgZm9yIHRoZSBHUFUgdG8gZmluaXNoIHJlbmRlcmluZyBhbmQgcmV0cmlldmUgdGhlIHRleHR1cmUgY29udGVudHMuXG4gICAgICAgIGlmICh0aGlzLnJlYWRfZGVsYXlfdGltZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVhZF9kZWxheV90aW1lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkX2RlbGF5X3RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZmJvKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgciBpbiB0aGlzLnJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW3JdO1xuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyByZXF1ZXN0IHdhcyBhbHJlYWR5IHNlbnQgdG8gdGhlIHdvcmtlciwgd2UncmUganVzdCBhd2FpdGluZyBpdHMgcmVwbHlcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5zZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgc2VsZWN0aW9uIHR5cGVzLCBzdWNoIGFzIGZlYXR1cmVzIHdpdGhpbiBhIGJveFxuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnR5cGUgIT09ICdwb2ludCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgc2VsZWN0aW9uIG1hcCBhZ2FpbnN0IEZCT1xuICAgICAgICAgICAgICAgIGdsLnJlYWRQaXhlbHMoXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IocmVxdWVzdC5wb2ludC54ICogdGhpcy5mYm9fc2l6ZS53aWR0aCksXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoKDEgLSByZXF1ZXN0LnBvaW50LnkpICogdGhpcy5mYm9fc2l6ZS5oZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICAxLCAxLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLnBpeGVsKTtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZV9rZXkgPSAodGhpcy5waXhlbFswXSArICh0aGlzLnBpeGVsWzFdIDw8IDgpICsgKHRoaXMucGl4ZWxbMl0gPDwgMTYpICsgKHRoaXMucGl4ZWxbM10gPDwgMjQpKSA+Pj4gMDtcblxuICAgICAgICAgICAgICAgIC8vIElmIGZlYXR1cmUgZm91bmQsIGFzayBhcHByb3ByaWF0ZSB3ZWIgd29ya2VyIHRvIGxvb2t1cCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgdmFyIHdvcmtlcl9pZCA9IHRoaXMucGl4ZWxbM107XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtlcl9pZCAhPT0gMjU1KSB7IC8vIDI1NSBpbmRpY2F0ZXMgYW4gZW1wdHkgc2VsZWN0aW9uIGJ1ZmZlciBwaXhlbFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53b3JrZXJzW3dvcmtlcl9pZF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud29ya2Vyc1t3b3JrZXJfaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWxmLmdldEZlYXR1cmVTZWxlY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IHJlcXVlc3QuaWQsIGtleTogZmVhdHVyZV9rZXkgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKG1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoUmVhZChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE5vIGZlYXR1cmUgZm91bmQsIGJ1dCBzdGlsbCBuZWVkIHRvIHJlc29sdmUgcHJvbWlzZVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaFJlYWQoeyBpZDogcmVxdWVzdC5pZCwgZmVhdHVyZTogbnVsbCB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0LnNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuXG4gICAgICAgIH0sIHRoaXMucmVhZF9kZWxheSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGZpbmRzIGEgZmVhdHVyZSBpbiB0aGUgc2VsZWN0aW9uIGJ1ZmZlclxuICAgIGZpbmlzaFJlYWQgKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RzW21lc3NhZ2UuaWRdO1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBcIkZlYXR1cmVTZWxlY3Rpb24uZmluaXNoUmVhZCgpOiBjb3VsZCBub3QgZmluZCBtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuOyAvLyByZXF1ZXN0IHdhcyBjbGVhcmVkIGJlZm9yZSBpdCByZXR1cm5lZFxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZlYXR1cmUgPSBtZXNzYWdlLmZlYXR1cmU7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGlmICgoZmVhdHVyZSAhPSBudWxsICYmIHRoaXMuZmVhdHVyZSA9PSBudWxsKSB8fFxuICAgICAgICAgICAgKGZlYXR1cmUgPT0gbnVsbCAmJiB0aGlzLmZlYXR1cmUgIT0gbnVsbCkgfHxcbiAgICAgICAgICAgIChmZWF0dXJlICE9IG51bGwgJiYgdGhpcy5mZWF0dXJlICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShmZWF0dXJlKSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5mZWF0dXJlKSkpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsgLy8gc3RvcmUgdGhlIG1vc3QgcmVjZW50bHkgc2VsZWN0ZWQgZmVhdHVyZVxuXG4gICAgICAgIC8vIFJlc29sdmUgdGhlIHJlcXVlc3RcbiAgICAgICAgcmVxdWVzdC5yZXNvbHZlKHsgZmVhdHVyZSwgY2hhbmdlZCwgcmVxdWVzdCB9KTtcbiAgICAgICAgZGVsZXRlIHRoaXMucmVxdWVzdHNbbWVzc2FnZS5pZF07IC8vIGRvbmUgcHJvY2Vzc2luZyB0aGlzIHJlcXVlc3RcbiAgICB9XG5cblxuICAgIC8vIFNlbGVjdGlvbiBtYXAgZ2VuZXJhdGlvblxuICAgIC8vIEVhY2ggd29ya2VyIHdpbGwgY3JlYXRlIGl0cyBvd24gaW5kZXBlbmRlbnQsICdsb2NhbCcgc2VsZWN0aW9uIG1hcFxuXG4gICAgLy8gQ3JlYXRlIGEgdW5pcXVlIDMyLWJpdCBjb2xvciB0byBpZGVudGlmeSBhIGZlYXR1cmVcbiAgICAvLyBXb3JrZXJzIGluZGVwZW5kZW50bHkgY3JlYXRlL21vZGlmeSBzZWxlY3Rpb24gY29sb3JzIGluIHRoZWlyIG93biB0aHJlYWRzLCBidXQgd2UgYWxzb1xuICAgIC8vIG5lZWQgdGhlIG1haW4gdGhyZWFkIHRvIGtub3cgd2hlcmUgZWFjaCBmZWF0dXJlIGNvbG9yIG9yaWdpbmF0ZWQuIFRvIGFjY29tcGxpc2ggdGhpcyxcbiAgICAvLyB3ZSBwYXJ0aXRpb24gdGhlIG1hcCBieSBzZXR0aW5nIHRoZSA0dGggY29tcG9uZW50IChhbHBoYSBjaGFubmVsKSB0byB0aGUgd29ya2VyJ3MgaWQuXG4gICAgc3RhdGljIG1ha2VFbnRyeSh0aWxlKSB7XG4gICAgICAgIC8vIDMyLWJpdCBjb2xvciBrZXlcbiAgICAgICAgdGhpcy5tYXBfZW50cnkrKztcbiAgICAgICAgdmFyIGlyID0gdGhpcy5tYXBfZW50cnkgJiAyNTU7XG4gICAgICAgIHZhciBpZyA9ICh0aGlzLm1hcF9lbnRyeSA+PiA4KSAmIDI1NTtcbiAgICAgICAgdmFyIGliID0gKHRoaXMubWFwX2VudHJ5ID4+IDE2KSAmIDI1NTtcbiAgICAgICAgdmFyIGlhID0gdGhpcy5tYXBfcHJlZml4O1xuICAgICAgICB2YXIgciA9IGlyIC8gMjU1O1xuICAgICAgICB2YXIgZyA9IGlnIC8gMjU1O1xuICAgICAgICB2YXIgYiA9IGliIC8gMjU1O1xuICAgICAgICB2YXIgYSA9IGlhIC8gMjU1O1xuICAgICAgICB2YXIga2V5ID0gKGlyICsgKGlnIDw8IDgpICsgKGliIDw8IDE2KSArIChpYSA8PCAyNCkpID4+PiAwOyAvLyBuZWVkIHVuc2lnbmVkIHJpZ2h0IHNoaWZ0IHRvIGNvbnZlcnQgdG8gcG9zaXRpdmUgI1xuXG4gICAgICAgIHRoaXMubWFwW2tleV0gPSB7XG4gICAgICAgICAgICBjb2xvcjogW3IsIGcsIGIsIGFdLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1hcF9zaXplKys7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aWxlLXNwZWNpZmljIHRyYWNraW5nIGluZm9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVzW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy50aWxlc1t0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICAgICAgZW50cmllczogW10sICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IG9mIGZlYXR1cmUgZW50cmllcyBpbiB0aGlzIHRocmVhZFxuICAgICAgICAgICAgICAgIHRpbGU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YnNldCBvZiB0aWxlIHByb3BlcnRpZXMgdG8gcGFzcyBiYWNrIHdpdGggZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgICBrZXk6IHRpbGUua2V5LFxuICAgICAgICAgICAgICAgICAgICBjb29yZHM6IHRpbGUuY29vcmRzLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZV96b29tOiB0aWxlLnN0eWxlX3pvb20sXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGlsZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb246IHRpbGUuZ2VuZXJhdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRpbGVzW3RpbGUua2V5XS5lbnRyaWVzLnB1c2goa2V5KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5tYXBba2V5XTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbWFrZUNvbG9yKGZlYXR1cmUsIHRpbGUsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gdGhpcy5tYWtlRW50cnkodGlsZSk7XG4gICAgICAgIHNlbGVjdG9yLmZlYXR1cmUgPSB7XG4gICAgICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgIHNvdXJjZV9uYW1lOiBjb250ZXh0LnNvdXJjZSxcbiAgICAgICAgICAgIHNvdXJjZV9sYXllcjogY29udGV4dC5sYXllcixcbiAgICAgICAgICAgIGxheWVyczogY29udGV4dC5sYXllcnMsXG4gICAgICAgICAgICB0aWxlOiB0aGlzLnRpbGVzW3RpbGUua2V5XS50aWxlXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yLmNvbG9yO1xuICAgIH1cblxuICAgIHN0YXRpYyByZXNldCgpIHtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLm1hcCA9IHt9O1xuICAgICAgICB0aGlzLm1hcF9zaXplID0gMDtcbiAgICAgICAgdGhpcy5tYXBfZW50cnkgPSAwO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhclRpbGUoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLnRpbGVzW2tleV0pIHtcbiAgICAgICAgICAgIHRoaXMudGlsZXNba2V5XS5lbnRyaWVzLmZvckVhY2goayA9PiBkZWxldGUgdGhpcy5tYXBba10pO1xuICAgICAgICAgICAgdGhpcy5tYXBfc2l6ZSAtPSB0aGlzLnRpbGVzW2tleV0uZW50cmllcy5sZW5ndGg7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy50aWxlc1trZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldE1hcFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcF9zaXplO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXRQcmVmaXgocHJlZml4KSB7XG4gICAgICAgIHRoaXMubWFwX3ByZWZpeCA9IHByZWZpeDtcbiAgICB9XG5cbn1cblxuLy8gU3RhdGljIHByb3BlcnRpZXNcbkZlYXR1cmVTZWxlY3Rpb24ubWFwID0ge307ICAgLy8gdGhpcyB3aWxsIGJlIHVuaXF1ZSBwZXIgbW9kdWxlIGluc3RhbmNlIChzbyB1bmlxdWUgcGVyIHdvcmtlcilcbkZlYXR1cmVTZWxlY3Rpb24udGlsZXMgPSB7fTsgLy8gc2VsZWN0aW9uIGtleXMsIGJ5IHRpbGVcbkZlYXR1cmVTZWxlY3Rpb24ubWFwX3NpemUgPSAwO1xuRmVhdHVyZVNlbGVjdGlvbi5tYXBfZW50cnkgPSAwO1xuRmVhdHVyZVNlbGVjdGlvbi5tYXBfcHJlZml4ID0gMDsgLy8gc2V0IGJ5IHdvcmtlciB0byB3b3JrZXIgaWQgI1xuRmVhdHVyZVNlbGVjdGlvbi5kZWZhdWx0Q29sb3IgPSBbMCwgMCwgMCwgMV07XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUgKi9cbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCB7TWV0aG9kTm90SW1wbGVtZW50ZWR9IGZyb20gJy4uL3V0aWxzL2Vycm9ycyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0ICogYXMgVVJMcyBmcm9tICcuLi91dGlscy91cmxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0YVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoY29uZmlnLCBzb3VyY2VzKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOyAvLyBzYXZlIG9yaWdpbmFsIGNvbmZpZ1xuICAgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzOyAvLyBmdWxsIHNldCBvZiBkYXRhIHNvdXJjZXMgVE9ETzogY2VudHJhbGl6ZSB0aGVzZSBsaWtlIHRleHR1cmVzP1xuICAgICAgICB0aGlzLmlkID0gY29uZmlnLmlkO1xuICAgICAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICAgICAgdGhpcy5wYWRfc2NhbGUgPSBjb25maWcucGFkX3NjYWxlIHx8IDAuMDAwMTsgLy8gc2NhbGUgdGlsZSB1cCBieSBzbWFsbCBmYWN0b3IgdG8gY292ZXIgc2VhbXNcbiAgICAgICAgdGhpcy5kZWZhdWx0X3dpbmRpbmcgPSBudWxsOyAvLyB3aW5kaW5nIG9yZGVyIHdpbGwgYWRhcHQgdG8gZGF0YSBzb3VyY2VcbiAgICAgICAgdGhpcy5yYXN0ZXJzID0gW107IC8vIGF0dGFjaGVkIHJhc3RlciB0aWxlIHNvdXJjZXNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnJhc3RlcnMpKSB7IC8vIGNvcHkgdW5pcXVlIHNldCBvZiByYXN0ZXIgc291cmNlc1xuICAgICAgICAgICAgY29uZmlnLnJhc3RlcnMuZm9yRWFjaChyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yYXN0ZXJzLmluZGV4T2YocikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmFzdGVycy5wdXNoKHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHNvdXJjZSBkYXRhXG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gY29uZmlnLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uYmluZCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25cbiAgICAgICAgdGhpcy5leHRyYV9kYXRhID0gY29uZmlnLmV4dHJhX2RhdGE7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBzY3JpcHRzIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb25cbiAgICAgICAgLy8gTk9URTogdGhlc2UgYXJlIGxvYWRlZCBhbG9uZ3NpZGUgdGhlIGxpYnJhcnkgd2hlbiB0aGUgd29ya2VycyBhcmUgaW5zdGFudGlhdGVkXG4gICAgICAgIHRoaXMuc2NyaXB0cyA9IGNvbmZpZy5zY3JpcHRzO1xuXG4gICAgICAgIC8vIG92ZXJ6b29tIHdpbGwgYXBwbHkgZm9yIHpvb21zIGhpZ2hlciB0aGFuIHRoaXNcbiAgICAgICAgdGhpcy5tYXhfem9vbSA9IChjb25maWcubWF4X3pvb20gIT0gbnVsbCkgPyBjb25maWcubWF4X3pvb20gOiBHZW8uZGVmYXVsdF9zb3VyY2VfbWF4X3pvb207XG5cbiAgICAgICAgLy8gbm8gdGlsZXMgd2lsbCBiZSByZXF1ZXN0ZWQgb3IgZGlzcGxheWVkIG91dHNpZGUgb2YgdGhlc2UgbWluL21heCB2YWx1ZXNcbiAgICAgICAgdGhpcy5taW5fZGlzcGxheV96b29tID0gKGNvbmZpZy5taW5fZGlzcGxheV96b29tICE9IG51bGwpID8gY29uZmlnLm1pbl9kaXNwbGF5X3pvb20gOiAwO1xuICAgICAgICB0aGlzLm1heF9kaXNwbGF5X3pvb20gPSAoY29uZmlnLm1heF9kaXNwbGF5X3pvb20gIT0gbnVsbCkgPyBjb25maWcubWF4X2Rpc3BsYXlfem9vbSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgdGlsZSBzb3VyY2UgYnkgdHlwZSwgZmFjdG9yeS1zdHlsZVxuICAgIHN0YXRpYyBjcmVhdGUgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBpZiAoRGF0YVNvdXJjZS50eXBlc1tzb3VyY2UudHlwZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZS50eXBlc1tzb3VyY2UudHlwZV0oc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvbiBjaGFuZ2VkXG4gICAgc3RhdGljIGNoYW5nZWQgKHNvdXJjZSwgcHJldl9zb3VyY2UpIHtcbiAgICAgICAgaWYgKCFzb3VyY2UgfHwgIXByZXZfc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjdXIgPSBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2UuY29uZmlnLCB7IGlkOiBudWxsIH0pOyAvLyBudWxsIG91dCBpZHMgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBjb21wYXJlIHRoZW1cbiAgICAgICAgbGV0IHByZXYgPSBPYmplY3QuYXNzaWduKHt9LCBwcmV2X3NvdXJjZS5jb25maWcsIHsgaWQ6IG51bGwgfSk7XG5cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGN1cikgIT09IEpTT04uc3RyaW5naWZ5KHByZXYpO1xuICAgIH1cblxuICAgIC8vIE1lcmNhdG9yIHByb2plY3Rpb25cbiAgICBzdGF0aWMgcHJvamVjdERhdGEgKHNvdXJjZSkge1xuICAgICAgICB2YXIgdGltZXIgPSArbmV3IERhdGUoKTtcbiAgICAgICAgZm9yICh2YXIgdCBpbiBzb3VyY2UubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbnVtX2ZlYXR1cmVzID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBudW1fZmVhdHVyZXM7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgW3gsIHldID0gR2VvLmxhdExuZ1RvTWV0ZXJzKGNvb3JkKTtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMF0gPSB4O1xuICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IHk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc291cmNlLmRlYnVnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNvdXJjZS5kZWJ1Zy5wcm9qZWN0aW9uID0gK25ldyBEYXRlKCkgLSB0aW1lcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICBSZS1zY2FsZSBnZW9tZXRyaWVzIHdpdGhpbiBlYWNoIHNvdXJjZSB0byBpbnRlcm5hbCB0aWxlIHVuaXRzXG4gICAgKi9cbiAgICBzdGF0aWMgc2NhbGVEYXRhIChzb3VyY2UsIHtjb29yZHM6IHt6fSwgbWluLCBtYXh9KSB7XG4gICAgICAgIGxldCB1bml0c19wZXJfbWV0ZXIgPSBHZW8udW5pdHNQZXJNZXRlcih6KTtcbiAgICAgICAgZm9yICh2YXIgdCBpbiBzb3VyY2UubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbnVtX2ZlYXR1cmVzID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBudW1fZmVhdHVyZXM7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gc291cmNlLmxheWVyc1t0XS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb29yZFswXSA9IChjb29yZFswXSAtIG1pbi54KSAqIHVuaXRzX3Blcl9tZXRlcjtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSAoY29vcmRbMV0gLSBtaW4ueSkgKiB1bml0c19wZXJfbWV0ZXIgKiAtMTsgLy8gZmxpcCBjb29yZHMgcG9zaXRpdmVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWQoZGVzdCkge1xuICAgICAgICBkZXN0LnNvdXJjZV9kYXRhID0ge307XG4gICAgICAgIGRlc3Quc291cmNlX2RhdGEubGF5ZXJzID0ge307XG4gICAgICAgIGRlc3QucGFkX3NjYWxlID0gdGhpcy5wYWRfc2NhbGU7XG4gICAgICAgIGRlc3QucmFzdGVycyA9IFsuLi50aGlzLnJhc3RlcnNdOyAvLyBjb3B5IGxpc3Qgb2YgcmFzdGVycyB0byBsb2FkIGZvciB0aWxlXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWQoZGVzdCkudGhlbigoZGVzdCkgPT4ge1xuICAgICAgICAgICAgLy8gUG9zdC1wcm9jZXNzaW5nXG4gICAgICAgICAgICBmb3IgKGxldCBsYXllciBpbiBkZXN0LnNvdXJjZV9kYXRhLmxheWVycykge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gZGVzdC5zb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuZmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5mZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgR2VvLnRyYW5zZm9ybUdlb21ldHJ5KGZlYXR1cmUuZ2VvbWV0cnksIGNvb3JkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGbGlwIFkgY29vcmRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRbMV0gPSAtY29vcmRbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTbGlnaHRseSBzY2FsZSB1cCB0aWxlIHRvIGNvdmVyIHNlYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFkX3NjYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWzBdID0gTWF0aC5yb3VuZChjb29yZFswXSAqICgxICsgdGhpcy5wYWRfc2NhbGUpIC0gKEdlby50aWxlX3NjYWxlICogdGhpcy5wYWRfc2NhbGUvMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IE1hdGgucm91bmQoY29vcmRbMV0gKiAoMSArIHRoaXMucGFkX3NjYWxlKSAtIChHZW8udGlsZV9zY2FsZSAqIHRoaXMucGFkX3NjYWxlLzIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGZpcnN0IGVuY291bnRlcmVkIHBvbHlnb24gd2luZGluZyBvcmRlciBhcyBkZWZhdWx0IGZvciBkYXRhIHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEZWZhdWx0V2luZGluZyhmZWF0dXJlLmdlb21ldHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZXN0LmRlZmF1bHRfd2luZGluZyA9IHRoaXMuZGVmYXVsdF93aW5kaW5nIHx8ICdDQ1cnO1xuICAgICAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN1Yi1jbGFzc2VzIG11c3QgaW1wbGVtZW50XG4gICAgX2xvYWQoZGVzdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ19sb2FkJyk7XG4gICAgfVxuXG4gICAgLy8gSW5mZXIgd2luZGluZyBmb3IgZGF0YSBzb3VyY2UgZnJvbSBmaXJzdCByaW5nIG9mIHByb3ZpZGVkIGdlb21ldHJ5XG4gICAgdXBkYXRlRGVmYXVsdFdpbmRpbmcgKGdlb20pIHtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdF93aW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChnZW9tLnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdF93aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKGdlb20uY29vcmRpbmF0ZXNbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZ2VvbS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdF93aW5kaW5nID0gR2VvLnJpbmdXaW5kaW5nKGdlb20uY29vcmRpbmF0ZXNbMF1bMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRfd2luZGluZztcbiAgICB9XG5cbiAgICAvLyBBbGwgZGF0YSBzb3VyY2VzIHN1cHBvcnQgYSBtaW4gem9vbSwgdGlsZWQgc291cmNlcyBjYW4gc3ViY2xhc3MgZm9yIG1vcmUgc3BlY2lmaWMgbGltaXRzIChlLmcuIGJvdW5kaW5nIGJveClcbiAgICBpbmNsdWRlc1RpbGUgKGNvb3Jkcywgc3R5bGVfem9vbSkge1xuICAgICAgICAvLyBMaW1pdCBieSB0aGlzIGRhdGEgc291cmNlXG4gICAgICAgIGlmIChjb29yZHMueiA8IHRoaXMubWluX2Rpc3BsYXlfem9vbSB8fCAodGhpcy5tYXhfZGlzcGxheV96b29tICE9IG51bGwgJiYgc3R5bGVfem9vbSA+IHRoaXMubWF4X2Rpc3BsYXlfem9vbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpbWl0IGJ5IGFueSBkZXBlbmRlbnQgcmFzdGVyIHNvdXJjZXNcbiAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgdGhpcy5yYXN0ZXJzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VfbmFtZSA9IHRoaXMucmFzdGVyc1tyXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZXNbc291cmNlX25hbWVdICYmXG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VzW3NvdXJjZV9uYW1lXSAhPT0gdGhpcyAmJlxuICAgICAgICAgICAgICAgICF0aGlzLnNvdXJjZXNbc291cmNlX25hbWVdLmluY2x1ZGVzVGlsZShjb29yZHMsIGNvb3Jkcy56KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVyIGEgbmV3IGRhdGEgc291cmNlIHR5cGUsIHVuZGVyIGEgdHlwZSBuYW1lXG4gICAgc3RhdGljIHJlZ2lzdGVyKHR5cGVfY2xhc3MsIHR5cGVfbmFtZSkge1xuICAgICAgICBpZiAoIXR5cGVfY2xhc3MgfHwgIXR5cGVfbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRGF0YVNvdXJjZS50eXBlc1t0eXBlX25hbWVdID0gdHlwZV9jbGFzcztcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS50eXBlcyA9IHt9OyAvLyBzZXQgb2Ygc3VwcG9ydGVkIGRhdGEgc291cmNlIGNsYXNzZXMsIHJlZmVyZW5jZWQgYnkgdHlwZSBuYW1lXG5cblxuLyoqKiBHZW5lcmljIG5ldHdvcmsgbG9hZGluZyBzb3VyY2UgLSBhYnN0cmFjdCBjbGFzcyAqKiovXG5cbmxldCBuZXR3b3JrX3JlcXVlc3RfaWQgPSAwOyAvLyB1c2VkIHRvIG5hbWVzcGFjZSBVUkwgcmVxdWVzdHNcblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtTb3VyY2UgZXh0ZW5kcyBEYXRhU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgdGhpcy51cmwgPSBVUkxzLmFkZFBhcmFtc1RvVVJMKHNvdXJjZS51cmwsIHNvdXJjZS51cmxfcGFyYW1zKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZV90eXBlID0gXCJcIjsgLy8gdXNlIHRvIHNldCBleHBsaWNpdCBYSFIgdHlwZVxuXG4gICAgICAgIGlmICh0aGlzLnVybCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTmV0d29yayBkYXRhIHNvdXJjZSBtdXN0IHByb3ZpZGUgYSBgdXJsYCBwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2xvYWQgKGRlc3QpIHtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuZm9ybWF0VXJsKHRoaXMudXJsLCBkZXN0KTtcblxuICAgICAgICBsZXQgc291cmNlX2RhdGEgPSBkZXN0LnNvdXJjZV9kYXRhO1xuICAgICAgICBzb3VyY2VfZGF0YS51cmwgPSB1cmw7XG4gICAgICAgIGRlc3QuZGVidWcgPSBkZXN0LmRlYnVnIHx8IHt9O1xuICAgICAgICBkZXN0LmRlYnVnLm5ldHdvcmsgPSArbmV3IERhdGUoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc291cmNlX2RhdGEuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgLy8gRm9yIHRlc3RpbmcgbmV0d29yayBlcnJvcnNcbiAgICAgICAgICAgIC8vIHZhciBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMCwgdGhpcy5yZXNwb25zZV90eXBlKTtcbiAgICAgICAgICAgIC8vIGlmIChNYXRoLnJhbmRvbSgpIDwgLjcpIHtcbiAgICAgICAgICAgIC8vICAgICBwcm9taXNlID0gUHJvbWlzZS5yZWplY3QoRXJyb3IoJ2Zha2UgZGF0YSBzb3VyY2UgZXJyb3InKSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcblxuICAgICAgICAgICAgbGV0IHJlcXVlc3RfaWQgPSAobmV0d29ya19yZXF1ZXN0X2lkKyspICsgJy0nICsgdXJsO1xuICAgICAgICAgICAgbGV0IHByb21pc2UgPSBVdGlscy5pbyh1cmwsIDYwICogMTAwMCwgdGhpcy5yZXNwb25zZV90eXBlLCAnR0VUJywge30sIHJlcXVlc3RfaWQpO1xuICAgICAgICAgICAgc291cmNlX2RhdGEucmVxdWVzdF9pZCA9IHJlcXVlc3RfaWQ7XG5cbiAgICAgICAgICAgIHByb21pc2UudGhlbigoYm9keSkgPT4ge1xuICAgICAgICAgICAgICAgIGRlc3QuZGVidWcucmVzcG9uc2Vfc2l6ZSA9IGJvZHkubGVuZ3RoIHx8IGJvZHkuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICBkZXN0LmRlYnVnLm5ldHdvcmsgPSArbmV3IERhdGUoKSAtIGRlc3QuZGVidWcubmV0d29yaztcbiAgICAgICAgICAgICAgICBkZXN0LmRlYnVnLnBhcnNpbmcgPSArbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlU291cmNlRGF0YShkZXN0LCBzb3VyY2VfZGF0YSwgYm9keSk7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5wYXJzaW5nID0gK25ldyBEYXRlKCkgLSBkZXN0LmRlYnVnLnBhcnNpbmc7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkZXN0KTtcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHNvdXJjZV9kYXRhLmVycm9yID0gZXJyb3Iuc3RhY2s7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkZXN0KTsgLy8gcmVzb2x2ZSByZXF1ZXN0IGJ1dCBwYXNzIGFsb25nIGVycm9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3ViLWNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6XG5cbiAgICBmb3JtYXRVcmwgKHVybF90ZW1wbGF0ZSwgZGVzdCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ2Zvcm1hdFVybCcpO1xuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAoZGVzdCwgc291cmNlLCByZXBvbnNlKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZCgncGFyc2VTb3VyY2VEYXRhJyk7XG4gICAgfVxufVxuXG5cbi8qKiogR2VuZXJpYyBuZXR3b3JrIHRpbGUgbG9hZGluZyAtIGFic3RyYWN0IGNsYXNzICoqKi9cblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtUaWxlU291cmNlIGV4dGVuZHMgTmV0d29ya1NvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgdGhpcy50aWxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGFyc2VCb3VuZHMoc291cmNlKTtcblxuICAgICAgICAvLyBpbmRpY2F0ZXMgaWYgc291cmNlIHNob3VsZCBidWlsZCBnZW9tZXRyeSB0aWxlcywgZW5hYmxlZCBmb3Igc291cmNlcyByZWZlcmVuY2VkIGluIHRoZSBzY2VuZSdzIGxheWVycyxcbiAgICAgICAgLy8gYW5kIGxlZnQgZGlzYWJsZWQgZm9yIHNvdXJjZXMgdGhhdCBhcmUgbmV2ZXIgcmVmZXJlbmNlZCwgb3Igb25seSB1c2VkIGFzIHJhc3RlciB0ZXh0dXJlc1xuICAgICAgICB0aGlzLmJ1aWxkc19nZW9tZXRyeV90aWxlcyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMudG1zID0gKHNvdXJjZS50bXMgPT09IHRydWUpOyAvLyBvcHRpb25hbGx5IGZsaXAgdGlsZSBjb29yZHMgZm9yIFRNU1xuICAgICAgICB0aGlzLnVybF9ob3N0cyA9IG51bGw7XG4gICAgICAgIHZhciBob3N0X21hdGNoID0gdGhpcy51cmwubWF0Y2goL3tzOlxcWyhbXn0rXSspXFxdfS8pO1xuICAgICAgICBpZiAoaG9zdF9tYXRjaCAhPSBudWxsICYmIGhvc3RfbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy51cmxfaG9zdHMgPSBob3N0X21hdGNoWzFdLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICB0aGlzLm5leHRfaG9zdCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgYm91bmRzIGZyb20gc291cmNlIGNvbmZpZyBwYXJhbWV0ZXJzXG4gICAgcGFyc2VCb3VuZHMgKHNvdXJjZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UuYm91bmRzKSAmJiBzb3VyY2UuYm91bmRzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgdGhpcy5ib3VuZHMgPSBzb3VyY2UuYm91bmRzO1xuICAgICAgICAgICAgbGV0IFt3LCBzLCBlLCBuXSA9IHRoaXMuYm91bmRzO1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNfbWV0ZXJzID0ge1xuICAgICAgICAgICAgICAgIG1pbjogR2VvLmxhdExuZ1RvTWV0ZXJzKFt3LCBuXSksXG4gICAgICAgICAgICAgICAgbWF4OiBHZW8ubGF0TG5nVG9NZXRlcnMoW2UsIHNdKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmJvdW5kc190aWxlcyA9IHsgbWluOiB7fSwgbWF4OiB7fSB9OyAvLyBtYXggdGlsZSBib3VuZHMgcGVyIHpvb20gKGxhemlseSBldmFsdWF0ZWQpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRpbGUgaXMgb3V0c2lkZSBkYXRhIHNvdXJjZSdzIGJvdW5kcywgdHJ1ZSBpZiB3aXRoaW5cbiAgICBjaGVja0JvdW5kcyAoY29vcmRzKSB7XG4gICAgICAgIC8vIENoZWNrIHRpbGUgYm91bmRzXG4gICAgICAgIGlmICh0aGlzLmJvdW5kcykge1xuICAgICAgICAgICAgY29vcmRzID0gR2VvLndyYXBUaWxlKGNvb3JkcywgeyB4OiB0cnVlIH0pO1xuXG4gICAgICAgICAgICBsZXQgbWluID0gdGhpcy5ib3VuZHNfdGlsZXMubWluW2Nvb3Jkcy56XTtcbiAgICAgICAgICAgIGlmICghbWluKSB7XG4gICAgICAgICAgICAgICAgbWluID0gdGhpcy5ib3VuZHNfdGlsZXMubWluW2Nvb3Jkcy56XSA9IEdlby50aWxlRm9yTWV0ZXJzKHRoaXMuYm91bmRzX21ldGVycy5taW4sIGNvb3Jkcy56KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IG1heCA9IHRoaXMuYm91bmRzX3RpbGVzLm1heFtjb29yZHMuel07XG4gICAgICAgICAgICBpZiAoIW1heCkge1xuICAgICAgICAgICAgICAgIG1heCA9IHRoaXMuYm91bmRzX3RpbGVzLm1heFtjb29yZHMuel0gPSBHZW8udGlsZUZvck1ldGVycyh0aGlzLmJvdW5kc19tZXRlcnMubWF4LCBjb29yZHMueik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb29yZHMueCA8IG1pbi54IHx8IGNvb3Jkcy54ID4gbWF4LnggfHxcbiAgICAgICAgICAgICAgICBjb29yZHMueSA8IG1pbi55IHx8IGNvb3Jkcy55ID4gbWF4LnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaW5jbHVkZXNUaWxlIChjb29yZHMsIHN0eWxlX3pvb20pIHtcbiAgICAgICAgaWYgKCFzdXBlci5pbmNsdWRlc1RpbGUoY29vcmRzLCBzdHlsZV96b29tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGlsZSBib3VuZHNcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrQm91bmRzKGNvb3JkcykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3JtYXRVcmwodXJsX3RlbXBsYXRlLCB0aWxlKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSBHZW8ud3JhcFRpbGUodGlsZS5jb29yZHMsIHsgeDogdHJ1ZSB9KTtcblxuICAgICAgICBpZiAodGhpcy50bXMpIHtcbiAgICAgICAgICAgIGNvb3Jkcy55ID0gTWF0aC5wb3coMiwgY29vcmRzLnopIC0gMSAtIGNvb3Jkcy55OyAvLyBvcHRpb25hbGx5IGZsaXAgdGlsZSBjb29yZHMgZm9yIFRNU1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVybCA9IHVybF90ZW1wbGF0ZS5yZXBsYWNlKCd7eH0nLCBjb29yZHMueCkucmVwbGFjZSgne3l9JywgY29vcmRzLnkpLnJlcGxhY2UoJ3t6fScsIGNvb3Jkcy56KTtcblxuICAgICAgICBpZiAodGhpcy51cmxfaG9zdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoL3tzOlxcWyhbXn0rXSspXFxdfS8sIHRoaXMudXJsX2hvc3RzW3RoaXMubmV4dF9ob3N0XSk7XG4gICAgICAgICAgICB0aGlzLm5leHRfaG9zdCA9ICh0aGlzLm5leHRfaG9zdCArIDEpICUgdGhpcy51cmxfaG9zdHMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2tzIGZvciB0aGUgeC95L3ogdGlsZSBwYXR0ZXJuIGluIFVSTCB0ZW1wbGF0ZVxuICAgIHVybEhhc1RpbGVQYXR0ZXJuKHVybCkge1xuICAgICAgICByZXR1cm4gdXJsICYmXG4gICAgICAgICAgICB1cmwuc2VhcmNoKCd7eH0nKSA+IC0xICYmXG4gICAgICAgICAgICB1cmwuc2VhcmNoKCd7eX0nKSA+IC0xICYmXG4gICAgICAgICAgICB1cmwuc2VhcmNoKCd7en0nKSA+IC0xO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IERhdGFTb3VyY2UsIHtOZXR3b3JrU291cmNlLCBOZXR3b3JrVGlsZVNvdXJjZX0gZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQge2RlY29kZU11bHRpUG9seWdvbn0gZnJvbSAnLi9tdnQnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG4vLyBGb3IgdGlsaW5nIEdlb0pTT04gY2xpZW50LXNpZGVcbmltcG9ydCBnZW9qc29udnQgZnJvbSAnZ2VvanNvbi12dCc7XG5cbi8qKlxuIEdlb0pTT04gc3RhbmRhbG9uZSAobm9uLXRpbGVkKSBzb3VyY2VcbiBVc2VzIGdlb2pzb24tdnQgc3BsaXQgaW50byB0aWxlcyBjbGllbnQtc2lkZVxuKi9cblxuZXhwb3J0IGNsYXNzIEdlb0pTT05Tb3VyY2UgZXh0ZW5kcyBOZXR3b3JrU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuICAgICAgICB0aGlzLmxvYWRfZGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMudGlsZV9pbmRleGVzID0ge307IC8vIGdlb2pzb24tdnQgdGlsZSBpbmRpY2VzLCBieSBsYXllciBuYW1lXG4gICAgICAgIHRoaXMubWF4X3pvb20gPSBNYXRoLm1heCh0aGlzLm1heF96b29tIHx8IDAsIDE1KTsgLy8gVE9ETzogbWF4IHpvb20gPCAxNSBjYXVzZXMgYXJ0aWZhY3RzL25vLWRyYXcgYXQgMjAsIGludmVzdGlnYXRlXG4gICAgICAgIHRoaXMucGFkX3NjYWxlID0gMDsgLy8gd2UgZG9uJ3Qgd2FudCBwYWRkaW5nIG9uIGF1dG8tdGlsZWQgc291cmNlc1xuICAgIH1cblxuICAgIF9sb2FkKGRlc3QpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkX2RhdGEgPSBzdXBlci5fbG9hZCh7IHNvdXJjZV9kYXRhOiB7IGxheWVyczoge30gfSB9KS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFdhcm4gYW5kIGNvbnRpbnVlIG9uIGRhdGEgc291cmNlIGVycm9yXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuc291cmNlX2RhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYGRhdGEgc291cmNlIGxvYWQgZXJyb3IocykgZm9yIHNvdXJjZSAnJHt0aGlzLm5hbWV9JywgVVJMICcke3RoaXMudXJsfSc6ICR7ZGF0YS5zb3VyY2VfZGF0YS5lcnJvcn1gKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbGF5ZXJzID0gZGF0YS5zb3VyY2VfZGF0YS5sYXllcnM7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbGF5ZXJfbmFtZSBpbiBsYXllcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aWxlX2luZGV4ZXNbbGF5ZXJfbmFtZV0gPSBnZW9qc29udnQobGF5ZXJzW2xheWVyX25hbWVdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhab29tOiB0aGlzLm1heF96b29tLCAgLy8gbWF4IHpvb20gdG8gcHJlc2VydmUgZGV0YWlsIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2xlcmFuY2U6IDMsIC8vIHNpbXBsaWZpY2F0aW9uIHRvbGVyYW5jZSAoaGlnaGVyIG1lYW5zIHNpbXBsZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnQ6IEdlby50aWxlX3NjYWxlLCAvLyB0aWxlIGV4dGVudCAoYm90aCB3aWR0aCBhbmQgaGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiAwLjAwMDEgICAgIC8vIHRpbGUgYnVmZmVyIG9uIGVhY2ggc2lkZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRfZGF0YS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGxheWVyX25hbWUgaW4gdGhpcy50aWxlX2luZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICBkZXN0LnNvdXJjZV9kYXRhLmxheWVyc1tsYXllcl9uYW1lXSA9IHRoaXMuZ2V0VGlsZUZlYXR1cmVzKGRlc3QsIGxheWVyX25hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFRpbGVGZWF0dXJlcyh0aWxlLCBsYXllcl9uYW1lKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSBHZW8ud3JhcFRpbGUodGlsZS5jb29yZHMsIHsgeDogdHJ1ZSB9KTtcblxuICAgICAgICAvLyByZXF1ZXN0IGEgcGFydGljdWxhciB0aWxlXG4gICAgICAgIGxldCB0ID0gdGhpcy50aWxlX2luZGV4ZXNbbGF5ZXJfbmFtZV0uZ2V0VGlsZShjb29yZHMueiwgY29vcmRzLngsIGNvb3Jkcy55KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGZyb20gTVZULXN0eWxlIEpTT04gc3RydWN0IHRvIEdlb0pTT05cbiAgICAgICAgbGV0IGNvbGxlY3Rpb247XG4gICAgICAgIGlmICh0ICYmIHQuZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICBmZWF0dXJlczogW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IHQuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gdC5mZWF0dXJlc1tpXTtcblxuICAgICAgICAgICAgICAgIC8vIEdlb0pTT04gZmVhdHVyZVxuICAgICAgICAgICAgICAgIGxldCBmID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS50YWdzXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLnR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS5jb29yZGluYXRlcyA9IGZlYXR1cmUuZ2VvbWV0cnkubWFwKGNvb3JkID0+IFtjb29yZFswXSwgY29vcmRbMV1dKTtcbiAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS50eXBlID0gJ011bHRpUG9pbnQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09IDIgfHwgZmVhdHVyZS50eXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5Lm1hcChyaW5nID0+XG4gICAgICAgICAgICAgICAgICAgICAgICByaW5nLm1hcChjb29yZCA9PiBbY29vcmRbMF0sIGNvb3JkWzFdXSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS50eXBlID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5LnR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5ID0gZGVjb2RlTXVsdGlQb2x5Z29uKGYuZ2VvbWV0cnkpOyAvLyB1bi1mbGF0dGVuIHJpbmdzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5nZW9tZXRyeSA9PSBudWxsKSB7IC8vIHNraXAgcG9seXMgdGhhdCBjb3VsZG4ndCBiZSBkZWNvZGVkIChlLmcuIGRlZ2VuZXJhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uZmVhdHVyZXMucHVzaChmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cblxuICAgIGZvcm1hdFVybCAoZGVzdCkge1xuICAgICAgICByZXR1cm4gdGhpcy51cmw7XG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBwYXJzZWRfcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgbGV0IGxheWVycyA9IHRoaXMuZ2V0TGF5ZXJzKHBhcnNlZF9yZXNwb25zZSk7XG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSB0aGlzLnByZXByb2Nlc3NMYXllcnMobGF5ZXJzKTtcbiAgICB9XG5cbiAgICBwcmVwcm9jZXNzTGF5ZXJzIChsYXllcnMpe1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gbGF5ZXJzKSB7XG4gICAgICAgICAgICBsZXQgbGF5ZXIgPSBsYXllcnNba2V5XTtcbiAgICAgICAgICAgIHRoaXMucHJlcHJvY2Vzc0ZlYXR1cmVzKGxheWVyLmZlYXR1cmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IG9wdGlvbmFsIGRhdGEgdHJhbnNmb3JtXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhsYXllcnMpLmxlbmd0aCA9PT0gMSAmJiBsYXllcnMuX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMuX2RlZmF1bHQgPSB0aGlzLnRyYW5zZm9ybShsYXllcnMuX2RlZmF1bHQsIHRoaXMuZXh0cmFfZGF0YSk7IC8vIHNpbmdsZS1sYXllclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzID0gdGhpcy50cmFuc2Zvcm0obGF5ZXJzLCB0aGlzLmV4dHJhX2RhdGEpOyAvLyBtdWx0aXBsZSBsYXllcnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgLy8gUHJlcHJvY2VzcyBmZWF0dXJlcy4gQ3VycmVudGx5IHVzZWQgdG8gYWRkIGEgbmV3IFwiY2VudHJvaWRcIiBmZWF0dXJlIGZvciBwb2x5Z29uIGxhYmVsaW5nXG4gICAgcHJlcHJvY2Vzc0ZlYXR1cmVzIChmZWF0dXJlcykge1xuICAgICAgICAvLyBEZWZpbmUgY2VudHJvaWRzIGZvciBwb2x5Z29ucyBmb3IgY2VudHJvaWQgbGFiZWwgcGxhY2VtZW50XG4gICAgICAgIC8vIEF2b2lkcyByZWR1bmRhbnQgbGFiZWwgcGxhY2VtZW50IGZvciBlYWNoIGdlbmVyYXRlZCB0aWxlIGF0IGhpZ2hlciB6b29tIGxldmVsc1xuICAgICAgICBpZiAodGhpcy5jb25maWcuZ2VuZXJhdGVfbGFiZWxfY2VudHJvaWRzKXtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlc19jZW50cm9pZCA9IFtdO1xuICAgICAgICAgICAgbGV0IGNlbnRyb2lkX3Byb3BlcnRpZXMgPSB7XCJsYWJlbF9wbGFjZW1lbnRcIiA6IHRydWV9O1xuXG4gICAgICAgICAgICBmZWF0dXJlcy5mb3JFYWNoKGZlYXR1cmUgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjb29yZGluYXRlcywgY2VudHJvaWRfZmVhdHVyZTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZlYXR1cmUuZ2VvbWV0cnkudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdQb2x5Z29uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRyb2lkX2ZlYXR1cmUgPSBnZXRDZW50cm9pZEZlYXR1cmVGb3JQb2x5Z29uKGNvb3JkaW5hdGVzLCBmZWF0dXJlLnByb3BlcnRpZXMsIGNlbnRyb2lkX3Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXNfY2VudHJvaWQucHVzaChjZW50cm9pZF9mZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGNlbnRyb2lkIGZlYXR1cmUgZm9yIGxhcmdlc3QgcG9seWdvblxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heF9hcmVhID0gLUluZmluaXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1heF9hcmVhX2luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb29yZGluYXRlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJlYSA9IEdlby5wb2x5Z29uQXJlYShjb29yZGluYXRlc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmVhID4gbWF4X2FyZWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FyZWEgPSBhcmVhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYXJlYV9pbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRyb2lkX2ZlYXR1cmUgPSBnZXRDZW50cm9pZEZlYXR1cmVGb3JQb2x5Z29uKGNvb3JkaW5hdGVzW21heF9hcmVhX2luZGV4XSwgZmVhdHVyZS5wcm9wZXJ0aWVzLCBjZW50cm9pZF9wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzX2NlbnRyb2lkLnB1c2goY2VudHJvaWRfZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gYXBwZW5kIGNlbnRyb2lkIGZlYXR1cmVzIHRvIGZlYXR1cmVzIGFycmF5XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShmZWF0dXJlcywgZmVhdHVyZXNfY2VudHJvaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzO1xuICAgIH1cblxuICAgIC8vIERldGVjdCBzaW5nbGUgb3IgbXVsdGlwbGUgbGF5ZXJzIGluIHJldHVybmVkIGRhdGFcbiAgICBnZXRMYXllcnMgKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF9kZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbZGF0YV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfZGVmYXVsdDogZGF0YVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbi8qKlxuIEdlb0pTT04gdmVjdG9yIHRpbGVzXG4gQGNsYXNzIEdlb0pTT05UaWxlU291cmNlXG4qL1xuZXhwb3J0IGNsYXNzIEdlb0pTT05UaWxlU291cmNlIGV4dGVuZHMgTmV0d29ya1RpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIFVSTCB0aWxlIHBhdHRlcm4sIGlmIG5vdCBmb3VuZCwgdHJlYXQgYXMgc3RhbmRhbG9uZSBHZW9KU09OL1RvcG9KU09OIG9iamVjdFxuICAgICAgICBpZiAoIXRoaXMudXJsSGFzVGlsZVBhdHRlcm4odGhpcy51cmwpKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpbnN0YW5jZSB0eXBlIGZyb20gcGFyZW50IGNsYXNzXG4gICAgICAgICAgICBpZiAoc291cmNlLnR5cGUgPT09ICdHZW9KU09OJykge1xuICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgaW5zdGFuY2UgdHlwZVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR2VvSlNPTlNvdXJjZShzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUGFzcyBiYWNrIHRvIHBhcmVudCBjbGFzcyB0byBpbnN0YW50aWF0ZVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnByZXBhcmVHZW9KU09OKGRhdGEsIHRpbGUsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgcHJlcGFyZUdlb0pTT04gKGRhdGEsIHRpbGUsIHNvdXJjZSkge1xuICAgICAgICAvLyBBcHBseSBvcHRpb25hbCBkYXRhIHRyYW5zZm9ybVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy50cmFuc2Zvcm0oZGF0YSwgdGhpcy5leHRyYV9kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSBHZW9KU09OU291cmNlLnByb3RvdHlwZS5nZXRMYXllcnMoZGF0YSk7XG5cbiAgICAgICAgLy8gQSBcInN5bnRoZXRpY1wiIHRpbGUgdGhhdCBhZGp1c3RzIHRoZSB0aWxlIG1pbiBhbmNob3IgdG8gYWNjb3VudCBmb3IgdGlsZSBsb25naXR1ZGUgd3JhcHBpbmdcbiAgICAgICAgbGV0IGFuY2hvciA9IHtcbiAgICAgICAgICAgIGNvb3JkczogdGlsZS5jb29yZHMsXG4gICAgICAgICAgICBtaW46IEdlby5tZXRlcnNGb3JUaWxlKEdlby53cmFwVGlsZSh0aWxlLmNvb3JkcywgeyB4OiB0cnVlIH0pKVxuICAgICAgICB9O1xuXG4gICAgICAgIERhdGFTb3VyY2UucHJvamVjdERhdGEoc291cmNlKTsgLy8gbWVyY2F0b3IgcHJvamVjdGlvblxuICAgICAgICBEYXRhU291cmNlLnNjYWxlRGF0YShzb3VyY2UsIGFuY2hvcik7IC8vIHJlLXNjYWxlIGZyb20gbWV0ZXJzIHRvIGxvY2FsIHRpbGUgY29vcmRzXG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoR2VvSlNPTlRpbGVTb3VyY2UsICdHZW9KU09OJyk7ICAgICAgLy8gcHJlZmVyZWQgc2hvcnRlciBuYW1lXG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgY2VudHJvaWQgcG9pbnQgZmVhdHVyZSBmcm9tIHBvbHlnb24gY29vcmRpbmF0ZXMgYW5kIHByb3ZpZGVkIGZlYXR1cmUgbWV0YS1kYXRhXG5mdW5jdGlvbiBnZXRDZW50cm9pZEZlYXR1cmVGb3JQb2x5Z29uIChjb29yZGluYXRlcywgcHJvcGVydGllcywgbmV3UHJvcGVydGllcykge1xuICAgIGxldCBjZW50cm9pZCA9IEdlby5jZW50cm9pZChjb29yZGluYXRlcyk7XG5cbiAgICAvLyBjbG9uZSBwcm9wZXJ0aWVzIGFuZCBtaXhpeCBuZXdQcm9wZXJ0aWVzXG4gICAgbGV0IGNlbnRyb2lkX3Byb3BlcnRpZXMgPSB7fTtcbiAgICBPYmplY3QuYXNzaWduKGNlbnRyb2lkX3Byb3BlcnRpZXMsIHByb3BlcnRpZXMsIG5ld1Byb3BlcnRpZXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICAgIHByb3BlcnRpZXM6IGNlbnRyb2lkX3Byb3BlcnRpZXMsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiBcIlBvaW50XCIsXG4gICAgICAgICAgICBjb29yZGluYXRlczogY2VudHJvaWRcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCJpbXBvcnQgRGF0YVNvdXJjZSwge05ldHdvcmtUaWxlU291cmNlfSBmcm9tICcuL2RhdGFfc291cmNlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuaW1wb3J0IFBiZiBmcm9tICdwYmYnO1xuaW1wb3J0IHtWZWN0b3JUaWxlLCBWZWN0b3JUaWxlRmVhdHVyZX0gZnJvbSAndmVjdG9yLXRpbGUnO1xuXG4vKipcbiBNYXBib3ggVmVjdG9yIFRpbGUgZm9ybWF0XG4gQGNsYXNzIE1WVFNvdXJjZVxuKi9cbmV4cG9ydCBjbGFzcyBNVlRTb3VyY2UgZXh0ZW5kcyBOZXR3b3JrVGlsZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VfdHlwZSA9IFwiYXJyYXlidWZmZXJcIjsgLy8gYmluYXJ5IGRhdGFcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgLy8gQ29udmVydCBNYXBib3ggdmVjdG9yIHRpbGUgdG8gR2VvSlNPTlxuICAgICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKTtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBQYmYoZGF0YSk7XG4gICAgICAgIHNvdXJjZS5kYXRhID0gbmV3IFZlY3RvclRpbGUoYnVmZmVyKTtcbiAgICAgICAgc291cmNlLmxheWVycyA9IHRoaXMudG9HZW9KU09OKHNvdXJjZS5kYXRhKTtcblxuICAgICAgICAvLyBBcHBseSBvcHRpb25hbCBkYXRhIHRyYW5zZm9ybVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzb3VyY2UubGF5ZXJzID0gdGhpcy50cmFuc2Zvcm0oc291cmNlLmxheWVycywgdGhpcy5leHRyYV9kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBzb3VyY2UuZGF0YTsgLy8gY29tbWVudCBvdXQgdG8gc2F2ZSByYXcgZGF0YSBmb3IgZGVidWdnaW5nXG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGxheWVycy9mZWF0dXJlcyB1c2luZyBNYXBib3ggbGliIEFQSSwgY29udmVydCB0byBHZW9KU09OIGZlYXR1cmVzXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBrZXlzIGZvciBlYWNoIGxheWVyLCBlLmcuIHsgbGF5ZXI6IGdlb2pzb24gfVxuICAgIHRvR2VvSlNPTiAodGlsZSkge1xuICAgICAgICB2YXIgbGF5ZXJzID0ge307XG4gICAgICAgIGZvciAodmFyIGwgaW4gdGlsZS5sYXllcnMpIHtcbiAgICAgICAgICAgIHZhciBsYXllciA9IHRpbGUubGF5ZXJzW2xdO1xuICAgICAgICAgICAgdmFyIHNjYWxlID0gR2VvLnRpbGVfc2NhbGUgLyBsYXllci5leHRlbnQ7XG4gICAgICAgICAgICB2YXIgbGF5ZXJfZ2VvanNvbiA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yICh2YXIgZj0wOyBmIDwgbGF5ZXIubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZSA9IGxheWVyLmZlYXR1cmUoZik7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmVfZ2VvanNvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeToge30sXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlX2dlb2pzb24uZ2VvbWV0cnk7XG4gICAgICAgICAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0gZmVhdHVyZS5sb2FkR2VvbWV0cnkoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByPTA7IHIgPCBjb29yZGluYXRlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmluZyA9IGNvb3JkaW5hdGVzW3JdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTA7IGMgPCByaW5nLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByaW5nW2NdID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10ueCAqIHNjYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10ueSAqIHNjYWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7XG5cbiAgICAgICAgICAgICAgICBpZiAoVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbZmVhdHVyZS50eXBlXSA9PT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS50eXBlID0gJ1BvaW50JztcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBnZW9tZXRyeS5jb29yZGluYXRlc1swXVswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbZmVhdHVyZS50eXBlXSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPSAnTGluZVN0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkudHlwZSA9ICdNdWx0aUxpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IGRlY29kZU11bHRpUG9seWdvbihnZW9tZXRyeSk7IC8vIHVuLWZsYXR0ZW4gcmluZ3NcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsYXllcl9nZW9qc29uLmZlYXR1cmVzLnB1c2goZmVhdHVyZV9nZW9qc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxheWVyc1tsXSA9IGxheWVyX2dlb2pzb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9XG5cbn1cblxuLy8gRGVjb2RlIG11bHRpcG9seWdvbnMsIHdoaWNoIGFyZSBlbmNvZGVkIGFzIGEgc2luZ2xlIHNldCBvZiByaW5nc1xuLy8gV2luZGluZyBvcmRlciBvZiBmaXJzdCByaW5nIGlzIGFzc3VtZWQgdG8gaW5kaWNhdGUgZXh0ZXJpb3IgcmluZyxcbi8vIHRoZSBvcHBvc2l0ZSB3aW5kaW5nIG9yZGVyIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgYSBuZXcgcG9seWdvbi5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVNdWx0aVBvbHlnb24gKGdlb20pIHtcbiAgICBsZXQgcG9seXMgPSBbXTtcbiAgICBsZXQgcG9seSA9IFtdO1xuICAgIGxldCBvdXRlcl93aW5kaW5nO1xuICAgIGZvciAobGV0IHI9MDsgciA8IGdlb20uY29vcmRpbmF0ZXMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgbGV0IHJpbmcgPSBnZW9tLmNvb3JkaW5hdGVzW3JdO1xuICAgICAgICBsZXQgd2luZGluZyA9IEdlby5yaW5nV2luZGluZyhyaW5nKTtcbiAgICAgICAgaWYgKHdpbmRpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgemVyby1hcmVhIHJpbmdzXG4gICAgICAgIH1cblxuICAgICAgICBvdXRlcl93aW5kaW5nID0gb3V0ZXJfd2luZGluZyB8fCB3aW5kaW5nOyAvLyBhc3N1bWUgZmlyc3QgcmluZyBpbmRpY2F0ZXMgb3V0ZXIgcmluZyB3aW5kaW5nXG5cbiAgICAgICAgaWYgKHdpbmRpbmcgPT09IG91dGVyX3dpbmRpbmcgJiYgcG9seS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwb2x5cy5wdXNoKHBvbHkpO1xuICAgICAgICAgICAgcG9seSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHBvbHkucHVzaChyaW5nKTtcbiAgICB9XG4gICAgaWYgKHBvbHkubGVuZ3RoID4gMCkge1xuICAgICAgICBwb2x5cy5wdXNoKHBvbHkpO1xuICAgIH1cblxuICAgIC8vIFNpbmdsZSBvciBtdWx0aT9cbiAgICBpZiAocG9seXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGdlb20udHlwZSA9ICdQb2x5Z29uJztcbiAgICAgICAgZ2VvbS5jb29yZGluYXRlcyA9IHBvbHlzWzBdO1xuICAgIH1cbiAgICBlbHNlIGlmIChwb2x5cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGdlb20udHlwZSA9ICdNdWx0aVBvbHlnb24nO1xuICAgICAgICBnZW9tLmNvb3JkaW5hdGVzID0gcG9seXM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBnZW9tID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2VvbTtcbn1cblxuRGF0YVNvdXJjZS5yZWdpc3RlcihNVlRTb3VyY2UsICdNVlQnKTtcbiIsImltcG9ydCBEYXRhU291cmNlLCB7TmV0d29ya1RpbGVTb3VyY2V9IGZyb20gJy4vZGF0YV9zb3VyY2UnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi4vdGlsZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmV4cG9ydCBjbGFzcyBSYXN0ZXJUaWxlU291cmNlIGV4dGVuZHMgTmV0d29ya1RpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgaWYgKHRoaXMucmFzdGVycy5pbmRleE9mKHRoaXMubmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnJhc3RlcnMudW5zaGlmdCh0aGlzLm5hbWUpOyAvLyBhZGQgdGhpcyByYXN0ZXIgYXMgdGhlIGZpcnN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSBzb3VyY2UuZmlsdGVyaW5nOyAvLyBvcHRpb25hbCB0ZXh0dXJlIGZpbHRlcmluZyAobmVhcmVzdCwgbGluZWFyLCBtaXBtYXApXG5cbiAgICAgICAgLy8gc2F2ZSB0ZXh0dXJlIG9iamVjdHMgYnkgdGlsZSBrZXksIHNvIFVSTCByZW1haW5zIHN0YWJsZSBpZiB0aWxlIGlzIGJ1aWx0IG11bHRpcGxlIHRpbWVzLFxuICAgICAgICAvLyBlLmcuIGF2b2lkIHJlLWxvYWRpbmcgdGhlIHNhbWUgdGlsZSB0ZXh0dXJlIHVuZGVyIGEgZGlmZmVyZW50IHN1YmRvbWFpbiB3aGVuIHVzaW5nIHRpbGUgaG9zdHNcbiAgICAgICAgdGhpcy50ZXh0dXJlcyA9IHt9O1xuICAgIH1cblxuICAgIGxvYWQodGlsZSkge1xuICAgICAgICB0aWxlLnNvdXJjZV9kYXRhID0ge307XG4gICAgICAgIHRpbGUuc291cmNlX2RhdGEubGF5ZXJzID0ge307XG4gICAgICAgIHRpbGUucGFkX3NjYWxlID0gdGhpcy5wYWRfc2NhbGU7XG4gICAgICAgIHRpbGUucmFzdGVycyA9IFsuLi50aGlzLnJhc3RlcnNdOyAvLyBjb3B5IGxpc3Qgb2YgcmFzdGVycyB0byBsb2FkIGZvciB0aWxlXG5cbiAgICAgICAgLy8gR2VuZXJhdGUgYSBzaW5nbGUgcXVhZCB0aGF0IGZpbGxzIHRoZSBlbnRpcmUgdGlsZVxuICAgICAgICBsZXQgc2NhbGUgPSBHZW8udGlsZV9zY2FsZTtcbiAgICAgICAgdGlsZS5zb3VyY2VfZGF0YS5sYXllcnMgPSB7XG4gICAgICAgICAgICBfZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IFt7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUG9seWdvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlczogW1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMCwgMF0sIFtzY2FsZSwgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NjYWxlLCAtc2NhbGVdLCBbMCwgLXNjYWxlXSwgWzAsIDBdXG4gICAgICAgICAgICAgICAgICAgICAgICBdXVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7fVxuICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGlsZS5kZWZhdWx0X3dpbmRpbmcgPSAnQ1cnO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGUpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0ZXh0dXJlIGluZm8gZm9yIGEgcmFzdGVyIHRpbGVcbiAgICB0aWxlVGV4dHVyZSAodGlsZSkge1xuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuICAgICAgICBpZiAoIXRoaXMudGV4dHVyZXNba2V5XSkge1xuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZVdpdGhNYXhab29tKHRpbGUuY29vcmRzLCB0aGlzLm1heF96b29tKTtcbiAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLmZvcm1hdFVybCh0aGlzLnVybCwgeyBjb29yZHMgfSk7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmVzW2tleV0gPSB7IHVybCwgZmlsdGVyaW5nOiB0aGlzLmZpbHRlcmluZywgY29vcmRzIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZXNba2V5XTtcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS5yZWdpc3RlcihSYXN0ZXJUaWxlU291cmNlLCAnUmFzdGVyJyk7XG4iLCJpbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL2RhdGFfc291cmNlJztcbmltcG9ydCB7R2VvSlNPTlNvdXJjZSwgR2VvSlNPTlRpbGVTb3VyY2V9IGZyb20gJy4vZ2VvanNvbic7XG5cbmltcG9ydCAqIGFzIHRvcG9qc29uIGZyb20gJ3RvcG9qc29uLWNsaWVudCc7XG5cbi8qKlxuIFRvcG9KU09OIHN0YW5kYWxvbmUgKG5vbi10aWxlZCkgc291cmNlXG4gVXNlcyBnZW9qc29uLXZ0IHNwbGl0IGludG8gdGlsZXMgY2xpZW50LXNpZGVcbiovXG5cbmV4cG9ydCBjbGFzcyBUb3BvSlNPTlNvdXJjZSBleHRlbmRzIEdlb0pTT05Tb3VyY2Uge1xuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICAgIGRhdGEgPSB0aGlzLnRvR2VvSlNPTihkYXRhKTtcblxuICAgICAgICBsZXQgbGF5ZXJzID0gdGhpcy5nZXRMYXllcnMoZGF0YSk7XG4gICAgICAgIHN1cGVyLnByZXByb2Nlc3NMYXllcnMobGF5ZXJzKTtcbiAgICAgICAgc291cmNlLmxheWVycyA9IGxheWVycztcbiAgICB9XG5cbiAgICB0b0dlb0pTT04gKGRhdGEpIHtcbiAgICAgICAgLy8gU2luZ2xlIGxheWVyXG4gICAgICAgIGlmIChkYXRhLm9iamVjdHMgJiZcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRhdGEub2JqZWN0cykubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBsZXQgbGF5ZXIgPSBPYmplY3Qua2V5cyhkYXRhLm9iamVjdHMpWzBdO1xuICAgICAgICAgICAgZGF0YSA9IGdldFRvcG9KU09ORmVhdHVyZShkYXRhLCBkYXRhLm9iamVjdHNbbGF5ZXJdKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNdWx0aXBsZSBsYXllcnNcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGF5ZXJzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YS5vYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzW2tleV0gPSBnZXRUb3BvSlNPTkZlYXR1cmUoZGF0YSwgZGF0YS5vYmplY3RzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YSA9IGxheWVycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbn1cblxuZnVuY3Rpb24gZ2V0VG9wb0pTT05GZWF0dXJlICh0b3BvbG9neSwgb2JqZWN0KSB7XG4gICAgbGV0IGZlYXR1cmUgPSB0b3BvanNvbi5mZWF0dXJlKHRvcG9sb2d5LCBvYmplY3QpO1xuXG4gICAgLy8gQ29udmVydCBzaW5nbGUgZmVhdHVyZSB0byBhIGZlYXR1cmUgY29sbGVjdGlvblxuICAgIGlmIChmZWF0dXJlLnR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICBmZWF0dXJlID0ge1xuICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgICAgICAgIGZlYXR1cmVzOiBbZmVhdHVyZV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cblxuLyoqXG4gVG9wb0pTT04gdmVjdG9yIHRpbGVzXG4gQGNsYXNzIFRvcG9KU09OVGlsZVNvdXJjZVxuKi9cbmV4cG9ydCBjbGFzcyBUb3BvSlNPTlRpbGVTb3VyY2UgZXh0ZW5kcyBHZW9KU09OVGlsZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcblxuICAgICAgICAvLyBSZXBsYWNlIHdpdGggbm9uLXRpbGVkIHNvdXJjZSBpZiB0aWxlZCBzb3VyY2UgZmFpbGVkIHRvIGluc3RhbnRpYXRlXG4gICAgICAgIGlmICghdGhpcy51cmxIYXNUaWxlUGF0dGVybih0aGlzLnVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVG9wb0pTT05Tb3VyY2Uoc291cmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICBkYXRhID0gVG9wb0pTT05Tb3VyY2UucHJvdG90eXBlLnRvR2VvSlNPTihkYXRhKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlR2VvSlNPTihkYXRhLCB0aWxlLCBzb3VyY2UpO1xuICAgIH1cblxufVxuXG5EYXRhU291cmNlLnJlZ2lzdGVyKFRvcG9KU09OVGlsZVNvdXJjZSwgJ1RvcG9KU09OJyk7ICAgICAgICAvLyBwcmVmZXJlZCBzaG9ydGVyIG5hbWVcbiIsImZ1bmN0aW9uIG5vdE51bGwoeCkgIHsgcmV0dXJuIHggIT0gbnVsbDsgfVxuZnVuY3Rpb24gd3JhcCh4KSAgICAgeyByZXR1cm4gJygnICsgeCArICcpJzt9XG5cbmZ1bmN0aW9uIG1heWJlUXVvdGUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJ1wiJyArIHZhbHVlICsgJ1wiJztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBsb29rVXAoa2V5KSB7XG4gICAgaWYgKGtleVswXSA9PT0gJyQnKSB7XG4gICAgICAgIHJldHVybiAnY29udGV4dFtcXCcnICsga2V5LnN1YnN0cmluZygxKSArICdcXCddJztcbiAgICB9XG4gICAgcmV0dXJuICdjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1tcXCcnICsga2V5ICsgJ1xcJ10nO1xufVxuXG5mdW5jdGlvbiBudWxsVmFsdWUoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiAnIHRydWUgJztcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlFcXVhbChrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHdyYXAobWF5YmVRdW90ZSh2YWx1ZSkgKyAnID09PSAnICsgbG9va1VwKGtleSkpO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eU9yKGtleSwgdmFsdWVzKSB7XG4gICAgcmV0dXJuIHdyYXAodmFsdWVzLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gcHJvcGVydHlFcXVhbChrZXksIHgpOyB9KS5qb2luKCcgfHwgJykpO1xufVxuXG5mdW5jdGlvbiBwcmludE5lc3RlZCh2YWx1ZXMsIGpvaW5lcikge1xuICAgIHJldHVybiB3cmFwKHZhbHVlcy5maWx0ZXIobm90TnVsbCkubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB3cmFwKHguam9pbignICYmICcpKTtcbiAgICB9KS5qb2luKCcgJyArIGpvaW5lciArICcgJykpO1xufVxuXG5mdW5jdGlvbiBhbnkoXywgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApID8gcHJpbnROZXN0ZWQodmFsdWVzLm1hcChmdW5jdGlvbih2KSB7IHJldHVybiBwYXJzZUZpbHRlcih2LCBvcHRpb25zKTsgfSksICd8fCcpIDogJ3RydWUnO1xufVxuXG5mdW5jdGlvbiBhbGwoXywgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApID8gcHJpbnROZXN0ZWQodmFsdWVzLm1hcChmdW5jdGlvbih2KSB7IHJldHVybiBwYXJzZUZpbHRlcih2LCBvcHRpb25zKTsgfSksICcmJicpIDogJ3RydWUnO1xufVxuXG5mdW5jdGlvbiBub3Qoa2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIHJldHVybiAnIScgKyB3cmFwKHBhcnNlRmlsdGVyKHZhbHVlLCBvcHRpb25zKS5qb2luKCcgJiYgJykpO1xufVxuXG5mdW5jdGlvbiBub25lKGtleSwgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICchJyArIHdyYXAoYW55KG51bGwsIHZhbHVlcywgb3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eU1hdGNoZXNCb29sZWFuKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd3JhcChsb29rVXAoa2V5KSArICh2YWx1ZSA/ICcgIT0gJyA6ICcgPT0gJykgICsgJ251bGwnKTtcbn1cblxuZnVuY3Rpb24gcmFuZ2VNYXRjaChrZXksIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHZhciBleHByZXNzaW9ucyA9IFtdO1xuICAgIHZhciB0cmFuc2Zvcm0gPSBvcHRpb25zICYmICh0eXBlb2Ygb3B0aW9ucy5yYW5nZVRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgJiYgb3B0aW9ucy5yYW5nZVRyYW5zZm9ybTtcblxuICAgIGlmICh2YWx1ZXMubWF4KSB7XG4gICAgICAgIHZhciBtYXggPSB0cmFuc2Zvcm0gPyB0cmFuc2Zvcm0odmFsdWVzLm1heCkgOiB2YWx1ZXMubWF4O1xuICAgICAgICBleHByZXNzaW9ucy5wdXNoKCcnICsgbG9va1VwKGtleSkgKyAnIDwgJyArIG1heCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlcy5taW4pIHtcbiAgICAgICAgdmFyIG1pbiA9IHRyYW5zZm9ybSA/IG1pbiA9IHRyYW5zZm9ybSh2YWx1ZXMubWluKSA6IHZhbHVlcy5taW47XG4gICAgICAgIGV4cHJlc3Npb25zLnB1c2goJycgKyBsb29rVXAoa2V5KSArICcgPj0gJyArIG1pbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXAoZXhwcmVzc2lvbnMuam9pbignICYmICcpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSB7XG4gICAgdmFyIGZpbHRlckFTVCA9IFtdO1xuXG4gICAgLy8gRnVuY3Rpb24gZmlsdGVyXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIFt3cmFwKGZpbHRlci50b1N0cmluZygpICsgJyhjb250ZXh0KScpXTtcbiAgICB9XG4gICAgLy8gQXJyYXkgZmlsdGVyLCBpbXBsaWNpdCAnYW55J1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICByZXR1cm4gW2FueShudWxsLCBmaWx0ZXIsIG9wdGlvbnMpXTtcbiAgICB9XG4gICAgLy8gTnVsbCBmaWx0ZXIgb2JqZWN0XG4gICAgZWxzZSBpZiAoZmlsdGVyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFsndHJ1ZSddO1xuICAgIH1cblxuICAgIC8vIE9iamVjdCBmaWx0ZXIsIGUuZy4gaW1wbGljaXQgJ2FsbCdcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZpbHRlcik7XG4gICAgZm9yICh2YXIgaz0wOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1trXTtcblxuICAgICAgICB2YXIgdmFsdWUgPSBmaWx0ZXJba2V5XSxcbiAgICAgICAgICAgIHR5cGUgID0gdHlwZW9mIHZhbHVlO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHByb3BlcnR5RXF1YWwoa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gocHJvcGVydHlNYXRjaGVzQm9vbGVhbihrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbm90Jykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gobm90KGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhbnknKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChhbnkoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKGFsbChrZXksIHZhbHVlLCBvcHRpb25zKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG5vbmUoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChwcm9wZXJ0eU9yKGtleSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUubWF4IHx8IHZhbHVlLm1pbikge1xuICAgICAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHJhbmdlTWF0Y2goa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG51bGxWYWx1ZShrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gUXVlcnkgc3l0bmF4OiAnICsgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtleXMubGVuZ3RoID09PSAwID8gWyd0cnVlJ10gOiBmaWx0ZXJBU1Q7XG59XG5cbmZ1bmN0aW9uIGZpbHRlclRvU3RyaW5nKGZpbHRlckFTVCkge1xuICAgIHJldHVybiB3cmFwKGZpbHRlckFTVC5qb2luKCcgJiYgJykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKGZpbHRlciA9PSBudWxsKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9OyB9XG4gICAgLy8ganNoaW50IGV2aWw6IHRydWVcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ3JldHVybiAnICsgZmlsdGVyVG9TdHJpbmcocGFyc2VGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSkgKyAnOycpO1xufVxuIiwiaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBtZXJnZU9iamVjdHMgZnJvbSAnLi4vdXRpbHMvbWVyZ2UnO1xuaW1wb3J0IHtidWlsZEZpbHRlcn0gZnJvbSAnLi9maWx0ZXInO1xuXG5leHBvcnQgY29uc3Qgd2hpdGVMaXN0ID0gWydmaWx0ZXInLCAnZHJhdycsICd2aXNpYmxlJywgJ2RhdGEnXTtcblxuZXhwb3J0IGNvbnN0IGxheWVyX2NhY2hlID0ge307XG5cbmZ1bmN0aW9uIGNhY2hlS2V5IChsYXllcnMpIHtcbiAgICBpZiAobGF5ZXJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdmFyIGsgPSBsYXllcnNbMF07XG4gICAgICAgIGZvciAodmFyIGk9MTsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgayArPSAnLycgKyBsYXllcnNbaV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaztcbiAgICB9XG4gICAgcmV0dXJuIGxheWVyc1swXTtcbn1cblxuLy8gTWVyZ2UgbWF0Y2hpbmcgbGF5ZXIgdHJlZXMgaW50byBhIGZpbmFsIGRyYXcgZ3JvdXBcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRyZWVzKG1hdGNoaW5nVHJlZXMsIGdyb3VwKSB7XG4gICAgbGV0IGRyYXdzLCB0cmVlRGVwdGggPSAwO1xuXG4gICAgbGV0IGRyYXcgPSB7XG4gICAgICAgIHZpc2libGU6IHRydWUgLy8gdmlzaWJsZSBieSBkZWZhdWx0XG4gICAgfTtcblxuICAgIC8vIEZpbmQgZGVlcGVzdCB0cmVlXG4gICAgZm9yIChsZXQgdD0wOyB0IDwgbWF0Y2hpbmdUcmVlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICBpZiAobWF0Y2hpbmdUcmVlc1t0XS5sZW5ndGggPiB0cmVlRGVwdGgpIHtcbiAgICAgICAgICAgIHRyZWVEZXB0aCA9IG1hdGNoaW5nVHJlZXNbdF0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gbGF5ZXJzIHRvIHBhcnNlXG4gICAgaWYgKHRyZWVEZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBJdGVyYXRlIHRyZWVzIGluIHBhcmFsbGVsXG4gICAgZm9yIChsZXQgeD0wOyB4IDwgdHJlZURlcHRoOyB4KyspIHtcbiAgICAgICAgLy8gUHVsbCBvdXQgdGhlIHJlcXVlc3RlZCBkcmF3IGdyb3VwLCBmb3IgZWFjaCB0cmVlLCBhdCB0aGlzIGRlcHRoXG4gICAgICAgIGRyYXdzID0gbWF0Y2hpbmdUcmVlcy5tYXAodHJlZSA9PiB0cmVlW3hdICYmIHRyZWVbeF1bZ3JvdXBdKTtcbiAgICAgICAgaWYgKGRyYXdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IGJ5IGxheWVyIG5hbWUgYmVmb3JlIG1lcmdpbmcsIHNvIGxheWVycyBhcmUgYXBwbGllZCBkZXRlcm1pbmlzdGljYWxseVxuICAgICAgICAvLyB3aGVuIG11bHRpcGxlIGxheWVycyBtb2RpZnkgdGhlIHNhbWUgcHJvcGVydGllc1xuICAgICAgICBkcmF3cy5zb3J0KChhLCBiKSA9PiAoYSAmJiBhLmxheWVyX25hbWUpID4gKGIgJiYgYi5sYXllcl9uYW1lKSA/IDEgOiAtMSk7XG5cbiAgICAgICAgLy8gTWVyZ2UgZHJhdyBvYmplY3RzXG4gICAgICAgIG1lcmdlT2JqZWN0cyhkcmF3LCAuLi5kcmF3cyk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGxheWVyIG5hbWVzLCB0aGV5IHdlcmUgb25seSB1c2VkIHRyYW5zaWVudGx5IHRvIHNvcnQgYW5kIGNhbGN1bGF0ZSBmaW5hbCBsYXllclxuICAgICAgICAvLyAoZmluYWwgbWVyZ2VkIG5hbWVzIHdpbGwgbm90IGJlIGFjY3VyYXRlIHNpbmNlIG9ubHkgb25lIHRyZWUgY2FuIHdpbilcbiAgICAgICAgZGVsZXRlIGRyYXcubGF5ZXJfbmFtZTtcbiAgICB9XG5cbiAgICAvLyBTaG9ydC1jaXJjdWl0IGlmIG5vdCB2aXNpYmxlXG4gICAgaWYgKGRyYXcudmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyYXc7XG59XG5cbmNvbnN0IGJsYWNrbGlzdCA9IFsnYW55JywgJ2FsbCcsICdub3QnLCAnbm9uZSddO1xuXG5jbGFzcyBMYXllciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih7IGxheWVyLCBuYW1lLCBwYXJlbnQsIGRyYXcsIHZpc2libGUsIGZpbHRlciB9KSB7XG4gICAgICAgIHRoaXMuaWQgPSBMYXllci5pZCsrO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGxheWVyO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5mdWxsX25hbWUgPSB0aGlzLnBhcmVudCA/ICh0aGlzLnBhcmVudC5mdWxsX25hbWUgKyAnOicgKyB0aGlzLm5hbWUpIDogdGhpcy5uYW1lO1xuICAgICAgICB0aGlzLmRyYXcgPSBkcmF3O1xuICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjtcbiAgICAgICAgdGhpcy5pc19idWlsdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZpc2libGUgPSB2aXNpYmxlICE9PSB1bmRlZmluZWQgPyB2aXNpYmxlIDogKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnZpc2libGUpO1xuXG4gICAgICAgIC8vIERlbm9ybWFsaXplIGxheWVyIG5hbWUgdG8gZHJhdyBncm91cHNcbiAgICAgICAgaWYgKHRoaXMuZHJhdykge1xuICAgICAgICAgICAgZm9yIChsZXQgZ3JvdXAgaW4gdGhpcy5kcmF3KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJhd1tncm91cF0gPT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5kcmF3W2dyb3VwXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBkcmF3IGdyb3VwXG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgRHJhdyBncm91cCAnJHtncm91cH0nIGZvciBsYXllciAke3RoaXMuZnVsbF9uYW1lfSBpcyBpbnZhbGlkLCBtdXN0IGJlIGFuIG9iamVjdCwgYDtcbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGBidXQgd2FzIHNldCB0byBcXGAke2dyb3VwfTogJHt0aGlzLmRyYXdbZ3JvdXBdfVxcYCBpbnN0ZWFkYDtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgbXNnKTsgLy8gVE9ETzogZmlyZSBleHRlcm5hbCBldmVudCB0aGF0IGNsaWVudHMgdG8gc3Vic2NyaWJlIHRvXG5cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZHJhd1tncm91cF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdbZ3JvdXBdLmxheWVyX25hbWUgPSB0aGlzLmZ1bGxfbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBidWlsZCAoKSB7XG4gICAgICAgIGxvZygndHJhY2UnLCBgQnVpbGRpbmcgbGF5ZXIgJyR7dGhpcy5mdWxsX25hbWV9J2ApO1xuICAgICAgICB0aGlzLmJ1aWxkRmlsdGVyKCk7XG4gICAgICAgIHRoaXMuYnVpbGREcmF3KCk7XG4gICAgICAgIHRoaXMuaXNfYnVpbHQgPSB0cnVlO1xuICAgIH1cblxuICAgIGJ1aWxkRHJhdygpIHtcbiAgICAgICAgdGhpcy5kcmF3ID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKHRoaXMuZHJhdywgU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVkRHJhdyA9IGNhbGN1bGF0ZURyYXcodGhpcyk7XG4gICAgfVxuXG4gICAgYnVpbGRGaWx0ZXIoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyX29yaWdpbmFsID0gdGhpcy5maWx0ZXI7XG4gICAgICAgIHRoaXMuZmlsdGVyID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKHRoaXMuZmlsdGVyLCBTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24pO1xuXG4gICAgICAgIGxldCB0eXBlID0gdHlwZW9mIHRoaXMuZmlsdGVyO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXIgIT0gbnVsbCAmJiB0eXBlICE9PSAnb2JqZWN0JyAmJiB0eXBlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIGZpbHRlclxuICAgICAgICAgICAgbGV0IG1zZyA9IGBGaWx0ZXIgZm9yIGxheWVyICR7dGhpcy5mdWxsX25hbWV9IGlzIGludmFsaWQsIGZpbHRlciB2YWx1ZSBtdXN0IGJlIGFuIG9iamVjdCBvciBmdW5jdGlvbiwgYDtcbiAgICAgICAgICAgIG1zZyArPSBgYnV0IHdhcyBzZXQgdG8gXFxgZmlsdGVyOiAke3RoaXMuZmlsdGVyfVxcYCBpbnN0ZWFkYDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7IC8vIFRPRE86IGZpcmUgZXh0ZXJuYWwgZXZlbnQgdGhhdCBjbGllbnRzIHRvIHN1YnNjcmliZSB0b1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRab29tcygpO1xuICAgICAgICAgICAgdGhpcy5idWlsZFByb3BNYXRjaGVzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXIgIT0gbnVsbCAmJiAodHlwZW9mIHRoaXMuZmlsdGVyID09PSAnZnVuY3Rpb24nIHx8IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gYnVpbGRGaWx0ZXIodGhpcy5maWx0ZXIsIEZpbHRlck9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgIC8vIEludmFsaWQgZmlsdGVyXG4gICAgICAgICAgICBsZXQgbXNnID0gYEZpbHRlciBmb3IgbGF5ZXIgJHt0aGlzLmZ1bGxfbmFtZX0gaXMgaW52YWxpZCwgXFxgZmlsdGVyOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuZmlsdGVyKX1cXGAgYDtcbiAgICAgICAgICAgIG1zZyArPSBgZmFpbGVkIHdpdGggZXJyb3IgJyR7ZS5tZXNzYWdlfScsIHN0YWNrIHRyYWNlOiAke2Uuc3RhY2t9YDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7IC8vIFRPRE86IGZpcmUgZXh0ZXJuYWwgZXZlbnQgdGhhdCBjbGllbnRzIHRvIHN1YnNjcmliZSB0b1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gWm9vbXMgb2Z0ZW4gY3VsbCBsYXJnZSBzd2F0aHMgb2YgdGhlIGxheWVyIHRyZWUsIHNvIHRoZXkgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGFuZCBhcmUgY2hlY2tlZCBmaXJzdFxuICAgIGJ1aWxkWm9vbXMoKSB7XG4gICAgICAgIGxldCB6b29tID0gdGhpcy5maWx0ZXIgJiYgdGhpcy5maWx0ZXIuJHpvb207XG4gICAgICAgIGxldCB6dHlwZSA9IHR5cGVvZiB6b29tO1xuICAgICAgICBpZiAoem9vbSAhPSBudWxsICYmIHp0eXBlICE9PSAnZnVuY3Rpb24nKSB7IC8vIGRvbid0IGFjY2VsZXJhdGUgZnVuY3Rpb24tYmFzZWQgZmlsdGVyc1xuICAgICAgICAgICAgdGhpcy56b29tcyA9IHt9O1xuXG4gICAgICAgICAgICBpZiAoenR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy56b29tc1t6b29tXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHpvb20pKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgej0wOyB6IDwgem9vbS5sZW5ndGg7IHorKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb21zW3pvb21bel1dID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh6dHlwZSA9PT0gJ29iamVjdCcgJiYgKHpvb20ubWluICE9IG51bGwgfHwgem9vbS5tYXggIT0gbnVsbCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgem1pbiA9IHpvb20ubWluIHx8IDA7XG4gICAgICAgICAgICAgICAgbGV0IHptYXggPSB6b29tLm1heCB8fCAyNTsgLy8gVE9ETzogcmVwbGFjZSBjb25zdGFudCBmb3IgbWF4IHBvc3NpYmxlIHpvb21cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6PXptaW47IHogPCB6bWF4OyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tc1t6XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5maWx0ZXIuJHpvb207IC8vIGRvbid0IHByb2Nlc3Mgem9vbSB0aHJvdWdoIHVzdWFsIGdlbmVyaWMgZmlsdGVyIGxvZ2ljXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBidWlsZFByb3BNYXRjaGVzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmlsdGVyIHx8IEFycmF5LmlzQXJyYXkodGhpcy5maWx0ZXIpIHx8IHR5cGVvZiB0aGlzLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXIpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmIChibGFja2xpc3QuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSB0aGlzLmZpbHRlcltrZXldO1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgICAgICAgICAgICAgICBsZXQgYXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIShhcnJheSB8fCB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChrZXlbMF0gPT09ICckJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDb250ZXh0IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXMgPSB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzLnB1c2goW2tleS5zdWJzdHJpbmcoMSksIGFycmF5ID8gdmFsIDogW3ZhbF1dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZlYXR1cmUgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlcyA9IHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMucHVzaChba2V5LCBhcnJheSA/IHZhbCA6IFt2YWxdXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsdGVyW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGRvUHJvcE1hdGNoZXMgKGNvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHI9MDsgciA8IHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzW3JdO1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1ttYXRjaFswXV07XG4gICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IG1hdGNoWzFdLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByPTA7IHIgPCB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlc1tyXTtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gY29udGV4dFttYXRjaFswXV07XG4gICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IG1hdGNoWzFdLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGRvZXNNYXRjaCAoY29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNfYnVpbHQpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHpvb20gcHJlLWZpbHRlcjogc2tpcCByZXN0IG9mIGZpbHRlciBpZiBvdXQgb2YgbGF5ZXIgem9vbSByYW5nZVxuICAgICAgICBpZiAodGhpcy56b29tcyAhPSBudWxsICYmICF0aGlzLnpvb21zW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRpcmVjdCBmZWF0dXJlIHByb3BlcnR5IG1hdGNoZXNcbiAgICAgICAgaWYgKCF0aGlzLmRvUHJvcE1hdGNoZXMoY29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFueSByZW1haW5pbmcgZmlsdGVyIChtb3JlIGNvbXBsZXggbWF0Y2hlcyBvciBkeW5hbWljIGZ1bmN0aW9uKVxuICAgICAgICBpZiAodGhpcy5maWx0ZXIgaW5zdGFuY2VvZiBGdW5jdGlvbil7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcihjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIEZpbHRlciBmdW5jdGlvbiBlcnJvclxuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgRmlsdGVyIGZvciB0aGlzICR7dGhpcy5mdWxsX25hbWV9OiBcXGBmaWx0ZXI6ICR7dGhpcy5maWx0ZXJfb3JpZ2luYWx9XFxgIGA7XG4gICAgICAgICAgICAgICAgbXNnICs9IGBmYWlsZWQgd2l0aCBlcnJvciAnJHtlcnJvci5tZXNzYWdlfScsIHN0YWNrIHRyYWNlOiAke2Vycm9yLnN0YWNrfWA7XG4gICAgICAgICAgICAgICAgbG9nKCdlcnJvcicsIG1zZywgY29udGV4dC5mZWF0dXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlciA9PSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbkxheWVyLmlkID0gMDtcblxuXG5leHBvcnQgY2xhc3MgTGF5ZXJMZWFmIGV4dGVuZHMgTGF5ZXIge1xuICAgIGNvbnN0cnVjdG9yIChjb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgdGhpcy5pc19sZWFmID0gdHJ1ZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIExheWVyVHJlZSBleHRlbmRzIExheWVyIHtcbiAgICBjb25zdHJ1Y3RvciAoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuaXNfdHJlZSA9IHRydWU7XG4gICAgICAgIHRoaXMubGF5ZXJzID0gY29uZmlnLmxheWVycyB8fCBbXTtcbiAgICB9XG5cbiAgICBhZGRMYXllciAobGF5ZXIpIHtcbiAgICAgICAgdGhpcy5sYXllcnMucHVzaChsYXllcik7XG4gICAgfVxuXG4gICAgYnVpbGREcmF3R3JvdXBzIChjb250ZXh0KSB7XG4gICAgICAgIGxldCBsYXllcnMgPSBbXSwgbGF5ZXJfaWRzID0gW107XG4gICAgICAgIG1hdGNoRmVhdHVyZShjb250ZXh0LCBbdGhpc10sIGxheWVycywgbGF5ZXJfaWRzKTtcblxuICAgICAgICBpZiAobGF5ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBjYWNoZV9rZXkgPSBjYWNoZUtleShsYXllcl9pZHMpO1xuXG4gICAgICAgICAgICAvLyBPbmx5IGV2YWx1YXRlIGVhY2ggbGF5ZXIgY29tYmluYXRpb24gb25jZSAodW5kZWZpbmVkIG1lYW5zIG5vdCB5ZXQgZXZhbHVhdGVkLFxuICAgICAgICAgICAgLy8gbnVsbCBtZWFucyBldmFsdWF0ZWQgd2l0aCBubyBkcmF3IG9iamVjdClcbiAgICAgICAgICAgIGlmIChsYXllcl9jYWNoZVtjYWNoZV9rZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIGFsbCB0aGUgdW5pcXVlIHZpc2libGUgZHJhdyBibG9ja3MgZm9yIHRoaXMgbGF5ZXIgdHJlZVxuICAgICAgICAgICAgICAgIGxldCBkcmF3X2dyb3VwcyA9IGxheWVycy5tYXAoeCA9PiB4ICYmIHgudmlzaWJsZSAhPT0gZmFsc2UgJiYgeC5jYWxjdWxhdGVkRHJhdyk7XG4gICAgICAgICAgICAgICAgbGV0IGRyYXdfa2V5cyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgZHJhd19ncm91cHMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxheWVyID0gZHJhd19ncm91cHNbcl07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGc9MDsgZyA8IGxheWVyLmxlbmd0aDsgZysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXAgPSBsYXllcltnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBncm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdfa2V5c1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBlYWNoIGRyYXcgZ3JvdXBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkcmF3X2tleSBpbiBkcmF3X2tleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSA9IGxheWVyX2NhY2hlW2NhY2hlX2tleV0gfHwge307XG4gICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldID0gbWVyZ2VUcmVlcyhkcmF3X2dyb3VwcywgZHJhd19rZXkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc2F2ZSB0aGUgb25lcyB0aGF0IHdlcmVuJ3QgbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XS5rZXkgPSBjYWNoZV9rZXkgKyAnLycgKyBkcmF3X2tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldLmxheWVycyA9IGxheWVycy5tYXAoeCA9PiB4ICYmIHguZnVsbF9uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5vIGxheWVycyBldmFsdWF0ZWRcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSAmJiBPYmplY3Qua2V5cyhsYXllcl9jYWNoZVtjYWNoZV9rZXldKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxheWVyX2NhY2hlW2NhY2hlX2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuY29uc3QgRmlsdGVyT3B0aW9ucyA9IHtcbiAgICAvLyBIYW5kbGUgdW5pdCBjb252ZXJzaW9ucyBvbiBmaWx0ZXIgcmFuZ2VzXG4gICAgcmFuZ2VUcmFuc2Zvcm0odmFsKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwudHJpbSgpLnNsaWNlKC0zKSA9PT0gJ3B4MicpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtwYXJzZUZsb2F0KHZhbCl9ICogY29udGV4dC5tZXRlcnNfcGVyX3BpeGVsX3NxYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGlzV2hpdGVMaXN0ZWQoa2V5KSB7XG4gICAgcmV0dXJuIHdoaXRlTGlzdC5pbmRleE9mKGtleSkgPiAtMTtcbn1cblxuZnVuY3Rpb24gaXNFbXB0eShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncm91cFByb3BzKG9iaikge1xuICAgIGxldCB3aGl0ZUxpc3RlZCA9IHt9LCBub25XaGl0ZUxpc3RlZCA9IHt9O1xuXG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoaXNXaGl0ZUxpc3RlZChrZXkpKSB7XG4gICAgICAgICAgICB3aGl0ZUxpc3RlZFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub25XaGl0ZUxpc3RlZFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFt3aGl0ZUxpc3RlZCwgbm9uV2hpdGVMaXN0ZWRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlRHJhdyhsYXllcikge1xuXG4gICAgbGV0IGRyYXcgID0gW107XG5cbiAgICBpZiAobGF5ZXIucGFyZW50KSB7XG4gICAgICAgIGxldCBjcyA9IGxheWVyLnBhcmVudC5jYWxjdWxhdGVkRHJhdyB8fCBbXTtcbiAgICAgICAgZHJhdy5wdXNoKC4uLmNzKTtcbiAgICB9XG5cbiAgICBkcmF3LnB1c2gobGF5ZXIuZHJhdyk7XG4gICAgcmV0dXJuIGRyYXc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxheWVyVHJlZShuYW1lLCBsYXllciwgcGFyZW50LCBzdHlsZXMpIHtcblxuICAgIGxldCBwcm9wZXJ0aWVzID0geyBuYW1lLCBsYXllciwgcGFyZW50IH07XG4gICAgbGV0IFt3aGl0ZUxpc3RlZCwgbm9uV2hpdGVMaXN0ZWRdID0gZ3JvdXBQcm9wcyhsYXllcik7XG4gICAgbGV0IGVtcHR5ID0gaXNFbXB0eShub25XaGl0ZUxpc3RlZCk7XG4gICAgbGV0IENyZWF0ZTtcblxuICAgIGlmIChlbXB0eSAmJiBwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICBDcmVhdGUgPSBMYXllckxlYWY7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgQ3JlYXRlID0gTGF5ZXJUcmVlO1xuICAgIH1cblxuICAgIGxldCByID0gbmV3IENyZWF0ZShPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIHdoaXRlTGlzdGVkKSk7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5hZGRMYXllcihyKTtcbiAgICB9XG5cbiAgICBpZiAoIWVtcHR5KSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBub25XaGl0ZUxpc3RlZCkge1xuICAgICAgICAgICAgbGV0IHByb3BlcnR5ID0gbm9uV2hpdGVMaXN0ZWRba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIHBhcnNlTGF5ZXJUcmVlKGtleSwgcHJvcGVydHksIHIsIHN0eWxlcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEludmFsaWQgbGF5ZXJcbiAgICAgICAgICAgICAgICBsZXQgbXNnID0gYExheWVyIHZhbHVlIG11c3QgYmUgYW4gb2JqZWN0OiBjYW5ub3QgY3JlYXRlIGxheWVyICcke2tleX06ICR7SlNPTi5zdHJpbmdpZnkocHJvcGVydHkpfSdgO1xuICAgICAgICAgICAgICAgIG1zZyArPSBgLCB1bmRlciBwYXJlbnQgbGF5ZXIgJyR7ci5mdWxsX25hbWV9Jy5gO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBhcmVudCBpcyBhIHN0eWxlIG5hbWUsIHRoaXMgbWF5IGJlIGFuIGluY29ycmVjdGx5IG5lc3RlZCBsYXllclxuICAgICAgICAgICAgICAgIGlmIChzdHlsZXNbci5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYCBUaGUgcGFyZW50IG5hbWUgJyR7ci5uYW1lfScgaXMgYWxzbyB0aGUgbmFtZSBvZiBhIHN0eWxlLCBkaWQgeW91IG1lYW4gdG8gY3JlYXRlIGEgJ2RyYXcnIGdyb3VwYDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAgdW5kZXIgJyR7cGFyZW50Lm5hbWV9J2A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAgaW5zdGVhZD9gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBtc2cpOyAvLyBUT0RPOiBmaXJlIGV4dGVybmFsIGV2ZW50IHRoYXQgY2xpZW50cyB0byBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGF5ZXJzIChsYXllcnMsIHN0eWxlcykge1xuICAgIGxldCBsYXllcl90cmVlcyA9IHt9O1xuXG4gICAgZm9yIChsZXQga2V5IGluIGxheWVycykge1xuICAgICAgICBsZXQgbGF5ZXIgPSBsYXllcnNba2V5XTtcbiAgICAgICAgaWYgKGxheWVyKSB7XG4gICAgICAgICAgICBsYXllcl90cmVlc1trZXldID0gcGFyc2VMYXllclRyZWUoa2V5LCBsYXllciwgbnVsbCwgc3R5bGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXllcl90cmVlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoRmVhdHVyZShjb250ZXh0LCBsYXllcnMsIGNvbGxlY3RlZF9sYXllcnMsIGNvbGxlY3RlZF9sYXllcnNfaWRzKSB7XG4gICAgbGV0IG1hdGNoZWQgPSBmYWxzZTtcbiAgICBsZXQgY2hpbGRNYXRjaGVkID0gZmFsc2U7XG5cbiAgICBpZiAobGF5ZXJzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cblxuICAgIGZvciAobGV0IHI9MDsgciA8IGxheWVycy5sZW5ndGg7IHIrKykge1xuICAgICAgICBsZXQgY3VycmVudCA9IGxheWVyc1tyXTtcblxuICAgICAgICBpZiAoY3VycmVudC5pc19sZWFmKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5kb2VzTWF0Y2goY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVyc19pZHMucHVzaChjdXJyZW50LmlkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnQuaXNfdHJlZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQuZG9lc01hdGNoKGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICBjaGlsZE1hdGNoZWQgPSBtYXRjaEZlYXR1cmUoXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzX2lkc1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkTWF0Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnNfaWRzLnB1c2goY3VycmVudC5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZWQ7XG59XG4iLCIvLyBSZW5kZXJzIGFuIGFycmF5IHNwZWNpZnlpbmcgYSBsaW5lIHBhdHRlcm4gb2YgYWx0ZXJuYXRpbmcgZGFzaGVzIGFuZCBzcGFjZXMsXG4vLyBzaW1pbGFyIHRvIGFuIFNWRyBgZGFzaGFycmF5YCBvciBDYW52YXMgc2V0TGluZURhc2goKSwgaW50byBhIGJ5dGUgYXJyYXkgb2YgUkdCQSBwaXhlbHNcbi8vIFJldHVybnM6XG4vLyB7XG4vLyAgICBwaXhlbDogcmVuZGVyZWQgaW1hZ2UgaW4gVWludDhBcnJheSBidWZmZXJcbi8vICAgIGxlbmd0aDogcGl4ZWwgbGVuZ3RoIG9mIHJlbmRlcmVkIGRhc2ggcGF0dGVybiAoc3VtIG9mIGFsbCBkYXNoZXMgYW5kIHNwYWNlcylcbi8vIH1cbi8vXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvU1ZHL3BhaW50aW5nLmh0bWwjU3Ryb2tlRGFzaGFycmF5UHJvcGVydHlcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1NWRy9BdHRyaWJ1dGUvc3Ryb2tlLWRhc2hhcnJheVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC9zZXRMaW5lRGFzaFxuXG5jb25zdCBkZWZhdWx0X2Rhc2hfY29sb3IgPSBbMjU1LCAyNTUsIDI1NSwgMjU1XTtcbmNvbnN0IGRlZmF1bHRfYmFja2dyb3VuZF9jb2xvciA9IFswLCAwLCAwLCAwXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVuZGVyRGFzaEFycmF5IChwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBkYXNoX3BpeGVsID0gb3B0aW9ucy5kYXNoX2NvbG9yIHx8IGRlZmF1bHRfZGFzaF9jb2xvcjtcbiAgICBjb25zdCBiYWNrZ3JvdW5kX2NvbG9yID0gb3B0aW9ucy5iYWNrZ3JvdW5kX2NvbG9yIHx8IGRlZmF1bHRfYmFja2dyb3VuZF9jb2xvcjtcbiAgICBjb25zdCBkYXNoZXMgPSBwYXR0ZXJuO1xuICAgIGNvbnN0IHNjYWxlID0gb3B0aW9ucy5zY2FsZSB8fCAxO1xuXG4gICAgLy8gSWYgcGF0dGVybiBpcyBvZGQsIHJlcGVhdCBpdCB0byBtYWtlIGl0IGV2ZW4gKHNlZSBTVkcgc3BlYylcbiAgICBpZiAoZGFzaGVzLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZGFzaGVzLCBkYXNoZXMpO1xuICAgIH1cblxuICAgIGxldCBkYXNoID0gdHJ1ZTtcbiAgICBsZXQgcGl4ZWxzID0gW107XG4gICAgZm9yIChsZXQgaT0wOyBpIDwgZGFzaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gTWF0aC5mbG9vcihkYXNoZXNbaV0gKiBzY2FsZSk7XG4gICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHNlZ21lbnQ7IHMrKykge1xuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocGl4ZWxzLCBkYXNoID8gZGFzaF9waXhlbCA6IGJhY2tncm91bmRfY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgIGRhc2ggPSAhZGFzaDsgLy8gYWx0ZXJuYXRlIGJldHdlZW4gZGFzaGVzIGFuZCBzcGFjZXNcbiAgICB9XG5cbiAgICBwaXhlbHMgPSBuZXcgVWludDhBcnJheShwaXhlbHMpOyAvLyBjb252ZXJ0IHRvIHR5cGVkIGFycmF5XG4gICAgY29uc3QgbGVuZ3RoID0gcGl4ZWxzLmxlbmd0aCAvIDQ7IC8vIG9uZSBSR0JBIGJ5dGUgc2VxdWVuY2VzIHRvIG9uZSBwaXhlbFxuXG4gICAgcmV0dXJuIHsgcGl4ZWxzLCBsZW5ndGggfTtcbn1cbiIsIi8vIExpbmUgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgZ2wgZnJvbSAnLi4vLi4vZ2wvY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IFZlcnRleExheW91dCBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfbGF5b3V0JztcbmltcG9ydCB7YnVpbGRQb2x5bGluZXN9IGZyb20gJy4uLy4uL2J1aWxkZXJzL3BvbHlsaW5lcyc7XG5pbXBvcnQgcmVuZGVyRGFzaEFycmF5IGZyb20gJy4vZGFzaGFycmF5JztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCB7c2hhZGVyU3JjX3BvbHlnb25zVmVydGV4LCBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudH0gZnJvbSAnLi4vcG9seWdvbnMvcG9seWdvbnMnO1xuXG5leHBvcnQgdmFyIExpbmVzID0gT2JqZWN0LmNyZWF0ZShTdHlsZSk7XG5cbk9iamVjdC5hc3NpZ24oTGluZXMsIHtcbiAgICBuYW1lOiAnbGluZXMnLFxuICAgIGJ1aWx0X2luOiB0cnVlLFxuICAgIHZlcnRleF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXgsXG4gICAgZnJhZ21lbnRfc2hhZGVyX3NyYzogc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnQsXG4gICAgc2VsZWN0aW9uOiB0cnVlLCAvLyB0dXJuIGZlYXR1cmUgc2VsZWN0aW9uIG9uXG5cbiAgICBpbml0KCkge1xuICAgICAgICBTdHlsZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgLy8gQmFzaWMgYXR0cmlidXRlcywgb3RoZXJzIGNhbiBiZSBhZGRlZCAoc2VlIHRleHR1cmUgVVZzIGJlbG93KVxuICAgICAgICB2YXIgYXR0cmlicyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfcG9zaXRpb24nLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfZXh0cnVkZScsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFRlbGwgdGhlIHNoYWRlciB3ZSB3YW50IGEgb3JkZXIgaW4gdmVydGV4IGF0dHJpYnV0ZXMsIGFuZCB0byBleHRydWRlIGxpbmVzXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xBWUVSX09SREVSID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRVhUUlVERV9MSU5FUyA9IHRydWU7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV9zZWxlY3Rpb25fY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgbGluZSB0ZXh0dXJlIG9yIGRhc2ggYXJyYXlcbiAgICAgICAgLy8gKGxhdHRlciB3aWxsIGJlIHJlbmRlcmVkIGF0IGNvbXBpbGUtdGltZSwgd2hlbiBHTCBjb250ZXh0IGF2YWlsYWJsZSlcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSB8fCB0aGlzLmRhc2gpIHtcbiAgICAgICAgICAgIHRoaXMudGV4Y29vcmRzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIHRleHR1cmUgVVZzXG4gICAgICAgIGlmICh0aGlzLnRleGNvb3Jkcykge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVEVYVFVSRV9DT09SRFMgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBTY2FsaW5nIGZhY3RvciB0byBhZGQgcHJlY2lzaW9uIHRvIGxpbmUgdGV4dHVyZSBWIGNvb3JkaW5hdGUgcGFja2VkIGFzIG5vcm1hbGl6ZWQgc2hvcnRcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEUgPSAxO1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVl9TQ0FMRV9BREpVU1QgPSBHZW8udGlsZV9zY2FsZSAqIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEU7XG5cbiAgICAgICAgICAgIC8vIEFkZCB2ZXJ0ZXggYXR0cmlidXRlIGZvciBVVnMgb25seSB3aGVuIG5lZWRlZFxuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2FfdGV4Y29vcmQnLCBzaXplOiAyLCB0eXBlOiBnbC5VTlNJR05FRF9TSE9SVCwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG5cbiAgICAgICAgLy8gQWRkaXRpb25hbCBzaW5nbGUtYWxsb2NhdGVkIG9iamVjdCB1c2VkIGZvciBob2xkaW5nIG91dGxpbmUgc3R5bGUgYXMgaXQgaXMgcHJvY2Vzc2VkXG4gICAgICAgIC8vIFNlcGFyYXRlIGZyb20gdGhpcy5mZWF0dXJlX3N0eWxlIHNvIHRoYXQgb3V0bGluZSBwcm9wZXJ0aWVzIGRvIG5vdCBvdmVyd3JpdGUgY2FsY3VsYXRlZFxuICAgICAgICAvLyBpbmxpbmUgcHJvcGVydGllcyAob3V0bGluZSBjYWxsIGlzIG1hZGUgKndpdGhpbiogdGhlIGlubGluZSBjYWxsKVxuICAgICAgICB0aGlzLm91dGxpbmVfZmVhdHVyZV9zdHlsZSA9IHt9O1xuICAgICAgICB0aGlzLmlubGluZV9mZWF0dXJlX3N0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlOyAvLyBzYXZlIHJlZmVyZW5jZSB0byBtYWluIGNvbXB1dGVkIHN0eWxlIG9iamVjdFxuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIGNvbXBpbGVTZXR1cCAoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlX3NldHVwKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlTGluZVRleHR1cmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3R5bGUuY29tcGlsZVNldHVwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIC8vIE9wdGlvbmFsbHkgYXBwbHkgYSBkYXNoIGFycmF5IHBhdHRlcm4gdG8gdGhpcyBsaW5lXG4gICAgcGFyc2VMaW5lVGV4dHVyZSAoKSB7XG4gICAgICAgIC8vIFNwZWNpZnkgYSBsaW5lIHBhdHRlcm5cbiAgICAgICAgaWYgKHRoaXMuZGFzaCkge1xuICAgICAgICAgICAgLy8gT3B0aW9uYWwgYmFja2dyb3VuZCBjb2xvciBmb3IgZGFzaCBwYXR0ZXJuIChkZWZhdWx0cyB0cmFuc3BhcmVudClcbiAgICAgICAgICAgIGlmICh0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZGFzaF9iYWNrZ3JvdW5kX2NvbG9yID0gU3R5bGVQYXJzZXIucGFyc2VDb2xvcih0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTElORV9CQUNLR1JPVU5EX0NPTE9SID1cbiAgICAgICAgICAgICAgICAgICAgYHZlYzMoJHt0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvci5zbGljZSgwLCAzKS5qb2luKCcsICcpfSlgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGp1c3QgdGV4Y29vcmQgc2NhbGUgdG8gYWxsb3cgZm9yIGRhc2ggcGF0dGVybnMgdGhhdCBhcmUgYSBmcmFjdGlvbiBvZiBsaW5lIHdpZHRoXG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFID0gMjA7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9WX1NDQUxFX0FESlVTVCA9IEdlby50aWxlX3NjYWxlICogdGhpcy5kZWZpbmVzLlRBTkdSQU1fREFTSF9TQ0FMRTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIGxpbmUgcGF0dGVyblxuICAgICAgICAgICAgY29uc3QgZGFzaCA9IHJlbmRlckRhc2hBcnJheSh0aGlzLmRhc2gsIHsgc2NhbGU6IHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEUgfSk7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUgPSAnXycgKyB0aGlzLm5hbWUgKyAnX2Rhc2hhcnJheSc7XG4gICAgICAgICAgICBUZXh0dXJlLmNyZWF0ZSh0aGlzLmdsLCB0aGlzLnRleHR1cmUsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXNoLnBpeGVscyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGRhc2gubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAxLFxuICAgICAgICAgICAgICAgIGZpbHRlcmluZzogJ25lYXJlc3QnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNwZWNpZnkgYSBsaW5lIHRleHR1cmUgKGVpdGhlciBkaXJlY3RseSwgb3IgcmVuZGVyZWQgZGFzaCBwYXR0ZXJuIGZyb20gYWJvdmUpXG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xJTkVfVEVYVFVSRSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9BTFBIQV9URVNUID0gMC41OyAvLyBwaXhlbHMgYmVsb3cgdGhpcyB0aHJlc2hvbGQgYXJlIHRyYW5zcGFyZW50XG4gICAgICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMgPSB0aGlzLnNoYWRlcnMudW5pZm9ybXMgfHwge307XG4gICAgICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMudV90ZXh0dXJlID0gdGhpcy50ZXh0dXJlO1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfdGV4dHVyZV9yYXRpbyA9IDE7XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBsaW5lIHBhdHRlcm4gYXNwZWN0IHJhdGlvIGFmdGVyIHRleHR1cmUgbG9hZHNcbiAgICAgICAgICAgIFRleHR1cmUuZ2V0SW5mbyh0aGlzLnRleHR1cmUpLnRoZW4odGV4dHVyZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfdGV4dHVyZV9yYXRpbyA9IHRleHR1cmUuaGVpZ2h0IC8gdGV4dHVyZS53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBDYWxjdWxhdGUgd2lkdGggYXQgem9vbSBnaXZlbiBpbiBgY29udGV4dGBcbiAgICBjYWxjV2lkdGggKHdpZHRoLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiAod2lkdGggJiYgU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkod2lkdGgsIGNvbnRleHQpKSB8fCAwO1xuICAgIH0sXG5cbiAgICAvLyBDYWxjdWxhdGUgd2lkdGggYXQgbmV4dCB6b29tICh1c2VkIGZvciBsaW5lIHdpZHRoIGludGVycG9sYXRpb24pXG4gICAgY2FsY1dpZHRoTmV4dFpvb20gKHdpZHRoLCBjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQuem9vbSsrO1xuICAgICAgICBsZXQgdmFsID0gdGhpcy5jYWxjV2lkdGgod2lkdGgsIGNvbnRleHQpO1xuICAgICAgICBjb250ZXh0Lnpvb20tLTtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgX3BhcnNlRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG5cbiAgICAgICAgLy8gbGluZSB3aWR0aCBpbiBtZXRlcnNcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5jYWxjV2lkdGgoZHJhdy53aWR0aCwgY29udGV4dCk7XG4gICAgICAgIGlmICh3aWR0aCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCBsaW5lcyB3aXRoIG5lZ2F0aXZlIHdpZHRoXG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHRfd2lkdGggPSB0aGlzLmNhbGNXaWR0aE5leHRab29tKGRyYXcubmV4dF93aWR0aCwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKCh3aWR0aCA9PT0gMCAmJiBuZXh0X3dpZHRoID09PSAwKSB8fCBuZXh0X3dpZHRoIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwIGxpbmVzIHRoYXQgZG9uJ3QgaW50ZXJwb2xhdGUgdG8gYSBwb3NpdGl2ZSB2YWx1ZSBhdCBuZXh0IHpvb21cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnZlcnQgdG8gdW5pdHMgYW5kIHJlbGF0aXZlIGNoYW5nZSBmcm9tIHByZXZpb3VzIHpvb21cbiAgICAgICAgLy8gTkI6IG11bHRpcGx5IGJ5IDIgYmVjYXVzZSBhIGdpdmVuIHdpZHRoIGlzIHR3aWNlIGFzIGJpZyBpbiBzY3JlZW4gc3BhY2UgYXQgdGhlIG5leHQgem9vbVxuICAgICAgICBzdHlsZS53aWR0aCA9IHdpZHRoICogY29udGV4dC51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb207XG4gICAgICAgIHN0eWxlLm5leHRfd2lkdGggPSAobmV4dF93aWR0aCAqIDIpIC0gd2lkdGg7XG4gICAgICAgIHN0eWxlLm5leHRfd2lkdGggKj0gY29udGV4dC51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb207XG4gICAgICAgIHN0eWxlLm5leHRfd2lkdGggLz0gMjsgLy8gTkI6IGRpdmlkZSBieSAyIGJlY2F1c2UgZXh0cnVzaW9uIHdpZHRoIGlzIGhhbHZlZCBpbiBidWlsZGVyIC0gcmVtb3ZlP1xuXG4gICAgICAgIHN0eWxlLmNvbG9yID0gdGhpcy5wYXJzZUNvbG9yKGRyYXcuY29sb3IsIGNvbnRleHQpO1xuICAgICAgICBpZiAoIXN0eWxlLmNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoZWlnaHQgZGVmYXVsdHMgdG8gZmVhdHVyZSBoZWlnaHQsIGJ1dCBleHRydWRlIHN0eWxlIGNhbiBkeW5hbWljYWxseSBhZGp1c3QgaGVpZ2h0IGJ5IHJldHVybmluZyBhIG51bWJlciBvciBhcnJheSAoaW5zdGVhZCBvZiBhIGJvb2xlYW4pXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiB8fCAwLCBjb250ZXh0KSkgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuejtcbiAgICAgICAgc3R5bGUuaGVpZ2h0ID0gZmVhdHVyZS5wcm9wZXJ0aWVzLmhlaWdodCB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5oZWlnaHQ7XG4gICAgICAgIHN0eWxlLmV4dHJ1ZGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoZHJhdy5leHRydWRlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3R5bGUuZXh0cnVkZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5leHRydWRlKSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlLmV4dHJ1ZGVbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSYWlzZSBsaW5lIGhlaWdodCBpZiBleHRydWRlZFxuICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSAmJiBzdHlsZS5oZWlnaHQpIHtcbiAgICAgICAgICAgIHN0eWxlLnogKz0gc3R5bGUuaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUueiAqPSBHZW8uaGVpZ2h0X3NjYWxlOyAgICAgICAgLy8gcHJvdmlkZSBzdWItbWV0ZXIgcHJlY2lzaW9uIG9mIGhlaWdodCB2YWx1ZXNcbiAgICAgICAgc3R5bGUuaGVpZ2h0ICo9IEdlby5oZWlnaHRfc2NhbGU7XG5cbiAgICAgICAgc3R5bGUuY2FwID0gZHJhdy5jYXA7XG4gICAgICAgIHN0eWxlLmpvaW4gPSBkcmF3LmpvaW47XG4gICAgICAgIHN0eWxlLm1pdGVyX2xpbWl0ID0gZHJhdy5taXRlcl9saW1pdDtcbiAgICAgICAgc3R5bGUudGlsZV9lZGdlcyA9IGRyYXcudGlsZV9lZGdlczsgLy8gdXN1YWxseSBhY3RpdmF0ZWQgZm9yIGRlYnVnZ2luZywgb3IgcmFyZSB2aXN1YWxpemF0aW9uIG5lZWRzXG5cbiAgICAgICAgLy8gQ29uc3RydWN0IGFuIG91dGxpbmUgc3R5bGVcbiAgICAgICAgLy8gUmV1c2FibGUgb3V0bGluZSBzdHlsZSBvYmplY3QsIG1hcmtlZCBhcyBhbHJlYWR5IHdyYXBwZWQgaW4gY2FjaGUgb2JqZWN0cyAocHJlcHJvY2Vzc2VkID0gdHJ1ZSlcbiAgICAgICAgc3R5bGUub3V0bGluZSA9IHN0eWxlLm91dGxpbmUgfHwgeyB3aWR0aDoge30sIG5leHRfd2lkdGg6IHt9LCBwcmVwcm9jZXNzZWQ6IHRydWUgfTtcblxuICAgICAgICBpZiAoZHJhdy5vdXRsaW5lICYmIGRyYXcub3V0bGluZS52aXNpYmxlICE9PSBmYWxzZSAmJiBkcmF3Lm91dGxpbmUuY29sb3IgJiYgZHJhdy5vdXRsaW5lLndpZHRoKSB7XG4gICAgICAgICAgICAvLyBvdXRsaW5lIHdpZHRoIGluIG1ldGVyc1xuICAgICAgICAgICAgLy8gTkI6IG11bHRpcGx5IGJ5IDIgYmVjYXVzZSBvdXRsaW5lIGlzIGFwcGxpZWQgb24gYm90aCBzaWRlcyBvZiBsaW5lXG4gICAgICAgICAgICBsZXQgb3V0bGluZV93aWR0aCA9IHRoaXMuY2FsY1dpZHRoKGRyYXcub3V0bGluZS53aWR0aCwgY29udGV4dCkgKiAyO1xuICAgICAgICAgICAgbGV0IG91dGxpbmVfbmV4dF93aWR0aCA9IHRoaXMuY2FsY1dpZHRoTmV4dFpvb20oZHJhdy5vdXRsaW5lLm5leHRfd2lkdGgsIGNvbnRleHQpICogMjtcblxuICAgICAgICAgICAgaWYgKChvdXRsaW5lX3dpZHRoID09PSAwICYmIG91dGxpbmVfbmV4dF93aWR0aCA9PT0gMCkgfHwgb3V0bGluZV93aWR0aCA8IDAgfHwgb3V0bGluZV9uZXh0X3dpZHRoIDwgMCkge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgbGluZXMgdGhhdCBkb24ndCBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHplcm8gb3IgZ3JlYXRlciB3aWR0aFxuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUud2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUubmV4dF93aWR0aC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jb2xvciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBNYWludGFpbiBjb25zaXN0ZW50IG91dGxpbmUgd2lkdGggYXJvdW5kIHRoZSBsaW5lIGZpbGxcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlID0gb3V0bGluZV93aWR0aCArIHdpZHRoO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUubmV4dF93aWR0aC52YWx1ZSA9IG91dGxpbmVfbmV4dF93aWR0aCArIG5leHRfd2lkdGg7XG5cbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmNvbG9yID0gZHJhdy5vdXRsaW5lLmNvbG9yO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuY2FwID0gZHJhdy5vdXRsaW5lLmNhcCB8fCBkcmF3LmNhcDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmpvaW4gPSBkcmF3Lm91dGxpbmUuam9pbiB8fCBkcmF3LmpvaW47XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5taXRlcl9saW1pdCA9IGRyYXcub3V0bGluZS5taXRlcl9saW1pdCB8fCBkcmF3Lm1pdGVyX2xpbWl0O1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuc3R5bGUgPSBkcmF3Lm91dGxpbmUuc3R5bGUgfHwgdGhpcy5uYW1lO1xuXG4gICAgICAgICAgICAgICAgLy8gRXhwbGljaXRseSBkZWZpbmVkIG91dGxpbmUgb3JkZXIsIG9yIGluaGVyaXRlZCBmcm9tIGlubmVyIGxpbmVcbiAgICAgICAgICAgICAgICBpZiAoZHJhdy5vdXRsaW5lLm9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUub3JkZXIgPSB0aGlzLnBhcnNlT3JkZXIoZHJhdy5vdXRsaW5lLm9yZGVyLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUub3JkZXIgPSBzdHlsZS5vcmRlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBEb24ndCBsZXQgb3V0bGluZSBiZSBhYm92ZSBpbm5lciBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLm91dGxpbmUub3JkZXIgPiBzdHlsZS5vcmRlcikge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyID0gc3R5bGUub3JkZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gT3V0bGluZXMgYXJlIGFsd2F5cyBhdCBoYWxmLWxheWVyIGludGVydmFscyB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoIGlubmVyIGxpbmVzXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5vcmRlciAtPSAwLjU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHN0eWxlLm91dGxpbmUubmV4dF93aWR0aC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmNvbG9yID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgZHJhdy5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZUNvbG9yUHJvcGVydHlDYWNoZShkcmF3LmNvbG9yKTtcbiAgICAgICAgZHJhdy53aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy53aWR0aCwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG4gICAgICAgIGRyYXcubmV4dF93aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy53aWR0aCwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7IC8vIHdpZHRoIHdpbGwgYmUgY29tcHV0ZWQgZm9yIG5leHQgem9vbVxuICAgICAgICBkcmF3LnogPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcueiwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG5cbiAgICAgICAgaWYgKGRyYXcub3V0bGluZSkge1xuICAgICAgICAgICAgZHJhdy5vdXRsaW5lLmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcub3V0bGluZS5jb2xvcik7XG4gICAgICAgICAgICBkcmF3Lm91dGxpbmUud2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub3V0bGluZS53aWR0aCwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG4gICAgICAgICAgICBkcmF3Lm91dGxpbmUubmV4dF93aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5vdXRsaW5lLndpZHRoLCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTsgLy8gd2lkdGggcmUtY29tcHV0ZWQgZm9yIG5leHQgem9vbVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIFwidGVtcGxhdGVcIiB0aGF0IHNldHMgY29uc3RhbnQgYXR0aWJ1dGVzIGZvciBlYWNoIHZlcnRleCwgd2hpY2ggaXMgdGhlbiBtb2RpZmllZCBwZXIgdmVydGV4IG9yIHBlciBmZWF0dXJlLlxuICAgICAqIEEgcGxhaW4gSlMgYXJyYXkgbWF0Y2hpbmcgdGhlIG9yZGVyIG9mIHRoZSB2ZXJ0ZXggbGF5b3V0LlxuICAgICAqL1xuICAgIG1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSkge1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgLy8gcG9zaXRpb24gLSB4ICYgeSBjb29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gcGVyLXZlcnRleCBiZWxvd1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS56IHx8IDA7XG5cbiAgICAgICAgLy8gbGF5ZXIgb3JkZXIgLSB3IGNvb3JkIG9mICdwb3NpdGlvbicgYXR0cmlidXRlIChmb3IgcGFja2luZyBlZmZpY2llbmN5KVxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gdGhpcy5zY2FsZU9yZGVyKHN0eWxlLm9yZGVyKTtcblxuICAgICAgICAvLyBleHRydXNpb24gdmVjdG9yXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG5cbiAgICAgICAgLy8gc2NhbGluZyB0byBwcmV2aW91cyBhbmQgbmV4dCB6b29tXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5uZXh0X3dpZHRoO1xuXG4gICAgICAgIC8vIGNvbG9yXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclswXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzFdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMl0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclszXSAqIDI1NTtcblxuICAgICAgICAvLyBzZWxlY3Rpb24gY29sb3JcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzBdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclsxXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMl0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzNdICogMjU1O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRleHR1cmUgVVZzIHRvIHRlbXBsYXRlIG9ubHkgaWYgbmVlZGVkXG4gICAgICAgIGlmICh0aGlzLnRleGNvb3Jkcykge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRleF90ZW1wbGF0ZTtcbiAgICB9LFxuXG4gICAgYnVpbGRMaW5lcyhsaW5lcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgIC8vIE91dGxpbmUgKGJ1aWxkIGZpcnN0IHNvIHRoYXQgYmxlbmRlZCBnZW9tZXRyeSB3aXRob3V0IGEgZGVwdGggdGVzdCBpcyBkcmF3biBmaXJzdC91bmRlciB0aGUgaW5uZXIgbGluZSlcbiAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlID0gdGhpcy5vdXRsaW5lX2ZlYXR1cmVfc3R5bGU7IC8vIHN3YXAgaW4gb3V0bGluZS1zcGVjaWZpYyBzdHlsZSBob2xkZXJcbiAgICAgICAgaWYgKHN0eWxlLm91dGxpbmUgJiYgc3R5bGUub3V0bGluZS5jb2xvciAhPSBudWxsICYmIHN0eWxlLm91dGxpbmUud2lkdGgudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIG91dGxpbmVfc3R5bGUgPSB0aGlzLnN0eWxlc1tzdHlsZS5vdXRsaW5lLnN0eWxlXTtcbiAgICAgICAgICAgIGlmIChvdXRsaW5lX3N0eWxlKSB7XG4gICAgICAgICAgICAgICAgb3V0bGluZV9zdHlsZS5hZGRGZWF0dXJlKGNvbnRleHQuZmVhdHVyZSwgc3R5bGUub3V0bGluZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWluIGxpbmVcbiAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlID0gdGhpcy5pbmxpbmVfZmVhdHVyZV9zdHlsZTsgLy8gcmVzdG9yZSBjYWxjdWxhdGVkIHN0eWxlIGZvciBpbmxpbmVcbiAgICAgICAgbGV0IHZlcnRleF90ZW1wbGF0ZSA9IHRoaXMubWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKTtcbiAgICAgICAgYnVpbGRQb2x5bGluZXMoXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIHN0eWxlLndpZHRoLFxuICAgICAgICAgICAgdmVydGV4X2RhdGEsXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2FwOiBzdHlsZS5jYXAsXG4gICAgICAgICAgICAgICAgam9pbjogc3R5bGUuam9pbixcbiAgICAgICAgICAgICAgICBtaXRlcl9saW1pdDogc3R5bGUubWl0ZXJfbGltaXQsXG4gICAgICAgICAgICAgICAgc2NhbGluZ19pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfZXh0cnVkZSxcbiAgICAgICAgICAgICAgICBzY2FsaW5nX25vcm1hbGl6ZTogMjU2LCAvLyB2YWx1ZXMgaGF2ZSBhbiA4LWJpdCBmcmFjdGlvblxuICAgICAgICAgICAgICAgIHRleGNvb3JkX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV90ZXhjb29yZCxcbiAgICAgICAgICAgICAgICB0ZXhjb29yZF93aWR0aDogKHN0eWxlLndpZHRoIHx8IHN0eWxlLm5leHRfd2lkdGgpIC8gY29udGV4dC50aWxlLm92ZXJ6b29tMiwgLy8gVVZzIGNhbid0IGNhbGMgZm9yIHplcm8td2lkdGgsIHVzZSBuZXh0IHpvb20gd2lkdGggaW4gdGhhdCBjYXNlXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplOiA2NTUzNSwgLy8gc2NhbGUgVVZzIHRvIHVuc2lnbmVkIHNob3J0c1xuICAgICAgICAgICAgICAgIGNsb3NlZF9wb2x5Z29uOiBvcHRpb25zICYmIG9wdGlvbnMuY2xvc2VkX3BvbHlnb24sXG4gICAgICAgICAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXM6ICFzdHlsZS50aWxlX2VkZ2VzICYmIG9wdGlvbnMgJiYgb3B0aW9ucy5yZW1vdmVfdGlsZV9lZGdlcyxcbiAgICAgICAgICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlOiBHZW8udGlsZV9zY2FsZSAqIGNvbnRleHQudGlsZS5wYWRfc2NhbGUgKiA0XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGJ1aWxkUG9seWdvbnMocG9seWdvbnMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICAvLyBSZW5kZXIgcG9seWdvbnMgYXMgaW5kaXZpZHVhbCBsaW5lc1xuICAgICAgICBmb3IgKGxldCBwPTA7IHAgPCBwb2x5Z29ucy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgdGhpcy5idWlsZExpbmVzKHBvbHlnb25zW3BdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQsIHsgY2xvc2VkX3BvbHlnb246IHRydWUsIHJlbW92ZV90aWxlX2VkZ2VzOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG59KTtcbiIsIi8vIFBvaW50ICsgdGV4dCBsYWJlbCByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IGxvZyBmcm9tICcuLi8uLi91dGlscy9sb2cnO1xuaW1wb3J0IHtTdHlsZX0gZnJvbSAnLi4vc3R5bGUnO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBnbCBmcm9tICcuLi8uLi9nbC9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IFZlcnRleExheW91dCBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfbGF5b3V0JztcbmltcG9ydCB7YnVpbGRRdWFkc0ZvclBvaW50c30gZnJvbSAnLi4vLi4vYnVpbGRlcnMvcG9pbnRzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuLi8uLi92ZWN0b3InO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tICcuLi8uLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBMYWJlbFBvaW50IGZyb20gJy4uLy4uL2xhYmVscy9sYWJlbF9wb2ludCc7XG5pbXBvcnQgcGxhY2VQb2ludHNPbkxpbmUgZnJvbSAnLi4vLi4vbGFiZWxzL3BvaW50X3BsYWNlbWVudCc7XG5pbXBvcnQge1RleHRMYWJlbHN9IGZyb20gJy4uL3RleHQvdGV4dF9sYWJlbHMnO1xuaW1wb3J0IHtWSUVXX1BBTl9TTkFQX1RJTUV9IGZyb20gJy4uLy4uL3ZpZXcnO1xuaW1wb3J0IGRlYnVnU2V0dGluZ3MgZnJvbSAnLi4vLi4vdXRpbHMvZGVidWdfc2V0dGluZ3MnO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX3BvaW50c1ZlcnRleCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL3BvaW50c192ZXJ0ZXguZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfcG9pbnRzRnJhZ21lbnQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2ludHNfZnJhZ21lbnQuZ2xzbCcsICd1dGY4Jyk7XG5cbmNvbnN0IFBMQUNFTUVOVCA9IExhYmVsUG9pbnQuUExBQ0VNRU5UO1xuXG5leHBvcnQgdmFyIFBvaW50cyA9IE9iamVjdC5jcmVhdGUoU3R5bGUpO1xuXG4vLyBNaXhpbiB0ZXh0IGxhYmVsIG1ldGhvZHNcbk9iamVjdC5hc3NpZ24oUG9pbnRzLCBUZXh0TGFiZWxzKTtcblxuT2JqZWN0LmFzc2lnbihQb2ludHMsIHtcbiAgICBuYW1lOiAncG9pbnRzJyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcbiAgICBjb2xsaXNpb246IHRydWUsICAvLyBzdHlsZSBpbmNsdWRlcyBhIGNvbGxpc2lvbiBwYXNzXG4gICAgYmxlbmQ6ICdvdmVybGF5JywgLy8gb3ZlcmxheXMgZHJhd24gb24gdG9wIG9mIGFsbCBvdGhlciBzdHlsZXMsIHdpdGggYmxlbmRpbmdcblxuICAgIGluaXQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIFN0eWxlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBCYXNlIHNoYWRlcnNcbiAgICAgICAgdGhpcy52ZXJ0ZXhfc2hhZGVyX3NyYyA9IHNoYWRlclNyY19wb2ludHNWZXJ0ZXg7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRfc2hhZGVyX3NyYyA9IHNoYWRlclNyY19wb2ludHNGcmFnbWVudDtcblxuICAgICAgICB2YXIgYXR0cmlicyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfcG9zaXRpb24nLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2Ffc2hhcGUnLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfdGV4Y29vcmQnLCBzaXplOiAyLCB0eXBlOiBnbC5VTlNJR05FRF9TSE9SVCwgbm9ybWFsaXplZDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9vZmZzZXQnLCBzaXplOiAyLCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBGZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3NlbGVjdGlvbl9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gbmV3IFZlcnRleExheW91dChhdHRyaWJzKTtcblxuICAgICAgICAvLyBJZiB3ZSdyZSBub3QgcmVuZGVyaW5nIGFzIG92ZXJsYXksIHdlIG5lZWQgYSBsYXllciBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKHRoaXMuYmxlbmQgIT09ICdvdmVybGF5Jykge1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTEFZRVJfT1JERVIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5zdXJlIGEgbGFiZWwgdGV4dHVyZSBpcyBhbHdheXMgYm91bmQgKGF2b2lkIENocm9tZSAnbm8gdGV4dHVyZSBib3VuZCB0byB1bml0JyB3YXJuaW5ncylcbiAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zID0gdGhpcy5zaGFkZXJzLnVuaWZvcm1zIHx8IHt9O1xuICAgICAgICB0aGlzLnNoYWRlcnMudW5pZm9ybXMudV9sYWJlbF90ZXh0dXJlID0gVGV4dHVyZS5kZWZhdWx0O1xuXG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1BPSU5UX1RFWFRVUkUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfdGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuYWJsZSBkdWFsIHBvaW50L3RleHQgbW9kZVxuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9NVUxUSV9TQU1QTEVSID0gdHJ1ZTtcblxuICAgICAgICAvLyBGYWRlIG91dCB3aGVuIHRpbGUgaXMgem9vbWluZyBvdXQsIGUuZy4gYWN0aW5nIGFzIHByb3h5IHRpbGVzXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfT05fWk9PTV9PVVQgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUX1JBVEUgPSAyOyAvLyBmYWRlIGF0IDJ4LCBlLmcuIGZ1bGx5IHRyYW5zcGFyZW50IGF0IDAuNSB6b29tIGxldmVsIGF3YXlcblxuICAgICAgICAvLyBGYWRlIGluIChkZXBlbmRpbmcgb24gdGlsZSBwcm94eSBzdGF0dXMpXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLnN1cHByZXNzX2xhYmVsX2ZhZGVfaW4gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuZmFkZV9pbl90aW1lID0gMDtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfSU5fUkFURSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IDAuMTU7IC8vIHRpbWUgaW4gc2Vjb25kc1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9JTl9SQVRFID0gMSAvIHRoaXMuZmFkZV9pbl90aW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU25hcCBwb2ludHMgdG8gcGl4ZWwgZ3JpZCBhZnRlciBwYW5uaW5nIHN0b3BcbiAgICAgICAgaWYgKGRlYnVnU2V0dGluZ3Muc3VwcHJlc3NfbGFiZWxfc25hcF9hbmltYXRpb24gIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1ZJRVdfUEFOX1NOQVBfUkFURSA9IDEgLyBWSUVXX1BBTl9TTkFQX1RJTUU7IC8vIGludmVyc2UgdGltZSBpbiBzZWNvbmRzXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbGxpc2lvbl9ncm91cF9wb2ludHMgPSB0aGlzLm5hbWUrJy1wb2ludHMnO1xuICAgICAgICB0aGlzLmNvbGxpc2lvbl9ncm91cF90ZXh0ID0gdGhpcy5uYW1lKyctdGV4dCc7XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH0sXG5cbiAgICByZXNldCAoKSB7XG4gICAgICAgIHRoaXMucXVldWVzID0ge307XG4gICAgICAgIHRoaXMucmVzZXRUZXh0KCk7XG4gICAgICAgIHRoaXMudGV4dHVyZV9taXNzaW5nX3Nwcml0ZXMgPSB7fTsgLy8gdHJhY2sgd2hpY2ggbWlzc2luZyBzcHJpdGVzIHdlJ3ZlIGZvdW5kIChyZWR1Y2UgZHVwZSBsb2cgbWVzc2FnZXMpXG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlIHRvIHF1ZXVlIGZlYXR1cmVzIGluc3RlYWQgb2YgcHJvY2Vzc2luZyBpbW1lZGlhdGVseVxuICAgIGFkZEZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRpbGUgPSBjb250ZXh0LnRpbGU7XG4gICAgICAgIGlmICh0aWxlLmdlbmVyYXRpb24gIT09IHRoaXMuZ2VuZXJhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbGVkIGhlcmUgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBkZWxheWVkIHVudGlsIHRoZSBmZWF0dXJlIHF1ZXVlIGlzIHBhcnNlZCxcbiAgICAgICAgLy8gYW5kIHdlIHdhbnQgdGhlIHByZXByb2Nlc3NpbmcgZG9uZSBiZWZvcmUgd2UgZXZhbHVhdGUgdGV4dCBzdHlsZSBiZWxvd1xuICAgICAgICBkcmF3ID0gdGhpcy5wcmVwcm9jZXNzKGRyYXcpO1xuICAgICAgICBpZiAoIWRyYXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHlsZSA9IHt9O1xuICAgICAgICBzdHlsZS5jb2xvciA9IHRoaXMucGFyc2VDb2xvcihkcmF3LmNvbG9yLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBQb2ludCBzdHlsaW5nXG5cbiAgICAgICAgLy8gcmVxdWlyZSBjb2xvciBvciB0ZXh0dXJlXG4gICAgICAgIGlmICghc3R5bGUuY29sb3IgJiYgIXRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3B0aW9uYWwgc3ByaXRlXG4gICAgICAgIGxldCBzcHJpdGVfaW5mbztcbiAgICAgICAgaWYgKHRoaXMuaGFzU3ByaXRlcygpKSB7XG4gICAgICAgICAgICBzcHJpdGVfaW5mbyA9IHRoaXMucGFyc2VTcHJpdGUoZHJhdywgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAoc3ByaXRlX2luZm8pIHtcbiAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBzcHJpdGVfaW5mby50ZXhjb29yZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwb2ludCBzaXplIGRlZmluZWQgZXhwbGljaXRseSwgb3IgZGVmYXVsdHMgdG8gc3ByaXRlIHNpemUsIG9yIGdlbmVyaWMgZmFsbGJhY2tcbiAgICAgICAgc3R5bGUuc2l6ZSA9IGRyYXcuc2l6ZTtcbiAgICAgICAgaWYgKCFzdHlsZS5zaXplKSB7XG4gICAgICAgICAgICBpZiAoc3ByaXRlX2luZm8pIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gc3ByaXRlX2luZm8uc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSBbMTYsIDE2XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLnNpemUgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoc3R5bGUuc2l6ZSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaXplIHdpbGwgYmUgc2NhbGVkIHRvIDE2LWJpdCBzaWduZWQgaW50LCBzbyBtYXggYWxsb3dlZCB3aWR0aCArIGhlaWdodCBvZiAyNTYgcGl4ZWxzXG4gICAgICAgIHN0eWxlLnNpemUgPSBbXG4gICAgICAgICAgICBNYXRoLm1pbihzdHlsZS5zaXplWzBdICE9IG51bGwgPyBzdHlsZS5zaXplWzBdIDogc3R5bGUuc2l6ZSwgMjU2KSxcbiAgICAgICAgICAgIE1hdGgubWluKHN0eWxlLnNpemVbMV0gIT0gbnVsbCA/IHN0eWxlLnNpemVbMV0gOiBzdHlsZS5zaXplLCAyNTYpXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gUGxhY2VtZW50IHN0cmF0ZWd5XG4gICAgICAgIHN0eWxlLnBsYWNlbWVudCA9IGRyYXcucGxhY2VtZW50O1xuICAgICAgICBzdHlsZS5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBTcGFjaW5nIHBhcmFtZXRlciAoaW4gcGl4ZWxzKSB0byBlcXVhbGx5IHNwYWNlIHBvaW50cyBhbG9uZyBhIGxpbmVcbiAgICAgICAgaWYgKHN0eWxlLnBsYWNlbWVudCA9PT0gUExBQ0VNRU5ULlNQQUNFRCAmJiBkcmF3LnBsYWNlbWVudF9zcGFjaW5nKSB7XG4gICAgICAgICAgICBzdHlsZS5wbGFjZW1lbnRfc3BhY2luZyA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnBsYWNlbWVudF9zcGFjaW5nLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFuZ2xlIHBhcmFtZXRlciAoY2FuIGJlIGEgbnVtYmVyIG9yIHRoZSBzdHJpbmcgXCJhdXRvXCIpXG4gICAgICAgIHN0eWxlLmFuZ2xlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuYW5nbGUsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIHBvaW50cyBjYW4gYmUgcGxhY2VkIG9mZiB0aGUgZ3JvdW5kXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG5cbiAgICAgICAgc3R5bGUudGlsZV9lZGdlcyA9IGRyYXcudGlsZV9lZGdlczsgLy8gdXN1YWxseSBhY3RpdmF0ZWQgZm9yIGRlYnVnZ2luZywgb3IgcmFyZSB2aXN1YWxpemF0aW9uIG5lZWRzXG5cbiAgICAgICAgc3R5bGUuc2FtcGxlciA9IDA7IC8vIDAgPSBzcHJpdGVzXG5cbiAgICAgICAgdGhpcy5jb21wdXRlTGF5b3V0KHN0eWxlLCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICAvLyBUZXh0IHN0eWxpbmdcbiAgICAgICAgbGV0IHRmID1cbiAgICAgICAgICAgIGRyYXcudGV4dCAmJlxuICAgICAgICAgICAgZHJhdy50ZXh0LnZpc2libGUgIT09IGZhbHNlICYmIC8vIGV4cGxpY2l0bHkgaGFuZGxlIGB2aXNpYmxlYCBwcm9wZXJ0eSBmb3IgbmVzdGVkIHRleHRcbiAgICAgICAgICAgIHRoaXMucGFyc2VUZXh0RmVhdHVyZShmZWF0dXJlLCBkcmF3LnRleHQsIGNvbnRleHQsIHRpbGUpO1xuXG4gICAgICAgIGlmICh0Zikge1xuICAgICAgICAgICAgdGYubGF5b3V0LnBhcmVudCA9IHN0eWxlOyAvLyBwYXJlbnQgcG9pbnQgd2lsbCBhcHBseSBhZGRpdGlvbmFsIGFuY2hvci9vZmZzZXQgdG8gdGV4dFxuXG4gICAgICAgICAgICAvLyBUZXh0IGxhYmVscyBoYXZlIGEgZGVmYXVsdCBwcmlvcml0eSBvZiAwLjUgYmVsb3cgdGhlaXIgcGFyZW50IHBvaW50ICgrMC41LCBwcmlvcml0eSBpcyBsb3dlci1pcy1iZXR0ZXIpXG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBiZSBvdmVycmlkZW4sIGFzIGxvbmcgYXMgaXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICB0Zi5sYXlvdXQucHJpb3JpdHkgPSBkcmF3LnRleHQucHJpb3JpdHkgPyBNYXRoLm1heCh0Zi5sYXlvdXQucHJpb3JpdHksIHN0eWxlLnByaW9yaXR5ICsgMC41KSA6IChzdHlsZS5wcmlvcml0eSArIDAuNSk7XG5cbiAgICAgICAgICAgIC8vIFRleHQgbGFiZWxzIGF0dGFjaGVkIHRvIHBvaW50cyBzaG91bGQgbm90IGJlIG1vdmVkIGludG8gdGlsZVxuICAgICAgICAgICAgLy8gKHRoZXkgc2hvdWxkIHN0YXkgZml4ZWQgcmVsYXRpdmUgdG8gdGhlIHBvaW50KVxuICAgICAgICAgICAgdGYubGF5b3V0Lm1vdmVfaW50b190aWxlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIENvbGxpc2lvbi5hZGRTdHlsZSh0aGlzLmNvbGxpc2lvbl9ncm91cF90ZXh0LCB0aWxlLmtleSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBRdWV1ZSB0aGUgZmVhdHVyZSBmb3IgcHJvY2Vzc2luZ1xuICAgICAgICBpZiAoIXRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGEodGlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0ucHVzaCh7XG4gICAgICAgICAgICBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCBzdHlsZSxcbiAgICAgICAgICAgIHRleHRfZmVhdHVyZTogdGZcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCBjb2xsaXNpb24gbWFuYWdlclxuICAgICAgICBDb2xsaXNpb24uYWRkU3R5bGUodGhpcy5jb2xsaXNpb25fZ3JvdXBfcG9pbnRzLCB0aWxlLmtleSk7XG4gICAgfSxcblxuICAgIGhhc1Nwcml0ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHR1cmUgJiYgVGV4dHVyZS50ZXh0dXJlc1t0aGlzLnRleHR1cmVdICYmIFRleHR1cmUudGV4dHVyZXNbdGhpcy50ZXh0dXJlXS5zcHJpdGVzO1xuICAgIH0sXG5cbiAgICBnZXRTcHJpdGVJbmZvIChzcHJpdGUpIHtcbiAgICAgICAgbGV0IGluZm8gPSBUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0uc3ByaXRlc1tzcHJpdGVdICYmIFRleHR1cmUuZ2V0U3ByaXRlSW5mbyh0aGlzLnRleHR1cmUsIHNwcml0ZSk7XG4gICAgICAgIGlmIChzcHJpdGUgJiYgIWluZm8pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy50ZXh0dXJlX21pc3Npbmdfc3ByaXRlc1tzcHJpdGVdKSB7IC8vIG9ubHkgbG9nIGVhY2ggbWlzc2luZyBzcHJpdGUgb25jZVxuICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBjb3VsZCBub3QgZmluZCBzcHJpdGUgJyR7c3ByaXRlfScgZm9yIHRleHR1cmUgJyR7dGhpcy50ZXh0dXJlfSdgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmVfbWlzc2luZ19zcHJpdGVzW3Nwcml0ZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmZvO1xuICAgIH0sXG5cbiAgICBwYXJzZVNwcml0ZSAoZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgc3ByaXRlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuc3ByaXRlLCBjb250ZXh0KTtcbiAgICAgICAgbGV0IHNwcml0ZV9pbmZvID0gdGhpcy5nZXRTcHJpdGVJbmZvKHNwcml0ZSkgfHwgdGhpcy5nZXRTcHJpdGVJbmZvKGRyYXcuc3ByaXRlX2RlZmF1bHQpO1xuICAgICAgICByZXR1cm4gc3ByaXRlX2luZm87XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgc3RhcnREYXRhICh0aWxlKSB7XG4gICAgICAgIHRoaXMucXVldWVzW3RpbGUua2V5XSA9IFtdO1xuICAgICAgICByZXR1cm4gU3R5bGUuc3RhcnREYXRhLmNhbGwodGhpcywgdGlsZSk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgZW5kRGF0YSAodGlsZSkge1xuICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZSAke3RoaXMubmFtZX06IHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHF1ZXVlID0gdGhpcy5xdWV1ZXNbdGlsZS5rZXldO1xuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0gPSBbXTtcblxuICAgICAgICAvLyBGb3IgZWFjaCBwb2ludCBmZWF0dXJlLCBjcmVhdGUgb25lIG9yIG1vcmUgbGFiZWxzXG4gICAgICAgIGxldCB0ZXh0X29ianMgPSBbXTtcbiAgICAgICAgbGV0IHBvaW50X29ianMgPSBbXTtcblxuICAgICAgICBxdWV1ZS5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gcS5zdHlsZTtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlID0gcS5mZWF0dXJlO1xuICAgICAgICAgICAgbGV0IGdlb21ldHJ5ID0gZmVhdHVyZS5nZW9tZXRyeTtcblxuICAgICAgICAgICAgbGV0IGZlYXR1cmVfbGFiZWxzID0gdGhpcy5idWlsZExhYmVscyhzdHlsZS5zaXplLCBnZW9tZXRyeSwgc3R5bGUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0dXJlX2xhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGZlYXR1cmVfbGFiZWxzW2ldO1xuICAgICAgICAgICAgICAgIGxldCBwb2ludF9vYmogPSB7XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgIGRyYXc6IHEuZHJhdyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogcS5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHBvaW50X29ianMucHVzaChwb2ludF9vYmopO1xuXG4gICAgICAgICAgICAgICAgaWYgKHEudGV4dF9mZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X29iaiA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkcmF3OiBxLnRleHRfZmVhdHVyZS5kcmF3LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogcS5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogcS50ZXh0X2ZlYXR1cmUudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfc2V0dGluZ3Nfa2V5OiBxLnRleHRfZmVhdHVyZS50ZXh0X3NldHRpbmdzX2tleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dDogcS50ZXh0X2ZlYXR1cmUubGF5b3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VkOiBwb2ludF9vYmogICAvLyBsaW5rIHNvIHRleHQgb25seSByZW5kZXJzIHdoZW4gcGFyZW50IHBvaW50IGlzIHBsYWNlZFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X29ianMucHVzaCh0ZXh0X29iaik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVW5sZXNzIHRleHQgZmVhdHVyZSBpcyBvcHRpb25hbCwgY3JlYXRlIGEgdHdvLXdheSBsaW5rIHNvIHRoYXQgcGFyZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIHBvaW50IHdpbGwgb25seSByZW5kZXIgd2hlbiB0ZXh0IGlzIGFsc28gcGxhY2VkXG4gICAgICAgICAgICAgICAgICAgIGlmICghcS5kcmF3LnRleHQub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X29iai5saW5rZWQgPSB0ZXh0X29iajsgLy8gdHdvLXdheSBsaW5rXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENvbGxpZGUgYm90aCBwb2ludHMgYW5kIHRleHQsIHRoZW4gYnVpbGQgZmVhdHVyZXNcbiAgICAgICAgcmV0dXJuIFByb21pc2UuXG4gICAgICAgICAgICBhbGwoW1xuICAgICAgICAgICAgICAgIC8vIFBvaW50c1xuICAgICAgICAgICAgICAgIENvbGxpc2lvbi5jb2xsaWRlKHBvaW50X29ianMsIHRoaXMuY29sbGlzaW9uX2dyb3VwX3BvaW50cywgdGlsZS5rZXkpLnRoZW4ocG9pbnRfb2JqcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50X29ianMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHEuc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUubGFiZWwgPSBxLmxhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUuYWRkRmVhdHVyZS5jYWxsKHRoaXMsIHEuZmVhdHVyZSwgcS5kcmF3LCBxLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAvLyBMYWJlbHNcbiAgICAgICAgICAgICAgICB0aGlzLnByZXBhcmVUZXh0TGFiZWxzKHRpbGUsIHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQsIHRleHRfb2JqcykuXG4gICAgICAgICAgICAgICAgICAgIHRoZW4obGFiZWxzID0+IHRoaXMuY29sbGlkZUFuZFJlbmRlclRleHRMYWJlbHModGlsZSwgdGhpcy5jb2xsaXNpb25fZ3JvdXBfdGV4dCwgbGFiZWxzKSlcbiAgICAgICAgICAgIF0pLnRoZW4oKFssIHsgbGFiZWxzLCB0ZXh0cywgdGV4dHVyZSB9XSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgbGFiZWxzXG4gICAgICAgICAgICAgICAgaWYgKGxhYmVscyAmJiB0ZXh0cykge1xuICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBxdWV1ZWQgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5nc19rZXkgPSBxLnRleHRfc2V0dGluZ3Nfa2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRzW3RleHRfc2V0dGluZ3Nfa2V5XSAmJiB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV1bcS50ZXh0XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgc3R5bGluZyBvYmplY3QgZXhwZWN0ZWQgYnkgU3R5bGUgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmxhYmVsID0gcS5sYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSB0ZXh0X2luZm8uc2l6ZS5sb2dpY2FsX3NpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSB0ZXh0X2luZm8uYWxpZ25bcS5sYWJlbC5hbGlnbl0udGV4Y29vcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuYW5nbGUgPSBxLmxhYmVsLmFuZ2xlIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zYW1wbGVyID0gMTsgLy8gbm9uLTAgPSBsYWJlbHNcblxuICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUuYWRkRmVhdHVyZS5jYWxsKHRoaXMsIHEuZmVhdHVyZSwgcS5kcmF3LCBxLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5mcmVlVGV4dCh0aWxlKTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmlzaCB0aWxlIG1lc2hcbiAgICAgICAgICAgICAgICByZXR1cm4gU3R5bGUuZW5kRGF0YS5jYWxsKHRoaXMsIHRpbGUpLnRoZW4odGlsZV9kYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoIHRpbGUtc3BlY2lmaWMgbGFiZWwgYXRsYXMgdG8gbWVzaCBhcyBhIHRleHR1cmUgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSAmJiB0aWxlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3JtcyA9IHRpbGVfZGF0YS51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcyA9IHRpbGVfZGF0YS50ZXh0dXJlcyB8fCBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnVuaWZvcm1zLnVfbGFiZWxfdGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMucHVzaCh0ZXh0dXJlKTsgLy8gYXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIGRyYXcuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5jb2xvcik7XG4gICAgICAgIGRyYXcueiA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy56LCBTdHlsZVBhcnNlci5wYXJzZVVuaXRzKTtcblxuICAgICAgICAvLyBTaXplICgxZCB2YWx1ZSBvciAyZCBhcnJheSlcbiAgICAgICAgZHJhdy5zaXplID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnNpemUsIHYgPT4gQXJyYXkuaXNBcnJheSh2KSA/IHYubWFwKHBhcnNlRmxvYXQpIDogcGFyc2VGbG9hdCh2KSk7XG5cbiAgICAgICAgLy8gT2Zmc2V0ICgyZCBhcnJheSlcbiAgICAgICAgZHJhdy5vZmZzZXQgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub2Zmc2V0LCB2ID0+IChBcnJheS5pc0FycmF5KHYpICYmIHYubWFwKHBhcnNlRmxvYXQpKSB8fCAwKTtcblxuICAgICAgICAvLyBCdWZmZXIgKDFkIHZhbHVlIG9yIDJkIGFycmF5LCBleHBhbmQgMWQgdG8gMmQpXG4gICAgICAgIGRyYXcuYnVmZmVyID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmJ1ZmZlciwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdiwgdl0pLm1hcChwYXJzZUZsb2F0KSB8fCAwKTtcblxuICAgICAgICAvLyBSZXBlYXQgcnVsZXMgLSBubyByZXBlYXQgbGltaXRhdGlvbiBmb3IgcG9pbnRzIGJ5IGRlZmF1bHRcbiAgICAgICAgZHJhdy5yZXBlYXRfZGlzdGFuY2UgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcucmVwZWF0X2Rpc3RhbmNlLCBwYXJzZUZsb2F0KTtcblxuICAgICAgICAvLyBQbGFjZW1lbnQgc3RyYXRlZ2llc1xuICAgICAgICBkcmF3LnBsYWNlbWVudCA9IFBMQUNFTUVOVFtkcmF3LnBsYWNlbWVudCAmJiBkcmF3LnBsYWNlbWVudC50b1VwcGVyQ2FzZSgpXTtcbiAgICAgICAgaWYgKGRyYXcucGxhY2VtZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgIGRyYXcucGxhY2VtZW50ID0gUExBQ0VNRU5ULlZFUlRFWDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRyYXcucGxhY2VtZW50X3NwYWNpbmcgPSBkcmF3LnBsYWNlbWVudF9zcGFjaW5nICE9IG51bGwgPyBkcmF3LnBsYWNlbWVudF9zcGFjaW5nIDogODA7IC8vIGRlZmF1bHQgc3BhY2luZ1xuICAgICAgICBkcmF3LnBsYWNlbWVudF9zcGFjaW5nID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnBsYWNlbWVudF9zcGFjaW5nLCBwYXJzZUZsb2F0KTtcblxuICAgICAgICBkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvID0gZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyAhPSBudWxsID8gZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA6IDE7XG4gICAgICAgIGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8sIHBhcnNlRmxvYXQpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgZHJhdy5hbmdsZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGRyYXcuYW5nbGUgPSBkcmF3LmFuZ2xlICogTWF0aC5QSSAvIDE4MDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRyYXcuYW5nbGUgPSBkcmF3LmFuZ2xlIHx8IDA7IC8vIGFuZ2xlIGNhbiBiZSBhIHN0cmluZyBsaWtlIFwiYXV0b1wiICh1c2UgYW5nbGUgb2YgZ2VvbWV0cnkpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCB0ZXh0IHN0eWxpbmdcbiAgICAgICAgZHJhdy50ZXh0ID0gdGhpcy5wcmVwcm9jZXNzVGV4dChkcmF3LnRleHQpOyAvLyB3aWxsIHJldHVybiBudWxsIGlmIHZhbGlkIHRleHQgc3R5bGluZyB3YXNuJ3QgcHJvdmlkZWRcbiAgICAgICAgaWYgKGRyYXcudGV4dCkge1xuICAgICAgICAgICAgZHJhdy50ZXh0LmtleSA9IGRyYXcua2V5OyAvLyBjb3B5IGxheWVyIGtleSBmb3IgdXNlIGFzIGxhYmVsIHJlcGVhdCBncm91cFxuICAgICAgICAgICAgZHJhdy50ZXh0LnJlcGVhdF9ncm91cCA9IGRyYXcudGV4dC5yZXBlYXRfZ3JvdXAgfHwgZHJhdy5yZXBlYXRfZ3JvdXA7IC8vIGluaGVyaXQgcmVwZWF0IGdyb3VwIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIGRyYXcudGV4dC5hbmNob3IgPSBkcmF3LnRleHQuYW5jaG9yIHx8IHRoaXMuZGVmYXVsdF9hbmNob3I7XG4gICAgICAgICAgICBkcmF3LnRleHQub3B0aW9uYWwgPSAodHlwZW9mIGRyYXcudGV4dC5vcHRpb25hbCA9PT0gJ2Jvb2xlYW4nKSA/IGRyYXcudGV4dC5vcHRpb25hbCA6IGZhbHNlOyAvLyBkZWZhdWx0IHRleHQgdG8gcmVxdWlyZWRcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBEZWZhdWx0IHRvIHRyeWluZyBhbGwgYW5jaG9yIHBsYWNlbWVudHNcbiAgICBkZWZhdWx0X2FuY2hvcjogWydib3R0b20nLCAndG9wJywgJ3JpZ2h0JywgJ2xlZnQnXSxcblxuICAgIC8vIENvbXB1dGUgbGFiZWwgbGF5b3V0LXJlbGF0ZWQgcHJvcGVydGllc1xuICAgIGNvbXB1dGVMYXlvdXQgKHRhcmdldCwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSkge1xuICAgICAgICBsZXQgbGF5b3V0ID0gdGFyZ2V0IHx8IHt9O1xuICAgICAgICBsYXlvdXQuaWQgPSBmZWF0dXJlO1xuICAgICAgICBsYXlvdXQudW5pdHNfcGVyX3BpeGVsID0gdGlsZS51bml0c19wZXJfcGl4ZWwgfHwgMTtcblxuICAgICAgICAvLyBjb2xsaXNpb24gZmxhZ1xuICAgICAgICBsYXlvdXQuY29sbGlkZSA9IChkcmF3LmNvbGxpZGUgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTtcblxuICAgICAgICAvLyB0aWxlIGJvdW5kYXJ5IGhhbmRsaW5nXG4gICAgICAgIGxheW91dC5jdWxsX2Zyb21fdGlsZSA9IChkcmF3LmN1bGxfZnJvbV90aWxlICE9IG51bGwpID8gZHJhdy5jdWxsX2Zyb21fdGlsZSA6IGZhbHNlO1xuXG4gICAgICAgIC8vIHBvaW50cyBzaG91bGQgbm90IG1vdmUgaW50byB0aWxlIGlmIG92ZXIgdGlsZSBib3VuZGFyeVxuICAgICAgICBsYXlvdXQubW92ZV9pbnRvX3RpbGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBsYWJlbCBhbmNob3JzIChwb2ludCBsYWJlbHMgb25seSlcbiAgICAgICAgLy8gbGFiZWwgcG9zaXRpb24gd2lsbCBiZSBhZGp1c3RlZCBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLCByZWxhdGl2ZSB0byBpdHMgb3JpZ2luYWwgcG9pbnRcbiAgICAgICAgLy8gb25lIG9mOiBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRvcC1sZWZ0LCB0b3AtcmlnaHQsIGJvdHRvbS1sZWZ0LCBib3R0b20tcmlnaHRcbiAgICAgICAgbGF5b3V0LmFuY2hvciA9IGRyYXcuYW5jaG9yO1xuXG4gICAgICAgIC8vIGxhYmVsIG9mZnNldCBhbmQgYnVmZmVyIGluIHBpeGVsIChhcHBsaWVkIGluIHNjcmVlbiBzcGFjZSlcbiAgICAgICAgbGF5b3V0Lm9mZnNldCA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3Lm9mZnNldCwgY29udGV4dCkgfHwgU3R5bGVQYXJzZXIuemVyb1BhaXI7XG4gICAgICAgIGxheW91dC5idWZmZXIgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5idWZmZXIsIGNvbnRleHQpIHx8IFN0eWxlUGFyc2VyLnplcm9QYWlyO1xuXG4gICAgICAgIC8vIHJlcGVhdCBydWxlc1xuICAgICAgICBsYXlvdXQucmVwZWF0X2Rpc3RhbmNlID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcucmVwZWF0X2Rpc3RhbmNlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGxheW91dC5yZXBlYXRfZGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZGlzdGFuY2UgKj0gbGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBkcmF3LnJlcGVhdF9ncm91cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGxheW91dC5yZXBlYXRfZ3JvdXAgPSBkcmF3LnJlcGVhdF9ncm91cChjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkcmF3LnJlcGVhdF9ncm91cCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5yZXBlYXRfZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5rZXk7IC8vIGRlZmF1bHQgdG8gdW5pcXVlIHNldCBvZiBtYXRjaGluZyBsYXllcnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxhYmVsIHByaW9yaXR5IChsb3dlciBpcyBoaWdoZXIpXG4gICAgICAgIGxldCBwcmlvcml0eSA9IGRyYXcucHJpb3JpdHk7XG4gICAgICAgIGlmIChwcmlvcml0eSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByaW9yaXR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBwcmlvcml0eShjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByaW9yaXR5ID0gLTEgPj4+IDA7IC8vIGRlZmF1bHQgdG8gbWF4IHByaW9yaXR5IHZhbHVlIGlmIG5vbmUgc2V0XG4gICAgICAgIH1cbiAgICAgICAgbGF5b3V0LnByaW9yaXR5ID0gcHJpb3JpdHk7XG5cbiAgICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9LFxuXG4gICAgLy8gSW1wbGVtZW50cyBsYWJlbCBidWlsZGluZyBmb3IgVGV4dExhYmVscyBtaXhpblxuICAgIGJ1aWxkVGV4dExhYmVscyAodGlsZV9rZXksIGZlYXR1cmVfcXVldWUpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmPTA7IGYgPCBmZWF0dXJlX3F1ZXVlLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICBsZXQgZnEgPSBmZWF0dXJlX3F1ZXVlW2ZdO1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRoaXMudGV4dHNbdGlsZV9rZXldW2ZxLnRleHRfc2V0dGluZ3Nfa2V5XVtmcS50ZXh0XTtcbiAgICAgICAgICAgIGxldCBzaXplID0gdGV4dF9pbmZvLnNpemUuY29sbGlzaW9uX3NpemU7XG4gICAgICAgICAgICBmcS5sYWJlbCA9IG5ldyBMYWJlbFBvaW50KGZxLnBvaW50X2xhYmVsLnBvc2l0aW9uLCBzaXplLCBmcS5sYXlvdXQpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2goZnEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkcyBvbmUgb3IgbW9yZSBwb2ludCBsYWJlbHMgZm9yIGEgZ2VvbWV0cnlcbiAgICBidWlsZExhYmVscyAoc2l6ZSwgZ2VvbWV0cnksIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuXG4gICAgICAgIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvaW50XCIpIHtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGdlb21ldHJ5LmNvb3JkaW5hdGVzLCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvaW50XCIpIHtcbiAgICAgICAgICAgIGxldCBwb2ludHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KHBvaW50LCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBsZXQgcG9pbnRfbGFiZWxzID0gcGxhY2VQb2ludHNPbkxpbmUobGluZSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aUxpbmVTdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IGxpbmVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBsbiA9IDA7IGxuIDwgbGluZXMubGVuZ3RoOyBsbisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tsbl07XG4gICAgICAgICAgICAgICAgbGV0IHBvaW50X2xhYmVscyA9IHBsYWNlUG9pbnRzT25MaW5lKGxpbmUsIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRfbGFiZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiUG9seWdvblwiKSB7XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBwb2x5Z29uIGNlbnRyb2lkIChvZiBvdXRlciByaW5nKVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGxhY2VtZW50ID09PSBQTEFDRU1FTlQuQ0VOVFJPSUQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8uY2VudHJvaWQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQb2ludCBhdCBlYWNoIHBvbHlnb24gdmVydGV4IChhbGwgcmluZ3MpXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcmluZ3MgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBsbiA9IDA7IGxuIDwgcmluZ3MubGVuZ3RoOyBsbisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb2ludF9sYWJlbHMgPSBwbGFjZVBvaW50c09uTGluZShyaW5nc1tsbl0sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gocG9pbnRfbGFiZWxzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9seWdvblwiKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5wbGFjZW1lbnQgPT09IFBMQUNFTUVOVC5DRU5UUk9JRCkge1xuICAgICAgICAgICAgICAgIGxldCBjZW50cm9pZCA9IEdlby5tdWx0aUNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvbHlzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBwb2x5cy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmluZ3MgPSBwb2x5c1twXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbG4gPSAwOyBsbiA8IHJpbmdzLmxlbmd0aDsgbG4rKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvaW50X2xhYmVscyA9IHBsYWNlUG9pbnRzT25MaW5lKHJpbmdzW2xuXSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIFwidGVtcGxhdGVcIiB0aGF0IHNldHMgY29uc3RhbnQgYXR0aWJ1dGVzIGZvciBlYWNoIHZlcnRleCwgd2hpY2ggaXMgdGhlbiBtb2RpZmllZCBwZXIgdmVydGV4IG9yIHBlciBmZWF0dXJlLlxuICAgICAqIEEgcGxhaW4gSlMgYXJyYXkgbWF0Y2hpbmcgdGhlIG9yZGVyIG9mIHRoZSB2ZXJ0ZXggbGF5b3V0LlxuICAgICAqL1xuICAgIG1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSkge1xuICAgICAgICBsZXQgY29sb3IgPSBzdHlsZS5jb2xvciB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5jb2xvcjtcblxuICAgICAgICAvLyBwb3NpdGlvbiAtIHggJiB5IGNvb3JkcyB3aWxsIGJlIGZpbGxlZCBpbiBwZXItdmVydGV4IGJlbG93XG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3Bvc2l0aW9uJywgMCwgeyBzaXplOiAyIH0pO1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9wb3NpdGlvbicsIHN0eWxlLnogfHwgMCwgeyBzaXplOiAxLCBvZmZzZXQ6IDIgfSk7XG4gICAgICAgIC8vIGxheWVyIG9yZGVyIC0gdyBjb29yZCBvZiAncG9zaXRpb24nIGF0dHJpYnV0ZSAoZm9yIHBhY2tpbmcgZWZmaWNpZW5jeSlcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfcG9zaXRpb24nLCB0aGlzLnNjYWxlT3JkZXIoc3R5bGUub3JkZXIpLCB7IHNpemU6IDEsIG9mZnNldDogMyB9KTtcblxuICAgICAgICAvLyBzY2FsaW5nIHZlY3RvciAtICh4LCB5KSBjb21wb25lbnRzIHBlciBwaXhlbCwgeiA9IGFuZ2xlLCB3ID0gc2NhbGluZyBmYWN0b3JcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2Ffc2hhcGUnLCAwLCB7IHNpemU6IDQgfSk7XG5cbiAgICAgICAgLy8gdGV4dHVyZSBjb29yZHNcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfdGV4Y29vcmQnLCAwLCB7IHNpemU6IDIgfSk7XG5cbiAgICAgICAgLy8gb2Zmc2V0c1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9vZmZzZXQnLCAwLCB7IHNpemU6IDIgfSk7XG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfY29sb3InLCBWZWN0b3IubXVsdChjb2xvciwgMjU1KSwgeyBzaXplOiA0IH0pO1xuXG4gICAgICAgIC8vIHNlbGVjdGlvbiBjb2xvclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3NlbGVjdGlvbl9jb2xvcicsIFZlY3Rvci5tdWx0KHN0eWxlLnNlbGVjdGlvbl9jb2xvciwgMjU1KSwgeyBzaXplOiA0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4X3RlbXBsYXRlO1xuICAgIH0sXG5cbiAgICBidWlsZFF1YWQocG9pbnRzLCBzaXplLCBhbmdsZSwgc2FtcGxlciwgb2Zmc2V0LCB0ZXhjb29yZF9zY2FsZSwgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSkge1xuICAgICAgICBidWlsZFF1YWRzRm9yUG9pbnRzKFxuICAgICAgICAgICAgcG9pbnRzLFxuICAgICAgICAgICAgdmVydGV4X2RhdGEsXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3RleGNvb3JkLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9wb3NpdGlvbixcbiAgICAgICAgICAgICAgICBzaGFwZV9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfc2hhcGUsXG4gICAgICAgICAgICAgICAgb2Zmc2V0X2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9vZmZzZXRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcXVhZDogc2l6ZSxcbiAgICAgICAgICAgICAgICBxdWFkX25vcm1hbGl6ZTogMjU2LCAgICAvLyB2YWx1ZXMgaGF2ZSBhbiA4LWJpdCBmcmFjdGlvblxuICAgICAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICAgICAgICBhbmdsZTogYW5nbGUgKiA0MDk2LCAgICAvLyB2YWx1ZXMgaGF2ZSBhIDEyLWJpdCBmcmFjdGlvblxuICAgICAgICAgICAgICAgIHNoYXBlX3c6IHNhbXBsZXIsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfc2NhbGUsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplOiA2NTUzNVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBxdWFkIGZvciBwb2ludCBzcHJpdGVcbiAgICBidWlsZCAoc3R5bGUsIHZlcnRleF9kYXRhKSB7XG4gICAgICAgIGxldCBsYWJlbCA9IHN0eWxlLmxhYmVsO1xuICAgICAgICBpZiAobGFiZWwubnVtX3NlZ21lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkQXJ0aWN1bGF0ZWRMYWJlbChsYWJlbCwgc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMYWJlbChsYWJlbCwgc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBidWlsZExhYmVsIChsYWJlbCwgc3R5bGUsIHZlcnRleF9kYXRhKSB7XG4gICAgICAgIGxldCB2ZXJ0ZXhfdGVtcGxhdGUgPSB0aGlzLm1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSk7XG4gICAgICAgIGxldCBhbmdsZSA9IGxhYmVsLmFuZ2xlIHx8IHN0eWxlLmFuZ2xlO1xuXG4gICAgICAgIHRoaXMuYnVpbGRRdWFkKFxuICAgICAgICAgICAgW2xhYmVsLnBvc2l0aW9uXSwgICAgICAgICAgICAgICAvLyBwb3NpdGlvblxuICAgICAgICAgICAgc3R5bGUuc2l6ZSwgICAgICAgICAgICAgICAgICAgICAvLyBzaXplIGluIHBpeGVsc1xuICAgICAgICAgICAgYW5nbGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmdsZSBpbiByYWRpYW5zXG4gICAgICAgICAgICBzdHlsZS5zYW1wbGVyLCAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgc2FtcGxlciB0byB1c2VcbiAgICAgICAgICAgIGxhYmVsLm9mZnNldCwgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGZyb20gY2VudGVyIGluIHBpeGVsc1xuICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzLCAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSAgICAvLyBWQk8gYW5kIGRhdGEgZm9yIGN1cnJlbnQgdmVydGV4XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGJ1aWxkQXJ0aWN1bGF0ZWRMYWJlbCAobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFiZWwubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgbGV0IGFuZ2xlID0gbGFiZWwuYW5nbGVbaV07XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHN0eWxlLnNpemVbaV07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gbGFiZWwub2Zmc2V0c1tpXTtcbiAgICAgICAgICAgIGxldCB0ZXhjb29yZCA9IHN0eWxlLnRleGNvb3Jkc1tpXTtcblxuICAgICAgICAgICAgdGhpcy5idWlsZFF1YWQoXG4gICAgICAgICAgICAgICAgW2xhYmVsLnBvc2l0aW9uXSwgICAgICAgICAgICAgICAvLyBwb3NpdGlvblxuICAgICAgICAgICAgICAgIHNpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBpbiBwaXhlbHNcbiAgICAgICAgICAgICAgICBhbmdsZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZ2xlIGluIGRlZ3JlZXNcbiAgICAgICAgICAgICAgICBzdHlsZS5zYW1wbGVyLCAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgc2FtcGxlciB0byB1c2VcbiAgICAgICAgICAgICAgICBvZmZzZXQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBmcm9tIGNlbnRlciBpbiBwaXhlbHNcbiAgICAgICAgICAgICAgICB0ZXhjb29yZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgVVZzXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSAgICAvLyBWQk8gYW5kIGRhdGEgZm9yIGN1cnJlbnQgdmVydGV4XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlIHRvIHBhc3MtdGhyb3VnaCB0byBnZW5lcmljIHBvaW50IGJ1aWxkZXJcbiAgICBidWlsZExpbmVzIChsaW5lcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVpbGQoc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2ludHMgKHBvaW50cywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVpbGQoc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICB9LFxuXG4gICAgYnVpbGRQb2x5Z29ucyAocG9pbnRzLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5idWlsZChzdHlsZSwgdmVydGV4X2RhdGEpO1xuICAgIH0sXG5cbiAgICBtYWtlTWVzaCAodmVydGV4X2RhdGEsIHZlcnRleF9lbGVtZW50cywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIEFkZCBsYWJlbCBmYWRlIHRpbWVcbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMsIHsgZmFkZV9pbl90aW1lOiB0aGlzLmZhZGVfaW5fdGltZSB9KTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLm1ha2VNZXNoLmNhbGwodGhpcywgdmVydGV4X2RhdGEsIHZlcnRleF9lbGVtZW50cywgb3B0aW9ucyk7XG4gICAgfVxuXG59KTtcbiIsIi8vIFBvbHlnb24gcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgZ2wgZnJvbSAnLi4vLi4vZ2wvY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBWZXJ0ZXhMYXlvdXQgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2xheW91dCc7XG5pbXBvcnQge2J1aWxkUG9seWdvbnMsIGJ1aWxkRXh0cnVkZWRQb2x5Z29uc30gZnJvbSAnLi4vLi4vYnVpbGRlcnMvcG9seWdvbnMnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX3BvbHlnb25zVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9seWdvbnNfdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2x5Z29uc19mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKTtcblxuZXhwb3J0IHZhciBQb2x5Z29ucyA9IE9iamVjdC5jcmVhdGUoU3R5bGUpO1xuXG4vLyBleHBvcnQgc2hhZGVycyBmb3IgdXNlIGluIGxpbmVzLmpzXG5leHBvcnQge1xuICAgIHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCxcbiAgICBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudFxufTtcblxuT2JqZWN0LmFzc2lnbihQb2x5Z29ucywge1xuICAgIG5hbWU6ICdwb2x5Z29ucycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgdmVydGV4X3NoYWRlcl9zcmM6IHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCxcbiAgICBmcmFnbWVudF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNGcmFnbWVudCxcblxuICAgIGluaXQoKSB7XG4gICAgICAgIFN0eWxlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBCYXNpYyBhdHRyaWJ1dGVzLCBvdGhlcnMgY2FuIGJlIGFkZGVkIChzZWUgdGV4dHVyZSBVVnMgYmVsb3cpXG4gICAgICAgIHZhciBhdHRyaWJzID0gW1xuICAgICAgICAgICAgeyBuYW1lOiAnYV9wb3NpdGlvbicsIHNpemU6IDQsIHR5cGU6IGdsLlNIT1JULCBub3JtYWxpemVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnYV9ub3JtYWwnLCBzaXplOiAzLCB0eXBlOiBnbC5CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0sIC8vIGdldHMgcGFkZGVkIHRvIDQtYnl0ZXNcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBUZWxsIHRoZSBzaGFkZXIgd2UgaGF2ZSBhIG5vcm1hbCBhbmQgb3JkZXIgYXR0cmlidXRlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9OT1JNQUxfQVRUUklCVVRFID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTEFZRVJfT1JERVIgPSB0cnVlO1xuXG4gICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2Ffc2VsZWN0aW9uX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcblxuICAgICAgICAvLyBPcHRpb25hbCB0ZXh0dXJlIFVWc1xuICAgICAgICBpZiAodGhpcy50ZXhjb29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1RFWFRVUkVfQ09PUkRTID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gQWRkIHZlcnRleCBhdHRyaWJ1dGUgZm9yIFVWcyBvbmx5IHdoZW4gbmVlZGVkXG4gICAgICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV90ZXhjb29yZCcsIHNpemU6IDIsIHR5cGU6IGdsLlVOU0lHTkVEX1NIT1JULCBub3JtYWxpemVkOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gbmV3IFZlcnRleExheW91dChhdHRyaWJzKTtcbiAgICB9LFxuXG4gICAgX3BhcnNlRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG5cbiAgICAgICAgc3R5bGUuY29sb3IgPSB0aGlzLnBhcnNlQ29sb3IoZHJhdy5jb2xvciwgY29udGV4dCk7XG4gICAgICAgIGlmICghc3R5bGUuY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUueiA9IChkcmF3LnogJiYgU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkoZHJhdy56LCBjb250ZXh0KSkgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuejtcbiAgICAgICAgc3R5bGUueiAqPSBHZW8uaGVpZ2h0X3NjYWxlOyAvLyBwcm92aWRlIHN1Yi1tZXRlciBwcmVjaXNpb24gb2YgaGVpZ2h0IHZhbHVlc1xuXG4gICAgICAgIHN0eWxlLmV4dHJ1ZGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoZHJhdy5leHRydWRlLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUpIHtcbiAgICAgICAgICAgIC8vIHVzZSBmZWF0dXJlJ3MgaGVpZ2h0IGFuZCBtaW5faGVpZ2h0IHByb3BlcnRpZXNcbiAgICAgICAgICAgIGlmIChzdHlsZS5leHRydWRlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gZmVhdHVyZS5wcm9wZXJ0aWVzLmhlaWdodCB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgc3R5bGUubWluX2hlaWdodCA9IGZlYXR1cmUucHJvcGVydGllcy5taW5faGVpZ2h0IHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLm1pbl9oZWlnaHQ7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGV4cGxpY2l0IGhlaWdodCwgbm8gbWluX2hlaWdodFxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHN0eWxlLmV4dHJ1ZGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc3R5bGUuZXh0cnVkZTtcbiAgICAgICAgICAgICAgICBzdHlsZS5taW5faGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGV4cGxpY2l0IGhlaWdodCBhbmQgbWluX2hlaWdodFxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5leHRydWRlKSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgPSBzdHlsZS5leHRydWRlWzBdO1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlLmV4dHJ1ZGVbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlLmhlaWdodCAqPSBHZW8uaGVpZ2h0X3NjYWxlOyAgICAgICAvLyBwcm92aWRlIHN1Yi1tZXRlciBwcmVjaXNpb24gb2YgaGVpZ2h0IHZhbHVlc1xuICAgICAgICAgICAgc3R5bGUubWluX2hlaWdodCAqPSBHZW8uaGVpZ2h0X3NjYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUudGlsZV9lZGdlcyA9IGRyYXcudGlsZV9lZGdlczsgLy8gdXN1YWxseSBhY3RpdmF0ZWQgZm9yIGRlYnVnZ2luZywgb3IgcmFyZSB2aXN1YWxpemF0aW9uIG5lZWRzXG5cbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICBkcmF3LmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcuY29sb3IpO1xuICAgICAgICBkcmF3LnogPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcueiwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIFwidGVtcGxhdGVcIiB0aGF0IHNldHMgY29uc3RhbnQgYXR0aWJ1dGVzIGZvciBlYWNoIHZlcnRleCwgd2hpY2ggaXMgdGhlbiBtb2RpZmllZCBwZXIgdmVydGV4IG9yIHBlciBmZWF0dXJlLlxuICAgICAqIEEgcGxhaW4gSlMgYXJyYXkgbWF0Y2hpbmcgdGhlIG9yZGVyIG9mIHRoZSB2ZXJ0ZXggbGF5b3V0LlxuICAgICAqL1xuICAgIG1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSkge1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgLy8gcG9zaXRpb24gLSB4ICYgeSBjb29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gcGVyLXZlcnRleCBiZWxvd1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS56IHx8IDA7XG5cbiAgICAgICAgLy8gbGF5ZXIgb3JkZXIgLSB3IGNvb3JkIG9mICdwb3NpdGlvbicgYXR0cmlidXRlIChmb3IgcGFja2luZyBlZmZpY2llbmN5KVxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gdGhpcy5zY2FsZU9yZGVyKHN0eWxlLm9yZGVyKTtcblxuICAgICAgICAvLyBub3JtYWxcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMSAqIDEyNztcblxuICAgICAgICAvLyBjb2xvclxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMF0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsxXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzJdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbM10gKiAyNTU7XG5cbiAgICAgICAgLy8gc2VsZWN0aW9uIGNvbG9yXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclswXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMV0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzJdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclszXSAqIDI1NTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0ZXh0dXJlIFVWcyB0byB0ZW1wbGF0ZSBvbmx5IGlmIG5lZWRlZFxuICAgICAgICBpZiAodGhpcy50ZXhjb29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy52ZXJ0ZXhfdGVtcGxhdGU7XG4gICAgfSxcblxuICAgIGJ1aWxkUG9seWdvbnMocG9seWdvbnMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHRleGNvb3JkX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV90ZXhjb29yZCxcbiAgICAgICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZTogNjU1MzUsIC8vIHNjYWxlIFVWcyB0byB1bnNpZ25lZCBzaG9ydHNcbiAgICAgICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzOiAhc3R5bGUudGlsZV9lZGdlcyxcbiAgICAgICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2U6IEdlby50aWxlX3NjYWxlICogY29udGV4dC50aWxlLnBhZF9zY2FsZSAqIDQsXG4gICAgICAgICAgICB3aW5kaW5nOiBjb250ZXh0LndpbmRpbmdcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBFeHRydWRlZCBwb2x5Z29ucyAoZS5nLiAzRCBidWlsZGluZ3MpXG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlICYmIHN0eWxlLmhlaWdodCkge1xuICAgICAgICAgICAgYnVpbGRFeHRydWRlZFBvbHlnb25zKFxuICAgICAgICAgICAgICAgIHBvbHlnb25zLFxuICAgICAgICAgICAgICAgIHN0eWxlLnosIHN0eWxlLmhlaWdodCwgc3R5bGUubWluX2hlaWdodCxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAgICAgIHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX25vcm1hbCxcbiAgICAgICAgICAgICAgICAxMjcsIC8vIHNjYWxlIG5vcm1hbHMgdG8gc2lnbmVkIGJ5dGVzXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWd1bGFyIHBvbHlnb25zXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnVpbGRQb2x5Z29ucyhcbiAgICAgICAgICAgICAgICBwb2x5Z29ucyxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbn0pO1xuIiwiLy8gUmFzdGVyIHRpbGUgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQge1BvbHlnb25zfSBmcm9tICcuLi9wb2x5Z29ucy9wb2x5Z29ucyc7XG5cbmV4cG9ydCBsZXQgUmFzdGVyU3R5bGUgPSBPYmplY3QuY3JlYXRlKFBvbHlnb25zKTtcblxuT2JqZWN0LmFzc2lnbihSYXN0ZXJTdHlsZSwge1xuICAgIG5hbWU6ICdyYXN0ZXInLFxuICAgIHN1cGVyOiBQb2x5Z29ucyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcblxuICAgIGluaXQoKSB7XG4gICAgICAgIC8vIFJlcXVpcmVkIGZvciByYXN0ZXIgdGlsZXNcbiAgICAgICAgdGhpcy5yYXN0ZXIgPSB0aGlzLnJhc3RlciB8fCAnY29sb3InO1xuXG4gICAgICAgIHRoaXMuc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gZmFsc2U7IC8vIHJhc3RlciBzdHlsZXMgY2FuJ3Qgc3VwcG9ydCBmZWF0dXJlIHNlbGVjdGlvblxuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICAvLyBSYXN0ZXIgdGlsZXMgZGVmYXVsdCB0byB3aGl0ZSB2ZXJ0ZXggY29sb3IsIGFzIHRoaXMgY29sb3Igd2lsbCB0aW50IHRoZSB1bmRlcmx5aW5nIHRleHR1cmVcbiAgICAgICAgZHJhdy5jb2xvciA9IGRyYXcuY29sb3IgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgICAgIHJldHVybiB0aGlzLnN1cGVyLl9wcmVwcm9jZXNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG59KTtcbiIsIi8vIFJlbmRlcmluZyBzdHlsZXNcblxuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi4vc2VsZWN0aW9uJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4uL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCBWQk9NZXNoIGZyb20gJy4uL2dsL3Zib19tZXNoJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IE1hdGVyaWFsIGZyb20gJy4uL21hdGVyaWFsJztcbmltcG9ydCBMaWdodCBmcm9tICcuLi9saWdodCc7XG5pbXBvcnQge1Jhc3RlclRpbGVTb3VyY2V9IGZyb20gJy4uL3NvdXJjZXMvcmFzdGVyJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi4vdXRpbHMvdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uRnJhZ21lbnQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi9nbC9zaGFkZXJzL3NlbGVjdGlvbl9mcmFnbWVudC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19yYXN0ZXJzID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9yYXN0ZXJzLmdsc2wnLCAndXRmOCcpO1xuXG4vLyBCYXNlIGNsYXNzXG5cbmV4cG9ydCB2YXIgU3R5bGUgPSB7XG4gICAgaW5pdCAoeyBnZW5lcmF0aW9uLCBzdHlsZXMsIHNvdXJjZXMgPSB7fSwgaW50cm9zcGVjdGlvbiB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsgICAgICAgICAgICAgICAvLyBzY2VuZSBnZW5lcmF0aW9uIGlkIHRoaXMgc3R5bGUgd2FzIGNyZWF0ZWQgZm9yXG4gICAgICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzOyAgICAgICAgICAgICAgICAgICAgICAgLy8gc3R5bGVzIGZvciBzY2VuZVxuICAgICAgICB0aGlzLnNvdXJjZXMgPSBzb3VyY2VzOyAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgc291cmNlcyBmb3Igc2NlbmVcbiAgICAgICAgdGhpcy5kZWZpbmVzID0gKHRoaXMuaGFzT3duUHJvcGVydHkoJ2RlZmluZXMnKSAmJiB0aGlzLmRlZmluZXMpIHx8IHt9OyAvLyAjZGVmaW5lcyB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBzaGFkZXJzXG4gICAgICAgIHRoaXMuc2hhZGVycyA9ICh0aGlzLmhhc093blByb3BlcnR5KCdzaGFkZXJzJykgJiYgdGhpcy5zaGFkZXJzKSB8fCB7fTsgLy8gc2hhZGVyIGN1c3RvbWl6YXRpb24gKHVuaWZvcm1zLCBkZWZpbmVzLCBibG9ja3MsIGV0Yy4pXG4gICAgICAgIHRoaXMuaW50cm9zcGVjdGlvbiA9IGludHJvc3BlY3Rpb24gfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24gfHwgdGhpcy5pbnRyb3NwZWN0aW9uIHx8IGZhbHNlOyAgIC8vIGZsYWcgaW5kaWNhdGluZyBpZiB0aGlzIHN0eWxlIHN1cHBvcnRzIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIHRoaXMuY29tcGlsZV9zZXR1cCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgLy8gb25lLXRpbWUgc2V0dXAgc3RlcHMgZm9yIHByb2dyYW0gY29tcGlsYXRpb25cbiAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBHTCBwcm9ncmFtIHJlZmVyZW5jZSAoZm9yIG1haW4gcmVuZGVyIHBhc3MpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBudWxsOyAgICAgICAgICAgICAgLy8gR0wgcHJvZ3JhbSByZWZlcmVuY2UgZm9yIGZlYXR1cmUgc2VsZWN0aW9uIHJlbmRlciBwYXNzXG4gICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHt9OyAgICAgICAgICAgICAgICAgICAgLy8gc3R5bGUgZm9yIGZlYXR1cmUgY3VycmVudGx5IGJlaW5nIHBhcnNlZCwgc2hhcmVkIHRvIGxlc3NlbiBHQy9tZW1vcnkgdGhyYXNoXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlID0gW107ICAgICAgICAgICAgICAgICAgLy8gc2hhcmVkIHNpbmdsZS12ZXJ0ZXggdGVtcGxhdGUsIGZpbGxlZCBvdXQgYnkgZWFjaCBzdHlsZVxuICAgICAgICB0aGlzLnRpbGVfZGF0YSA9IHt9O1xuXG4gICAgICAgIC8vIFByb3ZpZGUgYSBob29rIGZvciB0aGlzIG9iamVjdCB0byBiZSBjYWxsZWQgZnJvbSB3b3JrZXIgdGhyZWFkc1xuICAgICAgICB0aGlzLm1haW5fdGhyZWFkX3RhcmdldCA9IFsnU3R5bGUnLCB0aGlzLm5hbWUsIHRoaXMuZ2VuZXJhdGlvbl0uam9pbignLycpO1xuICAgICAgICBpZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5hZGRUYXJnZXQodGhpcy5tYWluX3RocmVhZF90YXJnZXQsIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCB3b3JsZCBjb29yZHMgdG8gd3JhcCBldmVyeSAxMDAsMDAwIG1ldGVycywgY2FuIHR1cm4gb2ZmIGJ5IHNldHRpbmcgdGhpcyB0byAnZmFsc2UnXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1dPUkxEX1BPU0lUSU9OX1dSQVAgPSAxMDAwMDA7XG5cbiAgICAgICAgLy8gQmxlbmRpbmdcbiAgICAgICAgdGhpcy5ibGVuZCA9IHRoaXMuYmxlbmQgfHwgJ29wYXF1ZSc7ICAgICAgICAvLyBkZWZhdWx0OiBvcGFxdWUgc3R5bGVzIGFyZSBkcmF3biBmaXJzdCwgd2l0aG91dCBibGVuZGluZ1xuICAgICAgICB0aGlzLmRlZmluZXNbYFRBTkdSQU1fQkxFTkRfJHt0aGlzLmJsZW5kLnRvVXBwZXJDYXNlKCl9YF0gPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5ibGVuZF9vcmRlciA9PSBudWxsKSB7IC8vIGNvbnRyb2xzIG9yZGVyIG9mIHJlbmRlcmluZyBmb3Igc3R5bGVzIHcvbm9uLW9wYXF1ZSBibGVuZGluZ1xuICAgICAgICAgICAgdGhpcy5ibGVuZF9vcmRlciA9IC0xOyAvLyBkZWZhdWx0cyB0byBmaXJzdFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW1vdmVTaGFkZXJCbG9jaygnc2V0dXAnKTsgLy8gY2xlYXIgYmVmb3JlIG1hdGVyaWFsIGluamVjdGlvblxuXG4gICAgICAgIC8vIElmIHRoZSBzdHlsZSBkZWZpbmVzIGl0cyBvd24gbWF0ZXJpYWwsIHJlcGxhY2UgdGhlIGluaGVyaXRlZCBtYXRlcmlhbCBpbnN0YW5jZVxuICAgICAgICBpZiAoISh0aGlzLm1hdGVyaWFsIGluc3RhbmNlb2YgTWF0ZXJpYWwpKSB7XG4gICAgICAgICAgICBpZiAoIU1hdGVyaWFsLmlzVmFsaWQodGhpcy5tYXRlcmlhbCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMubWF0ZXJpYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHRoaXMubWF0ZXJpYWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuaW5qZWN0KHRoaXMpO1xuXG4gICAgICAgIC8vIFNldCBsaWdodGluZyBtb2RlOiBmcmFnbWVudCwgdmVydGV4LCBvciBub25lIChzcGVjaWZpZWQgYXMgJ2ZhbHNlJylcbiAgICAgICAgTGlnaHQuc2V0TW9kZSh0aGlzLmxpZ2h0aW5nLCB0aGlzKTtcblxuICAgICAgICAvLyBTZXR1cCByYXN0ZXIgc2FtcGxlcnMgaWYgbmVlZGVkXG4gICAgICAgIHRoaXMuc2V0dXBSYXN0ZXJzKCk7XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSxcblxuICAgIGRlc3Ryb3kgKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0uZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbl9wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgcmVzZXQgKCkge1xuICAgIH0sXG5cbiAgICBiYXNlU3R5bGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlIHx8IHRoaXMubmFtZTtcbiAgICB9LFxuXG4gICAgZmlsbFZlcnRleFRlbXBsYXRlKGF0dHJpYnV0ZSwgdmFsdWUsIHsgc2l6ZSwgb2Zmc2V0IH0pIHtcbiAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCA9PT0gdW5kZWZpbmVkKSA/IDAgOiBvZmZzZXQ7XG5cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4W2F0dHJpYnV0ZV07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBubyBpbmRleCBmb3VuZCBpbiB2ZXJ0ZXggbGF5b3V0IGZvciBhdHRyaWJ1dGUgJyR7YXR0cmlidXRlfSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbHVlLmxlbmd0aCA+IGkgPyB2YWx1ZVtpXSA6IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaW5kZXggKyBpICsgb2Zmc2V0XSA9IHY7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqKiBTdHlsZSBwYXJzaW5nIGFuZCBnZW9tZXRyeSBjb25zdHJ1Y3Rpb24gKioqL1xuXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3QgdG8gaG9sZCBmZWF0dXJlIGRhdGEgKGZvciBhIHRpbGUgb3Igb3RoZXIgb2JqZWN0KVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogbnVsbCxcbiAgICAgICAgICAgIHVuaWZvcm1zOiB7fSxcbiAgICAgICAgICAgIHRleHR1cmVzOiBbXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldO1xuICAgIH0sXG5cbiAgICAvLyBGaW5hbGl6ZXMgYW4gb2JqZWN0IGhvbGRpbmcgZmVhdHVyZSBkYXRhIChmb3IgYSB0aWxlIG9yIG90aGVyIG9iamVjdClcbiAgICBlbmREYXRhICh0aWxlKSB7XG4gICAgICAgIHZhciB0aWxlX2RhdGEgPSB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV07XG4gICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRpbGVfZGF0YSAmJiB0aWxlX2RhdGEudmVydGV4X2RhdGEgJiYgdGlsZV9kYXRhLnZlcnRleF9kYXRhLnZlcnRleF9jb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIE9ubHkga2VlcCBmaW5hbCBieXRlIGJ1ZmZlclxuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9kYXRhLmVuZCgpO1xuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS5lbGVtZW50X2J1ZmZlcjtcbiAgICAgICAgICAgIHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YSA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfYnVmZmVyOyAvLyBjb252ZXJ0IGZyb20gaW5zdGFuY2UgdG8gcmF3IHR5cGVkIGFycmF5XG5cbiAgICAgICAgICAgIC8vIExvYWQgcmFzdGVyIHRpbGVzIHBhc3NlZCBmcm9tIGRhdGEgc291cmNlXG4gICAgICAgICAgICAvLyBCbG9ja3MgbWVzaCBjb21wbGV0aW9uIHRvIGF2b2lkIGZsaWNrZXJpbmdcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmFzdGVyVGV4dHVyZXModGlsZSwgdGlsZV9kYXRhKS50aGVuKCgpID0+IHRpbGVfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOyAvLyBkb24ndCBzZW5kIHRpbGUgZGF0YSBiYWNrIGlmIGRvZXNuJ3QgaGF2ZSBnZW9tZXRyeVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEhhcyBtZXNoIGRhdGEgZm9yIGEgZ2l2ZW4gdGlsZT9cbiAgICBoYXNEYXRhRm9yVGlsZSAodGlsZV9rZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZV9kYXRhW3RpbGVfa2V5XSAhPSBudWxsO1xuICAgIH0sXG5cbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0YSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHlsZSA9IHRoaXMucGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNraXAgZmVhdHVyZT9cbiAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyc3QgZmVhdHVyZSBpbiB0aGlzIHJlbmRlciBzdHlsZT9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSA9IHRoaXMudmVydGV4X2xheW91dC5jcmVhdGVWZXJ0ZXhEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1aWxkR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgc3R5bGUsIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIGJ1aWxkR2VvbWV0cnkgKGdlb21ldHJ5LCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvbHlnb25zKFtnZW9tZXRyeS5jb29yZGluYXRlc10sIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQb2x5Z29ucyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lcyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZXMoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgICAgICBzdHlsZS5vcmRlciA9IHRoaXMucGFyc2VPcmRlcihkcmF3Lm9yZGVyLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gKG9ubHkgaWYgc3R5bGUgc3VwcG9ydHMgaXQpXG4gICAgICAgICAgICB2YXIgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgc3R5bGUuaW50ZXJhY3RpdmUgPSB0aGlzLmludHJvc3BlY3Rpb24gfHwgZHJhdy5pbnRlcmFjdGl2ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoc3R5bGUuaW50ZXJhY3RpdmUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBmZWF0dXJlIGlzIG1hcmtlZCBhcyBzZWxlY3RhYmxlXG4gICAgICAgICAgICBpZiAoc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNlbGVjdGlvbl9jb2xvciA9IEZlYXR1cmVTZWxlY3Rpb24ubWFrZUNvbG9yKGZlYXR1cmUsIGNvbnRleHQudGlsZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zZWxlY3Rpb25fY29sb3IgPSBGZWF0dXJlU2VsZWN0aW9uLmRlZmF1bHRDb2xvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5fcGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCAnU3R5bGUucGFyc2VGZWF0dXJlOiBzdHlsZSBwYXJzaW5nIGVycm9yJywgZmVhdHVyZSwgc3R5bGUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgfSxcblxuICAgIHByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgLy8gUHJlcHJvY2VzcyBmaXJzdCB0aW1lXG4gICAgICAgIGlmICghZHJhdy5wcmVwcm9jZXNzZWQpIHtcbiAgICAgICAgICAgIGRyYXcgPSB0aGlzLl9wcmVwcm9jZXNzKGRyYXcpOyAvLyBvcHRpb25hbCBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHJhdy5wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBvcHRpb25hbGx5IGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIFBhcnNlIGFuIG9yZGVyIHZhbHVlXG4gICAgcGFyc2VPcmRlciAob3JkZXIsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgIGlmICh0eXBlb2Ygb3JkZXIgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gU3R5bGVQYXJzZXIuY2FsY3VsYXRlT3JkZXIob3JkZXIsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIGZpbmFsIHByZWNpc2lvbiBmb3IgaGFsZi1sYXllcnMgKGZvciBvdXRsaW5lcylcbiAgICBzY2FsZU9yZGVyIChvcmRlcikge1xuICAgICAgICByZXR1cm4gb3JkZXIgKiAyO1xuICAgIH0sXG5cbiAgICAvLyBQYXJzZSBhIGNvbG9yIG9mIGNob29zZSBhIGRlZmF1bHQgaWYgYWNjZXB0YWJsZSwgcmV0dXJuIHVuZGVmaW5lZCBpZiBjb2xvciBtaXNzaW5nXG4gICAgcGFyc2VDb2xvcihjb2xvciwgY29udGV4dCkge1xuICAgICAgICAvLyBOZWVkIGVpdGhlciBhIGNvbG9yLCBvciBhIHNoYWRlciBibG9jayBmb3IgJ2NvbG9yJyBvciAnZmlsdGVyJ1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShjb2xvciwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcy5jb2xvciB8fCB0aGlzLnNoYWRlcnMuYmxvY2tzLmZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmRlZmF1bHRzLmNvbG9yO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIGZ1bmN0aW9ucyBhcmUgbm8tb3BzIHVudGlsIG92ZXJyaWRlblxuICAgIGJ1aWxkUG9seWdvbnMgKCkge30sXG4gICAgYnVpbGRMaW5lcyAoKSB7fSxcbiAgICBidWlsZFBvaW50cyAoKSB7fSxcblxuXG4gICAgLyoqKiBHTCBzdGF0ZSBhbmQgcmVuZGVyaW5nICoqKi9cblxuICAgIHNldEdMIChnbCkge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMubWF4X3RleHR1cmVfc2l6ZSA9IFRleHR1cmUuZ2V0TWF4VGV4dHVyZVNpemUodGhpcy5nbCk7XG4gICAgfSxcblxuICAgIG1ha2VNZXNoICh2ZXJ0ZXhfZGF0YSwgdmVydGV4X2VsZW1lbnRzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWQk9NZXNoKHRoaXMuZ2wsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIHRoaXMudmVydGV4X2xheW91dCwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIHJlbmRlciAobWVzaCkge1xuICAgICAgICByZXR1cm4gbWVzaC5yZW5kZXIoKTtcbiAgICB9LFxuXG4gICAgLy8gR2V0IGEgc3BlY2lmaWMgcHJvZ3JhbSwgY29tcGlsaW5nIGlmIG5lY2Vzc2FyeVxuICAgIGdldFByb2dyYW0gKGtleSA9ICdwcm9ncmFtJykge1xuICAgICAgICB0aGlzLmNvbXBpbGVTZXR1cCgpO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzW2tleV07XG4gICAgICAgIGlmICghcHJvZ3JhbSB8fCBwcm9ncmFtLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByb2dyYW0uY29tcGlsZWQpIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgQ29tcGlsaW5nIHN0eWxlICcke3RoaXMubmFtZX0nLCBwcm9ncmFtIGtleSAnJHtrZXl9J2ApO1xuICAgICAgICAgICAgcHJvZ3JhbS5jb21waWxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfSxcblxuICAgIC8vIE9uZS10aW1lIHNldHVwIGZvciBjb21waWxpbmcgc3R5bGUncyBwcm9ncmFtc1xuICAgIGNvbXBpbGVTZXR1cCAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGVfc2V0dXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5nbCkge1xuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBzdHlsZS5jb21waWxlKCk6IHNraXBwaW5nIGZvciAke3RoaXMubmFtZX0gYmVjYXVzZSBubyBHTCBjb250ZXh0YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgZGVmaW5lcyAmIGZvciBzZWxlY3Rpb24gKG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBzaW5jZSB0aGUgZmlyc3QgaXMgc3RvcmVkIGFzIGEgcmVmZXJlbmNlIGJ5IHRoZSBwcm9ncmFtKVxuICAgICAgICB2YXIgZGVmaW5lcyA9IHRoaXMuYnVpbGREZWZpbmVMaXN0KCk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGlvbl9kZWZpbmVzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmaW5lcyk7XG4gICAgICAgICAgICBzZWxlY3Rpb25fZGVmaW5lcy5UQU5HUkFNX0ZFQVRVUkVfU0VMRUNUSU9OID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBhbnkgY3VzdG9tIGNvZGUgYmxvY2tzLCB1bmlmb3JtIGRlcGVuZGVuY2llcywgZXRjLlxuICAgICAgICB2YXIgYmxvY2tzID0gKHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMuYmxvY2tzKTtcbiAgICAgICAgdmFyIGJsb2NrX3Njb3BlcyA9ICh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blcyk7XG4gICAgICAgIHZhciB1bmlmb3JtcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMudW5pZm9ybXMpO1xuXG4gICAgICAgIC8vIEFjY2VwdCBhIHNpbmdsZSBleHRlbnNpb24sIG9yIGFuIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSAodGhpcy5zaGFkZXJzICYmIHRoaXMuc2hhZGVycy5leHRlbnNpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiBleHRlbnNpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IFtleHRlbnNpb25zXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBzaGFkZXJzXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBTaGFkZXJQcm9ncmFtKFxuICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3NoYWRlcl9zcmMsXG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50X3NoYWRlcl9zcmMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGRlZmluZXMsXG4gICAgICAgICAgICAgICAgdW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlcyxcbiAgICAgICAgICAgICAgICBleHRlbnNpb25zXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbmV3IFNoYWRlclByb2dyYW0oXG4gICAgICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjLFxuICAgICAgICAgICAgICAgIHNoYWRlclNyY19zZWxlY3Rpb25GcmFnbWVudCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICh0aGlzLm5hbWUgKyAnIChzZWxlY3Rpb24pJyksXG4gICAgICAgICAgICAgICAgICAgIGRlZmluZXM6IHNlbGVjdGlvbl9kZWZpbmVzLFxuICAgICAgICAgICAgICAgICAgICB1bmlmb3JtcyxcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgICAgICBibG9ja19zY29wZXMsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBpbGVfc2V0dXAgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzaGFkZXIgYmxvY2tcbiAgICBhZGRTaGFkZXJCbG9jayAoa2V5LCBibG9jaywgc2NvcGUgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3MgPSB0aGlzLnNoYWRlcnMuYmxvY2tzIHx8IHt9O1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gPSB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gfHwgW107XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3Nba2V5XS5wdXNoKGJsb2NrKTtcblxuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3BlcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldIHx8IFtdO1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tleV0ucHVzaChzY29wZSk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSBhbGwgc2hhZGVyIGJsb2NrcyBmb3Iga2V5XG4gICAgcmVtb3ZlU2hhZGVyQmxvY2sgKGtleSkge1xuICAgICAgICBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2Nrc1trZXldID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZXBsYWNlU2hhZGVyQmxvY2sgKGtleSwgYmxvY2ssIHNjb3BlID0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZVNoYWRlckJsb2NrKGtleSk7XG4gICAgICAgIHRoaXMuYWRkU2hhZGVyQmxvY2soa2V5LCBibG9jaywgc2NvcGUpO1xuICAgIH0sXG5cbiAgICAvKiogVE9ETzogY291bGQgcHJvYmFibHkgY29tYmluZSBhbmQgZ2VuZXJhbGl6ZSB0aGlzIHdpdGggc2ltaWxhciBtZXRob2QgaW4gU2hhZGVyUHJvZ3JhbVxuICAgICAqIChsaXN0IG9mIGRlZmluZSBvYmplY3RzIHRoYXQgaW5oZXJpdCBmcm9tIGVhY2ggb3RoZXIpXG4gICAgICovXG4gICAgYnVpbGREZWZpbmVMaXN0ICgpIHtcbiAgICAgICAgLy8gQWRkIGFueSBjdXN0b20gZGVmaW5lcyB0byBidWlsdC1pbiBzdHlsZSBkZWZpbmVzXG4gICAgICAgIHZhciBkZWZpbmVzID0ge307IC8vIGNyZWF0ZSBhIG5ldyBvYmplY3QgdG8gYXZvaWQgbXV0YXRpbmcgYSBwcm90b3R5cGUgdmFsdWUgdGhhdCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgc3R5bGVzXG4gICAgICAgIGlmICh0aGlzLmRlZmluZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgZCBpbiB0aGlzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5kZWZpbmVzW2RdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNoYWRlcnMgIT0gbnVsbCAmJiB0aGlzLnNoYWRlcnMuZGVmaW5lcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKGQgaW4gdGhpcy5zaGFkZXJzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5zaGFkZXJzLmRlZmluZXNbZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZXM7XG5cbiAgICB9LFxuXG4gICAgLy8gRGV0ZXJtaW5lcyBpZiAncmFzdGVyJyBwYXJhbWV0ZXIgaXMgc2V0IHRvIGEgdmFsaWQgdmFsdWVcbiAgICBoYXNSYXN0ZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIChbJ2NvbG9yJywgJ25vcm1hbCcsICdjdXN0b20nXS5pbmRleE9mKHRoaXMucmFzdGVyKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgLy8gU2V0dXAgcmFzdGVyIGFjY2VzcyBpbiBzaGFkZXJzXG4gICAgc2V0dXBSYXN0ZXJzICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Jhc3RlcnMoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5hYmxlIHJhc3RlciB0ZXh0dXJlcyBhbmQgY29uZmlndXJlIGhvdyBmaXJzdCByYXN0ZXIgaXMgYXBwbGllZFxuICAgICAgICBpZiAodGhpcy5yYXN0ZXIgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX0NPTE9SID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnJhc3RlciA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX05PUk1BTCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBjdXN0b20gcmFzdGVyIChzYW1wbGVycyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGJ1dCBub3QgYXV0b21hdGljYWxseSBhcHBsaWVkKVxuXG4gICAgICAgIC8vIEEgZ2l2ZW4gc3R5bGUgbWF5IGJlIGJ1aWx0IHdpdGggbXVsdGlwbGUgZGF0YSBzb3VyY2VzLCBlYWNoIG9mIHdoaWNoIG1heSBhdHRhY2hcbiAgICAgICAgLy8gYSB2YXJpYWJsZSBudW1iZXIgb2YgcmFzdGVyIHNvdXJjZXMgKDAgdG8gTiwgd2hlcmUgTiBpcyB0aGUgbWF4IG51bWJlciBvZiByYXN0ZXIgc291cmNlc1xuICAgICAgICAvLyBkZWZpbmVkIGZvciB0aGUgc2NlbmUpLiBUaGlzIG1lYW5zIHdlIGRvbid0IGtub3cgKndoaWNoKiBvciAqaG93IG1hbnkqIHJhc3RlcnMgd2lsbCBiZVxuICAgICAgICAvLyBib3VuZCBub3csIGF0IGluaXRpYWwgY29tcGlsZS10aW1lOyB3ZSBvbmx5IGtub3cgdGhpcyBhdCBnZW9tZXRyeSBidWlsZC10aW1lLiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB3ZSBjYW4gYmluZCBhcyBtYW55IHJhc3RlciBzb3VyY2VzIGFzIG5lZWRlZCwgd2UgZGVjbGFyZSBvdXIgdW5pZm9ybSBhcnJheXMgdG8gaG9sZFxuICAgICAgICAvLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9zc2libGUgc291cmNlcy4gQXQgcmVuZGVyIHRpbWUsIG9ubHkgdGhlIG5lY2Vzc2FyeSBudW1iZXIgb2YgcmFzdGVyc1xuICAgICAgICAvLyBhcmUgYm91bmQgKHRoZSByZW1haW5pbmcgc2xvdHMgYXJlbid0IGludGVuZGVkIHRvIGJlIGFjY2Vzc2VkKS5cbiAgICAgICAgbGV0IG51bV9yYXN0ZXJfc291cmNlcyA9XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpXG4gICAgICAgICAgICAuZmlsdGVyKHMgPT4gdGhpcy5zb3VyY2VzW3NdIGluc3RhbmNlb2YgUmFzdGVyVGlsZVNvdXJjZSlcbiAgICAgICAgICAgIC5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTlVNX1JBU1RFUl9TT1VSQ0VTID0gYGludCgke251bV9yYXN0ZXJfc291cmNlc30pYDtcbiAgICAgICAgaWYgKG51bV9yYXN0ZXJfc291cmNlcyA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBtb2RlbCBwb3NpdGlvbiBvZiB0aWxlJ3MgY29vcmRpbmF0ZSB6b29tIGZvciByYXN0ZXIgdGlsZSB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTU9ERUxfUE9TSVRJT05fQkFTRV9aT09NX1ZBUllJTkcgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBVbmlmb3JtcyBhbmQgbWFjcm9zIGZvciByYXN0ZXIgc2FtcGxlcnNcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZVNoYWRlckJsb2NrKCdyYXN0ZXInLCBzaGFkZXJTcmNfcmFzdGVycywgJ1Jhc3RlcicpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIExvYWQgcmFzdGVyIHRpbGUgdGV4dHVyZXMgYW5kIHNldCB1bmlmb3Jtc1xuICAgIGJ1aWxkUmFzdGVyVGV4dHVyZXMgKHRpbGUsIHRpbGVfZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzUmFzdGVycygpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29uZmlncyA9IHt9OyAvLyB0ZXh0dXJlIGNvbmZpZ3MgdG8gcGFzcyB0byB0ZXh0dXJlIGJ1aWxkZXIsIGtleWVkIGJ5IHRleHR1cmUgbmFtZVxuICAgICAgICBsZXQgaW5kZXggPSB7fTsgICAvLyBpbmRleCBpbnRvIHJhc3RlciBzYW1wbGVyIGFycmF5LCBrZXllZCBieSB0ZXh0dXJlIG5hbWVcblxuICAgICAgICAvLyBUT0RPOiBkYXRhIHNvdXJjZSBjb3VsZCByZXRyaWV2ZSByYXN0ZXIgdGV4dHVyZSBVUkxzXG4gICAgICAgIHRpbGUucmFzdGVycy5tYXAociA9PiB0aGlzLnNvdXJjZXNbcl0pLmZpbHRlcih4ID0+IHgpLmZvckVhY2goKHNvdXJjZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFJhc3RlclRpbGVTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gc291cmNlLnRpbGVUZXh0dXJlKHRpbGUpO1xuICAgICAgICAgICAgICAgIGNvbmZpZ3NbY29uZmlnLnVybF0gPSBjb25maWc7XG4gICAgICAgICAgICAgICAgaW5kZXhbY29uZmlnLnVybF0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlncykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIHRleHR1cmVzIG9uIG1haW4gdGhyZWFkIGFuZCByZXR1cm4gd2hlbiBkb25lXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gYmxvY2sgdGhlIGJ1aWxkaW5nIG9mIGEgcmFzdGVyIHRpbGUgbWVzaCB1bnRpbCBpdHMgdGV4dHVyZSBpcyBsb2FkZWQsXG4gICAgICAgIC8vIHRvIGF2b2lkIGZsaWNrZXJpbmcgd2hpbGUgbG9hZGluZyAodGV4dHVyZSB3aWxsIHJlbmRlciBhcyBibGFjaylcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLmxvYWRUZXh0dXJlcycsIGNvbmZpZ3MpXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0dXJlcyB8fCB0ZXh0dXJlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgdGV4dHVyZSB1bmlmb3JtcyAocmV0dXJuZWQgYWZ0ZXIgbG9hZGluZyBmcm9tIG1haW4gdGhyZWFkKVxuICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3JtcyA9IHRpbGVfZGF0YS51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMgPSB0aWxlX2RhdGEudGV4dHVyZXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBsZXQgdV9zYW1wbGVycyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJzJ10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdV9zaXplcyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJfc2l6ZXMnXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCB1X29mZnNldHMgPSB0aWxlX2RhdGEudW5pZm9ybXNbJ3VfcmFzdGVyX29mZnNldHMnXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCgoW3RuYW1lLCB0d2lkdGgsIHRoZWlnaHRdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXhbdG5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFzdGVyX2Nvb3JkcyA9IGNvbmZpZ3NbdG5hbWVdLmNvb3JkczsgLy8gdGlsZSBjb29yZHMgb2YgcmFzdGVyIHRpbGVcblxuICAgICAgICAgICAgICAgICAgICB1X3NhbXBsZXJzW2ldID0gdG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcy5wdXNoKHRuYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICB1X3NpemVzW2ldID0gW3R3aWR0aCwgdGhlaWdodF07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGlsZSBnZW9tZXRyeSBtYXkgYmUgYXQgYSBoaWdoZXIgem9vbSB0aGFuIHRoZSByYXN0ZXIgdGlsZSB0ZXh0dXJlLFxuICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBhbiBvdmVyem9vbWVkIHJhc3RlciB0aWxlKSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFkanVzdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmFzdGVyIHRleHR1cmUgVVZzIHRvIG9mZnNldCB0byB0aGUgYXBwcm9wcmlhdGUgc3RhcnRpbmcgcG9pbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZ2VvbWV0cnkgdGlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuY29vcmRzLnogPiByYXN0ZXJfY29vcmRzLnopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkeiA9IHRpbGUuY29vcmRzLnogLSByYXN0ZXJfY29vcmRzLno7IC8vICMgb2YgbGV2ZWxzIHJhc3RlciBzb3VyY2UgaXMgb3Zlcnpvb21lZFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR6MiA9IE1hdGgucG93KDIsIGR6KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVfb2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGlsZS5jb29yZHMueCAlIGR6MikgLyBkejIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR6MiAtIDEgLSAodGlsZS5jb29yZHMueSAlIGR6MikpIC8gZHoyLCAvLyBHTCB0ZXh0dXJlIGNvb3JkcyBhcmUgK1kgdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8gZHoyXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdV9vZmZzZXRzW2ldID0gWzAsIDAsIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWRcbiAgICBsb2FkVGV4dHVyZXMgKHRleHR1cmVzKSB7XG4gICAgICAgIC8vIE5COiBvbmx5IHJldHVybiBuYW1lIGFuZCBzaXplIG9mIHRleHR1cmVzIGxvYWRlZCwgYmVjYXVzZSB3ZSBjYW4ndCBzZW5kIGFjdHVhbCB0ZXh0dXJlIG9iamVjdHMgdG8gd29ya2VyXG4gICAgICAgIHJldHVybiBUZXh0dXJlLmNyZWF0ZUZyb21PYmplY3QodGhpcy5nbCwgdGV4dHVyZXMpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHRleHR1cmVzKS5tYXAodCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnRleHR1cmVzW3RdICYmIFRleHR1cmUudGV4dHVyZXNbdF0ubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHgpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHQucmV0YWluKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlcy5tYXAodCA9PiBbdC5uYW1lLCB0LndpZHRoLCB0LmhlaWdodF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFNldHVwIGFueSBHTCBzdGF0ZSBmb3IgcmVuZGVyaW5nXG4gICAgc2V0dXAgKCkge1xuICAgICAgICB0aGlzLnNldFVuaWZvcm1zKCk7XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuc2V0dXBQcm9ncmFtKFNoYWRlclByb2dyYW0uY3VycmVudCk7XG4gICAgfSxcblxuICAgIC8vIFNldCBzdHlsZSB1bmlmb3JtcyBvbiBjdXJyZW50bHkgYm91bmQgcHJvZ3JhbVxuICAgIHNldFVuaWZvcm1zICgpIHtcbiAgICAgICAgdmFyIHByb2dyYW0gPSBTaGFkZXJQcm9ncmFtLmN1cnJlbnQ7XG4gICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3Jtcyh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLCB0cnVlKTsgLy8gcmVzZXQgdGV4dHVyZSB1bml0IHRvIDBcbiAgICB9LFxuXG4gICAgLy8gUmVuZGVyIHN0YXRlIHNldHRpbmdzIGJ5IGJsZW5kIG1vZGVcbiAgICByZW5kZXJfc3RhdGVzOiB7XG4gICAgICAgIG9wYXF1ZTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogdHJ1ZSB9LFxuICAgICAgICBhZGQ6IHsgZGVwdGhfdGVzdDogdHJ1ZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH0sXG4gICAgICAgIG11bHRpcGx5OiB7IGRlcHRoX3Rlc3Q6IHRydWUsIGRlcHRoX3dyaXRlOiBmYWxzZSB9LFxuICAgICAgICBpbmxheTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogZmFsc2UgfSxcbiAgICAgICAgb3ZlcmxheTogeyBkZXB0aF90ZXN0OiBmYWxzZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH1cbiAgICB9LFxuXG4gICAgLy8gRGVmYXVsdCBzb3J0IG9yZGVyIGZvciBibGVuZCBtb2Rlc1xuICAgIGRlZmF1bHRfYmxlbmRfb3JkZXJzOiB7XG4gICAgICAgIG9wYXF1ZTogMCxcbiAgICAgICAgYWRkOiAxLFxuICAgICAgICBtdWx0aXBseTogMixcbiAgICAgICAgaW5sYXk6IDMsXG4gICAgICAgIG92ZXJsYXk6IDRcbiAgICB9LFxuXG4gICAgLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3Igc29ydGluZyBzdHlsZXMgYnkgYmxlbmRcbiAgICBibGVuZE9yZGVyU29ydCAoYSwgYikge1xuICAgICAgICAvLyBvcGFxdWUgYWx3YXlzIGNvbWVzIGZpcnN0XG4gICAgICAgIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJyB8fCBiLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgaWYgKGEuYmxlbmQgPT09ICdvcGFxdWUnICYmIGIuYmxlbmQgPT09ICdvcGFxdWUnKSB7IC8vIGlmIGJvdGggYXJlIG9wYXF1ZVxuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUgPCBiLm5hbWUgPyAtMSA6IDE7IC8vIHVzZSBuYW1lIGFzIHRpZSBicmVha2VyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gb25seSBgYWAgd2FzIG9wYXF1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIG9ubHkgYGJgIHdhcyBvcGFxdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzZSBleHBsaWNpdCBibGVuZCBvcmRlciBpZiBwb3NzaWJsZVxuICAgICAgICBpZiAoYS5ibGVuZF9vcmRlciA8IGIuYmxlbmRfb3JkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmJsZW5kX29yZGVyID4gYi5ibGVuZF9vcmRlcikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBibGVuZCBvcmRlcnMgYXJlIGVxdWFsLCB1c2UgZGVmYXVsdCBvcmRlciBieSBibGVuZCBtb2RlXG4gICAgICAgIGlmIChTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1thLmJsZW5kXSA8IFN0eWxlLmRlZmF1bHRfYmxlbmRfb3JkZXJzW2IuYmxlbmRdKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoU3R5bGUuZGVmYXVsdF9ibGVuZF9vcmRlcnNbYS5ibGVuZF0gPiBTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1tiLmJsZW5kXSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxOyAvLyB1c2UgbmFtZSBhcyB0aWUgYnJlYWtlclxuICAgIH1cblxufTtcbiIsIi8vIE1hbmFnZSByZW5kZXJpbmcgc3R5bGVzXG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4uL3V0aWxzL21lcmdlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuaW1wb3J0IHtQb2x5Z29uc30gZnJvbSAnLi9wb2x5Z29ucy9wb2x5Z29ucyc7XG5pbXBvcnQge0xpbmVzfSBmcm9tICcuL2xpbmVzL2xpbmVzJztcbmltcG9ydCB7UG9pbnRzfSBmcm9tICcuL3BvaW50cy9wb2ludHMnO1xuaW1wb3J0IHtUZXh0U3R5bGV9IGZyb20gJy4vdGV4dC90ZXh0JztcbmltcG9ydCB7UmFzdGVyU3R5bGV9IGZyb20gJy4vcmFzdGVyL3Jhc3Rlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfYWNjZXNzb3JzID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9hY2Nlc3NvcnMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfbGF5ZXJPcmRlciA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvbGF5ZXJfb3JkZXIuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvc2VsZWN0aW9uX2dsb2JhbHMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9zZWxlY3Rpb25fdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5zdHlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlX3N0eWxlcyA9IHt9O1xuXG4gICAgICAgIC8vIEFkZCBidWlsdC1pbiByZW5kZXJpbmcgc3R5bGVzXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShQb2x5Z29ucykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoTGluZXMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihPYmplY3QuY3JlYXRlKFBvaW50cykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoVGV4dFN0eWxlKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShSYXN0ZXJTdHlsZSkpO1xuICAgIH1cblxuICAgIC8vIEdsb2JhbCBjb25maWd1cmF0aW9uIGZvciBhbGwgc3R5bGVzXG4gICAgaW5pdCAoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soJ2dsb2JhbCcpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKCdzZXR1cCcpO1xuXG4gICAgICAgIC8vIE1vZGVsIGFuZCB3b3JsZCBwb3NpdGlvbiBhY2Nlc3NvcnNcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2FjY2Vzc29ycyk7XG5cbiAgICAgICAgLy8gTGF5ZXIgcmUtb3JkZXJpbmcgZnVuY3Rpb25cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2xheWVyT3JkZXIpO1xuXG4gICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uIGdsb2JhbFxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKCdnbG9iYWwnLCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyk7XG5cbiAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gdmVydGV4IHNoYWRlciBzdXBwb3J0XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdzZXR1cCcsIHNoYWRlclNyY19zZWxlY3Rpb25WZXJ0ZXgpO1xuXG4gICAgICAgIC8vIE1pbmltdW0gdmFsdWUgZm9yIGZsb2F0IGNvbXBhcmlzb25zXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0VQU0lMT04gPSAwLjAwMDAxO1xuXG4gICAgICAgIC8vIE1pbmltdW0gZGVwdGggYnVmZmVyIHZhbHVlIHNlcGFyYXRpbmcgZWFjaCBgb3JkZXJgIHVuaXRcbiAgICAgICAgLy8gQXNzdW1lIG1pbiAxNi1iaXQgZGVwdGggYnVmZmVyLCBpbiBwcmFjdGljZSB1c2VzIDE0LWJpdHMsIDEgZXh0cmEgYml0IHRvIGhhbmRsZSB2aXJ0dWFsIGhhbGYtbGF5ZXJzXG4gICAgICAgIC8vIGZvciBvdXRsaW5lcyAoaW5zZXJ0ZWQgaW4gYmV0d2VlbiBsYXllcnMpLCBhbm90aGVyIGV4dHJhIGJpdCB0byBwcmV2ZW50IHByZWNpc2lvbiBsb3NzXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0xBWUVSX0RFTFRBID0gMSAvICgxIDw8IDE0KTtcblxuICAgICAgICAvLyBJbnRlcm5hbCB0aWxlIHNjYWxlXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX1RJTEVfU0NBTEUgPVxuICAgICAgICAgICAgYHZlYzMoJHtHZW8udGlsZV9zY2FsZX0uLCAke0dlby50aWxlX3NjYWxlfS4sIHVfbWV0ZXJzX3Blcl9waXhlbCAqICR7R2VvLnRpbGVfc2l6ZX0uKWA7XG5cbiAgICAgICAgLy8gSW5jcmVhc2VzIHByZWNpc2lvbiBmb3IgaGVpZ2h0IHZhbHVlc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXMuVEFOR1JBTV9IRUlHSFRfU0NBTEUgPSBHZW8uaGVpZ2h0X3NjYWxlO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgYWxsIHN0eWxlcyBmb3IgYSBnaXZlbiBHTCBjb250ZXh0XG4gICAgZGVzdHJveSAoZ2wpIHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdHlsZXMpLmZvckVhY2goKF9uYW1lKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLnN0eWxlc1tfbmFtZV07XG4gICAgICAgICAgICBpZiAoc3R5bGUuZ2wgPT09IGdsKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZU1hbmFnZXIuZGVzdHJveTogZGVzdHJveWluZyByZW5kZXIgc3R5bGUgJHtzdHlsZS5uYW1lfWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmJhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0eWxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgYSBzdHlsZVxuICAgIHJlZ2lzdGVyIChzdHlsZSkge1xuICAgICAgICB0aGlzLnN0eWxlc1tzdHlsZS5uYW1lXSA9IHN0eWxlO1xuICAgICAgICB0aGlzLmJhc2Vfc3R5bGVzW3N0eWxlLm5hbWVdID0gc3R5bGU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgc3R5bGVcbiAgICByZW1vdmUgKG5hbWUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGVzW25hbWVdO1xuICAgIH1cblxuICAgIG1peCAoc3R5bGUsIHN0eWxlcykge1xuICAgICAgICAvLyBFeGl0IGVhcmx5IGlmIHdlIGhhdmUgYWxyZWFkeSBhcHBsaWVkIG1peGlucyB0byB0aGlzIHN0eWxlXG4gICAgICAgIGlmIChzdHlsZS5taXhlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLm1peGVkID0ge307XG5cbiAgICAgICAgLy8gTWl4aW4gc291cmNlcywgaW4gb3JkZXJcbiAgICAgICAgbGV0IHNvdXJjZXMgPSBbXTtcbiAgICAgICAgaWYgKHN0eWxlLm1peCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUubWl4KSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaCguLi5zdHlsZS5taXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKHN0eWxlLm1peCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb3VyY2VzID0gc291cmNlcy5tYXAoeCA9PiBzdHlsZXNbeF0pLmZpbHRlcih4ID0+IHggJiYgeCAhPT0gc3R5bGUpOyAvLyBUT0RPOiB3YXJuaW5nIG9uIHRyeWluZyB0byBtaXggaW50byBzZWxmXG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHdoaWNoIHN0eWxlcyB3ZXJlIG1peGVkIGludG8gdGhpcyBvbmVcbiAgICAgICAgICAgIHNvdXJjZXMuZm9yRWFjaChzID0+IHN0eWxlLm1peGVkW3MubmFtZV0gPSB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzLnB1c2goc3R5bGUpO1xuXG4gICAgICAgIC8vIEZsYWdzIC0gT1InZCwgdHJ1ZSBpZiBhbnkgc3R5bGUgaGFzIGl0IHNldFxuICAgICAgICBzdHlsZS5hbmltYXRlZCA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC5hbmltYXRlZCk7XG4gICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC50ZXhjb29yZHMpO1xuXG4gICAgICAgIC8vIE92ZXJ3cml0ZXMgLSBsYXN0IGRlZmluaXRpb24gd2luc1xuICAgICAgICBzdHlsZS5iYXNlID0gc291cmNlcy5tYXAoeCA9PiB4LmJhc2UpLmZpbHRlcih4ID0+IHgpLnBvcCgpO1xuICAgICAgICBzdHlsZS5saWdodGluZyA9IHNvdXJjZXMubWFwKHggPT4geC5saWdodGluZykuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUudGV4dHVyZSA9IHNvdXJjZXMubWFwKHggPT4geC50ZXh0dXJlKS5maWx0ZXIoeCA9PiB4KS5wb3AoKTtcbiAgICAgICAgc3R5bGUucmFzdGVyID0gc291cmNlcy5tYXAoeCA9PiB4LnJhc3RlcikuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUuZGFzaCA9IHNvdXJjZXMubWFwKHggPT4geC5kYXNoKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBzdHlsZS5kYXNoX2JhY2tncm91bmRfY29sb3IgPSBzb3VyY2VzLm1hcCh4ID0+IHguZGFzaF9iYWNrZ3JvdW5kX2NvbG9yKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBpZiAoc291cmNlcy5zb21lKHggPT4geC5oYXNPd25Qcm9wZXJ0eSgnYmxlbmQnKSAmJiB4LmJsZW5kKSkge1xuICAgICAgICAgICAgLy8gb25seSBtaXggYmxlbmQgaWYgZXhwbGljaXRseSBzZXQsIG90aGVyd2lzZSBsZXQgYmFzZSBzdHlsZSBjaG9vc2UgYmxlbmRpbmcgbW9kZVxuICAgICAgICAgICAgLy8gaGFzT3duUHJvcGVydHkgY2hlY2sgZ2l2ZXMgcHJlZmVyZW5jZSB0byBiYXNlIHN0eWxlIHByb3RvdHlwZVxuICAgICAgICAgICAgc3R5bGUuYmxlbmQgPSBzb3VyY2VzLm1hcCh4ID0+IHguaGFzT3duUHJvcGVydHkoJ2JsZW5kJykgJiYgeC5ibGVuZCkuZmlsdGVyKHggPT4geCkucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3R5bGUuYmxlbmRfb3JkZXIgPSBzb3VyY2VzLm1hcCh4ID0+IHguYmxlbmRfb3JkZXIpLmZpbHRlcih4ID0+IHggIT0gbnVsbCkucG9wKCk7XG5cbiAgICAgICAgLy8gTWVyZ2VzIC0gcHJvcGVydHktc3BlY2lmaWMgcnVsZXMgZm9yIG1lcmdpbmcgdmFsdWVzXG4gICAgICAgIHN0eWxlLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zb3VyY2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpOyAvLyBpbnRlcm5hbCBkZWZpbmVzIChub3QgdXNlci1kZWZpbmVkKVxuICAgICAgICBzdHlsZS5tYXRlcmlhbCA9IE9iamVjdC5hc3NpZ24oe30sIC4uLnNvdXJjZXMubWFwKHggPT4geC5tYXRlcmlhbCkuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIE1peCBzaGFkZXIgcHJvcGVydGllc1xuICAgICAgICB0aGlzLm1peFNoYWRlcnMoc3R5bGUsIHN0eWxlcywgc291cmNlcyk7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBNaXggdGhlIHByb3BlcnRlcyBpbiB0aGUgXCJzaGFkZXJzXCIgYmxvY2tcbiAgICBtaXhTaGFkZXJzIChzdHlsZSwgc3R5bGVzLCBzb3VyY2VzKSB7XG4gICAgICAgIGxldCBzaGFkZXJzID0ge307IC8vIG5ld2x5IG1peGVkIHNoYWRlcnMgcHJvcGVydGllc1xuICAgICAgICBsZXQgc2hhZGVyX21lcmdlcyA9IHNvdXJjZXMubWFwKHggPT4geC5zaGFkZXJzKS5maWx0ZXIoeCA9PiB4KTsgLy8ganVzdCB0aGUgc291cmNlIHN0eWxlcyB3aXRoIHNoYWRlciBwcm9wZXJ0aWVzXG5cbiAgICAgICAgLy8gRGVmaW5lc1xuICAgICAgICBzaGFkZXJzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zaGFkZXJfbWVyZ2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIFVuaWZvcm1zXG4gICAgICAgIHNoYWRlcnMudW5pZm9ybXMgPSB7fTsgIC8vIHVuaWZvcm1zIGZvciB0aGlzIHN0eWxlLCBib3RoIGV4cGxpY2l0bHkgZGVmaW5lZCwgYW5kIG1peGVkIGZyb20gb3RoZXIgc3R5bGVzXG4gICAgICAgIHNoYWRlcnMuX3VuaWZvcm1zID0gKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3JtcykgfHwge307IC8vIHVuaWZvcm1zIGV4cGxpY2l0bHkgZGVmaW5lZCBieSAqdGhpcyogc3R5bGVcbiAgICAgICAgc2hhZGVycy5fdW5pZm9ybV9zY29wZXMgPSB7fTsgLy8gdHJhY2tzIHdoaWNoIHN0eWxlIGVhY2ggdW5pZm9ybSBvcmlnaW5hdGVkIGZyb20gKHRoaXMgb25lLCBvciBhbmNlc3RvcilcblxuICAgICAgICAvLyBNaXggaW4gdW5pZm9ybXMgZnJvbSBhbmNlc3RvcnMsIHByb3ZpZGluZyBtZWFucyB0byBhY2Nlc3NcbiAgICAgICAgc291cmNlc1xuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHguc2hhZGVycyAmJiB4LnNoYWRlcnMudW5pZm9ybXMpXG4gICAgICAgICAgICAuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB1IGluIHguc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3JtX3Njb3Blc1t1XSA9IHgubmFtZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZpbmUgZ2V0dGVyIGFuZCBzZXR0ZXIgZm9yIHRoaXMgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICAvLyBHZXR0ZXIgcmV0dXJucyB2YWx1ZSBmb3IgdGhpcyBzdHlsZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgYXNrcyBhcHByb3ByaWF0ZSBhbmNlc3RvciBmb3IgaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0dGVyIHNldHMgdGhlIHZhbHVlIGZvciB0aGlzIHN0eWxlICh3aGV0aGVyIHByZXZpb3VzbHkgcHJlc2VudCBpbiB0aGlzIHN0eWxlIG9yIG5vdClcbiAgICAgICAgICAgICAgICAgICAgLy8gTWltaWNzIEpTIHByb3RvdHlwZS9oYXNPd25Qcm9wZXJ0eSBiZWhhdmlvciwgYnV0IHdpdGggbXVsdGlwbGUgYW5jZXN0b3JzICh2aWEgbWl4aW5zKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hhZGVycy51bmlmb3JtcywgdSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gaXMgZXhwbGljaXRseSBkZWZpbmVkIG9uIHRoaXMgc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hhZGVycy5fdW5pZm9ybXNbdV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hhZGVycy5fdW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gd2FzIG1peGVkIGZyb20gYW5vdGhlciBzdHlsZSwgZm9yd2FyZCByZXF1ZXN0IHRoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgY2hlY2sgaXMgbmVlZGVkIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgcHJldmlvdXNseSBkZWZpbmVkIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzZXQgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVzW3NoYWRlcnMuX3VuaWZvcm1fc2NvcGVzW3VdXS5zaGFkZXJzLnVuaWZvcm1zICE9PSBzaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXNbc2hhZGVycy5fdW5pZm9ybV9zY29wZXNbdV1dLnNoYWRlcnMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3Jtc1t1XSA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4dGVuc2lvbnM6IGJ1aWxkIGEgbGlzdCBvZiB1bmlxdWUgZXh0ZW5zaW9uc1xuICAgICAgICBzaGFkZXJzLmV4dGVuc2lvbnMgPSBPYmplY3Qua2V5cyhzaGFkZXJfbWVyZ2VzXG4gICAgICAgICAgICAubWFwKHggPT4geC5leHRlbnNpb25zKVxuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHgpXG4gICAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZbY3VyXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyLmZvckVhY2goeCA9PiBwcmV2W3hdID0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgfSwge30pIHx8IHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2hhZGVyIGJsb2Nrc1xuICAgICAgICAvLyBNYXJrIGFsbCBzaGFkZXIgYmxvY2tzIGZvciB0aGUgdGFyZ2V0IHN0eWxlIGFzIG9yaWdpbmF0aW5nIHdpdGggaXRzIG93biBuYW1lXG4gICAgICAgIGlmIChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMuYmxvY2tzKSB7XG4gICAgICAgICAgICBzdHlsZS5zaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgayBpbiBzdHlsZS5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHN0eWxlLnNoYWRlcnMuYmxvY2tzW2tdO1xuICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdID0gc3R5bGUuc2hhZGVycy5ibG9ja19zY29wZXNba10gfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmxvY2spKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goLi4uYmxvY2subWFwKCgpID0+IHN0eWxlLm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2Ugc2hhZGVyIGJsb2Nrcywga2VlcGluZyB0cmFjayBvZiB3aGljaCBzdHlsZSBlYWNoIGJsb2NrIG9yaWdpbmF0ZWQgZnJvbVxuICAgICAgICBsZXQgbWl4ZWQgPSB7fTsgLy8gYWxsIHNjb3BlcyBtaXhlZCBzbyBmYXJcbiAgICAgICAgc2hhZGVyX21lcmdlcy5mb3JFYWNoKHNvdXJjZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzID0gc2hhZGVycy5ibG9ja3MgfHwge307XG4gICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgbGV0IG1peGVkX3NvdXJjZSA9IHt9OyAvLyBzY29wZXMgbWl4ZWQgZm9yIHRoaXMgc291cmNlIHN0eWxlXG5cbiAgICAgICAgICAgIGZvciAobGV0IHQgaW4gc291cmNlLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHNvdXJjZS5ibG9ja3NbdF07XG4gICAgICAgICAgICAgICAgbGV0IGJsb2NrX3Njb3BlID0gc291cmNlLmJsb2NrX3Njb3Blc1t0XTtcblxuICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdID0gc2hhZGVycy5ibG9ja3NbdF0gfHwgW107XG4gICAgICAgICAgICAgICAgc2hhZGVycy5ibG9ja19zY29wZXNbdF0gPSBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XSB8fCBbXTtcblxuICAgICAgICAgICAgICAgIC8vIHN0YW5kYXJkaXplIG9uIGFycmF5cyAoYmxvY2sgY2FuIGJlIHNpbmdsZSBvciBtdWx0aS12YWx1ZSlcbiAgICAgICAgICAgICAgICBibG9jayA9IEFycmF5LmlzQXJyYXkoYmxvY2spID8gYmxvY2sgOiBbYmxvY2tdO1xuICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlID0gQXJyYXkuaXNBcnJheShibG9ja19zY29wZSkgPyBibG9ja19zY29wZSA6IFtibG9ja19zY29wZV07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiPTA7IGIgPCBibG9jay5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGJsb2NrcyB3ZSd2ZSBhbHJlYWR5IG1peGVkIGluIGZyb20gdGhlIHNhbWUgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwZWF0aW5nIHNjb3BlIGluZGljYXRlcyBhIGRpYW1vbmQgcGF0dGVybiB3aGVyZSBhIHN0eWxlIGlzIGJlaW5nIG1peGVkIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaXhlZFtibG9ja19zY29wZVtiXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1peGVkX3NvdXJjZVtibG9ja19zY29wZVtiXV0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdLnB1c2goYmxvY2tbYl0pO1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XS5wdXNoKGJsb2NrX3Njb3BlW2JdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBzdHlsZXMgbWl4ZWQgaW4gZnJvbSB0aGlzIHNvdXJjZSAtIHRoZXkgY291bGQgYmUgbXVsdGktbGV2ZWwgYW5jZXN0b3JzLFxuICAgICAgICAgICAgLy8gYmV5b25kIHRoZSBmaXJzdC1sZXZlbCBcInBhcmVudHNcIiBkZWZpbmVkIGluIHRoaXMgc3R5bGUncyBgbWl4YCBsaXN0XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1peGVkLCBtaXhlZF9zb3VyY2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlLm1peGVkLCBtaXhlZCk7IC8vIGFkZCBhbGwgbmV3bHkgbWl4ZWQgc3R5bGVzXG5cbiAgICAgICAgc3R5bGUuc2hhZGVycyA9IHNoYWRlcnM7IC8vIGFzc2lnbiBiYWNrIHRvIHN0eWxlXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgc3R5bGVcbiAgICAvLyBuYW1lOiBuYW1lIG9mIG5ldyBzdHlsZVxuICAgIC8vIGNvbmZpZzogcHJvcGVydGllcyBvZiBuZXcgc3R5bGVcbiAgICAvLyBzdHlsZXM6IHdvcmtpbmcgc2V0IG9mIHN0eWxlcyBiZWluZyBidWlsdCAodXNlZCBmb3IgbWl4aW5nIGluIGV4aXN0aW5nIHN0eWxlcylcbiAgICBjcmVhdGUgKG5hbWUsIGNvbmZpZywgc3R5bGVzID0ge30pIHtcbiAgICAgICAgbGV0IHN0eWxlID0gbWVyZ2VPYmplY3RzKHt9LCBjb25maWcpOyAvLyBkZWVwIGNvcHlcbiAgICAgICAgc3R5bGUubmFtZSA9IG5hbWU7XG5cbiAgICAgICAgLy8gU3R5bGUgbWl4aW5zXG4gICAgICAgIHN0eWxlID0gdGhpcy5taXgoc3R5bGUsIHN0eWxlcyk7XG5cbiAgICAgICAgLy8gSGFzIGJhc2Ugc3R5bGU/XG4gICAgICAgIC8vIE9ubHkgcmVuZGVyYWJsZSAoaW5zdGFudGlhdGVkKSBzdHlsZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBydW4tdGltZSB1c2VcbiAgICAgICAgLy8gT3RoZXJzIGFyZSBpbnRlcm1lZGlhcnkvYWJzdHJhY3QsIHVzZWQgZHVyaW5nIHN0eWxlIGNvbXBvc2l0aW9uIGJ1dCBub3QgZXhlY3V0aW9uXG4gICAgICAgIGlmIChzdHlsZS5iYXNlICYmIHRoaXMuYmFzZV9zdHlsZXNbc3R5bGUuYmFzZV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzW25hbWVdID0gc3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUodGhpcy5iYXNlX3N0eWxlc1tzdHlsZS5iYXNlXSksIHN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLmJhc2UgPSBudWxsOyAvLyBudWxsIG91dCBpbnZhbGlkIGJhc2Ugc3R5bGVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXplIHN0eWxlc1xuICAgIGJ1aWxkIChzdHlsZXMpIHtcbiAgICAgICAgLy8gU29ydCBzdHlsZXMgYnkgZGVwZW5kZW5jeSwgdGhlbiBidWlsZCB0aGVtXG4gICAgICAgIGxldCBzdHlsZV9kZXBzID0gT2JqZWN0LmtleXMoc3R5bGVzKS5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+IHRoaXMuaW5oZXJpdGFuY2VEZXB0aChhLCBzdHlsZXMpIC0gdGhpcy5pbmhlcml0YW5jZURlcHRoKGIsIHN0eWxlcylcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBPbmx5IGtlZXAgYnVpbHQtaW4gYmFzZSBzdHlsZXNcbiAgICAgICAgZm9yIChsZXQgc25hbWUgaW4gdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5iYXNlX3N0eWxlc1tzbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZXNbc25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXb3JraW5nIHNldCBvZiBzdHlsZXMgYmVpbmcgYnVpbHRcbiAgICAgICAgbGV0IHdzID0ge307XG4gICAgICAgIHN0eWxlX2RlcHMuZm9yRWFjaChzbmFtZSA9PiB7XG4gICAgICAgICAgICB3c1tzbmFtZV0gPSB0aGlzLmNyZWF0ZShzbmFtZSwgc3R5bGVzW3NuYW1lXSwgd3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZXM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgc3R5bGVzXG4gICAgaW5pdFN0eWxlcyAoc2NlbmUgPSB7fSkge1xuICAgICAgICAvLyBJbml0aWFsaXplIGFsbFxuICAgICAgICBmb3IgKGxldCBzbmFtZSBpbiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLmluaXQoc2NlbmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYSBzdHlsZSBrZXkgaW4gYSBzZXQgb2Ygc3R5bGVzIHRvIGFkZCwgY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgaW5oZXJpdGFuY2UgY2hhaW5cbiAgICBpbmhlcml0YW5jZURlcHRoIChrZXksIHN0eWxlcykge1xuICAgICAgICBsZXQgcGFyZW50cyA9IDA7XG5cbiAgICAgICAgd2hpbGUodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHNjZW5lIGRlZiBlcnJvciwgdHJ5aW5nIHRvIGV4dGVuZCBhIHN0eWxlIHRoYXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZXBlbmRlbmN5IGNoYWluIGVuZHMgd2hlbiB0aGlzIHN0eWxlIGlzbid0IG1peGluZyBpbiBhbnkgb3RoZXJzXG4gICAgICAgICAgICBpZiAoIXN0eWxlLm1peCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmF2ZXJzZSBuZXh0IHBhcmVudCBzdHlsZVxuICAgICAgICAgICAgcGFyZW50cysrO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5taXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbXVsdGlwbGUgbWl4aW5zLCBmaW5kIHRoZSBkZWVwZXN0IG9uZVxuICAgICAgICAgICAgICAgIHBhcmVudHMgKz0gTWF0aC5tYXgoLi4uc3R5bGUubWl4Lm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIG1peCBpbnRvIGl0c2VsZiFcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5oZXJpdGFuY2VEZXB0aChzLCBzdHlsZXMpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRyeWluZyB0byBtaXggaW50byBpdHNlbGYhXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gc3R5bGUubWl4KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIHNpbmdsZSBtaXhpbiwgY29udGludWUgbG9vcCB1cCB0aGUgdHJlZVxuICAgICAgICAgICAgICAgIGtleSA9IHN0eWxlLm1peDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9XG5cbn1cbiIsImltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmltcG9ydCBwYXJzZUNTU0NvbG9yIGZyb20gJ2Nzc2NvbG9ycGFyc2VyJztcblxuZXhwb3J0IHZhciBTdHlsZVBhcnNlciA9IHt9O1xuXG4vLyBXcmFwcyBzdHlsZSBmdW5jdGlvbnMgYW5kIHByb3ZpZGVzIGEgc2NvcGUgb2YgY29tbW9ubHkgYWNjZXNzaWJsZSBkYXRhOlxuLy8gLSBmZWF0dXJlOiB0aGUgJ3Byb3BlcnRpZXMnIG9mIHRoZSBmZWF0dXJlLCBlLmcuIGFjY2Vzc2VkIGFzICdmZWF0dXJlLm5hbWUnXG4vLyAtIGdsb2JhbDogdXNlci1kZWZpbmVkIHByb3BlcnRpZXMgb24gdGhlIGBnbG9iYWxgIG9iamVjdCBpbiB0aGUgc2NlbmUgZmlsZVxuLy8gLSAkem9vbTogdGhlIGN1cnJlbnQgbWFwIHpvb20gbGV2ZWxcbi8vIC0gJGdlb21ldHJ5OiB0aGUgdHlwZSBvZiBnZW9tZXRyeSwgJ3BvaW50JywgJ2xpbmUnLCBvciAncG9seWdvbidcbi8vIC0gJG1ldGVyc19wZXJfcGl4ZWw6IGNvbnZlcnNpb24gZm9yIG1ldGVycy9waXhlbHMgYXQgY3VycmVudCBtYXAgem9vbVxuU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgZiA9IGBcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllcztcbiAgICAgICAgdmFyIGdsb2JhbCA9IGNvbnRleHQuZ2xvYmFsO1xuICAgICAgICB2YXIgJHpvb20gPSBjb250ZXh0Lnpvb207XG4gICAgICAgIHZhciAkbGF5ZXIgPSBjb250ZXh0LmxheWVyO1xuICAgICAgICB2YXIgJGdlb21ldHJ5ID0gY29udGV4dC5nZW9tZXRyeTtcbiAgICAgICAgdmFyICRtZXRlcnNfcGVyX3BpeGVsID0gY29udGV4dC5tZXRlcnNfcGVyX3BpeGVsO1xuXG4gICAgICAgIHZhciB2YWwgPSAoZnVuY3Rpb24oKXsgJHtmdW5jfSB9KCkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpKSB7XG4gICAgICAgICAgICB2YWwgPSBudWxsOyAvLyBjb252ZXJ0IE5hTnMgdG8gbnVsbHNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgYDtcbiAgICByZXR1cm4gZjtcbn07XG5cblxuLy8gU3R5bGUgcGFyc2luZ1xuXG5TdHlsZVBhcnNlci56ZXJvUGFpciA9IE9iamVjdC5mcmVlemUoWzAsIDBdKTsgLy8gc2luZ2xlIGFsbG9jYXRpb24gZm9yIHplcm8gdmFsdWVzIHRoYXQgd29uJ3QgYmUgbW9kaWZpZWRcblxuLy8gU3R5bGUgZGVmYXVsdHNcblN0eWxlUGFyc2VyLmRlZmF1bHRzID0ge1xuICAgIGNvbG9yOiBbMSwgMSwgMSwgMV0sXG4gICAgd2lkdGg6IDEsXG4gICAgc2l6ZTogMSxcbiAgICBleHRydWRlOiBmYWxzZSxcbiAgICBoZWlnaHQ6IDIwLFxuICAgIG1pbl9oZWlnaHQ6IDAsXG4gICAgb3JkZXI6IDAsXG4gICAgejogMCxcbiAgICBtYXRlcmlhbDoge1xuICAgICAgICBhbWJpZW50OiAxLFxuICAgICAgICBkaWZmdXNlOiAxXG4gICAgfVxufTtcblxuLy8gU3R5bGUgbWFjcm9zXG5TdHlsZVBhcnNlci5tYWNyb3MgPSB7XG4gICAgLy8gcHNldWRvLXJhbmRvbSBjb2xvciBieSBnZW9tZXRyeSBpZFxuICAgICdTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvcic6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgMC43ICogKHBhcnNlSW50KGZlYXR1cmUuaWQsIDE2KSAvIDEwMCAlIDEpLCAgICAgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICAwLjcgKiAocGFyc2VJbnQoZmVhdHVyZS5pZCwgMTYpIC8gMTAwMDAgJSAxKSwgICAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIDAuNyAqIChwYXJzZUludChmZWF0dXJlLmlkLCAxNikgLyAxMDAwMDAwICUgMSksIC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgMVxuICAgICAgICBdO1xuICAgIH0sXG5cbiAgICAvLyByYW5kb20gY29sb3JcbiAgICAnU3R5bGUuY29sb3IucmFuZG9tQ29sb3InOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFswLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAxXTtcbiAgICB9XG59O1xuXG4vLyBBIGNvbnRleHQgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHRvIHN0eWxlIHBhcnNpbmcgZnVuY3Rpb25zIHRvIHByb3ZpZGUgYSBzY29wZSBvZiBjb21tb25seSB1c2VkIHZhbHVlc1xuU3R5bGVQYXJzZXIuZ2V0RmVhdHVyZVBhcnNlQ29udGV4dCA9IGZ1bmN0aW9uIChmZWF0dXJlLCB0aWxlLCBnbG9iYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmZWF0dXJlLFxuICAgICAgICB0aWxlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIHpvb206IHRpbGUuc3R5bGVfem9vbSxcbiAgICAgICAgZ2VvbWV0cnk6IEdlby5nZW9tZXRyeVR5cGUoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSxcbiAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGlsZS5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICBtZXRlcnNfcGVyX3BpeGVsX3NxOiB0aWxlLm1ldGVyc19wZXJfcGl4ZWxfc3EsXG4gICAgICAgIHVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTogdGlsZS51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb21cbiAgICB9O1xufTtcblxuLy8gQnVpbGQgYSBzdHlsZSBwYXJhbSBjYWNoZSBvYmplY3Rcbi8vIGB2YWx1ZWAgaXMgcmF3IHZhbHVlLCBjYWNoZSBtZXRob2RzIHdpbGwgYWRkIG90aGVyIHByb3BlcnRpZXMgYXMgbmVlZGVkXG4vLyBgdHJhbnNmb3JtYCBpcyBvcHRpb25hbCB0cmFuc2Zvcm0gZnVuY3Rpb24gdG8gcnVuIG9uIHZhbHVlcyAoZXhjZXB0IGZ1bmN0aW9uIHZhbHVlcylcblN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUgPSBmdW5jdGlvbiAob2JqLCB0cmFuc2Zvcm0gPSBudWxsKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2JqLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiBvYmoudmFsdWUsIHpvb206IChvYmouem9vbSA/IHt9IDogbnVsbCkgfTsgLy8gY2xvbmUgZXhpc3RpbmcgY2FjaGUgb2JqZWN0XG4gICAgfVxuXG4gICAgbGV0IGMgPSB7IHZhbHVlOiBvYmogfTtcblxuICAgIC8vIGRvZXMgdmFsdWUgY29udGFpbiB6b29tIHN0b3BzIHRvIGJlIGludGVycG9sYXRlZD9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KGMudmFsdWVbMF0pKSB7XG4gICAgICAgIGMuem9vbSA9IHt9OyAvLyB3aWxsIGhvbGQgdmFsdWVzIGludGVycG9sYXRlZCBieSB6b29tXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgb3B0aW9uYWwgdHJhbnNmb3JtIGZ1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGMuem9vbSkgeyAvLyBhcHBseSB0byBlYWNoIHpvb20gc3RvcCB2YWx1ZVxuICAgICAgICAgICAgYy52YWx1ZSA9IGMudmFsdWUubWFwKHYgPT4gW3ZbMF0sIHRyYW5zZm9ybSh2WzFdKV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7IC8vIGRvbid0IHRyYW5zZm9ybSBmdW5jdGlvbnNcbiAgICAgICAgICAgIGMudmFsdWUgPSB0cmFuc2Zvcm0oYy52YWx1ZSk7IC8vIHNpbmdsZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGM7XG59O1xuXG4vLyBDb252ZXJ0IG9sZC1zdHlsZSBjb2xvciBtYWNybyBpbnRvIGEgZnVuY3Rpb25cbi8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIG1hY3JvIHN5bnRheFxuU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKG9iaiwgdiA9PiB7XG4gICAgICAgIGlmICh2ID09PSAnU3R5bGUuY29sb3IucHNldWRvUmFuZG9tQ29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24oU3R5bGVQYXJzZXIubWFjcm9zWydTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvciddKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodiA9PT0gJ1N0eWxlLmNvbG9yLnJhbmRvbUNvbG9yJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLm1hY3Jvc1snU3R5bGUuY29sb3IucmFuZG9tQ29sb3InXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xufTtcblxuLy8gSW50ZXJwb2xhdGlvbiBhbmQgY2FjaGluZyBmb3IgYSBnZW5lcmljIHByb3BlcnR5IChub3QgYSBjb2xvciBvciBkaXN0YW5jZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IHZhbCwgem9vbTogeyAxOiB2YWwxLCAyOiB2YWwyLCAuLi4gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKHZhbCwgY29udGV4dCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5keW5hbWljKSB7IC8vIGZ1bmN0aW9uLCBjb21wdXRlIGVhY2ggdGltZSAobm8gY2FjaGluZylcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHsgLy8gc2luZ2xlIHN0YXRpYyB2YWx1ZVxuICAgICAgICByZXR1cm4gdmFsLnN0YXRpYztcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsLnpvb20gJiYgdmFsLnpvb21bY29udGV4dC56b29tXSkgeyAvLyBpbnRlcnBvbGF0ZWQsIGNhY2hlZFxuICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIG5vdCB5ZXQgZXZhdWxhdGVkIGZvciBjYWNoZVxuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbC52YWx1ZVswXSkpIHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB2YWx1ZSBmb3IgY3VycmVudCB6b29tXG4gICAgICAgICAgICB2YWwuem9vbSA9IHZhbC56b29tIHx8IHt9O1xuICAgICAgICAgICAgdmFsLnpvb20gPSB7fTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RhdGljIHZhbHVlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsLnN0YXRpYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuU3R5bGVQYXJzZXIuY29udmVydFVuaXRzID0gZnVuY3Rpb24odmFsLCBjb250ZXh0KSB7XG4gICAgLy8gcHJlLXBhcnNlZCB1bml0c1xuICAgIGlmICh2YWwudmFsICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbC51bml0cyA9PT0gJ3B4JykgeyAvLyBjb252ZXJ0IGZyb20gcGl4ZWxzXG4gICAgICAgICAgICByZXR1cm4gdmFsLnZhbCAqIEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWwudmFsO1xuICAgIH1cbiAgICAvLyB1bi1wYXJzZWQgdW5pdCBzdHJpbmdcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgdW5pdHMgPSB2YWwubWF0Y2goLyhbMC05Li1dKykoW2Etel0rKS8pO1xuICAgICAgICBpZiAodW5pdHMgJiYgdW5pdHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHVuaXRzWzFdKTtcbiAgICAgICAgICAgIHVuaXRzID0gdW5pdHNbMl07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5pdHMgPT09ICdweCcpIHsgLy8gY29udmVydCBmcm9tIHBpeGVsc1xuICAgICAgICAgICAgdmFsICo9IEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG11bHRpcGxlIHZhbHVlcyBvciBzdG9wc1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAvLyBBcnJheSBvZiBhcnJheXMsIGUuZy4gem9vbS1pbnRlcnBvbGF0ZWQgc3RvcHNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsWzBdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBbdlswXSwgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHZbMV0sIGNvbnRleHQpXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2YgdmFsdWVzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModiwgY29udGV4dCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBQcmUtcGFyc2UgdW5pdHMgZnJvbSBzdHJpbmcgdmFsdWVzXG5TdHlsZVBhcnNlci5wYXJzZVVuaXRzID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBvYmogPSB7IHZhbDogcGFyc2VGbG9hdCh2YWwpIH07XG4gICAgaWYgKG9iai52YWwgIT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKS5zbGljZSgtMikgPT09ICdweCcpIHtcbiAgICAgICAgb2JqLnVuaXRzID0gJ3B4JztcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIFRha2VzIGEgZGlzdGFuY2UgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgZGlzdGFuY2UgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCB6b29tOiB7IHo6IG1ldGVycyB9LCBkeW5hbWljOiBmdW5jdGlvbigpey4uLn0gfVxuU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkgPSBmdW5jdGlvbih2YWwsIGNvbnRleHQpIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKHZhbC56b29tKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdmFsdWUgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgLy8gRG8gZmluYWwgdW5pdCBjb252ZXJzaW9uIGFzIGxhdGUgYXMgcG9zc2libGUsIHdoZW4gaW50ZXJwb2xhdGlvbiB2YWx1ZXMgaGF2ZSBiZWVuIGRldGVybWluZWRcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSxcbiAgICAgICAgICAgICAgICB2ID0+IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2LCBjb250ZXh0KSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2YWwudmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gQ2FjaGUgcHJldmlvdXNseSBwYXJzZWQgY29sb3Igc3RyaW5nc1xuU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9ycyA9IHt9O1xuU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAvLyBDYWNoZWRcbiAgICBpZiAoU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9yc1tzdHJpbmddKSB7XG4gICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5zdHJpbmdfY29sb3JzW3N0cmluZ107XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZCBjYWNoZVxuICAgIGxldCBjb2xvciA9IHBhcnNlQ1NTQ29sb3IucGFyc2VDU1NDb2xvcihzdHJpbmcpO1xuICAgIGlmIChjb2xvciAmJiBjb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgY29sb3JbMF0gLz0gMjU1O1xuICAgICAgICBjb2xvclsxXSAvPSAyNTU7XG4gICAgICAgIGNvbG9yWzJdIC89IDI1NTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbG9yID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgfVxuICAgIFN0eWxlUGFyc2VyLnN0cmluZ19jb2xvcnNbc3RyaW5nXSA9IGNvbG9yO1xuICAgIHJldHVybiBjb2xvcjtcbn07XG5cbi8vIFRha2VzIGEgY29sb3IgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgY29sb3IgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IFtyLGcsYixhXSwgem9vbTogeyB6OiBbcixnLGIsYV0gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRDb2xvclByb3BlcnR5ID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodiAmJiB2WzNdID09IG51bGwpIHtcbiAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkIGNvbG9yXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2ICYmIHZbM10gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RyaW5nIGNvbG9yXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWwuc3RhdGljID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZWxzZSBpZiAodmFsLnpvb20pIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIGFueSBzdHJpbmcgY29sb3JzIGluc2lkZSBzdG9wcywgdGhlIGZpcnN0IHRpbWUgd2UgZW5jb3VudGVyIHRoaXMgcHJvcGVydHlcbiAgICAgICAgICAgIGlmICghdmFsLnpvb21fcHJlcHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2ID0gdmFsLnZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0gPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwuem9vbV9wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgY29sb3IgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgdmFsLnpvb21bY29udGV4dC56b29tXSA9IFV0aWxzLmludGVycG9sYXRlKGNvbnRleHQuem9vbSwgdmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV1bM10gPSB2YWwuem9vbVtjb250ZXh0Lnpvb21dWzNdIHx8IDE7IC8vIGRlZmF1bHQgYWxwaGFcbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmdsZSBhcnJheSBjb2xvclxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhbC5zdGF0aWMgPSB2YWwudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsLnN0YXRpYyAmJiB2YWwuc3RhdGljWzNdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YWwuc3RhdGljWzNdID0gMTsgLy8gZGVmYXVsdCBhbHBoYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5TdHlsZVBhcnNlci5wYXJzZUNvbG9yID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSB2YWwoY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgQ1NTLXN0eWxlIGNvbG9yc1xuICAgIC8vIFRPRE86IGNoYW5nZSBhbGwgY29sb3JzIHRvIHVzZSAwLTI1NSByYW5nZSBpbnRlcm5hbGx5IHRvIGF2b2lkIGRpdmlkaW5nIGFuZCB0aGVuIHJlLW11bHRpcGx5aW5nIGluIGdlb20gYnVpbGRlclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWwgPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2YWwpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkgJiYgQXJyYXkuaXNBcnJheSh2YWxbMF0pKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbFtpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2WzFdID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodlsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC56b29tKSB7XG4gICAgICAgICAgICB2YWwgPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0c1xuICAgIGlmICh2YWwpIHtcbiAgICAgICAgLy8gYWxwaGFcbiAgICAgICAgaWYgKHZhbFszXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWxbM10gPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWwgPSBbMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbn07XG5cblN0eWxlUGFyc2VyLmNhbGN1bGF0ZU9yZGVyID0gZnVuY3Rpb24ob3JkZXIsIGNvbnRleHQpIHtcbiAgICAvLyBDb21wdXRlZCBvcmRlclxuICAgIGlmICh0eXBlb2Ygb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3JkZXIgPSBvcmRlcihjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIG9yZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBPcmRlciB0aWVkIHRvIGZlYXR1cmUgcHJvcGVydHlcbiAgICAgICAgaWYgKGNvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzW29yZGVyXSkge1xuICAgICAgICAgICAgb3JkZXIgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1tvcmRlcl07XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwbGljaXQgb3JkZXIgdmFsdWVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcmRlciA9IHBhcnNlRmxvYXQob3JkZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xufTtcblxuLy8gRXZhbHVhdGUgYSBmdW5jdGlvbi1iYXNlZCBwcm9wZXJ0eSwgb3IgcGFzcy10aHJvdWdoIHN0YXRpYyB2YWx1ZVxuU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gcHJvcChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3A7XG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vZm9udF9tYW5hZ2VyJztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FudmFzVGV4dCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7IC8vIHJlbmRlciB0ZXh0IG9uIHRyYW5zcGFyZW50IGJhY2tncm91bmRcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciA9IDg7IC8vIHZlcnRpY2FsIHBpeGVsIHBhZGRpbmcgYXJvdW5kIHRleHRcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyID0gNDsgLy8gdGV4dCBzdHlsaW5nIHN1Y2ggYXMgaXRhbGljIGVtcGhhc2lzIGlzIG5vdCBtZWFzdXJlZCBieSB0aGUgQ2FudmFzIEFQSSwgc28gcGFkZGluZyBpcyBuZWNlc3NhcnlcbiAgICB9XG5cbiAgICByZXNpemUgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIFNldCBmb250IHN0eWxlIHBhcmFtcyBmb3IgY2FudmFzIGRyYXdpbmdcbiAgICBzZXRGb250ICh7IGZvbnRfY3NzLCBmaWxsLCBzdHJva2UsIHN0cm9rZV93aWR0aCwgcHhfc2l6ZSwgc3VwZXJzYW1wbGUgfSkge1xuICAgICAgICB0aGlzLnB4X3NpemUgPSBweF9zaXplO1xuICAgICAgICBsZXQgY3R4ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG5cbiAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2Vfd2lkdGggPiAwKSB7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2U7XG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gc3Ryb2tlX3dpZHRoICogZHByO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsO1xuXG4gICAgICAgIGN0eC5mb250ID0gZm9udF9jc3M7XG4gICAgICAgIGN0eC5taXRlckxpbWl0ID0gMjtcbiAgICB9XG5cbiAgICB0ZXh0U2l6ZXMgKHRleHRzKSB7XG4gICAgICAgIGxldCBkcHI7XG4gICAgICAgIHJldHVybiBGb250TWFuYWdlci5sb2FkRm9udHMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV0gfHwge307XG5cbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBzcGFjZV93aWR0aDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSB0ZXh0X2luZm8udGV4dF9zZXR0aW5ncztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRwciA9IFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAqIHRleHRfc2V0dGluZ3Muc3VwZXJzYW1wbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFjZV93aWR0aCA9IHRoaXMuY29udGV4dC5tZWFzdXJlVGV4dCgnICcpLndpZHRoIC8gZHByO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zcGFjZV93aWR0aCA9IHNwYWNlX3dpZHRoO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWdtZW50cyA9IHNwbGl0TGFiZWxUZXh0KHRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uc2VnbWVudHMgPSBzZWdtZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWdtZW50ID0gc2VnbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3NlZ21lbnRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bc2VnbWVudF0gPSB0aGlzLnRleHRTaXplKHNlZ21lbnQsIHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLm1pc3NlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC5jYWNoZV9zdGF0cy5oaXRzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplLnB1c2goQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVtzZWdtZW50XS5zaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0gPSB0aGlzLnRleHRTaXplKHRleHQsIHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMubWlzc2VzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLmhpdHMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgc2VuZCB0ZXh0IHNpemVzIGJhY2sgdG8gd29ya2VyIChrZWVwIGNvbXB1dGVkIHRleHQgbGluZSBpbmZvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBtYWluIHRocmVhZCwgZm9yIGZ1dHVyZSByZW5kZXJpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uc2l6ZSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0uc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRleHRzO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlcyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRleHQgYmFzZWQgb24gY3VycmVudCBmb250IHN0eWxlXG4gICAgLy8gSW5jbHVkZXMgd29yZCB3cmFwcGluZywgcmV0dXJucyBzaXplIGluZm8gZm9yIHdob2xlIHRleHQgYmxvY2sgYW5kIGluZGl2aWR1YWwgbGluZXNcbiAgICB0ZXh0U2l6ZSAodGV4dCwge3RyYW5zZm9ybSwgdGV4dF93cmFwLCBtYXhfbGluZXMsIHN0cm9rZV93aWR0aCA9IDAsIHN1cGVyc2FtcGxlfSkge1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG4gICAgICAgIGxldCBzdHIgPSB0aGlzLmFwcGx5VGV4dFRyYW5zZm9ybSh0ZXh0LCB0cmFuc2Zvcm0pO1xuICAgICAgICBsZXQgY3R4ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgdmVydGljYWxfYnVmZmVyID0gdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciAqIGRwcjtcbiAgICAgICAgbGV0IGhvcml6b250YWxfYnVmZmVyID0gZHByICogKHN0cm9rZV93aWR0aCArIHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlcik7XG4gICAgICAgIGxldCBsZWFkaW5nID0gMiAqIGRwcjsgLy8gbWFrZSBjb25maWd1cmFibGUgYW5kL29yIHVzZSBDYW52YXMgVGV4dE1ldHJpY3Mgd2hlbiBhdmFpbGFibGVcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gdGhpcy5weF9zaXplICsgbGVhZGluZzsgLy8gcHhfc2l6ZSBhbHJlYWR5IGluIGRldmljZSBwaXhlbHNcblxuICAgICAgICAvLyBQYXJzZSBzdHJpbmcgaW50byBzZXJpZXMgb2YgbGluZXMgaWYgaXQgZXhjZWVkcyB0aGUgdGV4dCB3cmFwcGluZyB2YWx1ZSBvciBjb250YWlucyBsaW5lIGJyZWFrc1xuICAgICAgICBsZXQgbXVsdGlsaW5lID0gTXVsdGlMaW5lLnBhcnNlKHN0ciwgdGV4dF93cmFwLCBtYXhfbGluZXMsIGxpbmVfaGVpZ2h0LCBjdHgpO1xuXG4gICAgICAgIC8vIEZpbmFsIGRpbWVuc2lvbnMgb2YgdGV4dFxuICAgICAgICBsZXQgaGVpZ2h0ID0gbXVsdGlsaW5lLmhlaWdodDtcbiAgICAgICAgbGV0IHdpZHRoID0gbXVsdGlsaW5lLndpZHRoO1xuICAgICAgICBsZXQgbGluZXMgPSBtdWx0aWxpbmUubGluZXM7XG5cbiAgICAgICAgbGV0IGNvbGxpc2lvbl9zaXplID0gW1xuICAgICAgICAgICAgd2lkdGggLyBkcHIsXG4gICAgICAgICAgICBoZWlnaHQgLyBkcHJcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gW1xuICAgICAgICAgICAgd2lkdGggKyAyICogaG9yaXpvbnRhbF9idWZmZXIsXG4gICAgICAgICAgICBoZWlnaHQgKyAyICogdmVydGljYWxfYnVmZmVyXG4gICAgICAgIF07XG5cbiAgICAgICAgbGV0IGxvZ2ljYWxfc2l6ZSA9IFtcbiAgICAgICAgICAgIHRleHR1cmVfc2l6ZVswXSAvIGRwcixcbiAgICAgICAgICAgIHRleHR1cmVfc2l6ZVsxXSAvIGRwcixcbiAgICAgICAgXTtcblxuICAgICAgICAvLyBSZXR1cm5zIGxpbmVzICh3L3Blci1saW5lIGluZm8gZm9yIGRyYXdpbmcpIGFuZCB0ZXh0J3Mgb3ZlcmFsbCBib3VuZGluZyBib3ggKyBjYW52YXMgc2l6ZVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGluZXMsXG4gICAgICAgICAgICBzaXplOiB7IGNvbGxpc2lvbl9zaXplLCB0ZXh0dXJlX3NpemUsIGxvZ2ljYWxfc2l6ZSwgbGluZV9oZWlnaHQgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIERyYXcgbXVsdGlwbGUgbGluZXMgb2YgdGV4dFxuICAgIGRyYXdUZXh0TXVsdGlMaW5lIChsaW5lcywgW3gsIHldLCBzaXplLCB7IHN0cm9rZSwgc3Ryb2tlX3dpZHRoID0gMCwgdHJhbnNmb3JtLCBhbGlnbiwgc3VwZXJzYW1wbGUgfSkge1xuICAgICAgICBsZXQgbGluZV9oZWlnaHQgPSBzaXplLmxpbmVfaGVpZ2h0O1xuICAgICAgICBsZXQgaGVpZ2h0ID0geTtcbiAgICAgICAgZm9yIChsZXQgbGluZV9udW09MDsgbGluZV9udW0gPCBsaW5lcy5sZW5ndGg7IGxpbmVfbnVtKyspIHtcbiAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbbGluZV9udW1dO1xuICAgICAgICAgICAgdGhpcy5kcmF3VGV4dExpbmUobGluZSwgW3gsIGhlaWdodF0sIHNpemUsIHsgc3Ryb2tlLCBzdHJva2Vfd2lkdGgsIHRyYW5zZm9ybSwgYWxpZ24sIHN1cGVyc2FtcGxlIH0pO1xuICAgICAgICAgICAgaGVpZ2h0ICs9IGxpbmVfaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHJhdyBib3VuZGluZyBib3hlcyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLmRyYXdfbGFiZWxfY29sbGlzaW9uX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG4gICAgICAgICAgICBsZXQgaG9yaXpvbnRhbF9idWZmZXIgPSBkcHIgKiAodGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyICsgc3Ryb2tlX3dpZHRoKTtcbiAgICAgICAgICAgIGxldCB2ZXJ0aWNhbF9idWZmZXIgPSBkcHIgKiB0aGlzLnZlcnRpY2FsX3RleHRfYnVmZmVyO1xuICAgICAgICAgICAgbGV0IGNvbGxpc2lvbl9zaXplID0gc2l6ZS5jb2xsaXNpb25fc2l6ZTtcbiAgICAgICAgICAgIGxldCBsaW5lV2lkdGggPSAyO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnYmx1ZSc7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVJlY3QoeCArIGhvcml6b250YWxfYnVmZmVyLCB5ICsgdmVydGljYWxfYnVmZmVyLCBkcHIgKiBjb2xsaXNpb25fc2l6ZVswXSwgZHByICogY29sbGlzaW9uX3NpemVbMV0pO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQucmVzdG9yZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlYnVnU2V0dGluZ3MuZHJhd19sYWJlbF90ZXh0dXJlX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gc2l6ZS50ZXh0dXJlX3NpemU7XG4gICAgICAgICAgICBsZXQgbGluZVdpZHRoID0gMjtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gJ2dyZWVuJztcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgICAgICAgICAvLyBzdHJva2UgaXMgYXBwbGllZCBpbnRlcm5hbGx5LCBzbyB0aGUgb3V0ZXIgYm9yZGVyIGlzIHRoZSBlZGdlIG9mIHRoZSB0ZXh0dXJlXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlUmVjdCh4ICsgbGluZVdpZHRoLCB5ICsgbGluZVdpZHRoLCB0ZXh0dXJlX3NpemVbMF0gLSAyICogbGluZVdpZHRoLCB0ZXh0dXJlX3NpemVbMV0gLSAyICogbGluZVdpZHRoKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERyYXcgc2luZ2xlIGxpbmUgb2YgdGV4dCBhdCBzcGVjaWZpZWQgbG9jYXRpb24sIGFkanVzdGluZyBmb3IgYnVmZmVyIGFuZCBiYXNlbGluZVxuICAgIGRyYXdUZXh0TGluZSAobGluZSwgW3gsIHldLCBzaXplLCB7IHN0cm9rZSwgc3Ryb2tlX3dpZHRoID0gMCwgdHJhbnNmb3JtLCBhbGlnbiwgc3VwZXJzYW1wbGUgfSkge1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICogc3VwZXJzYW1wbGU7XG4gICAgICAgIGFsaWduID0gYWxpZ24gfHwgJ2NlbnRlcic7XG5cbiAgICAgICAgbGV0IHZlcnRpY2FsX2J1ZmZlciA9IHRoaXMudmVydGljYWxfdGV4dF9idWZmZXIgKiBkcHI7XG4gICAgICAgIGxldCB0ZXh0dXJlX3NpemUgPSBzaXplLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gc2l6ZS5saW5lX2hlaWdodDtcbiAgICAgICAgbGV0IGhvcml6b250YWxfYnVmZmVyID0gZHByICogKHN0cm9rZV93aWR0aCArIHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlcik7XG5cbiAgICAgICAgbGV0IHN0ciA9IHRoaXMuYXBwbHlUZXh0VHJhbnNmb3JtKGxpbmUudGV4dCwgdHJhbnNmb3JtKTtcblxuICAgICAgICAvLyBUZXh0IGFsaWdubWVudFxuICAgICAgICBsZXQgdHg7XG4gICAgICAgIGlmIChhbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICB0eCA9IHggKyBob3Jpem9udGFsX2J1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIHR4ID0geCArIHRleHR1cmVfc2l6ZVswXS8yIC0gbGluZS53aWR0aC8yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICB0eCA9IHggKyB0ZXh0dXJlX3NpemVbMF0gLSBsaW5lLndpZHRoIC0gaG9yaXpvbnRhbF9idWZmZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbiB0aGUgYWJzZW5jZSBvZiBiZXR0ZXIgQ2FudmFzIFRleHRNZXRyaWNzIChub3Qgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzIHlldCksXG4gICAgICAgIC8vIDAuNzUgYnVmZmVyIHByb2R1Y2VzIGEgYmV0dGVyIGFwcHJveGltYXRlIHZlcnRpY2FsIGNlbnRlcmluZyBvZiB0ZXh0XG4gICAgICAgIGxldCB0eSA9IHkgKyB2ZXJ0aWNhbF9idWZmZXIgKiAwLjc1ICsgbGluZV9oZWlnaHQ7XG5cbiAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2Vfd2lkdGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc3Ryb2tlVGV4dChzdHIsIHR4LCB0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbGxUZXh0KHN0ciwgdHgsIHR5KTtcbiAgICB9XG5cbiAgICByYXN0ZXJpemUgKHRleHRzLCB0ZXh0dXJlX3NpemUsIHRpbGVfa2V5KSB7XG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0X2luZm9zW3RleHRdO1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzID0gdGV4dF9pbmZvLnRleHRfc2V0dGluZ3M7XG5cbiAgICAgICAgICAgICAgICAvLyBzZXQgZm9udCBvbiBmaXJzdCBvY2N1cmVuY2Ugb2YgbmV3IGZvbnQgc3R5bGVcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb250KHRleHRfc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmRzID0gdGV4dF9pbmZvLnNlZ21lbnRzO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8udGV4Y29vcmRzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29yZCA9IHdvcmRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleGNvb3JkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdLnRleGNvb3JkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhjb29yZCA9IENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXhjb29yZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlX3Bvc2l0aW9uID0gQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdLnRleHR1cmVfcG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3dvcmRdLnNpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3dvcmRdLmxpbmVzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3VGV4dE11bHRpTGluZShsaW5lLCB0ZXh0dXJlX3Bvc2l0aW9uLCBzaXplLCB0ZXh0X3NldHRpbmdzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleGNvb3JkID0gVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVfcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUudGV4dHVyZV9zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3NpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdLnRleGNvb3JkID0gdGV4Y29vcmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby50ZXhjb29yZHMucHVzaCh0ZXhjb29yZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsaW5lcyA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bdGV4dF0ubGluZXM7IC8vIGdldCBwcmV2aW91c2x5IGNvbXB1dGVkIGxpbmVzIG9mIHRleHRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYWxpZ24gaW4gdGV4dF9pbmZvLmFsaWduKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdUZXh0TXVsdGlMaW5lKGxpbmVzLCB0ZXh0X2luZm8uYWxpZ25bYWxpZ25dLnRleHR1cmVfcG9zaXRpb24sIHRleHRfaW5mby5zaXplLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiB0ZXh0X3NldHRpbmdzLnN0cm9rZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Vfd2lkdGg6IHRleHRfc2V0dGluZ3Muc3Ryb2tlX3dpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogdGV4dF9zZXR0aW5ncy50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJzYW1wbGU6IHRleHRfc2V0dGluZ3Muc3VwZXJzYW1wbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246IGFsaWduXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXhjb29yZHMgPSBUZXh0dXJlLmdldFRleGNvb3Jkc0ZvclNwcml0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ25bYWxpZ25dLnRleHR1cmVfcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNpemUudGV4dHVyZV9zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVfc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBsYWNlIHRleHQgbGFiZWxzIHdpdGhpbiBhbiBhdGxhcyBvZiB0aGUgZ2l2ZW4gbWF4IHNpemVcbiAgICBzZXRUZXh0dXJlVGV4dFBvc2l0aW9ucyAodGV4dHMsIG1heF90ZXh0dXJlX3NpemUsIHRpbGVfa2V5KSB7XG4gICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV0pIHtcbiAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIGNvbHVtbiB3aWR0aFxuICAgICAgICBsZXQgY29sdW1uX3dpZHRoID0gMDtcblxuICAgICAgICAvLyBMYXlvdXQgbGFiZWxzLCBzdGFja2VkIGluIGNvbHVtbnNcbiAgICAgICAgbGV0IGN4ID0gMCwgY3kgPSAwOyAvLyBjdXJyZW50IHgveSBwb3NpdGlvbiBpbiBhdGxhc1xuICAgICAgICBsZXQgaGVpZ2h0ID0gMDsgICAgIC8vIG92ZXJhbGwgYXRsYXMgaGVpZ2h0XG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXSkge1xuICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0X2luZm9zID0gdGV4dHNbc3R5bGVdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRfaW5mb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcblxuICAgICAgICAgICAgICAgIGlmICh0ZXh0X2luZm8udGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlX3Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHRfaW5mby5zaXplLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29yZCA9IHRleHRfaW5mby5zZWdtZW50c1tpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV1bd29yZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHRleHRfaW5mby5zaXplW2ldLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZVswXSA+IGNvbHVtbl93aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5fd2lkdGggPSBzaXplWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3kgKyBzaXplWzFdIDwgbWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgKz0gc2l6ZVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBjeTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gc3RhcnQgbmV3IGNvbHVtbiBpZiB0YWxsZXIgdGhhbiB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4ICs9IGNvbHVtbl93aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uOiB0ZXh0dXJlX3Bvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyZWQgc2l6ZSBpcyBzYW1lIGZvciBhbGwgYWxpZ25tZW50c1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2l6ZSA9IHRleHRfaW5mby5zaXplLnRleHR1cmVfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVbMF0gPiBjb2x1bW5fd2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl93aWR0aCA9IHNpemVbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgZWFjaCBhbGlnbm1lbnQgbmVlZHMgdG8gYmUgcmVuZGVyZWQgc2VwYXJhdGVseVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBhbGlnbiBpbiB0ZXh0X2luZm8uYWxpZ24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSArIHNpemVbMV0gPCBtYXhfdGV4dHVyZV9zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07IC8vIGFkZCBsYWJlbCB0byBjdXJyZW50IGNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5ICs9IHNpemVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGN5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBzdGFydCBuZXcgY29sdW1uIGlmIHRhbGxlciB0aGFuIHRleHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeCArPSBjb2x1bW5fd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uID0gW2N4LCBjeV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2N4ICsgY29sdW1uX3dpZHRoLCBoZWlnaHRdOyAvLyBvdmVyYWxsIGF0bGFzIHNpemVcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgYmVmb3JlIHJhc3Rlcml6YXRpb25cbiAgICBhcHBseVRleHRUcmFuc2Zvcm0gKHRleHQsIHRyYW5zZm9ybSkge1xuICAgICAgICBpZiAodHJhbnNmb3JtID09PSAnY2FwaXRhbGl6ZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xcd1xcUyovZywgZnVuY3Rpb24gKHR4dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0eHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtID09PSAndXBwZXJjYXNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0cmFuc2Zvcm0gPT09ICdsb3dlcmNhc2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgZm9udCBDU1Mtc3R5bGUgc2l6ZSAoJzEycHgnLCAnMTRwdCcsICcxLjVlbScsIGV0Yy4pIHRvIHBpeGVsIHNpemUgKGFkanVzdGVkIGZvciBkZXZpY2UgcGl4ZWwgcmF0aW8pXG4gICAgLy8gRGVmYXVsdHMgdW5pdHMgdG8gcGl4ZWxzIGlmIG5vdCBzcGVjaWZpZWRcbiAgICBzdGF0aWMgZm9udFBpeGVsU2l6ZSAoc2l6ZSkge1xuICAgICAgICBpZiAoc2l6ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2l6ZSA9ICh0eXBlb2Ygc2l6ZSA9PT0gJ3N0cmluZycpID8gc2l6ZSA6IFN0cmluZyhzaXplKTsgLy8gbmVlZCBhIHN0cmluZyBmb3IgcmVnZXhcblxuICAgICAgICBsZXQgWywgcHhfc2l6ZSwgdW5pdHNdID0gc2l6ZS5tYXRjaChDYW52YXNUZXh0LmZvbnRfc2l6ZV9yZSkgfHwgW107XG4gICAgICAgIHVuaXRzID0gdW5pdHMgfHwgJ3B4JztcblxuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikge1xuICAgICAgICAgICAgcHhfc2l6ZSAqPSAxNjtcbiAgICAgICAgfSBlbHNlIGlmICh1bml0cyA9PT0gXCJwdFwiKSB7XG4gICAgICAgICAgICBweF9zaXplIC89IDAuNzU7XG4gICAgICAgIH0gZWxzZSBpZiAodW5pdHMgPT09IFwiJVwiKSB7XG4gICAgICAgICAgICBweF9zaXplIC89IDYuMjU7XG4gICAgICAgIH1cblxuICAgICAgICBweF9zaXplID0gcGFyc2VGbG9hdChweF9zaXplKTtcbiAgICAgICAgcHhfc2l6ZSAqPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIHJldHVybiBweF9zaXplO1xuICAgIH1cblxuICAgIGNsZWFyVGV4Y29vcmRDYWNoZSAodGlsZV9rZXkpIHtcbiAgICAgICAgQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV0gPSB7fTtcbiAgICB9XG5cbn1cblxuLy8gRXh0cmFjdCBmb250IHNpemUgYW5kIHVuaXRzXG5DYW52YXNUZXh0LmZvbnRfc2l6ZV9yZSA9IC8oKD86WzAtOV0qXFwuKT9bMC05XSspXFxzKihweHxwdHxlbXwlKT8vO1xuXG4vLyBDYWNoZSBzaXplcyBvZiByZW5kZXJlZCB0ZXh0XG5DYW52YXNUZXh0LnRleHRfY2FjaGUgPSB7fTsgLy8gYnkgdGV4dCBzdHlsZSwgdGhlbiB0ZXh0IHN0cmluZ1xuQ2FudmFzVGV4dC5jYWNoZV9zdGF0cyA9IHsgaGl0czogMCwgbWlzc2VzOiAwIH07XG5DYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlID0ge307XG5cbi8vIFJpZ2h0LXRvLWxlZnQgLyBiaS1kaXJlY3Rpb25hbCB0ZXh0IGhhbmRsaW5nXG4vLyBUYWtlbiBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTIwMDYwOTUvamF2YXNjcmlwdC1ob3ctdG8tY2hlY2staWYtY2hhcmFjdGVyLWlzLXJ0bCNhbnN3ZXItMTkxNDMyNTRcbmxldCBydGxSZWdFeCA9IC9eW15cXHUwNTkxLVxcdTA3RkZcXHUyMDBGXFx1MjAyQlxcdTIwMkVcXHVGQjFELVxcdUZERkRcXHVGRTcwLVxcdUZFRkNdKj9bXFx1MDU5MS1cXHUwN0ZGXFx1MjAwRlxcdTIwMkJcXHUyMDJFXFx1RkIxRC1cXHVGREZEXFx1RkU3MC1cXHVGRUZDXS87XG5mdW5jdGlvbiBpc1JUTChzKXtcbiAgICByZXR1cm4gcnRsUmVnRXgudGVzdChzKTtcbn1cblxuZnVuY3Rpb24gcmVvcmRlcldvcmRzTFRSKHdvcmRzKSB7XG4gICAgbGV0IHdvcmRzX0xUUiA9IFtdO1xuICAgIGxldCB3b3Jkc19SVEwgPSBbXTtcblxuICAgIC8vIGxvb3AgdGhyb3VnaCB3b3JkcyBhbmQgcmUtb3JkZXIgUlRMIGdyb3VwcyBpbiByZXZlcnNlIG9yZGVyIChidXQgaW4gTFRSIHZpc3VhbCBvcmRlcilcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIHN0ciA9IHdvcmRzW2ldO1xuICAgICAgICB2YXIgcnRsID0gaXNSVEwoc3RyKTtcbiAgICAgICAgaWYgKHJ0bCl7XG4gICAgICAgICAgICB3b3Jkc19SVEwucHVzaChzdHIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKHdvcmRzX1JUTC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgICAgICB3b3Jkc19MVFIucHVzaCh3b3Jkc19SVEwucG9wKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd29yZHNfTFRSLnB1c2goc3RyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdoaWxlICh3b3Jkc19SVEwubGVuZ3RoID4gMCl7XG4gICAgICAgIHdvcmRzX0xUUi5wdXNoKHdvcmRzX1JUTC5wb3AoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmRzX0xUUjtcbn1cblxuLy8gU3BsaXR0aW5nIHN0cmF0ZWd5IGZvciBjaG9wcGluZyBhIGxhYmVsIGludG8gc2VnbWVudHNcbmZ1bmN0aW9uIHNwbGl0TGFiZWxUZXh0KHRleHQpe1xuICAgIGxldCB3b3JkcyA9IHRleHQuc3BsaXQoJyAnKTtcbiAgICByZXR1cm4gcmVvcmRlcldvcmRzTFRSKHdvcmRzKTtcbn1cblxuLy8gUHJpdmF0ZSBjbGFzcyB0byBhcnJhbmdlIHRleHQgbGFiZWxzIGludG8gbXVsdGlwbGUgbGluZXMgYmFzZWQgb25cbi8vIFwidGV4dCB3cmFwXCIgYW5kIFwibWF4IGxpbmVcIiB2YWx1ZXNcbmNsYXNzIE11bHRpTGluZSB7XG4gICAgY29uc3RydWN0b3IgKGNvbnRleHQsIG1heF9saW5lcyA9IEluZmluaXR5LCB0ZXh0X3dyYXAgPSBJbmZpbml0eSkge1xuICAgICAgICB0aGlzLndpZHRoID0gMDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLmxpbmVzID0gW107XG5cbiAgICAgICAgdGhpcy5lbGxpcHNpcyA9ICcuLi4nO1xuICAgICAgICB0aGlzLmVsbGlwc2lzX3dpZHRoID0gTWF0aC5jZWlsKGNvbnRleHQubWVhc3VyZVRleHQodGhpcy5lbGxpcHNpcykud2lkdGgpO1xuXG4gICAgICAgIHRoaXMubWF4X2xpbmVzID0gbWF4X2xpbmVzO1xuICAgICAgICB0aGlzLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICB9XG5cbiAgICBjcmVhdGVMaW5lIChsaW5lX2hlaWdodCl7XG4gICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA8IHRoaXMubWF4X2xpbmVzKXtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGluZShsaW5lX2hlaWdodCwgdGhpcy50ZXh0X3dyYXApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCAobGluZSl7XG4gICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA8IHRoaXMubWF4X2xpbmVzKXtcbiAgICAgICAgICAgIC8vIG1lYXN1cmUgbGluZSB3aWR0aFxuICAgICAgICAgICAgbGV0IGxpbmVfd2lkdGggPSB0aGlzLmNvbnRleHQubWVhc3VyZVRleHQobGluZS50ZXh0KS53aWR0aDtcbiAgICAgICAgICAgIGxpbmUud2lkdGggPSBsaW5lX3dpZHRoO1xuXG4gICAgICAgICAgICBpZiAobGluZV93aWR0aCA+IHRoaXMud2lkdGgpe1xuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSBNYXRoLmNlaWwobGluZV93aWR0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFkZCB0byBsaW5lcyBhbmQgaW5jcmVtZW50IGhlaWdodFxuICAgICAgICAgICAgdGhpcy5saW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgdGhpcy5oZWlnaHQgKz0gbGluZS5oZWlnaHQ7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRWxsaXBzaXMoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHB1c2hlcyB0byB0aGUgbGluZXMgYXJyYXkgYW5kIHJldHVybnMgYSBuZXcgbGluZSBpZiBwb3NzaWJsZSAoZmFsc2Ugb3RoZXJ3aXNlKVxuICAgIGFkdmFuY2UgKGxpbmUsIGxpbmVfaGVpZ2h0KSB7XG4gICAgICAgIGxldCBjYW5fcHVzaCA9IHRoaXMucHVzaChsaW5lKTtcbiAgICAgICAgaWYgKGNhbl9wdXNoKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUxpbmUobGluZV9oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkRWxsaXBzaXMgKCl7XG4gICAgICAgIGxldCBsYXN0X2xpbmUgPSB0aGlzLmxpbmVzW3RoaXMubGluZXMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgbGFzdF9saW5lLmFwcGVuZCh0aGlzLmVsbGlwc2lzKTtcbiAgICAgICAgbGFzdF9saW5lLndpZHRoICs9IHRoaXMuZWxsaXBzaXNfd2lkdGg7XG5cbiAgICAgICAgaWYgKGxhc3RfbGluZS53aWR0aCA+IHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSBsYXN0X2xpbmUud2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmaW5pc2ggKGxpbmUpe1xuICAgICAgICBpZiAobGluZSl7XG4gICAgICAgICAgICB0aGlzLnB1c2gobGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVsbGlwc2lzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UgKHN0ciwgdGV4dF93cmFwLCBtYXhfbGluZXMsIGxpbmVfaGVpZ2h0LCBjdHgpIHtcbiAgICAgICAgLy8gV29yZCB3cmFwcGluZ1xuICAgICAgICAvLyBMaW5lIGJyZWFrcyBjYW4gYmUgY2F1c2VkIGJ5OlxuICAgICAgICAvLyAgLSBpbXBsaWNpdCBsaW5lIGJyZWFrIHdoZW4gYSBtYXhpbXVtIGNoYXJhY3RlciB0aHJlc2hvbGQgaXMgZXhjZWVkZWQgcGVyIGxpbmUgKHRleHRfd3JhcClcbiAgICAgICAgLy8gIC0gZXhwbGljaXQgbGluZSBicmVhayBpbiB0aGUgbGFiZWwgdGV4dCAoXFxuKVxuICAgICAgICBsZXQgd29yZHM7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dF93cmFwID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgd29yZHMgPSBzdHIuc3BsaXQoJyAnKTsgLy8gc3BsaXQgd29yZHMgb24gc3BhY2VzXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3b3JkcyA9IFtzdHJdOyAvLyBubyBtYXggbGluZSB3b3JkIHdyYXBwaW5nIChidXQgbmV3IGxpbmVzIHdpbGwgc3RpbGwgYmUgaW4gZWZmZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG11bHRpbGluZSA9IG5ldyBNdWx0aUxpbmUoY3R4LCBtYXhfbGluZXMsIHRleHRfd3JhcCk7XG4gICAgICAgIGxldCBsaW5lID0gbXVsdGlsaW5lLmNyZWF0ZUxpbmUobGluZV9oZWlnaHQpO1xuXG4gICAgICAgIC8vIEZpcnN0IGl0ZXJhdGUgb24gc3BhY2UtYnJlYWsgZ3JvdXBzICh3aWxsIGJlIG9uZSBpZiBtYXggbGluZSBsZW5ndGggb2ZmKSwgdGhlbiBpdGVyYXRlIG9uIGxpbmUtYnJlYWsgZ3JvdXBzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBicmVha3MgPSB3b3Jkc1tpXS5zcGxpdCgnXFxuJyk7IC8vIHNwbGl0IG9uIGxpbmUgYnJlYWtzXG4gICAgICAgICAgICBsZXQgbmV3X2xpbmUgPSAoaSA9PT0gMCkgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgIGZvciAobGV0IG49MDsgbiA8IGJyZWFrcy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgICAgIGlmICghbGluZSl7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB3b3JkID0gYnJlYWtzW25dLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgIGlmICghd29yZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc3BhY2VkX3dvcmQgPSAobmV3X2xpbmUpID8gd29yZCA6ICcgJyArIHdvcmQ7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBhZGRpbmcgY3VycmVudCB3b3JkIHdvdWxkIG92ZXJmbG93LCBhZGQgYSBuZXcgbGluZSBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgLy8gZmlyc3Qgd29yZCAoaSA9PT0gMCkgYWx3YXlzIGFwcGVuZHNcbiAgICAgICAgICAgICAgICBpZiAodGV4dF93cmFwICYmIGkgPiAwICYmIGxpbmUuZXhjZWVkc1RleHR3cmFwKHNwYWNlZF93b3JkKSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lID0gbXVsdGlsaW5lLmFkdmFuY2UobGluZSwgbGluZV9oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQod29yZCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld19saW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKHNwYWNlZF93b3JkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBsaW5lIGJyZWFrcyBwcmVzZW50LCBhZGQgbmV3IGxpbmUgKHVubGVzcyBvbiBsYXN0IGxpbmUpXG4gICAgICAgICAgICAgICAgaWYgKG4gPCBicmVha3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lID0gbXVsdGlsaW5lLmFkdmFuY2UobGluZSwgbGluZV9oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdfbGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaSA9PT0gd29yZHMubGVuZ3RoIC0gMSl7XG4gICAgICAgICAgICAgICAgbXVsdGlsaW5lLmZpbmlzaChsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXVsdGlsaW5lO1xuICAgIH1cbn1cblxuLy8gQSBQcml2YXRlIGNsYXNzIHVzZWQgYnkgTXVsdGlMaW5lIHRvIGNvbnRhaW4gdGhlIGxvZ2ljIGZvciBhIHNpbmdsZSBsaW5lXG4vLyBpbmNsdWRpbmcgY2hhcmFjdGVyIGNvdW50LCB3aWR0aCwgaGVpZ2h0IGFuZCB0ZXh0XG5jbGFzcyBMaW5lIHtcbiAgICBjb25zdHJ1Y3RvciAoaGVpZ2h0ID0gMCwgdGV4dF93cmFwID0gMCl7XG4gICAgICAgIHRoaXMuY2hhcnMgPSAwO1xuICAgICAgICB0aGlzLnRleHQgPSAnJztcblxuICAgICAgICB0aGlzLmhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQpO1xuICAgICAgICB0aGlzLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcbiAgICB9XG5cbiAgICBhcHBlbmQgKHRleHQpe1xuICAgICAgICB0aGlzLmNoYXJzICs9IHRleHQubGVuZ3RoO1xuICAgICAgICB0aGlzLnRleHQgKz0gdGV4dDtcbiAgICB9XG5cbiAgICBleGNlZWRzVGV4dHdyYXAgKHRleHQpe1xuICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggKyB0aGlzLmNoYXJzID4gdGhpcy50ZXh0X3dyYXA7XG4gICAgfVxufVxuIiwiLyogZ2xvYmFsIEZvbnRGYWNlICovXG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEZvbnRGYWNlT2JzZXJ2ZXIgZnJvbSAnZm9udGZhY2VvYnNlcnZlcic7XG5cbmNvbnN0IEZvbnRNYW5hZ2VyID0ge1xuXG4gICAgLy8gRm9udCBkZXRlY3Rpb25cbiAgICBmb250c19sb2FkZWQ6IFByb21pc2UucmVzb2x2ZSgpLCAvLyByZXNvbHZlcyB3aGVuIGFsbCByZXF1ZXN0ZWQgZm9udHMgaGF2ZSBiZWVuIGRldGVjdGVkXG5cbiAgICAvLyBMb2FkIHNldCBvZiBjdXN0b20gZm9udCBmYWNlc1xuICAgIC8vIGBmb250c2AgaXMgYW4gb2JqZWN0IHdoZXJlIHRoZSBrZXkgaXMgYSBmb250IGZhbWlseSBuYW1lLCBhbmQgdGhlIHZhbHVlIGlzIG9uZSBvciBtb3JlIGZvbnQgZmFjZVxuICAgIC8vIGRlZmluaXRpb25zLiBUaGUgdmFsdWUgY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBvYmplY3QsIG9yIGFuIGFycmF5IG9mIHN1Y2ggb2JqZWN0cy5cbiAgICAvLyBJZiB0aGUgc3BlY2lhbCBzdHJpbmcgdmFsdWUgJ2V4dGVybmFsJyBpcyB1c2VkLCBpdCBpbmRpY2F0ZXMgdGhlIHRoZSBmb250IHdpbGwgYmUgbG9hZGVkIHZpYSBleHRlcm5hbCBDU1MuXG4gICAgbG9hZEZvbnRzIChmb250cykge1xuICAgICAgICBpZiAoZm9udHMpIHtcbiAgICAgICAgICAgIGxldCBxdWV1ZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgZmFtaWx5IGluIGZvbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZm9udHNbZmFtaWx5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9udHNbZmFtaWx5XS5mb3JFYWNoKGZhY2UgPT4gcXVldWUucHVzaCh0aGlzLmxvYWRGb250RmFjZShmYW1pbHksIGZhY2UpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKHRoaXMubG9hZEZvbnRGYWNlKGZhbWlseSwgZm9udHNbZmFtaWx5XSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5mb250c19sb2FkZWQgPSBQcm9taXNlLmFsbChxdWV1ZS5maWx0ZXIoeCA9PiB4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9udHNfbG9hZGVkO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkIGEgc2luZ2xlIGZvbnQgZmFjZVxuICAgIC8vIGBmYWNlYCBjb250YWlucyB0aGUgZm9udCBmYWNlIGRlZmluaXRpb24sIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgYHdlaWdodGAsIGBzdHlsZWAsIGFuZCBgdXJsYC5cbiAgICAvLyBJZiB0aGUgYHVybGAgaXMgZGVmaW5lZCwgdGhlIGZvbnQgaXMgaW5qZWN0ZWQgaW50byB0aGUgZG9jdW1lbnQgYXMgYSBDU1MgZm9udC1mYWNlLlxuICAgIC8vIElmIHRoZSBvYmplY3QncyB2YWx1ZSBpcyB0aGUgc3BlY2lhbCBzdHJpbmcgJ2V4dGVybmFsJywgb3IgaWYgbm8gYHVybGAgaXMgZGVmaW5lZCwgdGhlbiB0aGUgZm9udCBmYWNlXG4gICAgLy8gaXMgYXNzdW1lZCBpcyBhc3N1bWVkIHRvIGJlZW4gbG9hZGVkIHZpYSBleHRlcm5hbCBDU1MuIEluIGVpdGhlciBjYXNlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2VcbiAgICAvLyB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZvbnQgZmFjZSBoYXMgbG9hZGVkLCBvciB0aW1lcyBvdXQuXG4gICAgbG9hZEZvbnRGYWNlIChmYW1pbHksIGZhY2UpIHtcbiAgICAgICAgaWYgKGZhY2UgPT0gbnVsbCB8fCAodHlwZW9mIGZhY2UgIT09ICdvYmplY3QnICYmIGZhY2UgIT09ICdleHRlcm5hbCcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3B0aW9ucyA9IHsgZmFtaWx5IH07XG4gICAgICAgIGxldCBpbmplY3QgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGZhY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMsIGZhY2UpO1xuXG4gICAgICAgICAgICAvLyBJZiBVUkwgaXMgZGVmaW5lZCwgaW5qZWN0IGZvbnQgaW50byBkb2N1bWVudFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmYWNlLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbmplY3QgPSB0aGlzLmluamVjdEZvbnRGYWNlKG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2FpdCBmb3IgZm9udCB0byBsb2FkXG4gICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBGb250RmFjZU9ic2VydmVyKGZhbWlseSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBpbmplY3QudGhlbigoKSA9PiBvYnNlcnZlci5sb2FkKCkpLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlcywgZm9udCBpcyBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYEZvbnQgZmFjZSAnJHtmYW1pbHl9JyBpcyBhdmFpbGFibGVgLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUHJvbWlzZSByZWplY3RzLCBmb250IGlzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYEZvbnQgZmFjZSAnJHtmYW1pbHl9JyBpcyBOT1QgYXZhaWxhYmxlYCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIC8vIExvYWRzIGEgZm9udCBmYWNlIHZpYSBlaXRoZXIgdGhlIG5hdGl2ZSBGb250RmFjZSBBUEksIG9yIENTUyBpbmplY3Rpb25cbiAgICAvLyBUT0RPOiBjb25zaWRlciBzdXBwb3J0IGZvciBtdWx0aXBsZSBmb3JtYXQgVVJMcyBwZXIgZmFjZSwgdW5pY29kZSByYW5nZXNcbiAgICBpbmplY3RGb250RmFjZSAoeyBmYW1pbHksIHVybCwgd2VpZ2h0LCBzdHlsZSB9KSB7XG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzX25hdGl2ZV9mb250X2xvYWRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nID0gKHdpbmRvdy5Gb250RmFjZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgYmxvYiBVUkxzLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmF0aXZlIEZvbnRGYWNlIEFQSSB3aWxsIGJlIHVzZWQgb3Igbm90LlxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVuIHRoZSBGb250RmFjZSBBUEkgKmlzKiBzdXBwb3J0ZWQsIHRoZSBibG9iIFVSTCBpcyByZWFkIGludG8gYSByYXcgZGF0YSBhcnJheS5cbiAgICAgICAgLy8gTkI6IGl0J3MgaW5lZmZpY2llbnQgdG8gYmUgY29udmVydGluZyBibG9iIFVSTHMgaW50byB0eXBlZCBhcnJheXMgaGVyZSwgc2luY2UgdGhleSBvcmlnaW5hdGVkXG4gICAgICAgIC8vIGFzIHJhdyBkYXRhICpiZWZvcmUqIHRoZXkgd2VyZSBjb252ZXJ0ZWQgaW50byBibG9iIFVSTHMuIEhvd2V2ZXIsIHRoaXMgcHJvY2VzcyBzaG91bGQgYmUgZmFzdCBzaW5jZVxuICAgICAgICAvLyB0aGVzZSBhcmUgbmF0aXZlIGJyb3dzZXIgZnVuY3Rpb25zIGFuZCBhbGwgZGF0YSBpcyBsb2NhbCAobm8gbmV0d29yayByZXF1ZXN0KSwgYW5kIGl0IGtlZXBzIHRoZVxuICAgICAgICAvLyBsb2dpYyBzdHJlYW1saW5lZCBieSBhbGxvd2luZyB1cyB0byBjb250aW51ZSB0byB1c2UgYSBVUkwtYmFzZWQgaW50ZXJmYWNlIGZvciBhbGwgc2NlbmUgcmVzb3VyY2VzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVuIHRoZSBGb250RmFjZSBBUEkgaXMgKm5vdCogc3VwcG9ydGVkLCB0aGUgYmxvYiBVUkwgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gYSBiYXNlNjQgZGF0YSBVUkwuXG4gICAgICAgIC8vIFRoaXMgYXZvaWRzIHNlY3VyaXR5IHJlc3RyaWNpb25zIGluIHNvbWUgYnJvd3NlcnMuXG4gICAgICAgIC8vIEFsc28gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9icmFtc3RlaW4vZm9udGxvYWRlci9ibG9iLzU5OGU5Mzk5MTE3YmRjOTQ2ZmY3ODZmYTJjNTAwN2E2YmQ3ZDNiOWUvc3JjL2ZvbnRmYWNlLmpzI0wxNDUtTDE1M1xuICAgICAgICBsZXQgcHJlcHJvY2VzcyA9IFByb21pc2UucmVzb2x2ZSh1cmwpO1xuICAgICAgICBpZiAodXJsLnNsaWNlKDAsIDUpID09PSAnYmxvYjonKSB7XG4gICAgICAgICAgICBwcmVwcm9jZXNzID0gVXRpbHMuaW8odXJsLCA2MDAwMCwgJ2FycmF5YnVmZmVyJykudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBieXRlczsgLy8gdXNlIHJhdyBiaW5hcnkgZGF0YVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkYXRhOmZvbnQvb3BlbnR5cGU7YmFzZTY0LCcgKyBidG9hKHN0cik7IC8vIGJhc2U2NCBlbmNvZGUgYXMgZGF0YSBVUkxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmVwcm9jZXNzLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIG5hdGl2ZSBGb250RmFjZSBBUElcbiAgICAgICAgICAgICAgICBsZXQgZmFjZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7IC8vIGFkZCBhcyBVUkxcbiAgICAgICAgICAgICAgICAgICAgZmFjZSA9IG5ldyBGb250RmFjZShmYW1pbHksIGB1cmwoJHtlbmNvZGVVUkkoZGF0YSl9KWAsIHsgd2VpZ2h0LCBzdHlsZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsgLy8gYWRkIGFzIGJpbmFyeSBkYXRhXG4gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBuZXcgRm9udEZhY2UoZmFtaWx5LCBkYXRhLCB7IHdlaWdodCwgc3R5bGUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChmYWNlKTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0FkZGluZyBGb250RmFjZSB0byBkb2N1bWVudC5mb250czonLCBmYWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBDU1MgaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgbGV0IGNzcyA9IGBcbiAgICAgICAgICAgICAgICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogJyR7ZmFtaWx5fSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogJHt3ZWlnaHQgfHwgJ25vcm1hbCd9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zdHlsZTogJHtzdHlsZSB8fCAnbm9ybWFsJ307XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHVybCgke2VuY29kZVVSSShkYXRhKX0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICAgIGxldCBzdHlsZV9lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgc3R5bGVfZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIikpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVfZWwpO1xuICAgICAgICAgICAgICAgIHN0eWxlX2VsLnNoZWV0Lmluc2VydFJ1bGUoY3NzLCAwKTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgJ0luamVjdGluZyBDU1MgZm9udCBmYWNlOicsIGNzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxufTtcblxuZXhwb3J0IGRlZmF1bHQgRm9udE1hbmFnZXI7XG4iLCIvLyBUZXh0IHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1BvaW50c30gZnJvbSAnLi4vcG9pbnRzL3BvaW50cyc7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4uLy4uL2xhYmVscy9jb2xsaXNpb24nO1xuaW1wb3J0IExhYmVsUG9pbnQgZnJvbSAnLi4vLi4vbGFiZWxzL2xhYmVsX3BvaW50JztcbmltcG9ydCBMYWJlbExpbmUgZnJvbSAnLi4vLi4vbGFiZWxzL2xhYmVsX2xpbmUnO1xuXG5leHBvcnQgbGV0IFRleHRTdHlsZSA9IE9iamVjdC5jcmVhdGUoUG9pbnRzKTtcblxuT2JqZWN0LmFzc2lnbihUZXh0U3R5bGUsIHtcbiAgICBuYW1lOiAndGV4dCcsXG4gICAgc3VwZXI6IFBvaW50cyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcblxuICAgIGluaXQoKSB7XG4gICAgICAgIHRoaXMuc3VwZXIuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIFBvaW50IHN0eWxlIChwYXJlbnQgY2xhc3MpIHJlcXVpcmVzIHRleHR1cmluZyB0byBiZSB0dXJuZWQgb25cbiAgICAgICAgLy8gKGxhYmVscyBhcmUgYWx3YXlzIGRyYXduIHdpdGggdGV4dHVyZXMpXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1BPSU5UX1RFWFRVUkUgPSB0cnVlO1xuXG4gICAgICAgIC8vIERpc2FibGUgZHVhbCBwb2ludC90ZXh0IG1vZGVcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTVVMVElfU0FNUExFUiA9IGZhbHNlO1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IHVuLW11bHRpcGx5IGFscGhhLCBiZWNhdXNlIENhbnZhcyB0ZXh0IHJhc3Rlcml6YXRpb24gaXMgcHJlLW11bHRpcGxpZWRcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVU5NVUxUSVBMWV9BTFBIQSA9IHRydWU7XG5cbiAgICAgICAgLy8gRmFkZSBvdXQgdGV4dCB3aGVuIHRpbGUgaXMgem9vbWluZyBvdXQsIGUuZy4gYWN0aW5nIGFzIHByb3h5IHRpbGVzXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfT05fWk9PTV9PVVQgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUX1JBVEUgPSAyOyAvLyBmYWRlIGF0IDJ4LCBlLmcuIGZ1bGx5IHRyYW5zcGFyZW50IGF0IDAuNSB6b29tIGxldmVsIGF3YXlcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfSxcblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnF1ZXVlcyA9IHt9O1xuICAgICAgICB0aGlzLnJlc2V0VGV4dCgpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZSB0byBxdWV1ZSBmZWF0dXJlcyBpbnN0ZWFkIG9mIHByb2Nlc3NpbmcgaW1tZWRpYXRlbHlcbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGxlZCBoZXJlIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgZGVsYXllZCB1bnRpbCB0aGUgZmVhdHVyZSBxdWV1ZSBpcyBwYXJzZWQsXG4gICAgICAgIC8vIGFuZCB3ZSB3YW50IHRoZSBwcmVwcm9jZXNzaW5nIGRvbmUgYmVmb3JlIHdlIGV2YWx1YXRlIHRleHQgc3R5bGUgYmVsb3dcbiAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHlwZSA9IGZlYXR1cmUuZ2VvbWV0cnkudHlwZTtcbiAgICAgICAgZHJhdy5jYW5fYXJ0aWN1bGF0ZSA9ICh0eXBlID09PSBcIkxpbmVTdHJpbmdcIiB8fCB0eXBlID09PSBcIk11bHRpTGluZVN0cmluZ1wiKTtcblxuICAgICAgICAvLyBzdXBlcnNhbXBsZSB0ZXh0IHJlbmRlcmluZyBmb3IgYW5nbGVkIGxhYmVscywgdG8gaW1wcm92ZSBjbGFyaXR5XG4gICAgICAgIGRyYXcuc3VwZXJzYW1wbGVfdGV4dCA9ICh0eXBlID09PSBcIkxpbmVTdHJpbmdcIiB8fCB0eXBlID09PSBcIk11bHRpTGluZVN0cmluZ1wiKTtcblxuICAgICAgICBsZXQgcSA9IHRoaXMucGFyc2VUZXh0RmVhdHVyZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKTtcbiAgICAgICAgaWYgKCFxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBxLmZlYXR1cmUgPSBmZWF0dXJlO1xuICAgICAgICBxLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBxLmxheW91dC52ZXJ0ZXggPSBmYWxzZTsgLy8gdmVydGV4IHBsYWNlbWVudCBvcHRpb24gbm90IGFwcGxpY2FibGUgdG8gc3RhbmRhbG9uZSBsYWJlbHNcblxuICAgICAgICAvLyBRdWV1ZSB0aGUgZmVhdHVyZSBmb3IgcHJvY2Vzc2luZ1xuICAgICAgICBpZiAoIXRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydERhdGEodGlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldLnB1c2gocSk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgd2l0aCBjb2xsaXNpb24gbWFuYWdlclxuICAgICAgICBDb2xsaXNpb24uYWRkU3R5bGUodGhpcy5uYW1lLCB0aWxlLmtleSk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgc3RhcnREYXRhICh0aWxlKSB7XG4gICAgICAgIHRoaXMucXVldWVzW3RpbGUua2V5XSA9IFtdO1xuICAgICAgICByZXR1cm4gU3R5bGUuc3RhcnREYXRhLmNhbGwodGhpcywgdGlsZSk7XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlXG4gICAgZW5kRGF0YSAodGlsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlVGV4dExhYmVscyh0aWxlLCB0aGlzLm5hbWUsIHRoaXMucXVldWVzW3RpbGUua2V5XSkuXG4gICAgICAgICAgICB0aGVuKGxhYmVscyA9PiB0aGlzLmNvbGxpZGVBbmRSZW5kZXJUZXh0TGFiZWxzKHRpbGUsIHRoaXMubmFtZSwgbGFiZWxzKSkuXG4gICAgICAgICAgICB0aGVuKCh7IGxhYmVscywgdGV4dHMsIHRleHR1cmUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XSA9IHRleHRzO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJ1aWxkIHF1ZXVlZCBmZWF0dXJlc1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzX2tleSA9IHEudGV4dF9zZXR0aW5nc19rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XVt0ZXh0X3NldHRpbmdzX2tleV0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XVt0ZXh0X3NldHRpbmdzX2tleV1bcS50ZXh0XTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgc3R5bGluZyBvYmplY3QgZXhwZWN0ZWQgYnkgU3R5bGUgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmxhYmVsID0gcS5sYWJlbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfaW5mby50ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnBhY2sgbG9naWNhbCBzaXplcyBvZiBlYWNoIHNlZ21lbnQgaW50byBhbiBhcnJheSBmb3IgdGhlIHN0eWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHRleHRfaW5mby5zaXplLm1hcChmdW5jdGlvbihzaXplKXsgcmV0dXJuIHNpemUubG9naWNhbF9zaXplOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSB0ZXh0X2luZm8udGV4Y29vcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2l6ZSA9IHRleHRfaW5mby5zaXplLmxvZ2ljYWxfc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5hbmdsZSA9IHEubGFiZWwuYW5nbGUgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSB0ZXh0X2luZm8uYWxpZ25bcS5sYWJlbC5hbGlnbl0udGV4Y29vcmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBTdHlsZS5hZGRGZWF0dXJlLmNhbGwodGhpcywgcS5mZWF0dXJlLCBxLmRyYXcsIHEuY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZyZWVUZXh0KHRpbGUpO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluaXNoIHRpbGUgbWVzaFxuICAgICAgICAgICAgICAgIHJldHVybiBTdHlsZS5lbmREYXRhLmNhbGwodGhpcywgdGlsZSkudGhlbih0aWxlX2RhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2ggdGlsZS1zcGVjaWZpYyBsYWJlbCBhdGxhcyB0byBtZXNoIGFzIGEgdGV4dHVyZSB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlICYmIHRpbGVfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnVuaWZvcm1zLnVfdGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMucHVzaCh0ZXh0dXJlKTsgLy8gYXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aWxlX2RhdGE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBTZXRzIHVwIGNhY2hpbmcgZm9yIGRyYXcgcHJvcGVydGllc1xuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXByb2Nlc3NUZXh0KGRyYXcpO1xuICAgIH0sXG5cbiAgICAvLyBJbXBsZW1lbnRzIGxhYmVsIGJ1aWxkaW5nIGZvciBUZXh0TGFiZWxzIG1peGluXG4gICAgYnVpbGRUZXh0TGFiZWxzICh0aWxlX2tleSwgZmVhdHVyZV9xdWV1ZSkge1xuICAgICAgICBsZXQgbGFiZWxzID0gW107XG4gICAgICAgIGZvciAobGV0IGY9MDsgZiA8IGZlYXR1cmVfcXVldWUubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgIGxldCBmcSA9IGZlYXR1cmVfcXVldWVbZl07XG4gICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGhpcy50ZXh0c1t0aWxlX2tleV1bZnEudGV4dF9zZXR0aW5nc19rZXldW2ZxLnRleHRdO1xuICAgICAgICAgICAgbGV0IGZlYXR1cmVfbGFiZWxzO1xuICAgICAgICAgICAgaWYgKHRleHRfaW5mby50ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZXMgPSB0ZXh0X2luZm8uc2l6ZS5tYXAoZnVuY3Rpb24oc2l6ZSl7IHJldHVybiBzaXplLmNvbGxpc2lvbl9zaXplOyB9KTtcbiAgICAgICAgICAgICAgICBmcS5sYXlvdXQuc3BhY2Vfd2lkdGggPSB0ZXh0X2luZm8uc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgZmVhdHVyZV9sYWJlbHMgPSB0aGlzLmJ1aWxkTGFiZWxzKHNpemVzLCBmcS5mZWF0dXJlLmdlb21ldHJ5LCBmcS5sYXlvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZV9sYWJlbHMgPSB0aGlzLmJ1aWxkTGFiZWxzKHRleHRfaW5mby5zaXplLmNvbGxpc2lvbl9zaXplLCBmcS5mZWF0dXJlLmdlb21ldHJ5LCBmcS5sYXlvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0dXJlX2xhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBmcWwgPSBPYmplY3QuY3JlYXRlKGZxKTtcbiAgICAgICAgICAgICAgICBmcWwubGFiZWwgPSBmZWF0dXJlX2xhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChmcWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkcyBvbmUgb3IgbW9yZSBsYWJlbHMgZm9yIGEgZ2VvbWV0cnlcbiAgICBidWlsZExhYmVscyAoc2l6ZSwgZ2VvbWV0cnksIGxheW91dCkge1xuICAgICAgICBsZXQgbGFiZWxzID0gW107XG5cbiAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTGluZVN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZUxhYmVscyhnZW9tZXRyeS5jb29yZGluYXRlcywgc2l6ZSwgbGF5b3V0LCBsYWJlbHMpO1xuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBsaW5lcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lTGFiZWxzKGxpbmVzW2ldLCBzaXplLCBsYXlvdXQsIGxhYmVscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2ludFwiKSB7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChnZW9tZXRyeS5jb29yZGluYXRlcywgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvaW50XCIpIHtcbiAgICAgICAgICAgIGxldCBwb2ludHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQocG9pbnRzW2ldLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvbHlnb25cIikge1xuICAgICAgICAgICAgbGV0IGNlbnRyb2lkID0gR2VvLmNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KGNlbnRyb2lkLCBzaXplLCBsYXlvdXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpUG9seWdvblwiKSB7XG4gICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8ubXVsdGlDZW50cm9pZChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBvbmUgb3IgbW9yZSBsYWJlbHMgZm9yIGEgbGluZSBnZW9tZXRyeVxuICAgIGJ1aWxkTGluZUxhYmVscyAobGluZSwgc2l6ZSwgbGF5b3V0LCBsYWJlbHMpIHtcbiAgICAgICAgbGV0IHN1YmRpdiA9IE1hdGgubWluKGxheW91dC5zdWJkaXYsIGxpbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgIGlmIChzdWJkaXYgPiAxKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgbXVsdGlwbGUgbGFiZWxzIGZvciBsaW5lLCB3aXRoIGVhY2ggYWxsb3R0ZWQgYSByYW5nZSBvZiBzZWdtZW50c1xuICAgICAgICAgICAgLy8gaW4gd2hpY2ggaXQgd2lsbCBhdHRlbXB0IHRvIHBsYWNlXG4gICAgICAgICAgICBsZXQgc2VnX3Blcl9kaXYgPSAobGluZS5sZW5ndGggLSAxKSAvIHN1YmRpdjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViZGl2OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9zdGFydCA9IE1hdGguZmxvb3IoaSAqIHNlZ19wZXJfZGl2KTtcbiAgICAgICAgICAgICAgICBsYXlvdXQuc2VnbWVudF9lbmQgPSBNYXRoLmZsb29yKChpICsgMSkgKiBzZWdfcGVyX2Rpdik7XG5cbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxMaW5lKHNpemUsIGxpbmUsIGxheW91dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfc3RhcnQgPSBudWxsO1xuICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfZW5kID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IG5ldyBMYWJlbExpbmUoc2l6ZSwgbGluZSwgbGF5b3V0KTtcbiAgICAgICAgICAgIGlmICghbGFiZWwudGhyb3dfYXdheSl7XG4gICAgICAgICAgICAgICAgbGV0IGNob3Nlbl9sYWJlbCA9IHBsYWNlbWVudFN0cmF0ZWd5KGxhYmVsKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hvc2VuX2xhYmVsKXtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2goY2hvc2VuX2xhYmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbn0pO1xuXG5jb25zdCBUQVJHRVRfU1RSQUlHSFQgPSAwLjQ7IC8vIE9wdGltaXN0aWMgdGFyZ2V0IHJhdGlvIGZvciBzdHJhaWdodCBsYWJlbHMgKGxhYmVsIGxlbmd0aCAvIGxpbmUgbGVuZ3RoKVxuY29uc3QgVEFSR0VUX0tJTktFRCA9IDAuNTsgLy8gT3B0aW1pc3RpYyB0YXJnZXQgcmF0aW8gZm9yIGtpbmtlZCBsYWJlbHMgKGxhYmVsIGxlbmd0aCAvIGxpbmUgbGVuZ3RoKVxuXG4vLyBQbGFjZSBsYWJlbHMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3k6XG4vLyAtIGNob29zZSB0aGUgYmVzdCBzdHJhaWdodCBsYWJlbCB0aGF0IHNhdGlzZmllcyB0aGUgb3B0aW1pc3RpYyBzdHJhaWdodCBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBjaG9vc2UgdGhlIGJlc3Qga2lua2VkIGxhYmVsIHRoYXQgc2F0aXNmaWVzIHRoZSBvcHRpbWlzdGljIGtpbmtlZCBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBjaG9vc2UgdGhlIGJlc3Qgc3RyYWlnaHQgbGFiZWwgdGhhdCBzYXRpc2ZpZXMgaXRzIGludGVybmFsIChsZXNzIG9wdGltaXN0aWMpIGN1dG9mZiAoaWYgYW55KVxuLy8gLSBlbHNlIGNob29zZSB0aGUgYmVzdCBraW5rZWQgbGFiZWxzIHRoYXQgc2F0aXNmaWVzIGl0cyBpbnRlcm5hbCAobGVzcyBvcHRpbWlzdGljKSBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBkb24ndCBwbGFjZSBhIGxhYmVsXG5mdW5jdGlvbiBwbGFjZW1lbnRTdHJhdGVneShsYWJlbCl7XG4gICAgbGV0IGxhYmVsc19zdHJhaWdodCA9IFtdO1xuICAgIGxldCBsYWJlbHNfa2lua2VkID0gW107XG4gICAgbGV0IGJlc3Rfc3RyYWlnaHRfZml0bmVzcyA9IEluZmluaXR5O1xuICAgIGxldCBiZXN0X2tpbmtlZF9maXRuZXNzID0gSW5maW5pdHk7XG5cbiAgICAvLyBsb29wIHRocm91Z2ggYWxsIGxhYmVsc1xuICAgIHdoaWxlIChsYWJlbCAmJiAhbGFiZWwudGhyb3dfYXdheSkge1xuICAgICAgICBpZiAobGFiZWwua2lua19pbmRleCA+IDApe1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgYXJ0aWN1bGF0ZWQgbGFiZWwgaXMgYWJvdmUgbG93ZXN0IGN1dG9mZlxuICAgICAgICAgICAgaWYgKGxhYmVsLmZpdG5lc3MgPCBiZXN0X2tpbmtlZF9maXRuZXNzKXtcbiAgICAgICAgICAgICAgICBiZXN0X2tpbmtlZF9maXRuZXNzID0gbGFiZWwuZml0bmVzcztcbiAgICAgICAgICAgICAgICBsYWJlbHNfa2lua2VkLnVuc2hpZnQobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgc3RyYWlnaHQgbGFiZWwgaXMgYWJvdmUgbG93ZXN0IHN0cmFpZ2h0IGN1dG9mZlxuICAgICAgICAgICAgaWYgKGxhYmVsLmZpdG5lc3MgPCBiZXN0X3N0cmFpZ2h0X2ZpdG5lc3Mpe1xuICAgICAgICAgICAgICAgIGJlc3Rfc3RyYWlnaHRfZml0bmVzcyA9IGxhYmVsLmZpdG5lc3M7XG4gICAgICAgICAgICAgICAgbGFiZWxzX3N0cmFpZ2h0LnVuc2hpZnQobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFiZWwgPSBMYWJlbExpbmUubmV4dExhYmVsKGxhYmVsKTtcbiAgICB9XG5cbiAgICBsZXQgYmVzdF9zdHJhaWdodCA9IGxhYmVsc19zdHJhaWdodFswXTtcbiAgICBsZXQgYmVzdF9raW5rZWQgPSBsYWJlbHNfa2lua2VkWzBdO1xuXG4gICAgaWYgKGxhYmVsc19zdHJhaWdodC5sZW5ndGggJiYgYmVzdF9zdHJhaWdodC5maXRuZXNzIDwgVEFSR0VUX1NUUkFJR0hUKXtcbiAgICAgICAgLy8gcmV0dXJuIHRoZSBiZXN0IHN0cmFpZ2h0IHNlZ21lbnQgaWYgaXQgaXMgYWJvdmUgdGhlIHN0cmljdGVyIHN0cmFpZ2h0IGN1dG9mZlxuICAgICAgICByZXR1cm4gYmVzdF9zdHJhaWdodDtcbiAgICB9XG4gICAgZWxzZSBpZiAobGFiZWxzX2tpbmtlZC5sZW5ndGggJiYgYmVzdF9raW5rZWQuZml0bmVzcyA8IFRBUkdFVF9LSU5LRUQpe1xuICAgICAgICAvLyByZXR1cm4gdGhlIGJlc3Qga2lua2VkIHNlZ21lbnQgaWYgaXQgaXMgYWJvdmUgdGhlIHN0cmljdGVyIGtpbmtlZCBjdXRvZmZcbiAgICAgICAgcmV0dXJuIGJlc3Rfa2lua2VkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHJldHVybiBiZXN0IG9mIHdoYXQncyBsZWZ0IChpZiBhbnkpXG4gICAgICAgIHJldHVybiBiZXN0X3N0cmFpZ2h0IHx8IGJlc3Rfa2lua2VkO1xuICAgIH1cbn1cblxuVGV4dFN0eWxlLnRleHR1cmVfaWQgPSAwOyAvLyBuYW1lc3BhY2VzIHBlci10aWxlIGxhYmVsIHRleHR1cmVzXG4iLCIvLyBUZXh0IGxhYmVsIHJlbmRlcmluZyBtZXRob2RzLCBjYW4gYmUgbWl4ZWQgaW50byBhIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vLi4vZ2wvdGV4dHVyZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uLy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4uLy4uL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uLy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tICcuLi8uLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBUZXh0U2V0dGluZ3MgZnJvbSAnLi4vdGV4dC90ZXh0X3NldHRpbmdzJztcbmltcG9ydCBDYW52YXNUZXh0IGZyb20gJy4uL3RleHQvY2FudmFzX3RleHQnO1xuXG4vLyBuYW1lc3BhY2VzIGxhYmVsIHRleHR1cmVzIChlbnN1cmVzIG5ldyB0ZXh0dXJlIG5hbWUgd2hlbiBhIHRpbGUgaXMgYnVpbHQgbXVsdGlwbGUgdGltZXMpXG5sZXQgdGV4dF90ZXh0dXJlX2lkID0gMDtcblxuZXhwb3J0IGNvbnN0IFRleHRMYWJlbHMgPSB7XG5cbiAgICByZXNldFRleHQgKCkge1xuICAgICAgICBpZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gbmV3IENhbnZhc1RleHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChUaHJlYWQuaXNfd29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRzID0ge307IC8vIHVuaXF1ZSB0ZXh0cywgZ3JvdXBlZCBieSB0aWxlLCBieSBzdHlsZVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZyZWVUZXh0ICh0aWxlKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRleHRzW3RpbGUua2V5XTtcbiAgICB9LFxuXG4gICAgcGFyc2VUZXh0RmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSkge1xuICAgICAgICAvLyBDb21wdXRlIGxhYmVsIHRleHRcbiAgICAgICAgbGV0IHRleHQgPSB0aGlzLnBhcnNlVGV4dFNvdXJjZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0ID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBubyB0ZXh0IGZvciB0aGlzIGZlYXR1cmVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXB1dGUgdGV4dCBzdHlsZSBhbmQgbGF5b3V0IHNldHRpbmdzIGZvciB0aGlzIGZlYXR1cmUgbGFiZWxcbiAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSBUZXh0U2V0dGluZ3MuY29tcHV0ZShmZWF0dXJlLCBkcmF3LCBjb250ZXh0KTtcbiAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gVGV4dFNldHRpbmdzLmtleSh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgbGV0IGxheW91dCA9IHRoaXMuY29tcHV0ZVRleHRMYXlvdXQoe30sIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUsIHRleHQsIHRleHRfc2V0dGluZ3MpO1xuXG4gICAgICAgIC8vIGZpcnN0IGxhYmVsIGluIHRpbGUsIG9yIHdpdGggdGhpcyBzdHlsZT9cbiAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV0gPSB0aGlzLnRleHRzW3RpbGUua2V5XSB8fCB7fTtcbiAgICAgICAgbGV0IHNpemVzID0gdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldID0gdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldIHx8IHt9O1xuXG4gICAgICAgIC8vIHVuaXF1ZSB0ZXh0IHN0cmluZ3MsIGdyb3VwZWQgYnkgdGV4dCBkcmF3aW5nIHN0eWxlXG4gICAgICAgIGlmICghc2l6ZXNbdGV4dF0pIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IGxhYmVsIHdpdGggdGhpcyB0ZXh0L3N0eWxlL3RpbGUgY29tYmluYXRpb24sIG1ha2UgYSBuZXcgbGFiZWwgZW50cnlcbiAgICAgICAgICAgIHNpemVzW3RleHRdID0ge1xuICAgICAgICAgICAgICAgIHRleHRfc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgcmVmOiAwIC8vICMgb2YgdGltZXMgdGhpcyB0ZXh0L3N0eWxlIGNvbWJvIGFwcGVhcnMgaW4gdGlsZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkcmF3LCB0ZXh0LCB0ZXh0X3NldHRpbmdzX2tleSwgbGF5b3V0XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8vIENvbXB1dGUgdGhlIGxhYmVsIHRleHQsIGRlZmF1bHQgaXMgdmFsdWUgb2YgZmVhdHVyZS5wcm9wZXJ0aWVzLm5hbWVcbiAgICAvLyAtIFN0cmluZyB2YWx1ZSBpbmRpY2F0ZXMgYSBmZWF0dXJlIHByb3BlcnR5IGxvb2stdXAsIGUuZy4gYHNob3J0X25hbWVgIG1lYW5zIHVzZSBmZWF0dXJlLnByb3BlcnRpZXMuc2hvcnRfbmFtZVxuICAgIC8vIC0gRnVuY3Rpb24gd2lsbCB1c2UgdGhlIHJldHVybiB2YWx1ZSBhcyB0aGUgbGFiZWwgdGV4dCAoZm9yIGN1c3RvbSBsYWJlbHMpXG4gICAgLy8gLSBBcnJheSAob2Ygc3RyaW5ncyBhbmQvb3IgZnVuY3Rpb25zKSBkZWZpbmVzIGEgbGlzdCBvZiBmYWxsYmFja3MsIGV2YWx1YXRlZCBhY2NvcmRpbmcgdG8gdGhlIGFib3ZlIHJ1bGVzLFxuICAgIC8vICAgd2l0aCB0aGUgZmlyc3Qgbm9uLW51bGwgdmFsdWUgdXNlZCBhcyB0aGUgbGFiZWwgdGV4dFxuICAgIC8vICAgZS5nLiBgW25hbWU6ZXMsIG5hbWU6ZW4sIG5hbWVdYCBwcmVmZXJzIFNwYW5pc2ggbmFtZXMsIGZvbGxvd2VkIGJ5IEVuZ2xpc2gsIGFuZCBsYXN0IHRoZSBkZWZhdWx0IGxvY2FsIG5hbWVcbiAgICBwYXJzZVRleHRTb3VyY2UgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRleHQ7XG4gICAgICAgIGxldCBzb3VyY2UgPSBkcmF3LnRleHRfc291cmNlIHx8ICduYW1lJztcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzb3VyY2UubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZVtzXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGZlYXR1cmUucHJvcGVydGllc1tzb3VyY2Vbc11dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZVtzXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gc291cmNlW3NdKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBzdG9wIGlmIHdlIGZvdW5kIGEgdGV4dCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGV4dCA9IGZlYXR1cmUucHJvcGVydGllc1tzb3VyY2VdO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRleHQgPSBzb3VyY2UoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfSxcblxuICAgIHByZXBhcmVUZXh0TGFiZWxzICh0aWxlLCBjb2xsaXNpb25fZ3JvdXAsIHF1ZXVlKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnRleHRzW3RpbGUua2V5XXx8e30pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXJzdCBjYWxsIHRvIG1haW4gdGhyZWFkLCBhc2sgZm9yIHRleHQgcGl4ZWwgc2l6ZXNcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLmNhbGNUZXh0U2l6ZXMnLCB0aGlzLnRleHRzW3RpbGUua2V5XSkudGhlbih0ZXh0cyA9PiB7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZSAke3RoaXMubmFtZX06IHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fSwgcG9zdC1jYWxjVGV4dFNpemVzKClgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldID0gdGV4dHM7XG4gICAgICAgICAgICBpZiAoIXRleHRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFRleHRMYWJlbHModGlsZS5rZXksIHF1ZXVlKTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIGNvbGxpZGVBbmRSZW5kZXJUZXh0TGFiZWxzICh0aWxlLCBjb2xsaXNpb25fZ3JvdXAsIGxhYmVscykge1xuICAgICAgICBpZiAoIWxhYmVscykge1xuICAgICAgICAgICAgQ29sbGlzaW9uLmNvbGxpZGUoe30sIGNvbGxpc2lvbl9ncm91cCwgdGlsZS5rZXkpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQ29sbGlzaW9uLmNvbGxpZGUobGFiZWxzLCBjb2xsaXNpb25fZ3JvdXAsIHRpbGUua2V5KS50aGVuKGxhYmVscyA9PiB7XG4gICAgICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgc3RvcCB0aWxlIGJ1aWxkIGJlY2F1c2UgdGlsZSB3YXMgY2FuY2VsZWQ6ICR7dGlsZS5rZXl9LCBwb3N0LWNvbGxpZGUoKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0cyA9IHRoaXMudGV4dHNbdGlsZS5rZXldO1xuICAgICAgICAgICAgdGhpcy5jdWxsVGV4dFN0eWxlcyh0ZXh0cywgbGFiZWxzKTtcblxuICAgICAgICAgICAgLy8gc2V0IGFsaWdubWVudHNcbiAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X3NldHRpbmdzX2tleSA9IHEudGV4dF9zZXR0aW5nc19rZXk7XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRzW3RleHRfc2V0dGluZ3Nfa2V5XSAmJiB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV1bcS50ZXh0XTtcbiAgICAgICAgICAgICAgICBpZiAoIXRleHRfaW5mby50ZXh0X3NldHRpbmdzLmNhbl9hcnRpY3VsYXRlKXtcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduID0gdGV4dF9pbmZvLmFsaWduIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8uYWxpZ25bcS5sYWJlbC5hbGlnbl0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gc2Vjb25kIGNhbGwgdG8gbWFpbiB0aHJlYWQsIGZvciByYXN0ZXJpemluZyB0aGUgc2V0IG9mIHRleHRzXG4gICAgICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0KycucmFzdGVyaXplVGV4dHMnLCB0aWxlLmtleSwgdGV4dHMpLnRoZW4oKHsgdGV4dHMsIHRleHR1cmUgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aWxlLmNhbmNlbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgc3RvcCB0aWxlIGJ1aWxkIGJlY2F1c2UgdGlsZSB3YXMgY2FuY2VsZWQ6ICR7dGlsZS5rZXl9LCBwb3N0LXJhc3Rlcml6ZVRleHRzKClgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxhYmVscywgdGV4dHMsIHRleHR1cmUgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gUmVtb3ZlIHVudXNlZCB0ZXh0L3N0eWxlIGNvbWJpbmF0aW9ucyB0byBhdm9pZCB1bm5lY2Vzc2FyeSByYXN0ZXJpemF0aW9uXG4gICAgY3VsbFRleHRTdHlsZXModGV4dHMsIGxhYmVscykge1xuICAgICAgICAvLyBDb3VudCBob3cgbWFueSB0aW1lcyBlYWNoIHRleHQvc3R5bGUgY29tYmluYXRpb24gaXMgdXNlZFxuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsYWJlbCA9IGxhYmVsc1tpXTtcbiAgICAgICAgICAgIHRleHRzW2xhYmVsLnRleHRfc2V0dGluZ3Nfa2V5XVtsYWJlbC50ZXh0XS5yZWYrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0ZXh0L3N0eWxlIGNvbWJpbmF0aW9ucyB0aGF0IGhhdmUgbm8gdmlzaWJsZSBsYWJlbHNcbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGV4dHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dHNbc3R5bGVdKSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gbGFiZWxzIGZvciB0aGlzIHRleHRcbiAgICAgICAgICAgICAgICBpZiAodGV4dHNbc3R5bGVdW3RleHRdLnJlZiA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRleHRzW3N0eWxlXVt0ZXh0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgLy8gbm8gbGFiZWxzIGZvciB0aGlzIHN0eWxlXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGV4dHNbc3R5bGVdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGV4dHNbc3R5bGVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCBmcm9tIHdvcmtlciwgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBlYWNoIHRleHQgc3RyaW5nLFxuICAgIC8vIHdlcmUgaXQgdG8gYmUgcmVuZGVyZWQuIFRoaXMgaW5mbyBpcyB0aGVuIHVzZWQgdG8gcGVyZm9ybSBpbml0aWFsIGxhYmVsIGN1bGxpbmcsICpiZWZvcmUqXG4gICAgLy8gbGFiZWxzIGFyZSBhY3R1YWxseSByZW5kZXJlZC5cbiAgICBjYWxjVGV4dFNpemVzICh0ZXh0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW52YXMudGV4dFNpemVzKHRleHRzKTtcbiAgICB9LFxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIGZyb20gd29ya2VyLCB0byBjcmVhdGUgYXRsYXMgb2YgbGFiZWxzIGZvciBhIHRpbGVcbiAgICByYXN0ZXJpemVUZXh0cyAodGlsZV9rZXksIHRleHRzKSB7XG4gICAgICAgIGxldCBjYW52YXMgPSBuZXcgQ2FudmFzVGV4dCgpO1xuICAgICAgICBjYW52YXMuY2xlYXJUZXhjb29yZENhY2hlKHRpbGVfa2V5KTtcblxuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gY2FudmFzLnNldFRleHR1cmVUZXh0UG9zaXRpb25zKHRleHRzLCB0aGlzLm1heF90ZXh0dXJlX3NpemUsIHRpbGVfa2V5KTtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0ZXh0IHN1bW1hcnkgZm9yIHRpbGUgJHt0aWxlX2tleX06IGZpdHMgaW4gJHt0ZXh0dXJlX3NpemVbMF19eCR7dGV4dHVyZV9zaXplWzFdfXB4YCk7XG5cbiAgICAgICAgLy8gZml0cyBpbiBtYXggdGV4dHVyZSBzaXplP1xuICAgICAgICBpZiAodGV4dHVyZV9zaXplWzBdIDwgdGhpcy5tYXhfdGV4dHVyZV9zaXplICYmIHRleHR1cmVfc2l6ZVsxXSA8IHRoaXMubWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIGNhbnZhcyBzaXplICYgcmFzdGVyaXplIGFsbCB0aGUgdGV4dCBzdHJpbmdzIHdlIG5lZWRcbiAgICAgICAgICAgIGNhbnZhcy5yZXNpemUoLi4udGV4dHVyZV9zaXplKTtcbiAgICAgICAgICAgIGNhbnZhcy5yYXN0ZXJpemUodGV4dHMsIHRleHR1cmVfc2l6ZSwgdGlsZV9rZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIFtcbiAgICAgICAgICAgICAgICBgTGFiZWwgYXRsYXMgZm9yIHRpbGUgJHt0aWxlX2tleX0gaXMgJHt0ZXh0dXJlX3NpemVbMF19eCR7dGV4dHVyZV9zaXplWzFdfXB4LCBgLFxuICAgICAgICAgICAgICAgIGBidXQgbWF4IEdMIHRleHR1cmUgc2l6ZSBpcyAke3RoaXMubWF4X3RleHR1cmVfc2l6ZX14JHt0aGlzLm1heF90ZXh0dXJlX3NpemV9cHhgXS5qb2luKCcnKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjcmVhdGUgYSB0ZXh0dXJlXG4gICAgICAgIGxldCB0ID0gJ2xhYmVscy0nICsgdGlsZV9rZXkgKyAnLScgKyAodGV4dF90ZXh0dXJlX2lkKyspO1xuICAgICAgICBUZXh0dXJlLmNyZWF0ZSh0aGlzLmdsLCB0LCB7XG4gICAgICAgICAgICBlbGVtZW50OiBjYW52YXMuY2FudmFzLFxuICAgICAgICAgICAgZmlsdGVyaW5nOiAnbGluZWFyJyxcbiAgICAgICAgICAgIFVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgVGV4dHVyZS5yZXRhaW4odCk7XG5cbiAgICAgICAgcmV0dXJuIHsgdGV4dHMsIHRleHR1cmU6IHQgfTsgLy8gdGV4dHVyZSBpcyByZXR1cm5lZCBieSBuYW1lIChub3QgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIHByZXByb2Nlc3NUZXh0IChkcmF3KSB7XG4gICAgICAgIC8vIEZvbnQgc2V0dGluZ3MgYXJlIHJlcXVpcmVkXG4gICAgICAgIGlmICghZHJhdyB8fCAhZHJhdy5mb250IHx8IHR5cGVvZiBkcmF3LmZvbnQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb2xvcnNcbiAgICAgICAgZHJhdy5mb250LmZpbGwgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5maWxsKTtcbiAgICAgICAgaWYgKGRyYXcuZm9udC5zdHJva2UpIHtcbiAgICAgICAgICAgIGRyYXcuZm9udC5zdHJva2UuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5zdHJva2UuY29sb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBmb250IGFuZCB0ZXh0IHN0cm9rZSBzaXplc1xuICAgICAgICBkcmF3LmZvbnQucHhfc2l6ZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LnNpemUgfHwgVGV4dFNldHRpbmdzLmRlZmF1bHRzLnNpemUsIENhbnZhc1RleHQuZm9udFBpeGVsU2l6ZSk7XG4gICAgICAgIGlmIChkcmF3LmZvbnQuc3Ryb2tlICYmIGRyYXcuZm9udC5zdHJva2Uud2lkdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgZHJhdy5mb250LnN0cm9rZS53aWR0aCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5mb250LnN0cm9rZS53aWR0aCwgcGFyc2VGbG9hdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPZmZzZXQgKDJkIGFycmF5KVxuICAgICAgICBkcmF3Lm9mZnNldCA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5vZmZzZXQsIHYgPT4gKEFycmF5LmlzQXJyYXkodikgJiYgdi5tYXAocGFyc2VGbG9hdCkpIHx8IDApO1xuXG4gICAgICAgIC8vIEJ1ZmZlciAoMWQgdmFsdWUgb3Igb3IgMmQgYXJyYXkpXG4gICAgICAgIGRyYXcuYnVmZmVyID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmJ1ZmZlciwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdiwgdl0pLm1hcChwYXJzZUZsb2F0KSB8fCAwKTtcblxuICAgICAgICAvLyBSZXBlYXQgcnVsZXMgLSBmb3IgdGV4dCBsYWJlbHMsIGRlZmF1bHRzIHRvIHRpbGUgc2l6ZVxuICAgICAgICBkcmF3LnJlcGVhdF9kaXN0YW5jZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5yZXBlYXRfZGlzdGFuY2UgfHwgR2VvLnRpbGVfc2l6ZSwgcGFyc2VGbG9hdCk7XG5cbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIEFkZGl0aW9uYWwgdGV4dC1zcGVjaWZpYyBsYXlvdXQgc2V0dGluZ3NcbiAgICBjb21wdXRlVGV4dExheW91dCAodGFyZ2V0LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlLCB0ZXh0LCB0ZXh0X3NldHRpbmdzKSB7XG4gICAgICAgIGxldCBsYXlvdXQgPSB0YXJnZXQgfHwge307XG5cbiAgICAgICAgLy8gY29tbW9uIHNldHRpbmdzIHcvcG9pbnRzXG4gICAgICAgIGxheW91dCA9IHRoaXMuY29tcHV0ZUxheW91dChsYXlvdXQsIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpO1xuXG4gICAgICAgIC8vIHRpbGUgYm91bmRhcnkgaGFuZGxpbmdcbiAgICAgICAgbGF5b3V0LmN1bGxfZnJvbV90aWxlID0gKGRyYXcuY3VsbF9mcm9tX3RpbGUgIT0gbnVsbCkgPyBkcmF3LmN1bGxfZnJvbV90aWxlIDogdHJ1ZTtcblxuICAgICAgICAvLyBzdGFuZGFsb25lIHRleHQgY2FuIG1vdmUgaW50byB0aWxlIGlmIHNwZWNpZmllZFxuICAgICAgICBsYXlvdXQubW92ZV9pbnRvX3RpbGUgPSAoZHJhdy5tb3ZlX2ludG9fdGlsZSAhPSBudWxsKSA/IGRyYXcubW92ZV9pbnRvX3RpbGUgOiB0cnVlO1xuXG4gICAgICAgIC8vIHJlcGVhdCBydWxlcyBpbmNsdWRlIHRoZSB0ZXh0XG4gICAgICAgIGlmIChsYXlvdXQucmVwZWF0X2Rpc3RhbmNlKSB7XG4gICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwICs9ICcvJyArIHRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXggbnVtYmVyIG9mIHN1YmRpdmlzaW9ucyB0byB0cnlcbiAgICAgICAgbGF5b3V0LnN1YmRpdiA9IHRpbGUub3Zlcnpvb20yO1xuXG4gICAgICAgIGxheW91dC5hbGlnbiA9IGRyYXcuYWxpZ247XG5cbiAgICAgICAgLy8gdXNlZCB0byBmdWRnZSB3aWR0aCB2YWx1ZSBhcyB0ZXh0IG1heSBvdmVyZmxvdyBib3VuZGluZyBib3ggaWYgaXQgaGFzIGl0YWxpYywgYm9sZCwgZXRjIHN0eWxlXG4gICAgICAgIGxheW91dC5pdGFsaWMgPSAodGV4dF9zZXR0aW5ncy5zdHlsZSAhPT0gJ25vcm1hbCcpO1xuXG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfVxuXG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5cbnZhciBUZXh0U2V0dGluZ3M7XG5cbmV4cG9ydCBkZWZhdWx0IFRleHRTZXR0aW5ncyA9IHtcblxuICAgIC8vIEEga2V5IGZvciBncm91cGluZyBhbGwgbGFiZWxzIG9mIHRoZSBzYW1lIHRleHQgc3R5bGUgKGUuZy4gc2FtZSBDYW52YXMgc3RhdGUsIHRvIG1pbmltaXplIHN0YXRlIGNoYW5nZXMpXG4gICAga2V5IChzZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgc2V0dGluZ3Muc3R5bGUsXG4gICAgICAgICAgICBzZXR0aW5ncy53ZWlnaHQsXG4gICAgICAgICAgICBzZXR0aW5ncy5mYW1pbHksXG4gICAgICAgICAgICBzZXR0aW5ncy5weF9zaXplLFxuICAgICAgICAgICAgc2V0dGluZ3MuZmlsbCxcbiAgICAgICAgICAgIHNldHRpbmdzLnN0cm9rZSxcbiAgICAgICAgICAgIHNldHRpbmdzLnN0cm9rZV93aWR0aCxcbiAgICAgICAgICAgIHNldHRpbmdzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIHNldHRpbmdzLnRleHRfd3JhcCxcbiAgICAgICAgICAgIHNldHRpbmdzLm1heF9saW5lcyxcbiAgICAgICAgICAgIHNldHRpbmdzLnN1cGVyc2FtcGxlLFxuICAgICAgICAgICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvXG4gICAgICAgIF0uam9pbignLycpO1xuICAgIH0sXG5cbiAgICBkZWZhdWx0czoge1xuICAgICAgICBzdHlsZTogJ25vcm1hbCcsXG4gICAgICAgIHdlaWdodDogbnVsbCxcbiAgICAgICAgc2l6ZTogJzEycHgnLFxuICAgICAgICBweF9zaXplOiAxMixcbiAgICAgICAgZmFtaWx5OiAnSGVsdmV0aWNhJyxcbiAgICAgICAgZmlsbDogJ3doaXRlJyxcbiAgICAgICAgdGV4dF93cmFwOiAxNSxcbiAgICAgICAgbWF4X2xpbmVzOiA1LFxuICAgICAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIHN0cm9rZTogbnVsbCxcbiAgICAgICAgc3Ryb2tlX3dpZHRoOiAwXG4gICAgfSxcblxuICAgIGNvbXB1dGUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHN0eWxlID0ge307XG5cbiAgICAgICAgZHJhdy5mb250ID0gZHJhdy5mb250IHx8IHRoaXMuZGVmYXVsdHM7XG5cbiAgICAgICAgLy8gTGluZVN0cmluZyBsYWJlbHMgY2FuIGFydGljdWxhdGUgd2hpbGUgcG9pbnQgbGFiZWxzIGNhbm5vdC4gTmVlZGVkIGZvciBmdXR1cmUgdGV4dHVyZSBjb29yZGluYXRlIGNhbGN1bGF0aW9ucy5cbiAgICAgICAgc3R5bGUuY2FuX2FydGljdWxhdGUgPSBkcmF3LmNhbl9hcnRpY3VsYXRlO1xuXG4gICAgICAgIC8vIFVzZSBmaWxsIGlmIHNwZWNpZmllZCwgb3IgZGVmYXVsdFxuICAgICAgICBzdHlsZS5maWxsID0gKGRyYXcuZm9udC5maWxsICYmIFV0aWxzLnRvQ1NTQ29sb3IoU3R5bGVQYXJzZXIuZXZhbENhY2hlZENvbG9yUHJvcGVydHkoZHJhdy5mb250LmZpbGwsIGNvbnRleHQpKSkgfHwgdGhpcy5kZWZhdWx0cy5maWxsO1xuXG4gICAgICAgIC8vIEZvbnQgcHJvcGVydGllcyBhcmUgbW9kZWxlZCBhZnRlciBDU1MgbmFtZXM6XG4gICAgICAgIC8vIC0gZmFtaWx5OiBIZWx2ZXRpY2EsIEZ1dHVyYSwgZXRjLlxuICAgICAgICAvLyAtIHNpemU6IGluIHB0LCBweCwgb3IgZW1cbiAgICAgICAgLy8gLSBzdHlsZTogbm9ybWFsLCBpdGFsaWMsIG9ibGlxdWVcbiAgICAgICAgLy8gLSB3ZWlnaHQ6IG5vcm1hbCwgYm9sZCwgZXRjLlxuICAgICAgICAvLyAtIHRyYW5zZm9ybTogY2FwaXRhbGl6ZSwgdXBwZXJjYXNlLCBsb3dlcmNhc2VcbiAgICAgICAgc3R5bGUuc3R5bGUgPSBkcmF3LmZvbnQuc3R5bGUgfHwgdGhpcy5kZWZhdWx0cy5zdHlsZTtcbiAgICAgICAgc3R5bGUud2VpZ2h0ID0gZHJhdy5mb250LndlaWdodCB8fCB0aGlzLmRlZmF1bHRzLndlaWdodDtcbiAgICAgICAgaWYgKGRyYXcuZm9udC5mYW1pbHkpIHtcbiAgICAgICAgICAgIHN0eWxlLmZhbWlseSA9IGRyYXcuZm9udC5mYW1pbHk7XG4gICAgICAgICAgICBpZiAoc3R5bGUuZmFtaWx5ICE9PSB0aGlzLmRlZmF1bHRzLmZhbWlseSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmZhbWlseSArPSAnLCAnICsgdGhpcy5kZWZhdWx0cy5mYW1pbHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS5mYW1pbHkgPSB0aGlzLmRlZmF1bHRzLmZhbWlseTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IGRyYXcuZm9udC50cmFuc2Zvcm07XG5cbiAgICAgICAgLy8gb3JpZ2luYWwgc2l6ZSAobm90IGN1cnJlbnRseSB1c2VkLCBidXQgdXNlZnVsIGZvciBkZWJ1Z2dpbmcpXG4gICAgICAgIHN0eWxlLnNpemUgPSBkcmF3LmZvbnQuc2l6ZSB8fCB0aGlzLmRlZmF1bHRzLnNpemU7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlZCBwaXhlbCBzaXplXG4gICAgICAgIHN0eWxlLnN1cGVyc2FtcGxlID0gZHJhdy5zdXBlcnNhbXBsZV90ZXh0ID8gMS41IDogMTsgLy8gb3B0aW9uYWxseSByZW5kZXIgdGV4dCBhdCAxNTAlIHRvIGltcHJvdmUgY2xhcml0eVxuICAgICAgICBzdHlsZS5weF9zaXplID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuZm9udC5weF9zaXplLCBjb250ZXh0KSAqIHN0eWxlLnN1cGVyc2FtcGxlO1xuXG4gICAgICAgIC8vIFVzZSBzdHJva2UgaWYgc3BlY2lmaWVkXG4gICAgICAgIGlmIChkcmF3LmZvbnQuc3Ryb2tlICYmIGRyYXcuZm9udC5zdHJva2UuY29sb3IpIHtcbiAgICAgICAgICAgIHN0eWxlLnN0cm9rZSA9IFV0aWxzLnRvQ1NTQ29sb3IoU3R5bGVQYXJzZXIuZXZhbENhY2hlZENvbG9yUHJvcGVydHkoZHJhdy5mb250LnN0cm9rZS5jb2xvciwgY29udGV4dCkgfHwgdGhpcy5kZWZhdWx0cy5zdHJva2UpO1xuICAgICAgICAgICAgc3R5bGUuc3Ryb2tlX3dpZHRoID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuZm9udC5zdHJva2Uud2lkdGgsIGNvbnRleHQpIHx8IHRoaXMuZGVmYXVsdHMuc3Ryb2tlX3dpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUuZm9udF9jc3MgPSB0aGlzLmZvbnRDU1Moc3R5bGUpO1xuXG4gICAgICAgIC8vIFdvcmQgd3JhcCBhbmQgdGV4dCBhbGlnbm1lbnRcbiAgICAgICAgLy8gTm90IGEgZm9udCBwcm9wZXJ0aWVzLCBidXQgYWZmZWN0IGF0bGFzIG9mIHVuaXF1ZSB0ZXh0IHRleHR1cmVzXG4gICAgICAgIGxldCB0ZXh0X3dyYXAgPSBkcmF3LnRleHRfd3JhcDsgLy8gdXNlIGV4cGxpY2l0bHkgc2V0IHZhbHVlXG5cbiAgICAgICAgaWYgKHRleHRfd3JhcCA9PSBudWxsICYmIEdlby5nZW9tZXRyeVR5cGUoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSAhPT0gJ2xpbmUnKSB7XG4gICAgICAgICAgICAvLyBwb2ludCBsYWJlbHMgKGZvciBwb2ludCBhbmQgcG9seWdvbiBmZWF0dXJlcykgaGF2ZSB3b3JkIHdyYXAgb24gdy9kZWZhdWx0IG1heCBsZW5ndGgsXG4gICAgICAgICAgICAvLyBsaW5lIGxhYmVscyBkZWZhdWx0IG9mZlxuICAgICAgICAgICAgdGV4dF93cmFwID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldHRpbmcgdG8gJ3RydWUnIGNhdXNlcyBkZWZhdWx0IHdyYXAgdmFsdWUgdG8gYmUgdXNlZFxuICAgICAgICBpZiAodGV4dF93cmFwID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0ZXh0X3dyYXAgPSB0aGlzLmRlZmF1bHRzLnRleHRfd3JhcDtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZS50ZXh0X3dyYXAgPSB0ZXh0X3dyYXA7XG5cbiAgICAgICAgLy8gbWF4X2xpbmVzIHNldHRpbmcgdG8gdHJ1bmNhdGUgdmVyeSBsb25nIGxhYmVscyB3aXRoIGFuIGVsbGlwc2lzXG4gICAgICAgIHN0eWxlLm1heF9saW5lcyA9IGRyYXcubWF4X2xpbmVzIHx8IHRoaXMuZGVmYXVsdHMubWF4X2xpbmVzO1xuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgQ1NTLXN0eWxlIGZvbnQgc3RyaW5nICh0byBzZXQgQ2FudmFzIGRyYXcgc3RhdGUpXG4gICAgZm9udENTUyAoeyBzdHlsZSwgd2VpZ2h0LCBweF9zaXplLCBmYW1pbHkgfSkge1xuICAgICAgICByZXR1cm4gW3N0eWxlLCB3ZWlnaHQsIHB4X3NpemUgKyAncHgnLCBmYW1pbHldXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geCkgLy8gcmVtb3ZlIG51bGwgcHJvcHNcbiAgICAgICAgICAgIC5qb2luKCcgJyk7XG4gICAgfVxuXG59O1xuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgQ29sbGlzaW9uIGZyb20gJy4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuXG5pbXBvcnQge21hdDQsIHZlYzN9IGZyb20gJy4vdXRpbHMvZ2wtbWF0cml4JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZSB7XG5cbiAgICAvKipcbiAgICAgICAgVGlsZVxuICAgICAgICBAY29uc3RydWN0b3JcbiAgICAgICAgUmVxdWlyZWQgcHJvcGVydGllczpcbiAgICAgICAgY29vcmRzOiBvYmplY3Qgd2l0aCB7eCwgeSwgen0gcHJvcGVydGllcyBpZGVudGlmeWluZyB0aWxlIGNvb3JkaW5hdGUgbG9jYXRpb25cbiAgICAgICAgd29ya2VyOiB3ZWIgd29ya2VyIHRvIGhhbmRsZSB0aWxlIGNvbnN0cnVjdGlvblxuICAgICovXG4gICAgY29uc3RydWN0b3IoeyBjb29yZHMsIHN0eWxlX3pvb20sIHNvdXJjZSwgd29ya2VyLCB2aWV3IH0pIHtcbiAgICAgICAgdGhpcy53b3JrZXIgPSB3b3JrZXI7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBudWxsO1xuXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb3h5X2ZvciA9IG51bGw7XG4gICAgICAgIHRoaXMucHJveHlfZGVwdGggPSAwO1xuICAgICAgICB0aGlzLnByb3hpZWRfYXMgPSBudWxsO1xuICAgICAgICB0aGlzLmZhZGVfaW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5idWlsdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IHt9O1xuXG4gICAgICAgIHRoaXMuY29vcmRzID0gVGlsZS5jb29yZGluYXRlV2l0aE1heFpvb20oY29vcmRzLCB0aGlzLnNvdXJjZS5tYXhfem9vbSk7XG4gICAgICAgIHRoaXMuc3R5bGVfem9vbSA9IHN0eWxlX3pvb207IC8vIHpvb20gbGV2ZWwgdG8gYmUgdXNlZCBmb3Igc3R5bGluZ1xuICAgICAgICB0aGlzLm92ZXJ6b29tID0gTWF0aC5tYXgodGhpcy5zdHlsZV96b29tIC0gdGhpcy5jb29yZHMueiwgMCk7IC8vIG51bWJlciBvZiBsZXZlbHMgb2Ygb3Zlcnpvb21pbmdcbiAgICAgICAgdGhpcy5vdmVyem9vbTIgPSBNYXRoLnBvdygyLCB0aGlzLm92ZXJ6b29tKTtcbiAgICAgICAgdGhpcy5rZXkgPSBUaWxlLmtleSh0aGlzLmNvb3JkcywgdGhpcy5zb3VyY2UsIHRoaXMuc3R5bGVfem9vbSk7XG4gICAgICAgIHRoaXMubWluID0gR2VvLm1ldGVyc0ZvclRpbGUodGhpcy5jb29yZHMpO1xuICAgICAgICB0aGlzLm1heCA9IEdlby5tZXRlcnNGb3JUaWxlKHt4OiB0aGlzLmNvb3Jkcy54ICsgMSwgeTogdGhpcy5jb29yZHMueSArIDEsIHo6IHRoaXMuY29vcmRzLnogfSksXG4gICAgICAgIHRoaXMuc3BhbiA9IHsgeDogKHRoaXMubWF4LnggLSB0aGlzLm1pbi54KSwgeTogKHRoaXMubWF4LnkgLSB0aGlzLm1pbi55KSB9O1xuICAgICAgICB0aGlzLmJvdW5kcyA9IHsgc3c6IHsgeDogdGhpcy5taW4ueCwgeTogdGhpcy5tYXgueSB9LCBuZTogeyB4OiB0aGlzLm1heC54LCB5OiB0aGlzLm1pbi55IH0gfTtcbiAgICAgICAgdGhpcy5jZW50ZXJfZGlzdCA9IDA7XG5cbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsID0gR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMuc3R5bGVfem9vbSk7XG4gICAgICAgIHRoaXMubWV0ZXJzX3Blcl9waXhlbF9zcSA9IHRoaXMubWV0ZXJzX3Blcl9waXhlbCAqIHRoaXMubWV0ZXJzX3Blcl9waXhlbDtcbiAgICAgICAgdGhpcy51bml0c19wZXJfcGl4ZWwgPSBHZW8udW5pdHNfcGVyX3BpeGVsIC8gdGhpcy5vdmVyem9vbTI7IC8vIGFkanVzdGVkIGZvciBvdmVyem9vbVxuICAgICAgICB0aGlzLnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbSA9IEdlby51bml0c1Blck1ldGVyKHRoaXMuY29vcmRzLnopICogdGhpcy5vdmVyem9vbTI7IC8vIGFkanVzdGVkIGZvciBvdmVyem9vbVxuXG4gICAgICAgIHRoaXMubWVzaGVzID0ge307IC8vIHJlbmRlcmFibGUgVkJPIG1lc2hlcyBrZXllZCBieSBzdHlsZVxuICAgICAgICB0aGlzLnRleHR1cmVzID0gW107IC8vIHRleHR1cmVzIHRoYXQgdGhlIHRpbGUgb3ducyAobGFiZWxzLCBldGMuKVxuICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzID0gW107IC8vIHRleHR1cmVzIHJldGFpbmVkIGJ5IHRoZSB0aWxlIGluIHRoZSBwcmV2aW91cyBidWlsZCBnZW5lcmF0aW9uXG4gICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzID0gW107IC8vIG1lc2hlcyB0aGF0IGhhdmUgYmVlbiBidWlsdCBzbyBmYXIgaW4gY3VycmVudCBidWlsZCBnZW5lcmF0aW9uXG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGlsZShzcGVjKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmQoYykge1xuICAgICAgICByZXR1cm4ge3g6IGMueCwgeTogYy55LCB6OiBjLnosIGtleTogVGlsZS5jb29yZEtleShjKX07XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkS2V5KHt4LCB5LCB6fSkge1xuICAgICAgICByZXR1cm4geCArICcvJyArIHkgKyAnLycgKyB6O1xuICAgIH1cblxuICAgIHN0YXRpYyBrZXkgKGNvb3Jkcywgc291cmNlLCBzdHlsZV96b29tKSB7XG4gICAgICAgIGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZVdpdGhNYXhab29tKGNvb3Jkcywgc291cmNlLm1heF96b29tKTtcbiAgICAgICAgaWYgKGNvb3Jkcy55IDwgMCB8fCBjb29yZHMueSA+PSAoMSA8PCBjb29yZHMueikgfHwgY29vcmRzLnogPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIGN1bGwgdGlsZXMgb3V0IG9mIHJhbmdlICh4IHdpbGwgd3JhcClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3NvdXJjZS5uYW1lLCBzdHlsZV96b29tLCBjb29yZHMueCwgY29vcmRzLnksIGNvb3Jkcy56XS5qb2luKCcvJyk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNvb3JkaW5hdGVBdFpvb20oe3gsIHksIHosIGtleX0sIHpvb20pIHtcbiAgICAgICAgaWYgKHogIT09IHpvb20pIHtcbiAgICAgICAgICAgIGxldCB6c2NhbGUgPSBNYXRoLnBvdygyLCB6IC0gem9vbSk7XG4gICAgICAgICAgICB4ID0gTWF0aC5mbG9vcih4IC8genNjYWxlKTtcbiAgICAgICAgICAgIHkgPSBNYXRoLmZsb29yKHkgLyB6c2NhbGUpO1xuICAgICAgICAgICAgeiA9IHpvb207XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGUuY29vcmQoe3gsIHksIHp9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmRpbmF0ZVdpdGhNYXhab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pIHtcbiAgICAgICAgaWYgKG1heF96b29tICE9PSB1bmRlZmluZWQgJiYgeiA+IG1heF96b29tKSB7XG4gICAgICAgICAgICByZXR1cm4gVGlsZS5jb29yZGluYXRlQXRab29tKHt4LCB5LCB6fSwgbWF4X3pvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkKHt4LCB5LCB6fSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNoaWxkcmVuRm9yQ29vcmRpbmF0ZSh7eCwgeSwgeiwga2V5fSkge1xuICAgICAgICBpZiAoIVRpbGUuY29vcmRfY2hpbGRyZW5ba2V5XSkge1xuICAgICAgICAgICAgeisrO1xuICAgICAgICAgICAgeCAqPSAyO1xuICAgICAgICAgICAgeSAqPSAyO1xuICAgICAgICAgICAgVGlsZS5jb29yZF9jaGlsZHJlbltrZXldID0gW1xuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHksICAgICAgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHksICAgICAgen0pLFxuICAgICAgICAgICAgICAgIFRpbGUuY29vcmQoe3gsIHk6IHkrMSwgen0pLCBUaWxlLmNvb3JkKHt4OiB4KzEsIHk6IHkrMSwgen0pXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWxlLmNvb3JkX2NoaWxkcmVuW2tleV07XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRGVzY2VuZGFudChwYXJlbnQsIGRlc2NlbmRhbnQpIHtcbiAgICAgICAgaWYgKGRlc2NlbmRhbnQueiA+IHBhcmVudC56KSB7XG4gICAgICAgICAgICBsZXQge3gsIHl9ID0gVGlsZS5jb29yZGluYXRlQXRab29tKGRlc2NlbmRhbnQsIHBhcmVudC56KTtcbiAgICAgICAgICAgIHJldHVybiAocGFyZW50LnggPT09IHggJiYgcGFyZW50LnkgPT09IHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGEgc2V0IG9mIHRpbGUgaW5zdGFuY2VzICh3aGljaCBhbHJlYWR5IGhhdmUgYSBkaXN0YW5jZSBmcm9tIGNlbnRlciB0aWxlIGNvbXB1dGVkKVxuICAgIHN0YXRpYyBzb3J0KHRpbGVzKSB7XG4gICAgICAgIHJldHVybiB0aWxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWQgPSBhLmNlbnRlcl9kaXN0O1xuICAgICAgICAgICAgbGV0IGJkID0gYi5jZW50ZXJfZGlzdDtcbiAgICAgICAgICAgIHJldHVybiAoYmQgPiBhZCA/IC0xIDogKGJkID09PSBhZCA/IDAgOiAxKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZyZWUgcmVzb3VyY2VzIG93bmVkIGJ5IHRpbGVcbiAgICBmcmVlUmVzb3VyY2VzICgpIHtcbiAgICAgICAgZm9yIChsZXQgbSBpbiB0aGlzLm1lc2hlcykge1xuICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzaGVzID0ge307XG5cbiAgICAgICAgdGhpcy50ZXh0dXJlcy5mb3JFYWNoKHQgPT4gVGV4dHVyZS5yZWxlYXNlKHQpKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMuZm9yRWFjaCh0ID0+IFRleHR1cmUucmVsZWFzZSh0KSk7XG4gICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMgPSBbXTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLndvcmtlck1lc3NhZ2UoJ3NlbGYucmVtb3ZlVGlsZScsIHRoaXMua2V5KTtcbiAgICAgICAgdGhpcy5mcmVlUmVzb3VyY2VzKCk7XG4gICAgICAgIHRoaXMud29ya2VyID0gbnVsbDtcbiAgICB9XG5cbiAgICBidWlsZEFzTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogdGhpcy5rZXksXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLm5hbWUsXG4gICAgICAgICAgICBjb29yZHM6IHRoaXMuY29vcmRzLFxuICAgICAgICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgICAgICAgIG1heDogdGhpcy5tYXgsXG4gICAgICAgICAgICB1bml0c19wZXJfcGl4ZWw6IHRoaXMudW5pdHNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGhpcy5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgbWV0ZXJzX3Blcl9waXhlbF9zcTogdGhpcy5tZXRlcnNfcGVyX3BpeGVsX3NxLFxuICAgICAgICAgICAgdW5pdHNfcGVyX21ldGVyX292ZXJ6b29tOiB0aGlzLnVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbSxcbiAgICAgICAgICAgIHN0eWxlX3pvb206IHRoaXMuc3R5bGVfem9vbSxcbiAgICAgICAgICAgIG92ZXJ6b29tOiB0aGlzLm92ZXJ6b29tLFxuICAgICAgICAgICAgb3Zlcnpvb20yOiB0aGlzLm92ZXJ6b29tMixcbiAgICAgICAgICAgIGdlbmVyYXRpb246IHRoaXMuZ2VuZXJhdGlvbixcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLmRlYnVnXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgd29ya2VyTWVzc2FnZSAoLi4ubWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VyLCAuLi5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICBidWlsZChnZW5lcmF0aW9uLCB7IGZhZGVfaW4gPSB0cnVlIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuICAgICAgICB0aGlzLmZhZGVfaW4gPSBmYWRlX2luO1xuICAgICAgICBpZiAoIXRoaXMubG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5idWlsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLndvcmtlck1lc3NhZ2UoJ3NlbGYuYnVpbGRUaWxlJywgeyB0aWxlOiB0aGlzLmJ1aWxkQXNNZXNzYWdlKCkgfSkuY2F0Y2goZSA9PiB7IHRocm93IGU7IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICBDYWxsZWQgb24gd29ya2VyIHRvIGNhbmNlbCBsb2FkaW5nXG4gICAgICAgIFN0YXRpYyBtZXRob2QgYmVjYXVzZSB0aGUgd29ya2VyIG9ubHkgaGFzIG9iamVjdCByZXByZXNlbnRhdGlvbnMgb2YgdGlsZSBkYXRhLCB0aGVyZSBpcyBub1xuICAgICAgICB0aWxlIGluc3RhbmNlIGNyZWF0ZWQgeWV0LlxuICAgICovXG4gICAgc3RhdGljIGNhbmNlbCh0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aWxlLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aWxlLnNvdXJjZV9kYXRhICYmIHRpbGUuc291cmNlX2RhdGEucmVxdWVzdF9pZCkge1xuICAgICAgICAgICAgICAgIFV0aWxzLmNhbmNlbFJlcXVlc3QodGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0X2lkKTsgLy8gY2FuY2VsIHBlbmRpbmcgdGlsZSBuZXR3b3JrIHJlcXVlc3RcbiAgICAgICAgICAgICAgICB0aWxlLnNvdXJjZV9kYXRhLnJlcXVlc3RfaWQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBnZW9tZXRyeSBmb3IgdGlsZSAtIGNhbGxlZCBieSB3ZWIgd29ya2VyXG4gICAgLy8gUmV0dXJucyBhIHNldCBvZiB0aWxlIGtleXMgdGhhdCBzaG91bGQgYmUgc2VudCB0byB0aGUgbWFpbiB0aHJlYWQgKHNvIHRoYXQgd2UgY2FuIG1pbmltaXplIGRhdGEgZXhjaGFuZ2UgYmV0d2VlbiB3b3JrZXIgYW5kIG1haW4gdGhyZWFkKVxuICAgIHN0YXRpYyBidWlsZEdlb21ldHJ5ICh0aWxlLCB7IHNjZW5lX2lkLCBsYXllcnMsIHN0eWxlcywgZ2xvYmFsIH0pIHtcbiAgICAgICAgdGlsZS5kZWJ1Zy5yZW5kZXJpbmcgPSArbmV3IERhdGUoKTtcbiAgICAgICAgdGlsZS5kZWJ1Zy5mZWF0dXJlcyA9IDA7XG5cbiAgICAgICAgbGV0IGRhdGEgPSB0aWxlLnNvdXJjZV9kYXRhO1xuXG4gICAgICAgIENvbGxpc2lvbi5zdGFydFRpbGUodGlsZS5rZXkpO1xuXG4gICAgICAgIC8vIFByb2Nlc3MgZWFjaCB0b3AtbGV2ZWwgbGF5ZXJcbiAgICAgICAgZm9yIChsZXQgbGF5ZXJfbmFtZSBpbiBsYXllcnMpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IGxheWVyc1tsYXllcl9uYW1lXTtcbiAgICAgICAgICAgIC8vIFNraXAgbGF5ZXJzIHdpdGggbm8gZGF0YSBzb3VyY2UgZGVmaW5lZFxuICAgICAgICAgICAgaWYgKCFsYXllciB8fCAhbGF5ZXIuY29uZmlnLmRhdGEpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgTGF5ZXIgJHtsYXllcl9uYW1lfSB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2VvbWV0cnkgZGF0YSBzb3VyY2UgYW5kIHdpbGwgbm90IGJlIHJlbmRlcmVkLmApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTb3VyY2UgbmFtZXMgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgIGlmIChsYXllci5jb25maWcuZGF0YS5zb3VyY2UgIT09IHRpbGUuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCBkYXRhIGZvciBvbmUgb3IgbW9yZSBsYXllcnMgZnJvbSBzb3VyY2VcbiAgICAgICAgICAgIGxldCBzb3VyY2VfbGF5ZXJzID0gVGlsZS5nZXREYXRhRm9yU291cmNlKGRhdGEsIGxheWVyLmNvbmZpZy5kYXRhLCBsYXllcl9uYW1lKTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIGZlYXR1cmVzIGluIGxheWVyXG4gICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzb3VyY2VfbGF5ZXJzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZV9sYXllciA9IHNvdXJjZV9sYXllcnNbc107XG4gICAgICAgICAgICAgICAgbGV0IGdlb20gPSBzb3VyY2VfbGF5ZXIuZ2VvbTtcbiAgICAgICAgICAgICAgICBpZiAoIWdlb20pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZiA9IDA7IGYgPCBnZW9tLmZlYXR1cmVzLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmZWF0dXJlID0gZ2VvbS5mZWF0dXJlc1tmXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgZmVhdHVyZXMgdy9vIGdlb21ldHJ5ICh2YWxpZCBHZW9KU09OKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRleHQgPSBTdHlsZVBhcnNlci5nZXRGZWF0dXJlUGFyc2VDb250ZXh0KGZlYXR1cmUsIHRpbGUsIGdsb2JhbCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud2luZGluZyA9IHRpbGUuZGVmYXVsdF93aW5kaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNvdXJjZSA9IHRpbGUuc291cmNlOyAgICAgICAgLy8gYWRkIGRhdGEgc291cmNlIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5sYXllciA9IHNvdXJjZV9sYXllci5sYXllcjsgIC8vIGFkZCBkYXRhIHNvdXJjZSBsYXllciBuYW1lXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGRyYXcgZ3JvdXBzIGZvciB0aGlzIGZlYXR1cmVcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRyYXdfZ3JvdXBzID0gbGF5ZXIuYnVpbGREcmF3R3JvdXBzKGNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRyYXdfZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbmRlciBkcmF3IGdyb3Vwc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBncm91cF9uYW1lIGluIGRyYXdfZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXAgPSBkcmF3X2dyb3Vwc1tncm91cF9uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JvdXAudmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdG8gc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZV9uYW1lID0gZ3JvdXAuc3R5bGUgfHwgZ3JvdXBfbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHN0eWxlc1tzdHlsZV9uYW1lXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTdHlsZSAnJHtzdHlsZV9uYW1lfScgbm90IGZvdW5kLCBza2lwcGluZyBsYXllciAnJHtsYXllcl9uYW1lfSc6YCwgZ3JvdXAsIGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxheWVycyA9IGdyb3VwLmxheWVyczsgIC8vIGFkZCBtYXRjaGluZyBkcmF3IGxheWVyc1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5hZGRGZWF0dXJlKGZlYXR1cmUsIGdyb3VwLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRpbGUuZGVidWcuZmVhdHVyZXMrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGlsZS5kZWJ1Zy5yZW5kZXJpbmcgPSArbmV3IERhdGUoKSAtIHRpbGUuZGVidWcucmVuZGVyaW5nO1xuXG4gICAgICAgIC8vIFNlbmQgc3R5bGVzIGJhY2sgdG8gbWFpbiB0aHJlYWQgYXMgdGhleSBmaW5pc2ggYnVpbGRpbmcsIGluIHR3byBncm91cHM6IGNvbGxpc2lvbiB2cy4gbm9uLWNvbGxpc2lvblxuICAgICAgICBsZXQgdGlsZV9zdHlsZXMgPSB0aGlzLnN0eWxlc0ZvclRpbGUodGlsZS5rZXksIHN0eWxlcykubWFwKHMgPT4gc3R5bGVzW3NdKTtcbiAgICAgICAgVGlsZS5zZW5kU3R5bGVHcm91cHModGlsZSwgdGlsZV9zdHlsZXMsIHsgc2NlbmVfaWQgfSwgc3R5bGUgPT4gc3R5bGUuY29sbGlzaW9uID8gJ2NvbGxpc2lvbicgOiAnbm9uLWNvbGxpc2lvbicpO1xuICAgICAgICAvLyBUaWxlLnNlbmRTdHlsZUdyb3Vwcyh0aWxlLCB0aWxlX3N0eWxlcywgeyBzY2VuZV9pZCB9LCBzdHlsZSA9PiBzdHlsZS5uYW1lKTsgLy8gY2FsbCBmb3IgZWFjaCBzdHlsZVxuICAgICAgICAvLyBUaWxlLnNlbmRTdHlsZUdyb3Vwcyh0aWxlLCB0aWxlX3N0eWxlcywgeyBzY2VuZV9pZCB9LCBzdHlsZSA9PiAnc3R5bGVzJyk7IC8vIGFsbCBzdHlsZXMgaW4gc2luZ2xlIGNhbGwgKHByZXZpb3VzIGJlaGF2aW9yKVxuICAgIH1cblxuICAgIHN0YXRpYyBzdHlsZXNGb3JUaWxlICh0aWxlX2tleSwgc3R5bGVzKSB7XG4gICAgICAgIGxldCB0aWxlX3N0eWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBzIGluIHN0eWxlcykge1xuICAgICAgICAgICAgaWYgKHN0eWxlc1tzXS5oYXNEYXRhRm9yVGlsZSh0aWxlX2tleSkpIHtcbiAgICAgICAgICAgICAgICB0aWxlX3N0eWxlcy5wdXNoKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aWxlX3N0eWxlcztcbiAgICB9XG5cbiAgICAvLyBTZW5kIGdyb3VwcyBvZiBzdHlsZXMgYmFjayB0byBtYWluIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgKGFzIHRoZXkgZmluaXNoIGJ1aWxkaW5nKSxcbiAgICAvLyBncm91cGVkIGJ5IHRoZSBwcm92aWRlZCBmdW5jdGlvblxuICAgIHN0YXRpYyBzZW5kU3R5bGVHcm91cHModGlsZSwgc3R5bGVzLCB7IHNjZW5lX2lkIH0sIGdyb3VwX2J5KSB7XG4gICAgICAgIC8vIEdyb3VwIHN0eWxlc1xuICAgICAgICBsZXQgZ3JvdXBzID0ge307XG4gICAgICAgIHN0eWxlcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgbGV0IGdyb3VwX25hbWUgPSBncm91cF9ieShzKTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IGdyb3Vwc1tncm91cF9uYW1lXSB8fCBbXTtcbiAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXS5wdXNoKHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJvZ3Jlc3MgPSB7IHN0YXJ0OiB0cnVlIH07XG4gICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBncm91cF9uYW1lIGluIGdyb3Vwcykge1xuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGdyb3Vwc1tncm91cF9uYW1lXTtcblxuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGdyb3VwLm1hcChzdHlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZS5lbmREYXRhKHRpbGUpLnRoZW4oc3R5bGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUubWVzaF9kYXRhW3N0eWxlLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogc3R5bGVfZGF0YS52ZXJ0ZXhfZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzOiBzdHlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHN0eWxlX2RhdGEudW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVzOiBzdHlsZV9kYXRhLnRleHR1cmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYEZpbmlzaGVkIHN0eWxlIGdyb3VwICcke2dyb3VwX25hbWV9JyBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIGdyb3VwIGFuZCBjaGVjayBpZiBhbGwgZ3JvdXBzIGZpbmlzaGVkXG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tncm91cF9uYW1lXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXBzKS5ldmVyeShnID0+IGdyb3Vwc1tnXS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgbWVzaGVzIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGBUaWxlTWFuYWdlcl8ke3NjZW5lX2lkfS5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKHsgdGlsZTogVGlsZS5zbGljZSh0aWxlLCBbJ21lc2hfZGF0YSddKSwgcHJvZ3Jlc3MgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc3RhcnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm1lc2hfZGF0YSA9IHt9OyAvLyByZXNldCBzbyBlYWNoIGdyb3VwIHNlbmRzIHNlcGFyYXRlIHNldCBvZiBzdHlsZSBtZXNoZXNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90aGluZyB0byBidWlsZCwgcmV0dXJuIGVtcHR5IHRpbGUgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShcbiAgICAgICAgICAgICAgICBgVGlsZU1hbmFnZXJfJHtzY2VuZV9pZH0uYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkYCxcbiAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMoeyB0aWxlOiBUaWxlLnNsaWNlKHRpbGUpLCBwcm9ncmVzczogeyBzdGFydDogdHJ1ZSwgZG9uZTogdHJ1ZSB9IH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgQ29sbGlzaW9uLnJlc2V0VGlsZSh0aWxlLmtleSk7IC8vIGNsZWFyIGNvbGxpc2lvbiBpZiB3ZSdyZSBkb25lIHdpdGggdGhlIHRpbGVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAgICBSZXRyaWV2ZXMgZ2VvbWV0cnkgZnJvbSBhIHRpbGUgYWNjb3JkaW5nIHRvIGEgZGF0YSBzb3VyY2UgZGVmaW5pdGlvblxuICAgICAgICBSZXR1cm5zIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aDpcbiAgICAgICAgICAgIGxheWVyOiBzb3VyY2UgbGF5ZXIgbmFtZVxuICAgICAgICAgICAgZ2VvbTogR2VvSlNPTiBGZWF0dXJlQ29sbGVjdGlvblxuICAgICovXG4gICAgc3RhdGljIGdldERhdGFGb3JTb3VyY2UgKHNvdXJjZV9kYXRhLCBzb3VyY2VfY29uZmlnLCBkZWZhdWx0X2xheWVyID0gbnVsbCkge1xuICAgICAgICB2YXIgbGF5ZXJzID0gW107XG5cbiAgICAgICAgaWYgKHNvdXJjZV9jb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHNvdXJjZSBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGlmICghc291cmNlX2NvbmZpZy5sYXllciAmJiBzb3VyY2VfZGF0YS5sYXllcnMuX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGdlb206IHNvdXJjZV9kYXRhLmxheWVycy5fZGVmYXVsdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gbGF5ZXIgc3BlY2lmaWVkLCBhbmQgYSBkZWZhdWx0IHJlcXVlc3RlZCBsYXllciBleGlzdHNcbiAgICAgICAgICAgIGVsc2UgaWYgKCFzb3VyY2VfY29uZmlnLmxheWVyICYmIGRlZmF1bHRfbGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyOiBkZWZhdWx0X2xheWVyLFxuICAgICAgICAgICAgICAgICAgICBnZW9tOiBzb3VyY2VfZGF0YS5sYXllcnNbZGVmYXVsdF9sYXllcl1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIGEgbGF5ZXIgaXMgc3BlY2lmaWVkIGJ5IG5hbWUsIHVzZSBpdFxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZV9jb25maWcubGF5ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsYXllcjogc291cmNlX2NvbmZpZy5sYXllcixcbiAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW3NvdXJjZV9jb25maWcubGF5ZXJdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBtdWx0aXBsZSBsYXllcnMgYXJlIHNwZWNpZmllZCBieSBuYW1lLCBjb21iaW5lIHRoZW1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlX2NvbmZpZy5sYXllcikpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfY29uZmlnLmxheWVyLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXSAmJiBzb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdLmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzW2xheWVyXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGNvbXBsZXRlcyBwcm9jZXNzaW5nXG4gICAgICAgZm9yIGEgc2luZ2xlIHRpbGUuXG4gICAgKi9cbiAgICBidWlsZE1lc2hlcyhzdHlsZXMsIHByb2dyZXNzKSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWJ1Z1xuICAgICAgICB0aGlzLmRlYnVnLmdlb21ldHJpZXMgPSAwO1xuICAgICAgICB0aGlzLmRlYnVnLmJ1ZmZlcl9zaXplID0gMDtcblxuICAgICAgICAvLyBDcmVhdGUgVkJPc1xuICAgICAgICBsZXQgbWVzaGVzID0ge30sIHRleHR1cmVzID0gW107IC8vIG5ldyBkYXRhIHRvIGJlIGFkZGVkIHRvIHRpbGVcbiAgICAgICAgbGV0IG1lc2hfZGF0YSA9IHRoaXMubWVzaF9kYXRhO1xuICAgICAgICBpZiAobWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzIGluIG1lc2hfZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5idWZmZXJfc2l6ZSArPSBtZXNoX2RhdGFbc10udmVydGV4X2RhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuYnVmZmVyX3NpemUgKz0gbWVzaF9kYXRhW3NdLnZlcnRleF9lbGVtZW50cy5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3R5bGVzW3NdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3dhcm4nLCBgQ291bGQgbm90IGNyZWF0ZSBtZXNoIGJlY2F1c2Ugc3R5bGUgJyR7c30nIG5vdCBmb3VuZCwgZm9yIHRpbGUgJHt0aGlzLmtleX0sIGFib3J0aW5nIHRpbGVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc2hlc1tzXSA9IHN0eWxlc1tzXS5tYWtlTWVzaChtZXNoX2RhdGFbc10udmVydGV4X2RhdGEsIG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZWxlbWVudHMsIG1lc2hfZGF0YVtzXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcuZ2VvbWV0cmllcyArPSBtZXNoZXNbc10uZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXNzaWduIHRleHR1cmUgb3duZXJzaGlwIHRvIHRpbGVzXG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgdmFsaWQgZm9yIGEgc2luZ2xlIHRleHR1cmUgdG8gYmUgcmVmZXJlbmNlZCBmcm9tIG11bHRpcGxlIHN0eWxlc1xuICAgICAgICAgICAgICAgIC8vIChlLmcuIHNhbWUgcmFzdGVyIHRleHR1cmUgYXR0YWNoZWQgdG8gbXVsdGlwbGUgc291cmNlcykuIFRoaXMgbWVhbnMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIG1heSBiZSBhZGRlZCB0byB0aGUgdGlsZSdzIHRleHR1cmUgbGlzdCBtb3JlIHRoYW4gb25jZSwgd2hpY2ggZW5zdXJlc1xuICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgaXMgcHJvcGVybHkgcmVsZWFzZWQgKHRvIG1hdGNoIGl0cyByZXRhaW4gY291bnQpLlxuICAgICAgICAgICAgICAgIGlmIChtZXNoX2RhdGFbc10udGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXMucHVzaCguLi5tZXNoX2RhdGFbc10udGV4dHVyZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5tZXNoX2RhdGE7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0cmFja2luZyBmb3IgdGhpcyB0aWxlIGdlbmVyYXRpb25cbiAgICAgICAgaWYgKHByb2dyZXNzLnN0YXJ0KSB7XG4gICAgICAgICAgICB0aGlzLm5ld19tZXNoX3N0eWxlcyA9IFtdOyAvLyBrZWVwIHRyYWNrIG9mIHdoaWNoIG1lc2hlcyB3ZXJlIGJ1aWx0IGFzIHBhcnQgb2YgY3VycmVudCBnZW5lcmF0aW9uXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzID0gWy4uLnRoaXMudGV4dHVyZXNdOyAvLyBjb3B5IG9sZCBsaXN0IG9mIHRleHR1cmVzXG4gICAgICAgICAgICB0aGlzLnRleHR1cmVzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXcgbWVzaGVzXG4gICAgICAgIGZvciAobGV0IG0gaW4gbWVzaGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNoZXNbbV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc2hlc1ttXS5kZXN0cm95KCk7IC8vIGZyZWUgb2xkIG1lc2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWVzaGVzW21dID0gbWVzaGVzW21dOyAvLyBzZXQgbmV3IG1lc2hcbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzLnB1c2gobSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXcgdGV4dHVyZXNcbiAgICAgICAgdGhpcy50ZXh0dXJlcy5wdXNoKC4uLnRleHR1cmVzKTtcblxuICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgLy8gUmVsZWFzZSB1bi1yZXBsYWNlZCBtZXNoZXMgKGV4aXN0aW5nIGluIHByZXZpb3VzIGdlbmVyYXRpb24sIGJ1dCB3ZXJlbid0IGJ1aWx0IGZvciB0aGlzIG9uZSlcbiAgICAgICAgICAgIGZvciAobGV0IG0gaW4gdGhpcy5tZXNoZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXdfbWVzaF9zdHlsZXMuaW5kZXhPZihtKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0uZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzID0gW107XG5cbiAgICAgICAgICAgIC8vIFJlbGVhc2Ugb2xkIHRleHR1cmVzXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzLmZvckVhY2godCA9PiBUZXh0dXJlLnJlbGVhc2UodCkpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c190ZXh0dXJlcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmRlYnVnLmdlb21fcmF0aW8gPSAodGhpcy5kZWJ1Zy5nZW9tZXRyaWVzIC8gdGhpcy5kZWJ1Zy5mZWF0dXJlcykudG9GaXhlZCgxKTtcbiAgICAgICAgICAgIHRoaXMucHJpbnREZWJ1ZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgY29tcGxldGVzIHByb2Nlc3NpbmcsIGJ1dCB0aWxlIGhhcyBzaW5jZSBiZWVuIGRpc2NhcmRlZFxuICAgICAgICBGcmVlcyByZXNvdXJjZXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIHRpbGUgb2JqZWN0LlxuICAgICAgICBTdGF0aWMgbWV0aG9kIGJlY2F1c2UgdGhlIHRpbGUgb2JqZWN0IG5vIGxvbmdlciBleGlzdHMgKHRoZSB0aWxlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdvcmtlciBpcyBwYXNzZWQgaW5zdGVhZCkuXG4gICAgKi9cbiAgICBzdGF0aWMgYWJvcnRCdWlsZCAodGlsZSkge1xuICAgICAgICAvLyBSZWxlYXNlcyBtZXNoZXNcbiAgICAgICAgaWYgKHRpbGUubWVzaF9kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzIGluIHRpbGUubWVzaF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHR1cmVzID0gdGlsZS5tZXNoX2RhdGFbc10udGV4dHVyZXM7XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmVzLmZvckVhY2godCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZSA9IFRleHR1cmUudGV4dHVyZXNbdF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgcmVsZWFzaW5nIHRleHR1cmUgJHt0fSBmb3IgdGlsZSAke3RpbGUua2V5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmUucmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcmVsYXRpdmUgdG8gdmlld1xuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIGxldCBjb29yZHMgPSB0aGlzLmNvb3JkcztcbiAgICAgICAgaWYgKGNvb3Jkcy56ICE9PSB0aGlzLnZpZXcuY2VudGVyLnRpbGUueikge1xuICAgICAgICAgICAgY29vcmRzID0gVGlsZS5jb29yZGluYXRlQXRab29tKGNvb3JkcywgdGhpcy52aWV3LmNlbnRlci50aWxlLnopO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2VudGVyX2Rpc3QgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGNvb3Jkcy54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gY29vcmRzLnkpO1xuICAgIH1cblxuICAgIC8vIFNldCBhcyBhIHByb3h5IHRpbGUgZm9yIGFub3RoZXIgdGlsZVxuICAgIHNldFByb3h5Rm9yICh0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IgPSB0aGlzLnByb3h5X2ZvciB8fCBbXTtcbiAgICAgICAgICAgIHRoaXMucHJveHlfZm9yLnB1c2godGlsZSk7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2RlcHRoID0gMTsgLy8gZHJhdyBwcm94aWVzIGEgaGFsZi1sYXllciBiYWNrIChvcmRlciBpcyBzY2FsZWQgMnggdG8gYXZvaWQgaW50ZWdlciB0cnVuY2F0aW9uKVxuICAgICAgICAgICAgdGlsZS5wcm94aWVkX2FzID0gKHRpbGUuc3R5bGVfem9vbSA+IHRoaXMuc3R5bGVfem9vbSA/ICdjaGlsZCcgOiAncGFyZW50Jyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9kZXB0aCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm94eSB0aWxlcyBvbmx5IG5lZWQgdG8gcmVuZGVyIGEgc3BlY2lmaWMgc3R5bGUgaWYgYW55IG9mIHRoZSB0aWxlcyB0aGV5IGFyZSBwcm94eWluZyAqZm9yKlxuICAgIC8vIGhhdmVuJ3QgZmluaXNoZWQgbG9hZGluZyB0aGF0IHN0eWxlIHlldC4gSWYgYWxsIHByb3hpZWQgdGlsZXMgKmhhdmUqIGRhdGEgZm9yIHRoYXQgc3R5bGUsIHRoZW4gaXQnc1xuICAgIC8vIHNhZmUgdG8gaGlkZSB0aGUgcHJveHkgdGlsZSdzIHZlcnNpb24uXG4gICAgc2hvdWxkUHJveHlGb3JTdHlsZSAoc3R5bGUpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnByb3h5X2ZvciB8fCB0aGlzLnByb3h5X2Zvci5zb21lKHQgPT4gdC5tZXNoZXNbc3R5bGVdID09IG51bGwpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtb2RlbCBtYXRyaXggYW5kIHRpbGUgdW5pZm9ybXNcbiAgICBzZXR1cFByb2dyYW0gKHsgbW9kZWwsIG1vZGVsMzIgfSwgcHJvZ3JhbSkge1xuICAgICAgICAvLyBUaWxlIG9yaWdpblxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzRmdicsICd1X3RpbGVfb3JpZ2luJywgW3RoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMuc3R5bGVfem9vbSwgdGhpcy5jb29yZHMuel0pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfdGlsZV9wcm94eV9kZXB0aCcsIHRoaXMucHJveHlfZGVwdGgpO1xuXG4gICAgICAgIC8vIE1vZGVsIC0gdHJhbnNmb3JtIHRpbGUgc3BhY2UgaW50byB3b3JsZCBzcGFjZSAobWV0ZXJzLCBhYnNvbHV0ZSBtZXJjYXRvciBwb3NpdGlvbilcbiAgICAgICAgbWF0NC5pZGVudGl0eShtb2RlbCk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG1vZGVsLCBtb2RlbCwgdmVjMy5mcm9tVmFsdWVzKHRoaXMubWluLngsIHRoaXMubWluLnksIDApKTtcbiAgICAgICAgbWF0NC5zY2FsZShtb2RlbCwgbW9kZWwsIHZlYzMuZnJvbVZhbHVlcyh0aGlzLnNwYW4ueCAvIEdlby50aWxlX3NjYWxlLCAtMSAqIHRoaXMuc3Bhbi55IC8gR2VvLnRpbGVfc2NhbGUsIDEpKTsgLy8gc2NhbGUgdGlsZSBsb2NhbCBjb29yZHMgdG8gbWV0ZXJzXG4gICAgICAgIG1hdDQuY29weShtb2RlbDMyLCBtb2RlbCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfbW9kZWwnLCBtb2RlbDMyKTtcblxuICAgICAgICAvLyBGYWRlIGluIGxhYmVscyBhY2NvcmRpbmcgdG8gcHJveHkgc3RhdHVzLCBhdm9pZGluZyBcImZsaWNrZXJpbmdcIiB3aGVyZVxuICAgICAgICAvLyBsYWJlbHMgcXVpY2tseSBnbyBmcm9tIGludmlzaWJsZSBiYWNrIHRvIHZpc2libGVcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxaScsICd1X3RpbGVfZmFkZV9pbicsIHRoaXMuZmFkZV9pbiAmJiB0aGlzLnByb3hpZWRfYXMgIT09ICdjaGlsZCcpO1xuICAgIH1cblxuICAgIC8vIFNsaWNlIGEgc3Vic2V0IG9mIGtleXMgb3V0IG9mIGEgdGlsZVxuICAgIC8vIEluY2x1ZGVzIGEgbWluaW11bSBzZXQgb2YgcHJlLWRlZmluZWQga2V5cyBmb3IgbG9hZCBzdGF0ZSwgZGVidWcuIGV0Yy5cbiAgICAvLyBXZSB1c2UgdGhpcyB0byBzZW5kIGEgc3Vic2V0IG9mIHRoZSB0aWxlIGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkLCB0byBtaW5pbWl6ZSB1bm5lY2Vzc2FyeSBkYXRhIHRyYW5zZmVyXG4gICAgLy8gKGUuZy4gdmVyeSBsYXJnZSBpdGVtcyBsaWtlIGZlYXR1cmUgZ2VvbWV0cnkgYXJlIG5vdCBuZWVkZWQgb24gdGhlIG1haW4gdGhyZWFkKVxuICAgIHN0YXRpYyBzbGljZSAodGlsZSwga2V5cykge1xuICAgICAgICBsZXQga2VlcCA9IFtcbiAgICAgICAgICAgICdrZXknLFxuICAgICAgICAgICAgJ2xvYWRpbmcnLFxuICAgICAgICAgICAgJ2xvYWRlZCcsXG4gICAgICAgICAgICAnZ2VuZXJhdGlvbicsXG4gICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgJ2RlYnVnJ1xuICAgICAgICBdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgICAgICAgICAga2VlcC5wdXNoKC4uLmtleXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIHRpbGUgc3Vic2V0XG4gICAgICAgIHZhciB0aWxlX3N1YnNldCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBrPTA7IGsgPCBrZWVwLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBrZWVwW2tdO1xuICAgICAgICAgICAgdGlsZV9zdWJzZXRba2V5XSA9IHRpbGVba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aWxlX3N1YnNldDtcbiAgICB9XG5cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb3RoZXIpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdrZXknKSB7XG4gICAgICAgICAgICAgICAgdGhpc1trZXldID0gb3RoZXJba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcmludERlYnVnICgpIHtcbiAgICAgICAgbG9nKCdkZWJ1ZycsIGBUaWxlOiBkZWJ1ZyBmb3IgJHt0aGlzLmtleX06IFsgICR7SlNPTi5zdHJpbmdpZnkodGhpcy5kZWJ1Zyl9IF1gKTtcbiAgICB9XG5cbn1cblxuVGlsZS5jb29yZF9jaGlsZHJlbiA9IHt9OyAvLyBvbmx5IGFsbG9jYXRlIGNoaWxkcmVuIGNvb3JkaW5hdGVzIG9uY2UgcGVyIGNvb3JkaW5hdGVcbiIsImltcG9ydCBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgVGlsZVB5cmFtaWQgZnJvbSAnLi90aWxlX3B5cmFtaWQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yKHsgc2NlbmUsIHZpZXcgfSkge1xuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMudGlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5weXJhbWlkID0gbmV3IFRpbGVQeXJhbWlkKCk7XG4gICAgICAgIHRoaXMudmlzaWJsZV9jb29yZHMgPSB7fTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzID0gW107XG4gICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0gW107XG5cbiAgICAgICAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHRoaXMgb2JqZWN0IHRvIGJlIGNhbGxlZCBmcm9tIHdvcmtlciB0aHJlYWRzXG4gICAgICAgIHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0ID0gWydUaWxlTWFuYWdlcicsIHRoaXMuc2NlbmUuaWRdLmpvaW4oJ18nKTtcbiAgICAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCwgdGhpcyk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHRpbGUuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLnB5cmFtaWQgPSBudWxsO1xuICAgICAgICB0aGlzLnZpc2libGVfY29vcmRzID0ge307XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3JkcyA9IFtdO1xuICAgICAgICB0aGlzLnNjZW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3ID0gbnVsbDtcbiAgICB9XG5cbiAgICBrZWVwVGlsZSh0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZXNbdGlsZS5rZXldID0gdGlsZTtcbiAgICAgICAgdGhpcy5weXJhbWlkLmFkZFRpbGUodGlsZSk7XG4gICAgfVxuXG4gICAgaGFzVGlsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZXNba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZvcmdldFRpbGUoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc1RpbGUoa2V5KSkge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgICAgICB0aGlzLnB5cmFtaWQucmVtb3ZlVGlsZSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgIHRoaXMudGlsZUJ1aWxkU3RvcChrZXkpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhIHNpbmdsZSB0aWxlXG4gICAgcmVtb3ZlVGlsZShrZXkpIHtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0aWxlIHVubG9hZCBmb3IgJHtrZXl9YCk7XG5cbiAgICAgICAgdmFyIHRpbGUgPSB0aGlzLnRpbGVzW2tleV07XG5cbiAgICAgICAgaWYgKHRpbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGlsZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcmdldFRpbGUodGlsZS5rZXkpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG5cbiAgICAvLyBSdW4gYSBmdW5jdGlvbiBvbiBlYWNoIHRpbGVcbiAgICBmb3JFYWNoVGlsZShmdW5jKSB7XG4gICAgICAgIGZvciAobGV0IHQgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgZnVuYyh0aGlzLnRpbGVzW3RdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IHBhc3MgYSBmaWx0ZXIgY29uZGl0aW9uXG4gICAgcmVtb3ZlVGlsZXMoZmlsdGVyKSB7XG4gICAgICAgIGxldCByZW1vdmVfdGlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNbdF07XG4gICAgICAgICAgICBpZiAoZmlsdGVyKHRpbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlX3RpbGVzLnB1c2godCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgcmVtb3ZlX3RpbGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gcmVtb3ZlX3RpbGVzW3JdO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaWxlKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVUaWxlc0ZvclZpZXcoKSB7XG4gICAgICAgIC8vIEZpbmQgdmlzaWJsZSB0aWxlcyBhbmQgbG9hZCBuZXcgb25lc1xuICAgICAgICBsZXQgcHJldl9jb29yZHMgPSBPYmplY3Qua2V5cyh0aGlzLnZpc2libGVfY29vcmRzKTtcbiAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3JkcyA9IHt9O1xuICAgICAgICBsZXQgdGlsZV9jb29yZHMgPSB0aGlzLnZpZXcuZmluZFZpc2libGVUaWxlQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgdGlsZV9jb29yZHMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IHRpbGVfY29vcmRzW2NdO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZUNvb3JkaW5hdGUoY29vcmRzKTtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZV9jb29yZHNbY29vcmRzLmtleV0gPSBjb29yZHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB2aXNpYmxlIGNvb3JkcyBjaGFuZ2VkXG4gICAgICAgIC8vIFRPRE86IG1vdmUgdG8gYSBuZXcgdmlldyBtYW5hZ2VyIG9iamVjdFxuICAgICAgICBsZXQgbmV3X2Nvb3JkcyA9IE9iamVjdC5rZXlzKHRoaXMudmlzaWJsZV9jb29yZHMpO1xuICAgICAgICBsZXQgY29vcmRzX2NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHByZXZfY29vcmRzLmxlbmd0aCAhPT0gbmV3X2Nvb3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvb3Jkc19jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByZXZfY29vcmRzLnNvcnQoKTtcbiAgICAgICAgICAgIG5ld19jb29yZHMuc29ydCgpO1xuICAgICAgICAgICAgaWYgKCFwcmV2X2Nvb3Jkcy5ldmVyeSgoYywgaSkgPT4gbmV3X2Nvb3Jkc1tpXSA9PT0gYykpIHtcbiAgICAgICAgICAgICAgICBjb29yZHNfY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVRpbGVTdGF0ZXMoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVUaWxlU3RhdGVzICgpIHtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSh0aWxlKTtcbiAgICAgICAgICAgIHRpbGUudXBkYXRlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubG9hZFF1ZXVlZENvb3JkaW5hdGVzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUHJveHlUaWxlcygpO1xuICAgICAgICB0aGlzLnZpZXcucHJ1bmVUaWxlc0ZvclZpZXcoKTtcbiAgICAgICAgdGhpcy51cGRhdGVSZW5kZXJhYmxlVGlsZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVTdHlsZXMoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQcm94eVRpbGVzICgpIHtcbiAgICAgICAgaWYgKHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgcHJveGllc1xuICAgICAgICB0aGlzLmZvckVhY2hUaWxlKHRpbGUgPT4gdGlsZS5zZXRQcm94eUZvcihudWxsKSk7XG5cbiAgICAgICAgbGV0IHByb3h5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9yRWFjaFRpbGUodGlsZSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGUudmlzaWJsZSAmJiAhdGlsZS5idWlsdCAmJiB0aWxlLmNvb3Jkcy56ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnB5cmFtaWQuZ2V0QW5jZXN0b3IodGlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5zZXRQcm94eUZvcih0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmICF0aWxlLmJ1aWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy5weXJhbWlkLmdldERlc2NlbmRhbnRzKHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBkZXNjZW5kYW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHNbaV0uc2V0UHJveHlGb3IodGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm94eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcHJveHkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy56b29tX2RpcmVjdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVWaXNpYmlsaXR5KHRpbGUpIHtcbiAgICAgICAgdGlsZS52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aWxlLnN0eWxlX3pvb20gPT09IHRoaXMudmlldy50aWxlX3pvb20pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpc2libGVfY29vcmRzW3RpbGUuY29vcmRzLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aWxlLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYnJ1dGUgZm9yY2VcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy52aXNpYmxlX2Nvb3Jkcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGlsZS5pc0Rlc2NlbmRhbnQodGlsZS5jb29yZHMsIHRoaXMudmlzaWJsZV9jb29yZHNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IGFyZW4ndCB2aXNpYmxlLCBhbmQgZmxhZyByZW1haW5pbmcgdmlzaWJsZSBvbmVzIHRvIGJlIHVwZGF0ZWQgKGZvciBsb2FkaW5nLCBwcm94eSwgZXRjLilcbiAgICBwcnVuZVRvVmlzaWJsZVRpbGVzICgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVUaWxlcyh0aWxlID0+ICF0aWxlLnZpc2libGUpO1xuICAgIH1cblxuICAgIGdldFJlbmRlcmFibGVUaWxlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmFibGVfdGlsZXM7XG4gICAgfVxuXG4gICAgdXBkYXRlUmVuZGVyYWJsZVRpbGVzKCkge1xuICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNbdF07XG4gICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmIHRpbGUubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJhYmxlX3RpbGVzLnB1c2godGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyYWJsZV90aWxlcztcbiAgICB9XG5cbiAgICBnZXRBY3RpdmVTdHlsZXMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVfc3R5bGVzO1xuICAgIH1cblxuICAgIHVwZGF0ZUFjdGl2ZVN0eWxlcyAoKSB7XG4gICAgICAgIGxldCB0aWxlcyA9IHRoaXMucmVuZGVyYWJsZV90aWxlcztcbiAgICAgICAgbGV0IGFjdGl2ZSA9IHt9O1xuICAgICAgICBmb3IgKGxldCB0PTA7IHQgPCB0aWxlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aWxlc1t0XTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRpbGUubWVzaGVzKS5mb3JFYWNoKHMgPT4gYWN0aXZlW3NdID0gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVfc3R5bGVzID0gT2JqZWN0LmtleXMoYWN0aXZlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlX3N0eWxlcztcbiAgICB9XG5cbiAgICBpc0xvYWRpbmdWaXNpYmxlVGlsZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnRpbGVzKS5zb21lKGsgPT4gdGhpcy50aWxlc1trXS52aXNpYmxlICYmICF0aGlzLnRpbGVzW2tdLmJ1aWx0KTtcbiAgICB9XG5cbiAgICAvLyBRdWV1ZSBhIHRpbGUgZm9yIGxvYWRcbiAgICBxdWV1ZUNvb3JkaW5hdGUoY29vcmRzKSB7XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3Jkc1t0aGlzLnF1ZXVlZF9jb29yZHMubGVuZ3RoXSA9IGNvb3JkcztcbiAgICB9XG5cbiAgICAvLyBMb2FkIGFsbCBxdWV1ZWQgdGlsZXNcbiAgICBsb2FkUXVldWVkQ29vcmRpbmF0ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlZF9jb29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IHF1ZXVlZCB0aWxlcyBmcm9tIGNlbnRlciB0aWxlXG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3Jkcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgYWQgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGEueCkgKyBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueSAtIGEueSk7XG4gICAgICAgICAgICBsZXQgYmQgPSBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueCAtIGIueCkgKyBNYXRoLmFicyh0aGlzLnZpZXcuY2VudGVyLnRpbGUueSAtIGIueSk7XG4gICAgICAgICAgICByZXR1cm4gKGJkID4gYWQgPyAtMSA6IChiZCA9PT0gYWQgPyAwIDogMSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzLmZvckVhY2goY29vcmRzID0+IHRoaXMubG9hZENvb3JkaW5hdGUoY29vcmRzKSk7XG4gICAgICAgIHRoaXMucXVldWVkX2Nvb3JkcyA9IFtdO1xuICAgIH1cblxuICAgIC8vIExvYWQgYWxsIHRpbGVzIHRvIGNvdmVyIGEgZ2l2ZW4gbG9naWNhbCB0aWxlIGNvb3JkaW5hdGVcbiAgICBsb2FkQ29vcmRpbmF0ZShjb29yZHMpIHtcbiAgICAgICAgLy8gU2tpcCBpZiBub3QgYXQgY3VycmVudCBzY2VuZSB6b29tXG4gICAgICAgIGlmIChjb29yZHMueiAhPT0gdGhpcy52aWV3LmNlbnRlci50aWxlLnopIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVybWluZSBuZWNlc3NhcnkgdGlsZXMgZm9yIGVhY2ggc291cmNlXG4gICAgICAgIGZvciAobGV0IHMgaW4gdGhpcy5zY2VuZS5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zY2VuZS5zb3VyY2VzW3NdO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBzb3VyY2Ugc2hvdWxkIGJ1aWxkIHRoaXMgdGlsZVxuICAgICAgICAgICAgaWYgKCFzb3VyY2UuYnVpbGRzX2dlb21ldHJ5X3RpbGVzIHx8ICFzb3VyY2UuaW5jbHVkZXNUaWxlKGNvb3JkcywgdGhpcy52aWV3LnRpbGVfem9vbSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGtleSA9IFRpbGUua2V5KGNvb3Jkcywgc291cmNlLCB0aGlzLnZpZXcudGlsZV96b29tKTtcbiAgICAgICAgICAgIGlmIChrZXkgJiYgIXRoaXMuaGFzVGlsZShrZXkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRpbGUgPSBUaWxlLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgY29vcmRzLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZXI6IHRoaXMuc2NlbmUuZ2V0V29ya2VyRm9yRGF0YVNvdXJjZShzb3VyY2UpLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZV96b29tOiB0aGlzLnZpZXcuc3R5bGVab29tKGNvb3Jkcy56KSxcbiAgICAgICAgICAgICAgICAgICAgdmlldzogdGhpcy52aWV3XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmtlZXBUaWxlKHRpbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRUaWxlKHRpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU29ydCBhbmQgYnVpbGQgYSBsaXN0IG9mIHRpbGVzXG4gICAgYnVpbGRUaWxlcyh0aWxlcykge1xuICAgICAgICBUaWxlLnNvcnQodGlsZXMpLmZvckVhY2godGlsZSA9PiB0aGlzLmJ1aWxkVGlsZSh0aWxlKSk7XG4gICAgICAgIHRoaXMuY2hlY2tCdWlsZFF1ZXVlKCk7XG4gICAgfVxuXG4gICAgYnVpbGRUaWxlKHRpbGUsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50aWxlQnVpbGRTdGFydCh0aWxlLmtleSk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSh0aWxlKTtcbiAgICAgICAgdGlsZS51cGRhdGUoKTtcbiAgICAgICAgdGlsZS5idWlsZCh0aGlzLnNjZW5lLmdlbmVyYXRpb24sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIGEgd2ViIHdvcmtlciBjb21wbGV0ZXMgcHJvY2Vzc2luZyBmb3IgYSBzaW5nbGUgdGlsZSAoaW5pdGlhbCBsb2FkLCBvciByZWJ1aWxkKVxuICAgIGJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZCh7IHRpbGUsIHByb2dyZXNzIH0pIHtcbiAgICAgICAgLy8gUmVtb3ZlZCB0aGlzIHRpbGUgZHVyaW5nIGxvYWQ/XG4gICAgICAgIGlmICh0aGlzLnRpbGVzW3RpbGUua2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYGRpc2NhcmRlZCB0aWxlICR7dGlsZS5rZXl9IGluIFRpbGVNYW5hZ2VyLmJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZCBiZWNhdXNlIHByZXZpb3VzbHkgcmVtb3ZlZGApO1xuICAgICAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaWxlU3RhdGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnVpbHQgd2l0aCBhbiBvdXRkYXRlZCBzY2VuZSBjb25maWd1cmF0aW9uP1xuICAgICAgICBlbHNlIGlmICh0aWxlLmdlbmVyYXRpb24gIT09IHRoaXMuc2NlbmUuZ2VuZXJhdGlvbikge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBkaXNjYXJkZWQgdGlsZSAke3RpbGUua2V5fSBpbiBUaWxlTWFuYWdlci5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWQgYmVjYXVzZSBidWlsdCB3aXRoIGAgK1xuICAgICAgICAgICAgICAgIGBzY2VuZSBjb25maWcgZ2VuICR7dGlsZS5nZW5lcmF0aW9ufSwgY3VycmVudCAke3RoaXMuc2NlbmUuZ2VuZXJhdGlvbn1gKTtcbiAgICAgICAgICAgIFRpbGUuYWJvcnRCdWlsZCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRpbGUgd2l0aCBwcm9wZXJ0aWVzIGZyb20gd29ya2VyXG4gICAgICAgICAgICBpZiAodGhpcy50aWxlc1t0aWxlLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1t0aWxlLmtleV0ubWVyZ2UodGlsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5idWlsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRpbGUuYnVpbGRNZXNoZXModGhpcy5zY2VuZS5zdHlsZXMsIHByb2dyZXNzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvZ3Jlc3MuZG9uZSkge1xuICAgICAgICAgICAgdGhpcy50aWxlQnVpbGRTdG9wKHRpbGUua2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCB3aGVuIHdlYiB3b3JrZXIgZW5jb3VudGVycyBhbiBlcnJvciBidWlsZGluZyBhIHRpbGVcbiAgICBidWlsZFRpbGVFcnJvcih0aWxlKSB7XG4gICAgICAgIGxvZygnZXJyb3InLCBgRXJyb3IgYnVpbGRpbmcgdGlsZSAke3RpbGUua2V5fTpgLCB0aWxlLmVycm9yKTtcbiAgICAgICAgdGhpcy5mb3JnZXRUaWxlKHRpbGUua2V5KTtcbiAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgIH1cblxuICAgIC8vIFRyYWNrIHRpbGUgYnVpbGQgc3RhdGVcbiAgICB0aWxlQnVpbGRTdGFydChrZXkpIHtcbiAgICAgICAgdGhpcy5idWlsZGluZ190aWxlcyA9IHRoaXMuYnVpbGRpbmdfdGlsZXMgfHwge307XG4gICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXNba2V5XSA9IHRydWU7XG4gICAgICAgIGxvZygndHJhY2UnLCBgdGlsZUJ1aWxkU3RhcnQgZm9yICR7a2V5fTogJHtPYmplY3Qua2V5cyh0aGlzLmJ1aWxkaW5nX3RpbGVzKS5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgdGlsZUJ1aWxkU3RvcChrZXkpIHtcbiAgICAgICAgLy8gRG9uZSBidWlsZGluZz9cbiAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmdfdGlsZXMpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgdGlsZUJ1aWxkU3RvcCBmb3IgJHtrZXl9OiAke09iamVjdC5rZXlzKHRoaXMuYnVpbGRpbmdfdGlsZXMpLmxlbmd0aH1gKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1aWxkaW5nX3RpbGVzW2tleV07XG4gICAgICAgICAgICB0aGlzLmNoZWNrQnVpbGRRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgc3RhdHVzIG9mIHRpbGUgYnVpbGRpbmcgcXVldWUgYW5kIG5vdGlmeSBzY2VuZSB3aGVuIHdlJ3JlIGRvbmVcbiAgICBjaGVja0J1aWxkUXVldWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5idWlsZGluZ190aWxlcyB8fCBPYmplY3Qua2V5cyh0aGlzLmJ1aWxkaW5nX3RpbGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRpbmdfdGlsZXMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zY2VuZS50aWxlTWFuYWdlckJ1aWxkRG9uZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VtIG9mIGEgZGVidWcgcHJvcGVydHkgYWNyb3NzIHRpbGVzXG4gICAgZ2V0RGVidWdTdW0ocHJvcCwgZmlsdGVyKSB7XG4gICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICBmb3IgKHZhciB0IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbGVzW3RdLmRlYnVnW3Byb3BdICE9IG51bGwgJiYgKHR5cGVvZiBmaWx0ZXIgIT09ICdmdW5jdGlvbicgfHwgZmlsdGVyKHRoaXMudGlsZXNbdF0pID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgIHN1bSArPSB0aGlzLnRpbGVzW3RdLmRlYnVnW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgfVxuXG4gICAgLy8gQXZlcmFnZSBvZiBhIGRlYnVnIHByb3BlcnR5IGFjcm9zcyB0aWxlc1xuICAgIGdldERlYnVnQXZlcmFnZShwcm9wLCBmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVidWdTdW0ocHJvcCwgZmlsdGVyKSAvIE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aDtcbiAgICB9XG5cbn1cbiIsImltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZVB5cmFtaWQge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY29vcmRzID0ge307XG4gICAgICAgIHRoaXMubWF4X3Byb3h5X2Rlc2NlbmRhbnRfZGVwdGggPSAzOyAvLyAjIG9mIGxldmVscyB0byBzZWFyY2ggdXAvZG93biBmb3IgcHJveHkgdGlsZXNcbiAgICAgICAgdGhpcy5tYXhfcHJveHlfYW5jZXN0b3JfZGVwdGggPSA1O1xuICAgIH1cblxuICAgIHNvdXJjZVRpbGVzKGNvb3JkLCBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuY29vcmRzW2Nvb3JkLmtleV0gJiZcbiAgICAgICAgICAgIHRoaXMuY29vcmRzW2Nvb3JkLmtleV0uc291cmNlcyAmJlxuICAgICAgICAgICAgdGhpcy5jb29yZHNbY29vcmQua2V5XS5zb3VyY2VzW3NvdXJjZS5uYW1lXSk7XG4gICAgfVxuXG4gICAgYWRkVGlsZSh0aWxlKSB7XG4gICAgICAgIC8vIEFkZCB0YXJnZXQgdGlsZVxuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuICAgICAgICBsZXQgY29vcmQgPSB0aGlzLmNvb3Jkc1trZXldO1xuICAgICAgICBpZiAoIWNvb3JkKSB7XG4gICAgICAgICAgICBjb29yZCA9IHRoaXMuY29vcmRzW2tleV0gPSB7IGRlc2NlbmRhbnRzOiAwIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvb3JkLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvb3JkLnNvdXJjZXMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29vcmQuc291cmNlc1t0aWxlLnNvdXJjZS5uYW1lXSkge1xuICAgICAgICAgICAgY29vcmQuc291cmNlc1t0aWxlLnNvdXJjZS5uYW1lXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvb3JkLnNvdXJjZXNbdGlsZS5zb3VyY2UubmFtZV1bdGlsZS5zdHlsZV96b29tXSA9IHRpbGU7XG5cbiAgICAgICAgLy8gSW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudCB1cCB0aGUgdGlsZSBweXJhbWlkXG4gICAgICAgIGZvciAobGV0IHogPSB0aWxlLmNvb3Jkcy56IC0gMTsgeiA+PSAwOyB6LS0pIHtcbiAgICAgICAgICAgIGxldCB1cCA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbSh0aWxlLmNvb3Jkcywgeik7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29vcmRzW3VwLmtleV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvb3Jkc1t1cC5rZXldID0geyBkZXNjZW5kYW50czogMCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb29yZHNbdXAua2V5XS5kZXNjZW5kYW50cysrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlVGlsZSh0aWxlKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0YXJnZXQgdGlsZVxuICAgICAgICBsZXQgc291cmNlX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyh0aWxlLmNvb3JkcywgdGlsZS5zb3VyY2UpO1xuICAgICAgICBsZXQga2V5ID0gdGlsZS5jb29yZHMua2V5O1xuXG4gICAgICAgIGlmIChzb3VyY2VfdGlsZXMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzb3VyY2VfdGlsZXNbdGlsZS5zdHlsZV96b29tXTtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzb3VyY2VfdGlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzb3VyY2VcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNba2V5XS5zb3VyY2VzW3RpbGUuc291cmNlLm5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmNvb3Jkc1trZXldLnNvdXJjZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jb29yZHNba2V5XS5zb3VyY2VzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1trZXldLmRlc2NlbmRhbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgd2hvbGUgY29vcmRcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1trZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCB1cCB0aGUgdGlsZSBweXJhbWlkXG4gICAgICAgIGZvciAobGV0IHogPSB0aWxlLmNvb3Jkcy56IC0gMTsgeiA+PSAwOyB6LS0pIHtcbiAgICAgICAgICAgIGxldCBkb3duID0gVGlsZS5jb29yZGluYXRlQXRab29tKHRpbGUuY29vcmRzLCB6KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1tkb3duLmtleV0gJiYgdGhpcy5jb29yZHNbZG93bi5rZXldLmRlc2NlbmRhbnRzID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzW2Rvd24ua2V5XS5kZXNjZW5kYW50cy0tO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvb3Jkc1tkb3duLmtleV0uZGVzY2VuZGFudHMgPT09IDAgJiYgIXRoaXMuY29vcmRzW2Rvd24ua2V5XS5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1tkb3duLmtleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0QW5jZXN0b3IgKHsgY29vcmRzLCBzdHlsZV96b29tLCBzb3VyY2UgfSwgbGV2ZWwgPSAxKSB7XG4gICAgICAgIGlmIChsZXZlbCA+IHRoaXMubWF4X3Byb3h5X2FuY2VzdG9yX2RlcHRoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaXJzdCBjaGVjayBvdmVyem9vbWVkIHRpbGVzIGF0IHNhbWUgY29vcmRpbmF0ZSB6b29tXG4gICAgICAgIGlmIChzdHlsZV96b29tID4gc291cmNlLm1heF96b29tKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhjb29yZHMsIHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IHN0eWxlX3pvb20gLSAxOyB6ID49IHNvdXJjZS5tYXhfem9vbTsgei0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXNbel0gJiYgc291cmNlX3RpbGVzW3pdLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZV90aWxlc1t6XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICgrK2xldmVsID4gdGhpcy5tYXhfcHJveHlfYW5jZXN0b3JfZGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0eWxlX3pvb20gPSBzb3VyY2UubWF4X3pvb207XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aWxlcyBhdCBuZXh0IHpvb20gdXBcbiAgICAgICAgc3R5bGVfem9vbS0tO1xuICAgICAgICBsZXQgcGFyZW50ID0gVGlsZS5jb29yZGluYXRlQXRab29tKGNvb3JkcywgY29vcmRzLnogLSAxKTtcbiAgICAgICAgbGV0IHBhcmVudF90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMocGFyZW50LCBzb3VyY2UpO1xuICAgICAgICBpZiAocGFyZW50X3RpbGVzICYmIHBhcmVudF90aWxlc1tzdHlsZV96b29tXSAmJiBwYXJlbnRfdGlsZXNbc3R5bGVfem9vbV0ubG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50X3RpbGVzW3N0eWxlX3pvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRpZG4ndCBmaW5kIGFuY2VzdG9yLCB0cnkgbmV4dCBsZXZlbFxuICAgICAgICBpZiAocGFyZW50LnogPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBbmNlc3Rvcih7IGNvb3JkczogcGFyZW50LCBzdHlsZV96b29tLCBzb3VyY2UgfSwgbGV2ZWwgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldERlc2NlbmRhbnRzICh7IGNvb3Jkcywgc3R5bGVfem9vbSwgc291cmNlIH0sIGxldmVsID0gMSkge1xuICAgICAgICBsZXQgZGVzY2VuZGFudHMgPSBbXTtcblxuICAgICAgICAvLyBGaXJzdCBjaGVjayBvdmVyem9vbWVkIHRpbGVzIGF0IHNhbWUgY29vcmRpbmF0ZSB6b29tXG4gICAgICAgIGlmIChzdHlsZV96b29tID49IHNvdXJjZS5tYXhfem9vbSkge1xuICAgICAgICAgICAgbGV0IHNvdXJjZV90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMoY29vcmRzLCBzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlcykge1xuICAgICAgICAgICAgICAgIGxldCBzZWFyY2hfbWF4X3pvb20gPSBNYXRoLm1heChHZW8uZGVmYXVsdF92aWV3X21heF96b29tLCBzdHlsZV96b29tICsgdGhpcy5tYXhfcHJveHlfZGVzY2VuZGFudF9kZXB0aCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IHN0eWxlX3pvb20gKyAxOyB6IDw9IHNlYXJjaF9tYXhfem9vbTsgeisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXNbel0gJiYgc291cmNlX3RpbGVzW3pdLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChzb3VyY2VfdGlsZXNbel0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdGlsZXMgYXQgbmV4dCB6b29tIGRvd25cbiAgICAgICAgaWYgKHRoaXMuY29vcmRzW2Nvb3Jkcy5rZXldICYmIHRoaXMuY29vcmRzW2Nvb3Jkcy5rZXldLmRlc2NlbmRhbnRzID4gMCkge1xuICAgICAgICAgICAgc3R5bGVfem9vbSsrO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBUaWxlLmNoaWxkcmVuRm9yQ29vcmRpbmF0ZShjb29yZHMpO1xuICAgICAgICAgICAgZm9yIChsZXQgYz0wOyBjIDwgY2hpbGRyZW4ubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2NdO1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZF90aWxlcyA9IHRoaXMuc291cmNlVGlsZXMoY2hpbGQsIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkX3RpbGVzICYmIGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dICYmIGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKGNoaWxkX3RpbGVzW3N0eWxlX3pvb21dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgY2hpbGQsIHRyeSBuZXh0IGxldmVsXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPD0gdGhpcy5tYXhfcHJveHlfZGVzY2VuZGFudF9kZXB0aCAmJiBjaGlsZC56IDw9IHNvdXJjZS5tYXhfem9vbSkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKC4uLnRoaXMuZ2V0RGVzY2VuZGFudHMoeyBjb29yZHM6IGNoaWxkLCBzb3VyY2UsIHN0eWxlX3pvb20gfSwgbGV2ZWwgKyAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgIH1cblxufVxuIiwiZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIGRyYXdzIGEgYmx1ZSByZWN0YW5nbGUgYm9yZGVyIGFyb3VuZCB0aGUgY29sbGlzaW9uIGJveCBvZiBhIGxhYmVsXG4gICAgZHJhd19sYWJlbF9jb2xsaXNpb25fYm94ZXM6IGZhbHNlLFxuICAgIC8vIGRyYXdzIGEgZ3JlZW4gcmVjdGFuZ2xlIGJvcmRlciB3aXRoaW4gdGhlIHRleHR1cmUgYm94IG9mIGEgbGFiZWxcbiAgICBkcmF3X2xhYmVsX3RleHR1cmVfYm94ZXM6IGZhbHNlLFxuICAgIC8vIHN1cHByZXNlcyBmYWRlLWluIG9mIGxhYmVsc1xuICAgIHN1cHByZXNzX2xhYmVsX2ZhZGVfaW46IGZhbHNlLFxuICAgIC8vIHN1cHByZXNzIGFuaW1hdG9uIG9mIGxhYmVsIHNuYXAgdG8gcGl4ZWwgZ3JpZFxuICAgIHN1cHByZXNzX2xhYmVsX3NuYXBfYW5pbWF0aW9uOiBmYWxzZVxufTtcbiIsIlxuXG5leHBvcnQgY2xhc3MgTWV0aG9kTm90SW1wbGVtZW50ZWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kTmFtZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm5hbWUgICAgPSAnTWV0aG9kTm90SW1wbGVtZW50ZWQnO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnTWV0aG9kICcgKyBtZXRob2ROYW1lICsgJyBtdXN0IGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzJztcbiAgICB9XG59XG4iLCIvLyBQYXJ0aWFsIGltcG9ydCBvZiBnbC1tYXRyaXggdmlhIG1vZHVsYXJpemVkIHN0YWNrLWdsIGZvcmtzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdG9qaS9nbC1tYXRyaXhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFja2dsXG5cbi8vIHZlYzNcblxuLy8gU3Vic3RpdHV0ZSA2NC1iaXQgdmVyc2lvblxuLy8gV2UgbmVlZCB0aGUgZXh0cmEgcHJlY2lzaW9uIHdoZW4gbXVsdGlwbHlpbmcgbWF0cmljZXMgdy9tZXJjYXRvciBwcm9qZWN0ZWQgdmFsdWVzXG5jb25zdCB2ZWMzID0ge1xuICAgIGZyb21WYWx1ZXMgKHgsIHksIHopIHtcbiAgICAgICAgdmFyIG91dCA9IG5ldyBGbG9hdDY0QXJyYXkoMyk7XG4gICAgICAgIG91dFswXSA9IHg7XG4gICAgICAgIG91dFsxXSA9IHk7XG4gICAgICAgIG91dFsyXSA9IHo7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxufTtcblxuXG4vLyBtYXQzXG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQzX25vcm1hbEZyb21NYXQ0fSBmcm9tICdnbC1tYXQzL25vcm1hbC1mcm9tLW1hdDQnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDNfaW52ZXJ0fSBmcm9tICdnbC1tYXQzL2ludmVydCc7XG5cbmNvbnN0IG1hdDMgPSB7XG4gICAgbm9ybWFsRnJvbU1hdDQ6IG1hdDNfbm9ybWFsRnJvbU1hdDQsXG4gICAgaW52ZXJ0OiBtYXQzX2ludmVydFxufTtcblxuXG4vLyBtYXQ0XG5cbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X211bHRpcGx5fSBmcm9tICdnbC1tYXQ0L211bHRpcGx5JztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X3RyYW5zbGF0ZX0gZnJvbSAnZ2wtbWF0NC90cmFuc2xhdGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfc2NhbGV9IGZyb20gJ2dsLW1hdDQvc2NhbGUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfcGVyc3BlY3RpdmV9IGZyb20gJ2dsLW1hdDQvcGVyc3BlY3RpdmUnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfbG9va0F0fSBmcm9tICdnbC1tYXQ0L2xvb2tBdCc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9pZGVudGl0eX0gZnJvbSAnZ2wtbWF0NC9pZGVudGl0eSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9jb3B5fSBmcm9tICdnbC1tYXQ0L2NvcHknO1xuXG5jb25zdCBtYXQ0ID0ge1xuICAgIG11bHRpcGx5OiBtYXQ0X211bHRpcGx5LFxuICAgIHRyYW5zbGF0ZTogbWF0NF90cmFuc2xhdGUsXG4gICAgc2NhbGU6IG1hdDRfc2NhbGUsXG4gICAgcGVyc3BlY3RpdmU6IG1hdDRfcGVyc3BlY3RpdmUsXG4gICAgbG9va0F0OiBtYXQ0X2xvb2tBdCxcbiAgICBpZGVudGl0eTogbWF0NF9pZGVudGl0eSxcbiAgICBjb3B5OiBtYXQ0X2NvcHlcbn07XG5cblxuZXhwb3J0IHt2ZWMzLCBtYXQzLCBtYXQ0fTtcbiIsImltcG9ydCB2ZXJzaW9uIGZyb20gJy4vdmVyc2lvbic7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdGhyZWFkJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi93b3JrZXJfYnJva2VyJztcblxuY29uc3QgTEVWRUxTID0ge1xuICAgIHNpbGVudDogLTEsXG4gICAgZXJyb3I6IDAsXG4gICAgd2FybjogMSxcbiAgICBpbmZvOiAyLFxuICAgIGRlYnVnOiAzLFxuICAgIHRyYWNlOiA0XG59O1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbmZ1bmN0aW9uIG1ldGhvZEZvckxldmVsIChsZXZlbCkge1xuICAgIGlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgICAgICBtZXRob2RzW2xldmVsXSA9IG1ldGhvZHNbbGV2ZWxdIHx8IChjb25zb2xlW2xldmVsXSA/IGNvbnNvbGVbbGV2ZWxdIDogY29uc29sZS5sb2cpLmJpbmQoY29uc29sZSk7XG4gICAgICAgIHJldHVybiBtZXRob2RzW2xldmVsXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvZyAobXNnX2xldmVsLCAuLi5tc2cpIHtcbiAgICBpZiAoTEVWRUxTW21zZ19sZXZlbF0gPD0gTEVWRUxTW2xvZy5sZXZlbF0pIHtcbiAgICAgICAgaWYgKFRocmVhZC5pc193b3JrZXIpIHtcbiAgICAgICAgICAgIC8vIFByb3h5IHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ19sb2dQcm94eScsIG1zZ19sZXZlbCwgLi4ubXNnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsb2dnZXIgPSBtZXRob2RGb3JMZXZlbChtc2dfbGV2ZWwpO1xuXG4gICAgICAgICAgICAvLyBXcml0ZSB0byBjb25zb2xlIChvbiBtYWluIHRocmVhZClcbiAgICAgICAgICAgIGlmIChtc2cubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlcihgVGFuZ3JhbSAke3ZlcnNpb259IFske21zZ19sZXZlbH1dOiAke21zZ1swXX1gLCAuLi5tc2cuc2xpY2UoMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyKGBUYW5ncmFtICR7dmVyc2lvbn0gWyR7bXNnX2xldmVsfV06ICR7bXNnWzBdfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5sb2cubGV2ZWwgPSAnaW5mbyc7XG5sb2cud29ya2VycyA9IG51bGw7XG5cbmxvZy5zZXRMZXZlbCA9IGZ1bmN0aW9uIChsZXZlbCkge1xuICAgIGxvZy5sZXZlbCA9IGxldmVsO1xuXG4gICAgaWYgKFRocmVhZC5pc19tYWluICYmIEFycmF5LmlzQXJyYXkobG9nLndvcmtlcnMpKSB7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZShsb2cud29ya2VycywgJ19sb2dTZXRMZXZlbFByb3h5JywgbGV2ZWwpO1xuICAgIH1cbn07XG5cbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIGxvZy5zZXRXb3JrZXJzID0gZnVuY3Rpb24gKHdvcmtlcnMpIHtcbiAgICAgICAgbG9nLndvcmtlcnMgPSB3b3JrZXJzO1xuICAgIH07XG5cblxufVxuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdfbG9nUHJveHknLCBsb2cpOyAgICAgICAgICAgICAgICAgICAvLyBwcm94eSBsb2cgbWVzc2FnZXMgZnJvbSB3b3JrZXIgdG8gbWFpbiB0aHJlYWRcbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ19sb2dTZXRMZXZlbFByb3h5JywgbG9nLnNldExldmVsKTsgIC8vIHByb3h5IGxvZyBsZXZlbCBzZXR0aW5nIGZyb20gbWFpbiB0byB3b3JrZXIgdGhyZWFkXG4iLCIvKiBnbG9iYWwgTWVkaWFSZWNvcmRlciAqL1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQge2NyZWF0ZU9iamVjdFVSTH0gZnJvbSAnLi91cmxzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVkaWFDYXB0dXJlIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUgPSBudWxsO1xuICAgIH1cblxuICAgIHNldENhbnZhcyAoY2FudmFzKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzO1xuICAgIH1cblxuICAgIC8vIFRha2UgYSBzY3JlZW5zaG90LCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNjcmVlbnNob3QgZGF0YSB3aGVuIGF2YWlsYWJsZVxuICAgIHNjcmVlbnNob3QgKCkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZV9zY3JlZW5zaG90ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZTsgLy8gb25seSBjYXB0dXJlIG9uZSBzY3JlZW5zaG90IGF0IGEgdGltZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2lsbCByZXNvbHZlIG9uY2UgcmVuZGVyaW5nIGlzIGNvbXBsZXRlIGFuZCByZW5kZXIgYnVmZmVyIGlzIGNhcHR1cmVkXG4gICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdCA9IHt9O1xuICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnByb21pc2U7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIGFmdGVyIHJlbmRlcmluZywgY2FwdHVyZXMgcmVuZGVyIGJ1ZmZlciBhbmQgcmVzb2x2ZXMgcHJvbWlzZSB3aXRoIHRoZSBpbWFnZSBkYXRhXG4gICAgY29tcGxldGVTY3JlZW5zaG90ICgpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWVfc2NyZWVuc2hvdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBHZXQgZGF0YSBVUkwsIGNvbnZlcnQgdG8gYmxvYlxuICAgICAgICAgICAgLy8gU3RyaXAgaG9zdC9taW1ldHlwZS9ldGMuLCBjb252ZXJ0IGJhc2U2NCB0byBiaW5hcnkgd2l0aG91dCBVVEYtOCBtYW5nbGluZ1xuICAgICAgICAgICAgLy8gQWRhcHRlZCBmcm9tOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS91bmNvbmVkLzQzNzA4MjJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXRvYih1cmwuc2xpY2UoMjIpKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGRhdGEubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgeyB0eXBlOiAnaW1hZ2UvcG5nJyB9KTtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSB3aXRoIHNjcmVlbnNob3QgZGF0YVxuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlc29sdmUoeyB1cmwsIGJsb2IsIHR5cGU6ICdwbmcnIH0pO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0YXJ0cyBjYXB0dXJpbmcgYSB2aWRlbyBzdHJlYW0gZnJvbSB0aGUgY2FudmFzXG4gICAgc3RhcnRWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5NZWRpYVJlY29yZGVyICE9PSAnZnVuY3Rpb24nIHx8ICF0aGlzLmNhbnZhcyB8fCB0eXBlb2YgdGhpcy5jYW52YXMuY2FwdHVyZVN0cmVhbSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZpZGVvIGNhcHR1cmUgKENhbnZhcy5jYXB0dXJlU3RyZWFtIGFuZC9vciBNZWRpYVJlY29yZGVyIEFQSXMpIG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3NlcicpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmlkZW9fY2FwdHVyZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZpZGVvIGNhcHR1cmUgYWxyZWFkeSBpbiBwcm9ncmVzcywgY2FsbCBTY2VuZS5zdG9wVmlkZW9DYXB0dXJlKCkgZmlyc3QnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IGEgbmV3IGNhcHR1cmVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBjYXAgPSB0aGlzLnZpZGVvX2NhcHR1cmUgPSB7fTtcbiAgICAgICAgICAgIGNhcC5jaHVua3MgPSBbXTtcbiAgICAgICAgICAgIGNhcC5zdHJlYW0gPSB0aGlzLmNhbnZhcy5jYXB0dXJlU3RyZWFtKCk7XG4gICAgICAgICAgICBjYXAub3B0aW9ucyA9IHsgbWltZVR5cGU6ICd2aWRlby93ZWJtJyB9OyAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIGZvcm1hdCBvcHRpb25zXG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlcihjYXAuc3RyZWFtLCBjYXAub3B0aW9ucyk7XG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICBjYXAuY2h1bmtzLnB1c2goZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RvcHBlZCByZWNvcmRpbmc/IENyZWF0ZSB0aGUgZmluYWwgY2FwdHVyZSBmaWxlIGJsb2JcbiAgICAgICAgICAgICAgICBpZiAoY2FwLnJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJsb2IgPSBuZXcgQmxvYihjYXAuY2h1bmtzLCB7IHR5cGU6IGNhcC5vcHRpb25zLm1pbWVUeXBlIH0pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgcmVtb3ZlIGFsbCBzdHJlYW0gdHJhY2tzLCBhbmQgc2V0IG9iamVjdHMgdG8gbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FwLnN0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYWNrcyA9IGNhcC5zdHJlYW0uZ2V0VHJhY2tzKCkgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja3MuZm9yRWFjaCh0cmFjayA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2suc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcC5zdHJlYW0ucmVtb3ZlVHJhY2sodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FwLnN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGNhcC5tZWRpYV9yZWNvcmRlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FwLnJlc29sdmUoeyB1cmwsIGJsb2IsIHR5cGU6ICd3ZWJtJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FwLm1lZGlhX3JlY29yZGVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgJ1NjZW5lIHZpZGVvIGNhcHR1cmUgZmFpbGVkJywgZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU3RvcHMgY2FwdHVyaW5nIGEgdmlkZW8gc3RyZWFtIGZyb20gdGhlIGNhbnZhcywgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2aWRlbyB3aGVuIGF2YWlsYWJsZVxuICAgIHN0b3BWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9fY2FwdHVyZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ05vIHNjZW5lIHZpZGVvIGNhcHR1cmUgaW4gcHJvZ3Jlc3MsIGNhbGwgU2NlbmUuc3RhcnRWaWRlb0NhcHR1cmUoKSBmaXJzdCcpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIHdoZW4gZmluYWwgc3RyZWFtIGlzIGF2YWlsYWJsZVxuICAgICAgICB0aGlzLnZpZGVvX2NhcHR1cmUucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFN0b3AgcmVjb3JkaW5nXG4gICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5tZWRpYV9yZWNvcmRlci5zdG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW9fY2FwdHVyZS5wcm9taXNlO1xuICAgIH1cblxufVxuIiwiLy8gRGVlcC9yZWN1cnNpdmUgbWVyZ2Ugb2Ygb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgaW50byBhIGRlc3RpbmF0aW9uIG9iamVjdFxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VPYmplY3RzIChkZXN0LCAuLi5zb3VyY2VzKSB7XG4gICAgZm9yIChsZXQgcz0wOyBzIDwgc291cmNlcy5sZW5ndGg7IHMrKykge1xuICAgICAgICBsZXQgc291cmNlID0gc291cmNlc1tzXTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2UgdGhlIHNvdXJjZSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBpZiBpdCBpcyBhIGEgbm9uLW51bGwga2V5L3ZhbHVlIG9iamVjdFxuICAgICAgICAgICAgLy8gKGUuZy4gZG9uJ3QgbWVyZ2UgYXJyYXlzLCB0aG9zZSBhcmUgdHJlYXRlZCBhcyBzY2FsYXIgdmFsdWVzOyBudWxsIHZhbHVlcyB3aWxsIG92ZXJ3cml0ZS9lcmFzZVxuICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzIGRlc3RpbmF0aW9uIHZhbHVlKVxuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3Rba2V5XSAhPT0gbnVsbCAmJiB0eXBlb2YgZGVzdFtrZXldID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkZXN0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IG1lcmdlT2JqZWN0cyhkZXN0W2tleV0sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IG1lcmdlT2JqZWN0cyh7fSwgdmFsdWUpOyAvLyBkZXN0aW5hdGlvbiBub3QgYW4gb2JqZWN0LCBvdmVyd3JpdGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdmVyd3JpdGUgdGhlIHByZXZpb3VzIGRlc3RpbmF0aW9uIHZhbHVlIGlmIHRoZSBzb3VyY2UgcHJvcGVydHkgaXM6IGEgc2NhbGFyIChudW1iZXIvc3RyaW5nKSxcbiAgICAgICAgICAgIC8vIGFuIGFycmF5LCBvciBhIG51bGwgdmFsdWVcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZXN0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVuZGVmaW5lZCBzb3VyY2UgcHJvcGVydGllcyBhcmUgaWdub3JlZFxuICAgICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59XG4iLCJpbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9CQiB7XG5cbiAgICBjb25zdHJ1Y3RvciAoeCwgeSwgYSwgdywgaCkge1xuICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IFt3LCBoXTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGE7XG4gICAgICAgIHRoaXMuY2VudHJvaWQgPSBbeCwgeV07XG4gICAgICAgIHRoaXMucXVhZCA9IFtdO1xuICAgICAgICB0aGlzLmF4ZXMgPSBbXTtcblxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIG1vdmUgKHB4LCBweSkge1xuICAgIFx0dGhpcy5jZW50cm9pZCA9IFtweCwgcHldO1xuXG4gICAgXHR0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGdldEV4dGVudCAoKSB7XG4gICAgXHRsZXQgaW5mID0gMWU2O1xuICAgIFx0bGV0IGFhYmIgPSBbaW5mLCBpbmYsIC1pbmYsIC1pbmZdO1xuXG4gICAgXHRmb3IgKGxldCBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgYWFiYlswXSA9IE1hdGgubWluKHRoaXMucXVhZFtpXVswXSwgYWFiYlswXSk7XG4gICAgICAgICAgICBhYWJiWzFdID0gTWF0aC5taW4odGhpcy5xdWFkW2ldWzFdLCBhYWJiWzFdKTtcbiAgICAgICAgICAgIGFhYmJbMl0gPSBNYXRoLm1heCh0aGlzLnF1YWRbaV1bMF0sIGFhYmJbMl0pO1xuICAgICAgICAgICAgYWFiYlszXSA9IE1hdGgubWF4KHRoaXMucXVhZFtpXVsxXSwgYWFiYlszXSk7XG4gICAgXHR9XG5cbiAgICBcdHJldHVybiBhYWJiO1xuICAgIH1cblxuICAgIHBlcnBBeGVzICgpIHtcbiAgICBcdHRoaXMuYXhlc1swXSA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnN1Yih0aGlzLnF1YWRbMl0sIHRoaXMucXVhZFszXSkpO1xuICAgIFx0dGhpcy5heGVzWzFdID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3Iuc3ViKHRoaXMucXVhZFsyXSwgdGhpcy5xdWFkWzFdKSk7XG4gICAgfVxuXG4gICAgdXBkYXRlICgpIHtcbiAgICBcdGxldCB4ID0gWyBNYXRoLmNvcyh0aGlzLmFuZ2xlKSwgTWF0aC5zaW4odGhpcy5hbmdsZSldO1xuICAgIFx0bGV0IHkgPSBbLU1hdGguc2luKHRoaXMuYW5nbGUpLCBNYXRoLmNvcyh0aGlzLmFuZ2xlKV07XG5cbiAgICBcdHggPSBWZWN0b3IubXVsdCh4LCB0aGlzLmRpbWVuc2lvblswXSAvIDIuMCk7XG4gICAgXHR5ID0gVmVjdG9yLm11bHQoeSwgdGhpcy5kaW1lbnNpb25bMV0gLyAyLjApO1xuXG4gICAgXHR0aGlzLnF1YWRbMF0gPSBWZWN0b3Iuc3ViKFZlY3Rvci5zdWIodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyBsb3dlci1sZWZ0XG4gICAgXHR0aGlzLnF1YWRbMV0gPSBWZWN0b3Iuc3ViKFZlY3Rvci5hZGQodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyBsb3dlci1yaWdodFxuICAgIFx0dGhpcy5xdWFkWzJdID0gVmVjdG9yLmFkZChWZWN0b3IuYWRkKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gdXBlci1yaWdodFxuICAgIFx0dGhpcy5xdWFkWzNdID0gVmVjdG9yLmFkZChWZWN0b3Iuc3ViKHRoaXMuY2VudHJvaWQsIHgpLCB5KTsgLy8gdXBlci1sZWZ0XG5cbiAgICBcdHRoaXMucGVycEF4ZXMoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcHJvamVjdFRvQXhpcyAob2JiLCBheGlzKSB7XG4gICAgXHRsZXQgaW5mID0gMWU2O1xuICAgIFx0bGV0IG1pbiA9IGluZjtcbiAgICBcdGxldCBtYXggPSAtaW5mO1xuXG4gICAgXHRsZXQgcXVhZCA9IG9iYi5xdWFkO1xuXG4gICAgXHQvLyBmb3IgZWFjaCBheGlzLCBwcm9qZWN0IG9iYiBxdWFkIHRvIGl0IGFuZCBmaW5kIG1pbiBhbmQgbWF4IHZhbHVlc1xuICAgIFx0Zm9yIChsZXQgaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICAgICAgICAgIGxldCBkID0gIFZlY3Rvci5kb3QocXVhZFtpXSwgYXhpcyk7XG4gICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIGQpO1xuICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBkKTtcbiAgICBcdH1cblxuICAgIFx0cmV0dXJuIFttaW4sIG1heF07XG4gICAgfVxuXG4gICAgc3RhdGljIGF4aXNDb2xsaWRlIChvYmJfYSwgb2JiX2IsIGF4ZXMpIHtcbiAgICBcdGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7XG4gICAgXHRcdGxldCBhX3Byb2ogPSBPQkIucHJvamVjdFRvQXhpcyhvYmJfYSwgYXhlc1tpXSk7XG4gICAgXHRcdGxldCBiX3Byb2ogPSBPQkIucHJvamVjdFRvQXhpcyhvYmJfYiwgYXhlc1tpXSk7XG5cbiAgICBcdFx0aWYgKGJfcHJvalswXSA+IGFfcHJvalsxXSB8fCBiX3Byb2pbMV0gPCBhX3Byb2pbMF0pIHtcbiAgICBcdFx0XHRyZXR1cm4gZmFsc2U7XG4gICAgXHRcdH1cbiAgICBcdH1cbiAgICBcdHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcnNlY3Qob2JiX2EsIG9iYl9iKSB7XG4gICAgXHRyZXR1cm4gT0JCLmF4aXNDb2xsaWRlKG9iYl9hLCBvYmJfYiwgb2JiX2EuYXhlcykgJiYgT0JCLmF4aXNDb2xsaWRlKG9iYl9hLCBvYmJfYiwgb2JiX2IuYXhlcyk7XG4gICAgfVxuXG59XG5cbiIsIi8vIFByb21pc2VzIHBvbHlmaWxsXG5pbXBvcnQgJ2NvcmUtanMvZXM2L3Byb21pc2UnO1xuXG4vLyBPYmplY3QuYXNzaWduIHBvbHlmaWxsXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5pZiAodHlwZW9mIE9iamVjdC5hc3NpZ24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICBPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICAgICAgLy8gV2UgbXVzdCBjaGVjayBhZ2FpbnN0IHRoZXNlIHNwZWNpZmljIGNhc2VzLlxuICAgICAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkobmV4dEtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH0pKCk7XG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc3Vic2NyaWJlTWl4aW4gKHRhcmdldCkge1xuXG4gICAgbGV0IGxpc3RlbmVycyA9IFtdO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XG5cbiAgICAgICAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB1bnN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB1bnN1YnNjcmliZUFsbCgpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycyA9IFtdO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRyaWdnZXIoZXZlbnQsIC4uLmRhdGEpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyW2V2ZW50XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJbZXZlbnRdKC4uLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBDYXVnaHQgZXhjZXB0aW9uIGluIGxpc3RlbmVyIGZvciBldmVudCAnJHtldmVudH0nOmAsIGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaGFzU3Vic2NyaWJlcnNGb3IoZXZlbnQpIHtcbiAgICAgICAgICAgIGxldCBoYXMgPSBmYWxzZTtcbiAgICAgICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxpc3RlbmVyW2V2ZW50XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBoYXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGhhcztcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbn1cbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5cbi8vIE1hcmsgdGhyZWFkIGFzIG1haW4gb3Igd29ya2VyXG5jb25zdCBUaHJlYWQgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgVGhyZWFkO1xuXG50cnkge1xuICAgIGlmICh3aW5kb3cuZG9jdW1lbnQgIT09IEhUTUxEb2N1bWVudCkgeyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgVGhyZWFkLmlzX3dvcmtlciA9IGZhbHNlO1xuICAgICAgICBUaHJlYWQuaXNfbWFpbiAgID0gdHJ1ZTtcbiAgICB9XG59XG5jYXRjaCAoZSkge1xuICAgIGlmIChzZWxmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgVGhyZWFkLmlzX3dvcmtlciA9IHRydWU7XG4gICAgICAgIFRocmVhZC5pc19tYWluICAgPSBmYWxzZTtcblxuICAgICAgICAvLyBQYXRjaCBmb3IgM3JkIHBhcnR5IGxpYnMgdGhhdCByZXF1aXJlIHRoZXNlIGdsb2JhbHMgdG8gYmUgcHJlc2VudC4gU3BlY2lmaWNhbGx5LCBGb250RmFjZU9ic2VydmVyLlxuICAgICAgICAvLyBCcml0dGxlIHNvbHV0aW9uIGJ1dCBhbGxvd3MgdGhhdCBsaWJyYXJ5IHRvIGxvYWQgb24gd29ya2VyIHRocmVhZHMuXG4gICAgICAgIHNlbGYud2luZG93ID0geyBkb2N1bWVudDoge30gfTtcbiAgICAgICAgc2VsZi5kb2N1bWVudCA9IHNlbGYud2luZG93LmRvY3VtZW50O1xuICAgIH1cbn1cbiIsImltcG9ydCBsb2cgZnJvbSAnLi9sb2cnO1xuXG4vLyBBZGQgYSBiYXNlIFVSTCBmb3Igc2NoZW1lbGVzcyBvciBwcm90b2NvbC1sZXNzIFVSTHNcbi8vIERlZmF1bHRzIHRvIGFkZGluZyBjdXJyZW50IHdpbmRvdyBwcm90b2NvbCBhbmQgYmFzZSwgb3IgYWRkcyBhIGN1c3RvbSBiYXNlIGlmIHNwZWNpZmllZFxuLy8gTWF5YmUgdXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvVVJJLmpzIGlmIG1vcmUgcm9idXN0IGZ1bmN0aW9uYWxpdHkgaXMgbmVlZGVkXG5leHBvcnQgZnVuY3Rpb24gYWRkQmFzZVVSTCAodXJsLCBiYXNlKSB7XG4gICAgaWYgKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNjaGVtZWxlc3MsIGFkZCBwcm90b2NvbFxuICAgIGlmICh1cmwuc3Vic3RyKDAsIDIpID09PSAnLy8nKSB7XG4gICAgICAgIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCArIHVybDtcbiAgICB9XG4gICAgLy8gTm8gaHR0cChzKSBvciBkYXRhLCBhZGQgYmFzZVxuICAgIGVsc2UgaWYgKHVybC5zZWFyY2goL14oaHR0cHxodHRwc3xkYXRhfGJsb2IpOi8pIDwgMCkge1xuICAgICAgICB2YXIgcmVsYXRpdmUgPSAodXJsWzBdICE9PSAnLycpO1xuICAgICAgICB2YXIgYmFzZV9pbmZvO1xuICAgICAgICBpZiAoYmFzZSkge1xuICAgICAgICAgICAgYmFzZV9pbmZvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOyAvLyB1c2UgYSB0ZW1wb3JhcnkgZWxlbWVudCB0byBwYXJzZSBVUkxcbiAgICAgICAgICAgIGJhc2VfaW5mby5ocmVmID0gYmFzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJhc2VfaW5mbyA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWxhdGl2ZSkge1xuICAgICAgICAgICAgbGV0IHBhdGggPSBwYXRoRm9yVVJMKGJhc2VfaW5mby5ocmVmKTtcbiAgICAgICAgICAgIHVybCA9IHBhdGggKyB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBFYXN5IHdheVxuICAgICAgICAgICAgaWYgKGJhc2VfaW5mby5vcmlnaW4pIHtcbiAgICAgICAgICAgICAgICB1cmwgPSBiYXNlX2luZm8ub3JpZ2luICsgJy8nICsgdXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGFyZCB3YXkgKElFMTEpXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luID0gdXJsLm1hdGNoKC9eKChodHRwfGh0dHBzfGRhdGF8YmxvYik6XFwvXFwvW15cXC9dKlxcLykvKTtcbiAgICAgICAgICAgICAgICBvcmlnaW4gPSAob3JpZ2luICYmIG9yaWdpbi5sZW5ndGggPiAxKSA/IG9yaWdpblswXSA6ICcnO1xuICAgICAgICAgICAgICAgIHVybCA9IG9yaWdpbiArIHVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aEZvclVSTCAodXJsKSB7XG4gICAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnICYmIHVybC5zZWFyY2goL14oZGF0YXxibG9iKTovKSA9PT0gLTEpIHtcbiAgICAgICAgbGV0IHFzID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICAgICAgaWYgKHFzID4gLTEpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgcXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhhc2ggPSB1cmwuaW5kZXhPZignIycpO1xuICAgICAgICBpZiAoaGFzaCA+IC0xKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmwuc3Vic3RyKDAsIGhhc2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVybC5zdWJzdHIoMCwgdXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKSB8fCAnJztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5zaW9uRm9yVVJMICh1cmwpIHtcbiAgICB1cmwgPSB1cmwuc3BsaXQoJy8nKS5wb3AoKTtcbiAgICBsZXQgbGFzdF9kb3QgPSB1cmwubGFzdEluZGV4T2YoJy4nKTtcbiAgICBpZiAobGFzdF9kb3QgPiAtMSkge1xuICAgICAgICByZXR1cm4gdXJsLnN1YnN0cmluZyhsYXN0X2RvdCArIDEpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVsYXRpdmVVUkwgKHVybCkge1xuICAgIGlmICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAhKHVybC5zZWFyY2goL14oaHR0cHxodHRwc3xkYXRhfGJsb2IpOi8pID4gLTEgfHwgdXJsLnN1YnN0cigwLCAyKSA9PT0gJy8vJyk7XG59XG5cbi8vIFJlc29sdmVzICcuLycgYW5kICcuLi8nIGNvbXBvbmVudHMgZnJvbSByZWxhdGl2ZSBwYXRoLCB0byBnZXQgYSBcImZsYXR0ZW5lZFwiIHBhdGhcbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuUmVsYXRpdmVVUkwgKHVybCkge1xuICAgIGxldCBkaXJzID0gKHVybCB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICBmb3IgKGxldCBkID0gMTsgZCA8IGRpcnMubGVuZ3RoOyBkKyspIHtcbiAgICAgICAgaWYgKGRpcnNbZF0gPT09ICcuJykge1xuICAgICAgICAgICAgZGlycy5zcGxpY2UoZCwgMSk7XG4gICAgICAgICAgICBkLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlyc1tkXSA9PT0gJy4uJykge1xuICAgICAgICAgICAgZCA9IGQgKyAwO1xuICAgICAgICAgICAgZGlycy5zcGxpY2UoZC0xLCAyKTtcbiAgICAgICAgICAgIGQtLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlycy5qb2luKCcvJyk7XG59XG5cbi8vIEFkZCBhIHNldCBvZiBxdWVyeSBzdHJpbmcgcGFyYW1zIHRvIGEgVVJMXG4vLyBwYXJhbXM6IGhhc2ggb2Yga2V5L3ZhbHVlIHBhaXJzIG9mIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzXG5leHBvcnQgZnVuY3Rpb24gYWRkUGFyYW1zVG9VUkwgKHVybCwgcGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMgfHwgT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG5cbiAgICB2YXIgcXNfaW5kZXggPSB1cmwuaW5kZXhPZignPycpO1xuICAgIHZhciBoYXNoX2luZGV4ID0gdXJsLmluZGV4T2YoJyMnKTtcblxuICAgIC8vIFNhdmUgYW5kIHRyaW0gaGFzaFxuICAgIHZhciBoYXNoID0gJyc7XG4gICAgaWYgKGhhc2hfaW5kZXggPiAtMSkge1xuICAgICAgICBoYXNoID0gdXJsLnNsaWNlKGhhc2hfaW5kZXgpO1xuICAgICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaF9pbmRleCk7XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgcXVlcnkgc3RyaW5nXG4gICAgaWYgKHFzX2luZGV4ID09PSAtMSkge1xuICAgICAgICBxc19pbmRleCA9IHVybC5sZW5ndGg7XG4gICAgICAgIHVybCArPSAnPyc7XG4gICAgfVxuICAgIHFzX2luZGV4Kys7IC8vIGFkdmFuY2VkIHBhc3QgJz8nXG5cbiAgICAvLyBCdWlsZCBxdWVyeSBzdHJpbmcgcGFyYW1zXG4gICAgdmFyIHVybF9wYXJhbXMgPSAnJztcbiAgICBmb3IgKHZhciBwIGluIHBhcmFtcykge1xuICAgICAgICB1cmxfcGFyYW1zICs9IGAke3B9PSR7cGFyYW1zW3BdfSZgO1xuICAgIH1cblxuICAgIC8vIEluc2VydCBuZXcgcXVlcnkgc3RyaW5nIHBhcmFtcyBhbmQgcmVzdG9yZSBoYXNoXG4gICAgLy8gTk9URTogZG9lc24ndCByZXBsYWNlIGFueSB2YWx1ZXMgYWxyZWFkeSBwcmVzZW50IG9uIHF1ZXJ5IHN0cmluZywganVzdCBpbnNlcnRzIGR1cGUgdmFsdWVzXG4gICAgdXJsID0gdXJsLnNsaWNlKDAsIHFzX2luZGV4KSArIHVybF9wYXJhbXMgKyB1cmwuc2xpY2UocXNfaW5kZXgpICsgaGFzaDtcblxuICAgIHJldHVybiB1cmw7XG59XG5cbi8vIFBvbHlmaWxsIChmb3IgU2FmYXJpIGNvbXBhdGliaWxpdHkpXG5sZXQgX2NyZWF0ZU9iamVjdFVSTDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPYmplY3RVUkwgKHVybCkge1xuICAgIGlmIChfY3JlYXRlT2JqZWN0VVJMID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgX2NyZWF0ZU9iamVjdFVSTCA9ICh3aW5kb3cuVVJMICYmIHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKSB8fCAod2luZG93LndlYmtpdFVSTCAmJiB3aW5kb3cud2Via2l0VVJMLmNyZWF0ZU9iamVjdFVSTCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBfY3JlYXRlT2JqZWN0VVJMICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBfY3JlYXRlT2JqZWN0VVJMID0gbnVsbDtcbiAgICAgICAgICAgIGxvZygnd2FybicsIGB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCAob3IgdmVuZG9yIHByZWZpeCkgbm90IGZvdW5kLCB1bmFibGUgdG8gY3JlYXRlIGxvY2FsIGJsb2IgVVJMc2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF9jcmVhdGVPYmplY3RVUkwpIHtcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVPYmplY3RVUkwodXJsKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxufVxuXG4vLyBHZXQgVVJMIHRoYXQgdGhlIGN1cnJlbnQgc2NyaXB0IHdhcyBsb2FkZWQgZnJvbVxuLy8gSWYgY3VycmVudFNjcmlwdCBpcyBub3QgYXZhaWxhYmxlLCBsb29wcyB0aHJvdWdoIDxzY3JpcHQ+IGVsZW1lbnRzIHNlYXJjaGluZyBmb3IgYSBsaXN0IG9mIHByb3ZpZGVkIHBhdGhzXG4vLyBlLmcuIGZpbmRDdXJyZW50VVJMKCd0YW5ncmFtLmRlYnVnLmpzJywgJ3RhbmdyYW0ubWluLmpzJyk7XG5leHBvcnQgZnVuY3Rpb24gZmluZEN1cnJlbnRVUkwgKC4uLnBhdGhzKSB7XG4gICAgLy8gRmluZCBjdXJyZW50bHkgZXhlY3V0aW5nIHNjcmlwdFxuICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0O1xuICAgIGlmIChzY3JpcHQpIHtcbiAgICAgICAgcmV0dXJuIHNjcmlwdC5zcmM7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGF0aHMpKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIG9uIGxvb3BpbmcgdGhyb3VnaCA8c2NyaXB0PiBlbGVtZW50cyBpZiBkb2N1bWVudC5jdXJyZW50U2NyaXB0IGlzIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7XG4gICAgICAgIGZvciAodmFyIHM9MDsgcyA8IHNjcmlwdHMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHA9MDsgcCA8IHBhdGhzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcmlwdHNbc10uc3JjLmluZGV4T2YocGF0aHNbcF0pID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0c1tzXS5zcmM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy8gTWlzY2VsbGFuZW91cyB1dGlsaXRpZXNcbi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5cbmltcG9ydCBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IFRocmVhZCBmcm9tICcuL3RocmVhZCc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vd29ya2VyX2Jyb2tlcic7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbnZhciBVdGlscztcbmV4cG9ydCBkZWZhdWx0IFV0aWxzID0ge307XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ1V0aWxzJywgVXRpbHMpO1xuXG4vLyBCYXNpYyBTYWZhcmkgZGV0ZWN0aW9uXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc5NDQ0NjAvZGV0ZWN0LXNhZmFyaS1icm93c2VyXG5VdGlscy5pc1NhZmFyaSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbn07XG5cbi8vIEJhc2ljIElFMTEgb3IgRWRnZSBkZXRlY3Rpb25cblV0aWxzLmlzTWljcm9zb2Z0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvKFRyaWRlbnRcXC83LjB8RWRnZVsgL10oXFxkK1tcXC5cXGRdKykpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbn07XG5cblV0aWxzLl9yZXF1ZXN0cyA9IHt9OyAgICAgICAvLyBYSFIgcmVxdWVzdHMgb24gY3VycmVudCB0aHJlYWRcblV0aWxzLl9wcm94eV9yZXF1ZXN0cyA9IHt9OyAvLyBYSFIgcmVxdWVzdHMgcHJveGllZCB0byBtYWluIHRocmVhZFxuXG4vLyBgcmVxdWVzdF9rZXlgIGlzIGEgdXNlci1wcm92aWRlZCBrZXkgdGhhdCBjYW4gYmUgbGF0ZXIgdXNlZCB0byBjYW5jZWwgdGhlIHJlcXVlc3RcblV0aWxzLmlvID0gZnVuY3Rpb24gKHVybCwgdGltZW91dCA9IDYwMDAwLCByZXNwb25zZVR5cGUgPSAndGV4dCcsIG1ldGhvZCA9ICdHRVQnLCBoZWFkZXJzID0ge30sIHJlcXVlc3Rfa2V5ID0gbnVsbCwgcHJveHkgPSBmYWxzZSkge1xuICAgIGlmIChUaHJlYWQuaXNfd29ya2VyICYmIFV0aWxzLmlzTWljcm9zb2Z0KCkpIHtcbiAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJRTExIGFuZCBFZGdlIHdpbGwgaGFuZyB3ZWIgd29ya2VycyB3aGVuIHBlcmZvcm1pbmcgWEhSIHJlcXVlc3RzXG4gICAgICAgIC8vIFRoZXNlIHJlcXVlc3RzIGNhbiBiZSBwcm94aWVkIHRocm91Z2ggdGhlIG1haW4gdGhyZWFkXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzk1NDU4NjYvXG4gICAgICAgIGxvZygnZGVidWcnLCAnUHJveHlpbmcgcmVxdWVzdCBmb3IgVVJMIHRvIHdvcmtlcicsIHVybCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3Rfa2V5KSB7XG4gICAgICAgICAgICBVdGlscy5fcHJveHlfcmVxdWVzdHNbcmVxdWVzdF9rZXldID0gdHJ1ZTsgLy8gbWFyayBhcyBwcm94aWVkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnVXRpbHMuaW8nLCB1cmwsIHRpbWVvdXQsIHJlc3BvbnNlVHlwZSwgbWV0aG9kLCBoZWFkZXJzLCByZXF1ZXN0X2tleSwgdHJ1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3Qub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXF1ZXN0LnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGU7XG4gICAgICAgICAgICByZXF1ZXN0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoWyd0ZXh0JywgJ2pzb24nXS5pbmRleE9mKHJlcXVlc3QucmVzcG9uc2VUeXBlKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVxdWVzdC5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoJ1JlcXVlc3QgZXJyb3Igd2l0aCBhIHN0YXR1cyBvZiAnICsgcmVxdWVzdC5zdGF0dXNUZXh0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldnQpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoJ1RoZXJlIHdhcyBhIG5ldHdvcmsgZXJyb3InICsgZXZ0LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXF1ZXN0Lm9udGltZW91dCA9IChldnQpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoJ3RpbWVvdXQgJysgZXZ0LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXF1ZXN0LnNlbmQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdF9rZXkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgVXRpbHMuX3JlcXVlc3RzW3JlcXVlc3Rfa2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3h5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcyhyZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0X2tleSkge1xuICAgICAgICAgICAgVXRpbHMuX3JlcXVlc3RzW3JlcXVlc3Rfa2V5XSA9IHJlcXVlc3Q7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG59O1xuXG4vLyDDh2FuY2VsIGEgcGVuZGluZyBuZXR3b3JrIHJlcXVlc3QgYnkgdXNlci1wcm92aWRlZCByZXF1ZXN0IGtleVxuVXRpbHMuY2FuY2VsUmVxdWVzdCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAvLyBDaGVjayBmb3IgYSByZXF1ZXN0IHRoYXQgd2FzIHByb3hpZWQgdG8gdGhlIG1haW4gdGhyZWFkXG4gICAgaWYgKFRocmVhZC5pc193b3JrZXIgJiYgVXRpbHMuX3Byb3h5X3JlcXVlc3RzW2tleV0pIHtcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnVXRpbHMuY2FuY2VsUmVxdWVzdCcsIGtleSk7IC8vIGZvcndhcmQgdG8gbWFpbiB0aHJlYWRcbiAgICB9XG5cbiAgICBsZXQgcmVxID0gVXRpbHMuX3JlcXVlc3RzW2tleV07XG4gICAgaWYgKHJlcSkge1xuICAgICAgICBsb2coJ3RyYWNlJywgYENhbmNlbGxpbmcgbmV0d29yayByZXF1ZXN0IGtleSAnJHtrZXl9J2ApO1xuICAgICAgICBVdGlscy5fcmVxdWVzdHNba2V5XS5hYm9ydCgpO1xuICAgICAgICBkZWxldGUgVXRpbHMuX3JlcXVlc3RzW2tleV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsb2coJ3RyYWNlJywgYENvdWxkIG5vdCBmaW5kIG5ldHdvcmsgcmVxdWVzdCBrZXkgJyR7a2V5fSdgKTtcbiAgICB9XG59O1xuXG4vLyBOZWVkZWQgZm9yIG9sZGVyIGJyb3dzZXJzIHRoYXQgc3RpbGwgc3VwcG9ydCBXZWJHTCAoU2FmYXJpIDYgZXRjLilcblV0aWxzLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID1cbiAgICAgICAgICAgIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgICAgfHxcbiAgICAgICAgICAgIHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgICAgfHxcbiAgICAgICAgICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSAgICAgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoY2IsIDEwMDAgLzYwKTtcbiAgICAgICAgICAgIH07XG4gICAgfVxufTtcblxuLy8gU3RyaW5naWZ5IGFuIG9iamVjdCBpbnRvIEpTT04sIGJ1dCBjb252ZXJ0IGZ1bmN0aW9ucyB0byBzdHJpbmdzXG5VdGlscy5zZXJpYWxpemVXaXRoRnVuY3Rpb25zID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHZhciBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkob2JqLCBmdW5jdGlvbihrLCB2KSB7XG4gICAgICAgIC8vIENvbnZlcnQgZnVuY3Rpb25zIHRvIHN0cmluZ3NcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG59O1xuXG4vLyBSZWN1cnNpdmVseSBwYXJzZSBhbiBvYmplY3QsIGF0dGVtcHRpbmcgdG8gY29udmVydCBzdHJpbmcgcHJvcGVydGllcyB0aGF0IGxvb2sgbGlrZSBmdW5jdGlvbnMgYmFjayBpbnRvIGZ1bmN0aW9uc1xuVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zID0gZnVuY3Rpb24ob2JqLCB3cmFwKSB7XG4gICAgLy8gQ29udmVydCBzdHJpbmdcbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb2JqID0gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihvYmosIHdyYXApO1xuICAgIH1cbiAgICAvLyBMb29wIHRocm91Z2ggb2JqZWN0IHByb3BlcnRpZXNcbiAgICBlbHNlIGlmIChvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGxldCBwIGluIG9iaikge1xuICAgICAgICAgICAgb2JqW3BdID0gVXRpbHMuc3RyaW5nc1RvRnVuY3Rpb25zKG9ialtwXSwgd3JhcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIENvbnZlcnQgc3RyaW5nIGJhY2sgaW50byBhIGZ1bmN0aW9uXG5VdGlscy5zdHJpbmdUb0Z1bmN0aW9uID0gZnVuY3Rpb24odmFsLCB3cmFwKSB7XG4gICAgLy8gUGFyc2UgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCBib2R5XG4gICAgbGV0IGZtYXRjaCA9XG4gICAgICAgICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgJiZcbiAgICAgICAgdmFsLm1hdGNoKC9eXFxzKmZ1bmN0aW9uW14oXSpcXCgoW14pXSopXFwpXFxzKj9cXHsoW1xcc1xcU10qKVxcfSQvbSk7XG5cbiAgICBpZiAoZm1hdGNoICYmIGZtYXRjaC5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgc3JjID0gZm1hdGNoWzJdO1xuICAgICAgICAgICAgbGV0IGFyZ3MgPSBmbWF0Y2hbMV0ubGVuZ3RoID4gMCAmJiBmbWF0Y2hbMV0uc3BsaXQoJywnKS5tYXAoeCA9PiB4LnRyaW0oKSkuZmlsdGVyKHggPT4geCk7XG4gICAgICAgICAgICBhcmdzID0gYXJncy5sZW5ndGggPiAwID8gYXJncyA6IFsnY29udGV4dCddOyAvLyBkZWZhdWx0IHRvIHNpbmdsZSAnY29udGV4dCcgYXJndW1lbnRcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3cmFwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbiguLi5hcmdzLCB3cmFwKHNyYykpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oLi4uYXJncywgc3JjKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGZhbGwtYmFjayB0byBvcmlnaW5hbCB2YWx1ZSBpZiBwYXJzaW5nIGZhaWxlZFxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufTtcblxuLy8gRGVmYXVsdCB0byBhbGxvd2luZyBoaWdoIHBpeGVsIGRlbnNpdHlcbi8vIFJldHVybnMgdHJ1ZSBpZiBkaXNwbGF5IGRlbnNpdHkgY2hhbmdlZFxuVXRpbHMudXNlX2hpZ2hfZGVuc2l0eV9kaXNwbGF5ID0gdHJ1ZTtcblV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHByZXYgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvID0gKFV0aWxzLnVzZV9oaWdoX2RlbnNpdHlfZGlzcGxheSAmJiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbykgfHwgMTtcbiAgICByZXR1cm4gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvICE9PSBwcmV2O1xufTtcblxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgVXRpbHMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbygpO1xufVxuXG4vLyBVc2VkIGZvciBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBwb3dlci1vZi0yIGFuZCBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuLy8gVmlhOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5NzIyMjQ3L3dlYmdsLXdhaXQtZm9yLXRleHR1cmUtdG8tbG9hZFxuVXRpbHMuaXNQb3dlck9mMiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAmICh2YWx1ZSAtIDEpKSA9PT0gMDtcbn07XG5cbi8vIEludGVycG9sYXRlICd4JyBhbG9uZyBhIHNlcmllcyBvZiBjb250cm9sIHBvaW50c1xuLy8gJ3BvaW50cycgaXMgYW4gYXJyYXkgb2YgY29udHJvbCBwb2ludHMgaW4gdGhlIGZvcm0gW3gsIHldXG4vL1xuLy8gRXhhbXBsZTpcbi8vICAgICBDb250cm9sIHBvaW50czpcbi8vICAgICAgICAgWzAsIDVdOiAgd2hlbiB4PTAsIHk9NVxuLy8gICAgICAgICBbNCwgMTBdOiB3aGVuIHg9NCwgeT0xMFxuLy9cbi8vICAgICBVdGlscy5pbnRlcnBvbGF0ZSgyLCBbWzAsIDVdLCBbNCwgMTBdXSk7XG4vLyAgICAgLT4gY29tcHV0ZXMgeD0yLCBoYWxmd2F5IGJldHdlZW4geD0wIGFuZCB4PTQ6ICgxMCAtIDUpIC8gMiArNVxuLy8gICAgIC0+IHJldHVybnMgNy41XG4vL1xuLy8gVE9ETzogYWRkIG90aGVyIGludGVycG9sYXRpb24gbWV0aG9kcyBiZXNpZGVzIGxpbmVhclxuLy9cblV0aWxzLmludGVycG9sYXRlID0gZnVuY3Rpb24oeCwgcG9pbnRzLCB0cmFuc2Zvcm0pIHtcbiAgICAvLyBJZiB0aGlzIGRvZXNuJ3QgcmVzZW1ibGUgYSBsaXN0IG9mIGNvbnRyb2wgcG9pbnRzLCBqdXN0IHJldHVybiB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocG9pbnRzKSB8fCAhQXJyYXkuaXNBcnJheShwb2ludHNbMF0pKSB7XG4gICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPCAxKSB7XG4gICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuXG4gICAgdmFyIHgxLCB4MiwgZCwgeSwgeTEsIHkyO1xuXG4gICAgLy8gTWluIGJvdW5kc1xuICAgIGlmICh4IDw9IHBvaW50c1swXVswXSkge1xuICAgICAgICB5ID0gcG9pbnRzWzBdWzFdO1xuICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgeSA9IHRyYW5zZm9ybSh5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNYXggYm91bmRzXG4gICAgZWxzZSBpZiAoeCA+PSBwb2ludHNbcG9pbnRzLmxlbmd0aC0xXVswXSkge1xuICAgICAgICB5ID0gcG9pbnRzW3BvaW50cy5sZW5ndGgtMV1bMV07XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB5ID0gdHJhbnNmb3JtKHkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEZpbmQgd2hpY2ggY29udHJvbCBwb2ludHMgeCBpcyBiZXR3ZWVuXG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGk9MDsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh4ID49IHBvaW50c1tpXVswXSAmJiB4IDwgcG9pbnRzW2krMV1bMF0pIHtcbiAgICAgICAgICAgICAgICAvLyBMaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgICAgICAgICAgICAgIHgxID0gcG9pbnRzW2ldWzBdO1xuICAgICAgICAgICAgICAgIHgyID0gcG9pbnRzW2krMV1bMF07XG5cbiAgICAgICAgICAgICAgICAvLyBNdWx0aXBsZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwb2ludHNbaV1bMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHkgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYz0wOyBjIDwgcG9pbnRzW2ldWzFdLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxID0gdHJhbnNmb3JtKHBvaW50c1tpXVsxXVtjXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSB0cmFuc2Zvcm0ocG9pbnRzW2krMV1bMV1bY10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSB5MiAtIHkxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlbY10gPSBkICogKHggLSB4MSkgLyAoeDIgLSB4MSkgKyB5MTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBwb2ludHNbaSsxXVsxXVtjXSAtIHBvaW50c1tpXVsxXVtjXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5W2NdID0gZCAqICh4IC0geDEpIC8gKHgyIC0geDEpICsgcG9pbnRzW2ldWzFdW2NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNpbmdsZSB2YWx1ZVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB0cmFuc2Zvcm0ocG9pbnRzW2ldWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkyID0gdHJhbnNmb3JtKHBvaW50c1tpKzFdWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSB5MiAtIHkxO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHkxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHBvaW50c1tpKzFdWzFdIC0gcG9pbnRzW2ldWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHBvaW50c1tpXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geTtcbn07XG5cblV0aWxzLnRvQ1NTQ29sb3IgPSBmdW5jdGlvbiAoY29sb3IpIHtcbiAgICBpZiAoY29sb3JbM10gPT09IDEpIHsgLy8gZnVsbCBvcGFjaXR5XG4gICAgICAgIHJldHVybiBgcmdiKCR7Y29sb3Iuc2xpY2UoMCwgMykubWFwKGMgPT4gTWF0aC5yb3VuZChjICogMjU1KSkuam9pbignLCAnKX0pYDtcbiAgICB9XG4gICAgLy8gUkdCIGlzIGJldHdlZW4gWzAsIDI1NV0gb3BhY2l0eSBpcyBiZXR3ZWVuIFswLCAxXVxuICAgIHJldHVybiBgcmdiYSgke2NvbG9yLm1hcCgoYywgaSkgPT4gKGkgPCAzICYmIE1hdGgucm91bmQoYyAqIDI1NSkpIHx8IGMpLmpvaW4oJywgJyl9KWA7XG59O1xuXG5VdGlscy5wb2ludEluVGlsZSA9IGZ1bmN0aW9uIChwb2ludCkge1xuICAgIHJldHVybiBwb2ludFswXSA+PSAwICYmwqBwb2ludFsxXSA+IC1HZW8udGlsZV9zY2FsZSAmJiBwb2ludFswXSA8IEdlby50aWxlX3NjYWxlICYmIHBvaW50WzFdIDw9IDA7XG59O1xuIiwibGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmxldCBwa2cgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uLy4uL3BhY2thZ2UuanNvbicsICd1dGY4JykpO1xubGV0IHZlcnNpb247XG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uID0gJ3YnICsgcGtnLnZlcnNpb247XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG4vLyBXb3JrZXJCcm9rZXIgcm91dGVzIG1lc3NhZ2VzIGJldHdlZW4gd2ViIHdvcmtlcnMgYW5kIHRoZSBtYWluIHRocmVhZCwgYWxsb3dpbmcgZm9yIHNpbXBsZXJcbi8vIGFzeW5jIGNvZGUgdmlhIHByb21pc2VzLiBFeGFtcGxlIHVzYWdlOlxuLy9cbi8vIEluIHdlYiB3b3JrZXIsIHJlZ2lzdGVyIHNlbGYgYXMgYSBjYWxsYWJsZSBcInRhcmdldFwiLCBhbmQgZGVmaW5lIGEgbWV0aG9kOlxuLy9cbi8vICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdzZWxmJywgc2VsZik7XG4vL1xuLy8gICAgIHNlbGYuc3F1YXJlID0gZnVuY3Rpb24gKHgpIHtcbi8vICAgICAgICAgcmV0dXJuIHggKiB4O1xuLy8gICAgIH07XG4vL1xuLy8gSW4gbWFpbiB0aHJlYWQsIGludm9rZSB0aGF0IG1ldGhvZCBhbmQgcmVjZWl2ZSB0aGUgcmVzdWx0IChpZiBhbnkpIGFzIGEgcHJvbWlzZS5cbi8vXG4vLyAgICAgd29ya2VyID0gbmV3IFdvcmtlciguLi4pO1xuLy8gICAgIFdvcmtlckJyb2tlci5hZGRXb3JrZXIod29ya2VyKTtcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHdvcmtlciwgJ3NlbGYuc3F1YXJlJywgNSkudGhlbihmdW5jdGlvbih5KSB7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKHkpO1xuLy8gICAgIH0pO1xuLy9cbi8vICAgICAtPiBwcmludHMgMjVcbi8vXG4vLyBBc3luYyBjb2RlOlxuLy9cbi8vIEZvciBzeW5jaHJvbm91cyBjb2RlIHRoYXQgbXVzdCBwYXNzIGEgcmV0dXJuIHZhbHVlIHRvIHRoZSBtYWluIHRocmVhZCwgdGhlIGZ1bmN0aW9uIGNhbiBzaW1wbHlcbi8vIHJldHVybiBhbiBpbW1lZGlhdGUgdmFsdWUgKHNlZSBleGFtcGxlIGFib3ZlKS4gRm9yIGNhc2VzIHdoZXJlIHRoZSB3b3JrZXIgbWV0aG9kIG5lZWRzIHRvIHJ1blxuLy8gYXN5bmNocm9ub3VzIGNvZGUsIHRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgcHJvbWlzZSwgYW5kIHRoZSByZXNvbHZlZCBvciByZWplY3RlZCB2YWx1ZSB3aWxsXG4vLyBiZSBzZW50IGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkIHdoZW4gdGhlIHByb21pc2UgaXMgZnVsZmlsbGVkLlxuLy9cbi8vIEVycm9yIGhhbmRsaW5nOlxuLy9cbi8vIElmIHRoZSB3b3JrZXIgbWV0aG9kIGVpdGhlciB0aHJvd3MgYW4gZXJyb3IsIG9yIHJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQsIGl0IHdpbGwgYmVcbi8vIHNlbnQgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQgYXMgYSBwcm9taXNlIHJlamVjdGlvbi4gVGhlc2UgdHdvIGV4YW1wbGVzIGFyZSBlcXVpdmFsZW50OlxuLy9cbi8vICAgICBJbiB3b3JrZXIsIHRocm93aW5nIGFuIGVycm9yOlxuLy9cbi8vICAgICAgICAgc2VsZi5icm9rZW4gPSBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vycm9yIGluIHdvcmtlciEnKTtcbi8vICAgICAgICAgfTtcbi8vXG4vLyAgICAgSW4gd29ya2VyLCByZXR1cm5pbmcgYSByZWplY3RlZCBwcm9taXNlOlxuLy9cbi8vICAgICAgICAgc2VsZi5icm9rZW4gPSBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdlcnJvciBpbiB3b3JrZXIhJykpO1xuLy8gICAgICAgICB9O1xuLy9cbi8vICAgICBJbiBtYWluIHRocmVhZCwgYm90aCBlcnJvcnMgYXJlIHJlY2VpdmVkIGFzIGEgcHJvbWlzZSByZWplY3Rpb246XG4vL1xuLy8gICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2Uod29ya2VyLCAnc2VsZi5icm9rZW4nKS50aGVuKFxuLy8gICAgICAgICAgICAgLy8gUHJvbWlzZSByZXNvbHZlZFxuLy8gICAgICAgICAgICAgZnVuY3Rpb24oKSB7XG4vLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3N1Y2Nlc3MhJyk7XG4vLyAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgLy8gUHJvbWlzZSByZWplY3RlZFxuLy8gICAgICAgICAgICAgZnVuY3Rpb24oZXJyb3IpIHtcbi8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IhJywgZXJyb3IpO1xuLy8gICAgICAgICAgICAgfSk7XG4vL1xuLy8gICAgICAgICAtPiBwcmludHMgJ2Vycm9yISBlcnJvciBpbiB3b3JrZXInXG4vL1xuLy8gQ2FsbGluZyBmcm9tIHdvcmtlciB0byBtYWluIHRocmVhZDpcbi8vXG4vLyBUaGUgc2FtZSBzdHlsZSBvZiBjYWxscyBjYW4gYmUgbWFkZSAqZnJvbSogYSB3ZWIgd29ya2VyLCB0byB0aGUgbWFpbiB0aHJlYWQuIFRoZSBBUEkgaXMgdGhlIHNhbWVcbi8vIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCwgJ3dvcmtlcicsIGlzIG5vdCBuZWVkZWQgZm9yIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgpLFxuLy8gc2luY2UgdGhlIG1haW4gdGhyZWFkIGlzIHRoZSBpbXBsaWNpdCB0YXJnZXQuXG4vL1xuLy8gSW4gbWFpbiB0aHJlYWQsIGRlZmluZSBhIG1ldGhvZCBhbmQgcmVnaXN0ZXIgaXQ6XG4vL1xuLy8gICAgIHZhciBnZW9tZXRyeSA9IHtcbi8vICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbih4LCB5KSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xuLy8gICAgICAgICB9XG4vLyAgICAgfTtcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCgnZ2VvbWV0cnknLCBnZW9tZXRyeSk7XG4vL1xuLy8gSW4gd29ya2VyIHRocmVhZCk6XG4vL1xuLy8gICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnZ2VvbWV0cnkubGVuZ3RoJywgMywgNCkudGhlbihmdW5jdGlvbihkKSB7XG4vLyAgICAgICAgIGNvbnNvbGUubG9nKGQpO1xuLy8gICAgIH0pO1xuLy9cbi8vICAgICAtPiBwcmludHMgNVxuLy9cblxuaW1wb3J0IFRocmVhZCBmcm9tICcuL3RocmVhZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcblxudmFyIFdvcmtlckJyb2tlcjtcbmV4cG9ydCBkZWZhdWx0IFdvcmtlckJyb2tlciA9IHt9O1xuXG4vLyBHbG9iYWwgbGlzdCBvZiBhbGwgd29ya2VyIG1lc3NhZ2VzXG4vLyBVbmlxdWVseSB0cmFja3MgZXZlcnkgY2FsbCBtYWRlIGJldHdlZW4gbWFpbiB0aHJlYWQgYW5kIGEgd29ya2VyXG52YXIgbWVzc2FnZV9pZCA9IDA7XG52YXIgbWVzc2FnZXMgPSB7fTtcblxuLy8gUmVnaXN0ZXIgYW4gb2JqZWN0IHRvIHJlY2VpdmUgY2FsbHMgZnJvbSBvdGhlciB0aHJlYWRcbnZhciB0YXJnZXRzID0ge307XG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0ID0gZnVuY3Rpb24gKG5hbWUsIHRhcmdldCkge1xuICAgIHRhcmdldHNbbmFtZV0gPSB0YXJnZXQ7XG59O1xuXG4vLyBHaXZlbiBhIGRvdC1ub3RhdGlvbi1zdHlsZSBtZXRob2QgbmFtZSwgZS5nLiAnT2JqZWN0Lm9iamVjdC5tZXRob2QnLFxuLy8gZmluZCB0aGUgb2JqZWN0IHRvIGNhbGwgdGhlIG1ldGhvZCBvbiBmcm9tIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgdGFyZ2V0c1xuZnVuY3Rpb24gZmluZFRhcmdldCAobWV0aG9kKSB7XG4gICAgdmFyIGNoYWluID0gW107XG4gICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNoYWluID0gbWV0aG9kLnNwbGl0KCcuJyk7XG4gICAgICAgIG1ldGhvZCA9IGNoYWluLnBvcCgpO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXQgPSB0YXJnZXRzO1xuXG4gICAgZm9yIChsZXQgbT0wOyBtIDwgY2hhaW4ubGVuZ3RoOyBtKyspIHtcbiAgICAgICAgaWYgKHRhcmdldFtjaGFpblttXV0pIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldFtjaGFpblttXV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW21ldGhvZCwgdGFyZ2V0XTtcbn1cblxuLy8gTWFpbiB0aHJlYWQ6XG4vLyAtIFNlbmQgbWVzc2FnZXMgdG8gd29ya2VycywgYW5kIG9wdGlvbmFsbHkgcmVjZWl2ZSBhbiBhc3luYyByZXNwb25zZSBhcyBhIHByb21pc2Vcbi8vIC0gUmVjZWl2ZSBtZXNzYWdlcyBmcm9tIHdvcmtlcnMsIGFuZCBvcHRpb25hbGx5IHNlbmQgYW4gYXN5bmMgcmVzcG9uc2UgYmFjayBhcyBhIHByb21pc2VcbmZ1bmN0aW9uIHNldHVwTWFpblRocmVhZCAoKSB7XG5cbiAgICAvLyBTZW5kIGEgbWVzc2FnZSB0byBhIHdvcmtlciwgYW5kIG9wdGlvbmFsbHkgZ2V0IGFuIGFzeW5jIHJlc3BvbnNlXG4gICAgLy8gQXJndW1lbnRzOlxuICAgIC8vICAgLSB3b3JrZXI6IG9uZSBvciBtb3JlIHdlYiB3b3JrZXIgaW5zdGFuY2VzIHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8gKHNpbmdsZSB2YWx1ZSBvciBhcnJheSlcbiAgICAvLyAgIC0gbWV0aG9kOiB0aGUgbWV0aG9kIHdpdGggdGhpcyBuYW1lLCBzcGVjaWZpZWQgd2l0aCBkb3Qtbm90YXRpb24sIHdpbGwgYmUgaW52b2tlZCBpbiB0aGUgd29ya2VyXG4gICAgLy8gICAtIG1lc3NhZ2U6IHNwcmVhZCBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgbWV0aG9kIHdpdGhcbiAgICAvLyBSZXR1cm5zOlxuICAgIC8vICAgLSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBpZiB0aGUgd29ya2VyIG1ldGhvZCByZXR1cm5zIGEgdmFsdWUgKGNvdWxkIGJlIGltbWVkaWF0ZWx5LCBvciBhc3luYylcbiAgICAvL1xuICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSA9IGZ1bmN0aW9uICh3b3JrZXIsIG1ldGhvZCwgLi4ubWVzc2FnZSkge1xuICAgICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIHdvcmtlciBzcGVjaWZpZWQsIHBvc3QgdG8gbXVsdGlwbGVcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkod29ya2VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgIHdvcmtlci5tYXAodyA9PiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodywgbWV0aG9kLCAuLi5tZXNzYWdlKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmFjayBzdGF0ZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlc1ttZXNzYWdlX2lkXSA9IHsgbWV0aG9kLCBtZXNzYWdlLCByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgIGlmIChtZXNzYWdlICYmIG1lc3NhZ2UubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VbMF0gaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSBtZXNzYWdlWzBdLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZVswXS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnbWFpbl9zZW5kJywgICAgICAvLyBtYXJrIG1lc3NhZ2UgYXMgbWV0aG9kIGludm9jYXRpb24gZnJvbSBtYWluIHRocmVhZFxuICAgICAgICAgICAgbWVzc2FnZV9pZCwgICAgICAgICAgICAgLy8gdW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2UsIGZvciBsaWZlIG9mIHByb2dyYW1cbiAgICAgICAgICAgIG1ldGhvZCwgICAgICAgICAgICAgICAgIC8vIHdpbGwgZGlzcGF0Y2ggdG8gYSBmdW5jdGlvbiBvZiB0aGlzIG5hbWUgd2l0aGluIHRoZSB3b3JrZXJcbiAgICAgICAgICAgIG1lc3NhZ2UgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcGF5bG9hZFxuICAgICAgICB9O1xuXG4gICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byB3b3JrZXIgdGhyZWFkYCk7XG4gICAgICAgIH1cblxuICAgICAgICBtZXNzYWdlX2lkKys7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICAvLyBBZGQgYSB3b3JrZXIgdG8gY29tbXVuaWNhdGUgd2l0aCAtIGVhY2ggd29ya2VyIG11c3QgYmUgcmVnaXN0ZXJlZCBmcm9tIHRoZSBtYWluIHRocmVhZFxuICAgIFdvcmtlckJyb2tlci5hZGRXb3JrZXIgPSBmdW5jdGlvbiAod29ya2VyKSB7XG4gICAgICAgIGlmICghKHdvcmtlciBpbnN0YW5jZW9mIFdvcmtlcikpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBhZGQgbm9uLVdvcmtlciBvYmplY3RgLCB3b3JrZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiBXb3JrZXJCcm9rZXJNYWluVGhyZWFkSGFuZGxlcihldmVudCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBtYXliZURlY29kZShldmVudC5kYXRhKTtcbiAgICAgICAgICAgIGxldCBpZCA9IGRhdGEubWVzc2FnZV9pZDtcblxuICAgICAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBjb21pbmcgYmFjayBmcm9tIHRoZSB3b3JrZXIsIGFuZCBmdWxmaWxsIHRoYXQgbWVzc2FnZSdzIHByb21pc2VcbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICd3b3JrZXJfcmVwbHknKSB7XG4gICAgICAgICAgICAgICAgLy8gUGFzcyB0aGUgcmVzdWx0IHRvIHRoZSBwcm9taXNlXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaWRdLnJlamVjdChkYXRhLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZXNvbHZlKGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2VzW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGluaXRpYXRpbmcgYSBjYWxsIGZyb20gdGhlIHdvcmtlciwgZGlzcGF0Y2ggdGhlbSxcbiAgICAgICAgICAgIC8vIGFuZCBzZW5kIGFueSByZXR1cm4gdmFsdWUgYmFjayB0byB0aGUgd29ya2VyXG4gICAgICAgICAgICAvLyBVbmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZSAmIHJldHVybiBjYWxsIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICd3b3JrZXJfc2VuZCcgJiYgaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIHJlcXVlc3RlZCBtZXRob2QgYW5kIHNhdmUgdGhlIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgICAgIHZhciBbbWV0aG9kX25hbWUsIHRhcmdldF0gPSBmaW5kVGFyZ2V0KGRhdGEubWV0aG9kKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IG9uIHRhcmdldCAke2RhdGEudGFyZ2V0fSBiZWNhdXNlIG5vIG9iamVjdCB3aXRoIHRoYXQgbmFtZSBpcyByZWdpc3RlcmVkIG9uIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9ICh0eXBlb2YgdGFyZ2V0W21ldGhvZF9uYW1lXSA9PT0gJ2Z1bmN0aW9uJykgJiYgdGFyZ2V0W21ldGhvZF9uYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IG9uIHRhcmdldCAke2RhdGEudGFyZ2V0fSBiZWNhdXNlIG9iamVjdCBoYXMgbm8gbWV0aG9kIHdpdGggdGhhdCBuYW1lYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCwgZXJyb3I7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kLmFwcGx5KHRhcmdldCwgZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaHJvd24gZXJyb3JzIHdpbGwgYmUgcGFzc2VkIGJhY2sgKGluIHN0cmluZyBmb3JtKSB0byB3b3JrZXJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNlbmQgcmV0dXJuIHZhbHVlIHRvIHdvcmtlclxuICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgICAgICAgICAvLyBBc3luYyByZXN1bHRcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSB2YWx1ZS50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIHdvcmtlciB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm1lc3NhZ2V9OiAke2Vycm9yLnN0YWNrfWAgOiBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW1tZWRpYXRlIHJlc3VsdFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gcmVzdWx0LnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21haW5fcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIHdvcmtlciB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgLy8gRXhwb3NlIGZvciBkZWJ1Z2dpbmdcbiAgICBXb3JrZXJCcm9rZXIuZ2V0TWVzc2FnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlcztcbiAgICB9O1xuXG4gICAgV29ya2VyQnJva2VyLmdldE1lc3NhZ2VJZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VfaWQ7XG4gICAgfTtcblxufVxuXG4vLyBXb3JrZXIgdGhyZWFkczpcbi8vIC0gUmVjZWl2ZSBtZXNzYWdlcyBmcm9tIG1haW4gdGhyZWFkLCBhbmQgb3B0aW9uYWxseSBzZW5kIGFuIGFzeW5jIHJlc3BvbnNlIGJhY2sgYXMgYSBwcm9taXNlXG4vLyAtIFNlbmQgbWVzc2FnZXMgdG8gbWFpbiB0aHJlYWQsIGFuZCBvcHRpb25hbGx5IHJlY2VpdmUgYW4gYXN5bmMgcmVzcG9uc2UgYXMgYSBwcm9taXNlXG5mdW5jdGlvbiBzZXR1cFdvcmtlclRocmVhZCAoKSB7XG5cbiAgICAvLyBTZW5kIGEgbWVzc2FnZSB0byB0aGUgbWFpbiB0aHJlYWQsIGFuZCBvcHRpb25hbGx5IGdldCBhbiBhc3luYyByZXNwb25zZSBhcyBhIHByb21pc2VcbiAgICAvLyBBcmd1bWVudHM6XG4gICAgLy8gICAtIG1ldGhvZDogdGhlIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSwgc3BlY2lmaWVkIHdpdGggZG90LW5vdGF0aW9uLCB3aWxsIGJlIGludm9rZWQgb24gdGhlIG1haW4gdGhyZWFkXG4gICAgLy8gICAtIG1lc3NhZ2U6IGFycmF5IG9mIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBtZXRob2Qgd2l0aFxuICAgIC8vIFJldHVybnM6XG4gICAgLy8gICAtIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIGlmIHRoZSBtYWluIHRocmVhZCBtZXRob2QgcmV0dXJucyBhIHZhbHVlIChjb3VsZCBiZSBpbW1lZGlhdGVseSwgb3IgYXN5bmMpXG4gICAgLy9cbiAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UgPSBmdW5jdGlvbiAobWV0aG9kLCAuLi5tZXNzYWdlKSB7XG4gICAgICAgIC8vIFRyYWNrIHN0YXRlIG9mIHRoaXMgbWVzc2FnZVxuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VzW21lc3NhZ2VfaWRdID0geyBtZXRob2QsIG1lc3NhZ2UsIHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgICB9KTtcblxuICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5sZW5ndGggPT09IDEgJiYgbWVzc2FnZVswXSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IG1lc3NhZ2VbMF0udHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlWzBdLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfc2VuZCcsICAgIC8vIG1hcmsgbWVzc2FnZSBhcyBtZXRob2QgaW52b2NhdGlvbiBmcm9tIHdvcmtlclxuICAgICAgICAgICAgbWVzc2FnZV9pZCwgICAgICAgICAgICAgLy8gdW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2UsIGZvciBsaWZlIG9mIHByb2dyYW1cbiAgICAgICAgICAgIG1ldGhvZCwgICAgICAgICAgICAgICAgIC8vIHdpbGwgZGlzcGF0Y2ggdG8gYSBtZXRob2Qgb2YgdGhpcyBuYW1lIG9uIHRoZSBtYWluIHRocmVhZFxuICAgICAgICAgICAgbWVzc2FnZSAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBwYXlsb2FkXG4gICAgICAgIH07XG5cbiAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byBtYWluIHRocmVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVzc2FnZV9pZCsrO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gV29ya2VyQnJva2VyV29ya2VyVGhyZWFkSGFuZGxlcihldmVudCkge1xuICAgICAgICBsZXQgZGF0YSA9IG1heWJlRGVjb2RlKGV2ZW50LmRhdGEpO1xuICAgICAgICBsZXQgaWQgPSBkYXRhLm1lc3NhZ2VfaWQ7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBjb21pbmcgYmFjayBmcm9tIHRoZSBtYWluIHRocmVhZCwgYW5kIGZ1bGZpbGwgdGhhdCBtZXNzYWdlJ3MgcHJvbWlzZVxuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnbWFpbl9yZXBseScpIHtcbiAgICAgICAgICAgIC8vIFBhc3MgdGhlIHJlc3VsdCB0byB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZWplY3QoZGF0YS5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpZF0ucmVzb2x2ZShkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZXNbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlY2VpdmUgbWVzc2FnZXMgZnJvbSBtYWluIHRocmVhZCwgZGlzcGF0Y2ggdGhlbSwgYW5kIHNlbmQgYmFjayBhIHJlcGx5XG4gICAgICAgIC8vIFVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlICYgcmV0dXJuIGNhbGwgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgZWxzZSBpZiAoZGF0YS50eXBlID09PSAnbWFpbl9zZW5kJyAmJiBpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBDYWxsIHRoZSByZXF1ZXN0ZWQgd29ya2VyIG1ldGhvZCBhbmQgc2F2ZSB0aGUgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICB2YXIgW21ldGhvZF9uYW1lLCB0YXJnZXRdID0gZmluZFRhcmdldChkYXRhLm1ldGhvZCk7XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBkaXNwYXRjaCBtZXNzYWdlIHR5cGUgJHtkYXRhLm1ldGhvZH0gb24gdGFyZ2V0ICR7ZGF0YS50YXJnZXR9IGJlY2F1c2Ugbm8gb2JqZWN0IHdpdGggdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQgb24gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG1ldGhvZCA9ICh0eXBlb2YgdGFyZ2V0W21ldGhvZF9uYW1lXSA9PT0gJ2Z1bmN0aW9uJykgJiYgdGFyZ2V0W21ldGhvZF9uYW1lXTtcblxuICAgICAgICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IGJlY2F1c2Ugd29ya2VyIGhhcyBubyBtZXRob2Qgd2l0aCB0aGF0IG5hbWVgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZXJyb3I7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1ldGhvZC5hcHBseSh0YXJnZXQsIGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhyb3duIGVycm9ycyB3aWxsIGJlIHBhc3NlZCBiYWNrIChpbiBzdHJpbmcgZm9ybSkgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgICAgICBlcnJvciA9IGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNlbmQgcmV0dXJuIHZhbHVlIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgICAgICAvLyBBc3luYyByZXN1bHRcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IHZhbHVlLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW1tZWRpYXRlIHJlc3VsdFxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gcmVzdWx0LnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd29ya2VyX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubWVzc2FnZX06ICR7ZXJyb3Iuc3RhY2t9YCA6IGVycm9yKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxufVxuXG4vLyBTcGVjaWFsIHZhbHVlIHdyYXBwZXIsIHRvIGluZGljYXRlIHRoYXQgd2Ugd2FudCB0byBmaW5kIGFuZCBpbmNsdWRlIHRyYW5zZmVyYWJsZSBvYmplY3RzIGluIHRoZSBtZXNzYWdlXG5Xb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMgPSBmdW5jdGlvbiAoLi4udmFsdWUpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSkge1xuICAgICAgICByZXR1cm4gbmV3IFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcyguLi52YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudHJhbnNmZXJhYmxlcyA9IGZpbmRUcmFuc2ZlcmFibGVzKHRoaXMudmFsdWUpO1xufTtcblxuLy8gQnVpbGQgYSBsaXN0IG9mIHRyYW5zZmVyYWJsZSBvYmplY3RzIGZyb20gYSBzb3VyY2Ugb2JqZWN0XG4vLyBSZXR1cm5zIGEgbGlzdCBvZiBpbmZvIGFib3V0IGVhY2ggdHJhbnNmZXJhYmxlOlxuLy8gICAtIG9iamVjdDogdGhlIGFjdHVhbCB0cmFuc2ZlcmFibGUgb2JqZWN0XG4vLyAgIC0gcGFyZW50OiB0aGUgcGFyZW50IG9iamVjdCB0aGF0IHRoZSB0cmFuc2ZlcmFibGUgaXMgYSBwcm9wZXJ0eSBvZiAoaWYgYW55KVxuLy8gICAtIHByb3BlcnR5OiB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgdHJhbnNmZXJhYmxlIG9uIHRoZSBwYXJlbnQgb2JqZWN0IChpZiBhbnkpXG4vLyBUT0RPOiBhZGQgb3B0aW9uIGluIGNhc2UgeW91IERPTidUIHdhbnQgdG8gdHJhbnNmZXIgb2JqZWN0c1xuZnVuY3Rpb24gZmluZFRyYW5zZmVyYWJsZXMoc291cmNlLCBwYXJlbnQgPSBudWxsLCBwcm9wZXJ0eSA9IG51bGwsIGxpc3QgPSBbXSkge1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgIC8vIENoZWNrIGVhY2ggYXJyYXkgZWxlbWVudFxuICAgICAgICBzb3VyY2UuZm9yRWFjaCgoeCwgaSkgPT4gZmluZFRyYW5zZmVyYWJsZXMoeCwgc291cmNlLCBpLCBsaXN0KSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIElzIHRoZSBvYmplY3QgYSB0cmFuc2ZlcmFibGUgYXJyYXkgYnVmZmVyP1xuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGxpc3QucHVzaCh7IG9iamVjdDogc291cmNlLCBwYXJlbnQsIHByb3BlcnR5IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9yIGxvb2tzIGxpa2UgYSB0eXBlZCBhcnJheSAoaGFzIGFuIGFycmF5IGJ1ZmZlciBwcm9wZXJ0eSk/XG4gICAgICAgIGVsc2UgaWYgKHNvdXJjZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgbGlzdC5wdXNoKHsgb2JqZWN0OiBzb3VyY2UuYnVmZmVyLCBwYXJlbnQsIHByb3BlcnR5IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBlYWNoIHByb3BlcnR5XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBmaW5kVHJhbnNmZXJhYmxlcyhzb3VyY2VbcHJvcF0sIHNvdXJjZSwgcHJvcCwgbGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG59XG5cbi8vIFJlbW92ZSBuZXV0ZXJlZCB0cmFuc2ZlcmFibGVzIGZyb20gcGFyZW50IG9iamVjdHMsIGFzIHRoZXkgc2hvdWxkIG5vIGxvbmdlciBiZSBhY2Nlc3NlZCBhZnRlciB0cmFuc2ZlclxuZnVuY3Rpb24gZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0cmFuc2ZlcmFibGVzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyYW5zZmVyYWJsZXMuZmlsdGVyKHQgPT4gdC5wYXJlbnQgJiYgdC5wcm9wZXJ0eSkuZm9yRWFjaCh0ID0+IGRlbGV0ZSB0LnBhcmVudFt0LnByb3BlcnR5XSk7XG59XG5cbi8vIE1lc3NhZ2UgcGF5bG9hZCBjYW4gYmUgc3RyaW5naWZpZWQgZm9yIGZhc3RlciB0cmFuc2ZlciwgaWYgaXQgZG9lcyBub3QgaW5jbHVkZSB0cmFuc2ZlcmFibGUgb2JqZWN0c1xuZnVuY3Rpb24gbWF5YmVFbmNvZGUgKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpIHtcbiAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZDtcbn1cblxuLy8gUGFyc2Ugc3RyaW5naWZpZWQgbWVzc2FnZSBwYXlsb2FkXG5mdW5jdGlvbiBtYXliZURlY29kZSAoZGF0YSkge1xuICAgIHJldHVybiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGEpO1xufVxuXG4vLyBTZXR1cCB0aGlzIHRocmVhZCBhcyBhcHByb3ByaWF0ZVxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgc2V0dXBNYWluVGhyZWFkKCk7XG59XG5cbmlmIChUaHJlYWQuaXNfd29ya2VyKSB7XG4gICAgc2V0dXBXb3JrZXJUaHJlYWQoKTtcbn1cbiIsIi8qKiogVmVjdG9yIGZ1bmN0aW9ucyAtIHZlY3RvcnMgcHJvdmlkZWQgYXMgW3gsIHksIHpdIGFycmF5cyAqKiovXG5cbnZhciBWZWN0b3I7XG5leHBvcnQgZGVmYXVsdCBWZWN0b3IgPSB7fTtcblxuVmVjdG9yLnNldCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgdmFyIFYgPSBbXTtcbiAgICB2YXIgbGltID0gdi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICBWW2ldID0gdltpXTtcbiAgICB9XG4gICAgcmV0dXJuIFY7XG59O1xuXG5WZWN0b3IubmVnID0gZnVuY3Rpb24gKHYpIHtcbiAgICB2YXIgViA9IFtdO1xuICAgIHZhciBsaW0gPSB2Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIFZbaV0gPSB2W2ldICogLTE7XG4gICAgfVxuICAgIHJldHVybiBWO1xufTtcblxuLy8gQWRkaXRpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5hZGQgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXTtcbiAgICB2YXIgbGltID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICB2W2ldID0gdjFbaV0gKyB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG4vLyBTdWJzdHJhY3Rpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5zdWIgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXTtcbiAgICB2YXIgbGltID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIHZbaV0gPSB2MVtpXSAtIHYyW2ldO1xuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cblZlY3Rvci5zaWduZWRfYXJlYSA9IGZ1bmN0aW9uICh2MSwgdjIsIHYzKSB7XG4gICAgcmV0dXJuICh2MlswXS12MVswXSkqKHYzWzFdLXYxWzFdKSAtICh2M1swXS12MVswXSkqKHYyWzFdLXYxWzFdKTtcbn07XG5cbi8vIE11bHRpcGxpY2F0aW9uIG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IubXVsdCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdLFxuICAgICAgICBsZW4gPSB2MS5sZW5ndGgsXG4gICAgICAgIGk7XG5cbiAgICBpZiAodHlwZW9mIHYyID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBNdWxpdHBseSBieSBzY2FsYXJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gKiB2MjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gTXVsdGlwbHkgdHdvIHZlY3RvcnNcbiAgICAgICAgbGVuID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldICogdjJbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG4vLyBEaXZpc2lvbiBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmRpdiA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdLFxuICAgICAgICBpO1xuICAgIGlmKHR5cGVvZiB2MiA9PT0gJ251bWJlcicpe1xuICAgICAgICAvLyBEaXZpZGUgYnkgc2NhbGFyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB2MS5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gLyB2MjtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpdmlkZSB0byB2ZWN0b3JzXG4gICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbih2MS5sZW5ndGgsdjIubGVuZ3RoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gLyB2MltpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cbi8vIEdldCAyRCBwZXJwZW5kaWN1bGFyXG5WZWN0b3IucGVycCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICByZXR1cm4gWyB2MlsxXSAtIHYxWzFdLFxuICAgICAgICAgICAgIHYxWzBdIC0gdjJbMF0gXTtcbn07XG5cbi8vIEdldCAyRCB2ZWN0b3Igcm90YXRlZFxuVmVjdG9yLnJvdCA9IGZ1bmN0aW9uICh2LCBhKSB7XG4gICAgdmFyIGMgPSBNYXRoLmNvcyhhKTtcbiAgICB2YXIgcyA9IE1hdGguc2luKGEpO1xuICAgIHJldHVybiBbdlswXSAqIGMgLSB2WzFdICogcyxcbiAgICAgICAgICAgIHZbMF0gKiBzICsgdlsxXSAqIGNdO1xufTtcblxuLy8gR2V0IDJEIGhlYWRpbmcgYW5nbGVcblZlY3Rvci5hbmdsZSA9IGZ1bmN0aW9uIChbeCwgeV0pIHtcbiAgICByZXR1cm4gTWF0aC5hdGFuMih5LHgpO1xufTtcblxuLy8gR2V0IGFuZ2xlIGJldHdlZW4gdHdvIHZlY3RvcnNcblZlY3Rvci5hbmdsZUJldHdlZW4gPSBmdW5jdGlvbihBLCBCKXtcbiAgICB2YXIgZGVsdGEgPSBWZWN0b3IuZG90KEEsIEIpO1xuICAgIGlmIChkZWx0YSA8IC0xKSB7XG4gICAgICAgIGRlbHRhID0gLTE7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmFjb3MoZGVsdGEpO1xufTtcblxuLy8gQ29tcGFyZSB0d28gcG9pbnRzXG5WZWN0b3IuaXNFcXVhbCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgbGVuID0gdjEubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKHYxW2ldICE9PSB2MltpXSl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vLyBWZWN0b3IgbGVuZ3RoIHNxdWFyZWRcblZlY3Rvci5sZW5ndGhTcSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgaWYgKHYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiAodlswXSp2WzBdICsgdlsxXSp2WzFdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodi5sZW5ndGggPj0gMykge1xuICAgICAgICByZXR1cm4gKHZbMF0qdlswXSArIHZbMV0qdlsxXSArIHZbMl0qdlsyXSk7XG4gICAgfVxuICAgIHJldHVybiAwO1xufTtcblxuLy8gVmVjdG9yIGxlbmd0aFxuVmVjdG9yLmxlbmd0aCA9IGZ1bmN0aW9uICh2KSB7XG4gICAgcmV0dXJuIE1hdGguc3FydChWZWN0b3IubGVuZ3RoU3EodikpO1xufTtcblxuLy8gTm9ybWFsaXplIGEgdmVjdG9yXG5WZWN0b3Iubm9ybWFsaXplID0gZnVuY3Rpb24gKHYpIHtcbiAgICB2YXIgZDtcbiAgICBpZiAodi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgZCA9IHZbMF0qdlswXSArIHZbMV0qdlsxXTtcbiAgICAgICAgZCA9IE1hdGguc3FydChkKTtcblxuICAgICAgICBpZiAoZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFt2WzBdIC8gZCwgdlsxXSAvIGRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbMCwgMF07XG4gICAgfSBlbHNlIGlmICh2Lmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGQgPSB2WzBdKnZbMF0gKyB2WzFdKnZbMV0gKyB2WzJdKnZbMl07XG4gICAgICAgIGQgPSBNYXRoLnNxcnQoZCk7XG5cbiAgICAgICAgaWYgKGQgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbdlswXSAvIGQsIHZbMV0gLyBkLCB2WzJdIC8gZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFswLCAwLCAwXTtcbn07XG5cbi8vIENyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5jcm9zcyAgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgKHYxWzFdICogdjJbMl0pIC0gKHYxWzJdICogdjJbMV0pLFxuICAgICAgICAodjFbMl0gKiB2MlswXSkgLSAodjFbMF0gKiB2MlsyXSksXG4gICAgICAgICh2MVswXSAqIHYyWzFdKSAtICh2MVsxXSAqIHYyWzBdKVxuICAgIF07XG59O1xuXG4vLyBEb3QgcHJvZHVjdCBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmRvdCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgbiA9IDA7XG4gICAgdmFyIGxpbSA9IE1hdGgubWluKHYxLmxlbmd0aCwgdjIubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIG4gKz0gdjFbaV0gKiB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG59O1xuIiwiaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuaW1wb3J0IENhbWVyYSBmcm9tICcuL2NhbWVyYSc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgc3Vic2NyaWJlTWl4aW4gZnJvbSAnLi91dGlscy9zdWJzY3JpYmUnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5cbmV4cG9ydCBjb25zdCBWSUVXX1BBTl9TTkFQX1RJTUUgPSAwLjU7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuXG4gICAgY29uc3RydWN0b3IgKHNjZW5lLCBvcHRpb25zKSB7XG4gICAgICAgIHN1YnNjcmliZU1peGluKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgICAgdGhpcy5jcmVhdGVNYXRyaWNlcygpO1xuXG4gICAgICAgIHRoaXMuem9vbSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2VudGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBudWxsO1xuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBudWxsO1xuXG4gICAgICAgIHRoaXMucGFubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhbm5pbmdfc3RvcF9hdCA9IDA7XG4gICAgICAgIHRoaXMucGFuX3NuYXBfdGltZXIgPSAwO1xuICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy56b29tX2RpcmVjdGlvbiA9IDA7XG5cbiAgICAgICAgLy8gU2l6ZSBvZiB2aWV3cG9ydCBpbiBDU1MgcGl4ZWxzLCBkZXZpY2UgcGl4ZWxzLCBhbmQgbWVyY2F0b3IgbWV0ZXJzXG4gICAgICAgIHRoaXMuc2l6ZSA9IHtcbiAgICAgICAgICAgIGNzczoge30sXG4gICAgICAgICAgICBkZXZpY2U6IHt9LFxuICAgICAgICAgICAgbWV0ZXJzOiB7fVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFzcGVjdCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5idWZmZXIgPSAwO1xuICAgICAgICB0aGlzLmNvbnRpbnVvdXNfem9vbSA9ICh0eXBlb2Ygb3B0aW9ucy5jb250aW51b3VzWm9vbSA9PT0gJ2Jvb2xlYW4nKSA/IG9wdGlvbnMuY29udGludW91c1pvb20gOiB0cnVlO1xuICAgICAgICB0aGlzLnRpbGVfc2ltcGxpZmljYXRpb25fbGV2ZWwgPSAwOyAvLyBsZXZlbC1vZi1kZXRhaWwgZG93bnNhbXBsaW5nIHRvIGFwcGx5IHRvIHRpbGUgbG9hZGluZ1xuICAgICAgICB0aGlzLnByZXNlcnZlX3RpbGVzX3dpdGhpbl96b29tID0gMTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgc3RhdGUgYmVmb3JlIHNjZW5lIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAgcmVzZXQgKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBjYW1lcmFcbiAgICBjcmVhdGVDYW1lcmEgKCkge1xuICAgICAgICBsZXQgYWN0aXZlX2NhbWVyYSA9IHRoaXMuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgICAgIGlmIChhY3RpdmVfY2FtZXJhKSB7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYSA9IENhbWVyYS5jcmVhdGUoYWN0aXZlX2NhbWVyYSwgdGhpcywgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1thY3RpdmVfY2FtZXJhXSk7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYS51cGRhdGVWaWV3KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgYWN0aXZlIGNhbWVyYSAtIGZvciBwdWJsaWMgQVBJXG4gICAgZ2V0QWN0aXZlQ2FtZXJhICgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2NlbmUuY29uZmlnICYmIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW25hbWVdLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIG5vIGNhbWVyYSBzZXQgYXMgYWN0aXZlLCB1c2UgZmlyc3Qgb25lXG4gICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXMpO1xuICAgICAgICAgICAgcmV0dXJuIGtleXMubGVuZ3RoICYmIGtleXNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgYWN0aXZlIGNhbWVyYSBhbmQgcmVjb21waWxlIC0gZm9yIHB1YmxpYyBBUElcbiAgICBzZXRBY3RpdmVDYW1lcmEgKG5hbWUpIHtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgICAgICBpZiAodGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXS5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBDbGVhciBwcmV2aW91c2x5IGFjdGl2ZSBjYW1lcmFcbiAgICAgICAgICAgIGlmIChwcmV2ICYmIHByZXYgIT09IG5hbWUgJiYgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1twcmV2XSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW3ByZXZdLmFjdGl2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2NlbmUudXBkYXRlQ29uZmlnKHsgcmVidWlsZDogZmFsc2UgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBtZXRob2QgY2FsbGVkIG9uY2UgcGVyIGZyYW1lXG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgdGhpcy5jYW1lcmEudXBkYXRlKCk7XG4gICAgICAgIHRoaXMucGFuX3NuYXBfdGltZXIgPSAoKCtuZXcgRGF0ZSgpKSAtIHRoaXMucGFubmluZ19zdG9wX2F0KSAvIDEwMDA7XG4gICAgfVxuXG4gICAgLy8gU2V0IGxvZ2ljYWwgcGl4ZWwgc2l6ZSBvZiB2aWV3cG9ydFxuICAgIHNldFZpZXdwb3J0U2l6ZSAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICB0aGlzLnNpemUuY3NzID0geyB3aWR0aCwgaGVpZ2h0IH07XG4gICAgICAgIHRoaXMuc2l6ZS5kZXZpY2UgPSB7XG4gICAgICAgICAgICB3aWR0aDogTWF0aC5yb3VuZCh0aGlzLnNpemUuY3NzLndpZHRoICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAgICAgICAgIGhlaWdodDogTWF0aC5yb3VuZCh0aGlzLnNpemUuY3NzLmhlaWdodCAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbylcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hc3BlY3QgPSB0aGlzLnNpemUuY3NzLndpZHRoIC8gdGhpcy5zaXplLmNzcy5oZWlnaHQ7XG4gICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBtYXAgdmlldywgY2FuIGJlIHBhc3NlZCBhbiBvYmplY3Qgd2l0aCBsYXQvbG5nIGFuZC9vciB6b29tXG4gICAgc2V0VmlldyAoeyBsbmcsIGxhdCwgem9vbSB9ID0ge30pIHtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBTZXQgY2VudGVyXG4gICAgICAgIGlmICh0eXBlb2YgbG5nID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgbGF0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNlbnRlciB8fCBsbmcgIT09IHRoaXMuY2VudGVyLmxuZyB8fCBsYXQgIT09IHRoaXMuY2VudGVyLmxhdCkge1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2VudGVyID0geyBsbmc6IEdlby53cmFwTG5nKGxuZyksIGxhdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHpvb21cbiAgICAgICAgaWYgKHR5cGVvZiB6b29tID09PSAnbnVtYmVyJyAmJiB6b29tICE9PSB0aGlzLnpvb20pIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRab29tKHpvb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuXG4gICAgc2V0Wm9vbSAoem9vbSkge1xuICAgICAgICBpZiAodGhpcy56b29taW5nKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxhc3RfdGlsZV96b29tID0gdGhpcy50aWxlX3pvb207XG4gICAgICAgIGxldCB0aWxlX3pvb20gPSB0aGlzLnRpbGVab29tKHpvb20pO1xuICAgICAgICBpZiAoIXRoaXMuY29udGludW91c196b29tKSB7XG4gICAgICAgICAgICB6b29tID0gdGlsZV96b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbGVfem9vbSAhPT0gbGFzdF90aWxlX3pvb20pIHtcbiAgICAgICAgICAgIHRoaXMuem9vbV9kaXJlY3Rpb24gPSB0aWxlX3pvb20gPiBsYXN0X3RpbGVfem9vbSA/IDEgOiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnRpbGVfem9vbSA9IHRpbGVfem9vbTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICB9XG5cbiAgICBzdGFydFpvb20gKCkge1xuICAgICAgICB0aGlzLmxhc3Rfem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgdGhpcy56b29taW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaG9vc2UgdGhlIGJhc2Ugem9vbSBsZXZlbCB0byB1c2UgZm9yIGEgZ2l2ZW4gZnJhY3Rpb25hbCB6b29tXG4gICAgYmFzZVpvb20gKHpvb20pIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3Ioem9vbSk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGEgZ2l2ZW4gdmlldyB6b29tLCB3aGF0IHRpbGUgem9vbSBzaG91bGQgYmUgbG9hZGVkP1xuICAgIHRpbGVab29tICh2aWV3X3pvb20pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVpvb20odmlld196b29tKSAtIHRoaXMudGlsZV9zaW1wbGlmaWNhdGlvbl9sZXZlbDtcbiAgICB9XG5cbiAgICAvLyBGb3IgYSBnaXZlbiB0aWxlIHpvb20sIHdoYXQgc3R5bGUgem9vbSBzaG91bGQgYmUgdXNlZD9cbiAgICBzdHlsZVpvb20gKHRpbGVfem9vbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlWm9vbSh0aWxlX3pvb20pICsgdGhpcy50aWxlX3NpbXBsaWZpY2F0aW9uX2xldmVsO1xuICAgIH1cblxuICAgIHNldFBhbm5pbmcgKHBhbm5pbmcpIHtcbiAgICAgICAgdGhpcy5wYW5uaW5nID0gcGFubmluZztcbiAgICAgICAgaWYgKCF0aGlzLnBhbm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMucGFubmluZ19zdG9wX2F0ID0gKCtuZXcgRGF0ZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlYWR5ICgpIHtcbiAgICAgICAgLy8gVE9ETzogYmV0dGVyIGNvbmNlcHQgb2YgXCJyZWFkaW5lc3NcIiBzdGF0ZT9cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNpemUuY3NzLndpZHRoICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2l6ZS5jc3MuaGVpZ2h0ICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPT0gbnVsbCB8fFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuem9vbSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHZpZXdwb3J0IGJvdW5kcyBiYXNlZCBvbiBjdXJyZW50IGNlbnRlciBhbmQgem9vbVxuICAgIHVwZGF0ZUJvdW5kcyAoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy56b29tKTtcblxuICAgICAgICAvLyBTaXplIG9mIHRoZSBoYWxmLXZpZXdwb3J0IGluIG1ldGVycyBhdCBjdXJyZW50IHpvb21cbiAgICAgICAgdGhpcy5zaXplLm1ldGVycyA9IHtcbiAgICAgICAgICAgIHg6IHRoaXMuc2l6ZS5jc3Mud2lkdGggKiB0aGlzLm1ldGVyc19wZXJfcGl4ZWwsXG4gICAgICAgICAgICB5OiB0aGlzLnNpemUuY3NzLmhlaWdodCAqIHRoaXMubWV0ZXJzX3Blcl9waXhlbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENlbnRlciBvZiB2aWV3cG9ydCBpbiBtZXRlcnMsIGFuZCB0aWxlXG4gICAgICAgIGxldCBbeCwgeV0gPSBHZW8ubGF0TG5nVG9NZXRlcnMoW3RoaXMuY2VudGVyLmxuZywgdGhpcy5jZW50ZXIubGF0XSk7XG4gICAgICAgIHRoaXMuY2VudGVyLm1ldGVycyA9IHsgeCwgeSB9O1xuXG4gICAgICAgIHRoaXMuY2VudGVyLnRpbGUgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5jZW50ZXIubWV0ZXJzLngsIHRoaXMuY2VudGVyLm1ldGVycy55XSwgdGhpcy50aWxlX3pvb20pO1xuXG4gICAgICAgIC8vIEJvdW5kcyBpbiBtZXRlcnNcbiAgICAgICAgdGhpcy5ib3VuZHMgPSB7XG4gICAgICAgICAgICBzdzoge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuY2VudGVyLm1ldGVycy54IC0gdGhpcy5zaXplLm1ldGVycy54IC8gMixcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNlbnRlci5tZXRlcnMueSAtIHRoaXMuc2l6ZS5tZXRlcnMueSAvIDJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZToge1xuICAgICAgICAgICAgICAgIHg6IHRoaXMuY2VudGVyLm1ldGVycy54ICsgdGhpcy5zaXplLm1ldGVycy54IC8gMixcbiAgICAgICAgICAgICAgICB5OiB0aGlzLmNlbnRlci5tZXRlcnMueSArIHRoaXMuc2l6ZS5tZXRlcnMueSAvIDJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNjZW5lLnRpbGVfbWFuYWdlci51cGRhdGVUaWxlc0ZvclZpZXcoKTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ21vdmUnKTtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7IC8vIFRPRE8gYXV0b21hdGUgdmlhIG1vdmUgZXZlbnQ/XG4gICAgfVxuXG4gICAgZmluZFZpc2libGVUaWxlQ29vcmRpbmF0ZXMgKCkge1xuICAgICAgICBpZiAoIXRoaXMuYm91bmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgeiA9IHRoaXMudGlsZV96b29tO1xuICAgICAgICBsZXQgc3cgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5ib3VuZHMuc3cueCwgdGhpcy5ib3VuZHMuc3cueV0sIHopO1xuICAgICAgICBsZXQgbmUgPSBHZW8udGlsZUZvck1ldGVycyhbdGhpcy5ib3VuZHMubmUueCwgdGhpcy5ib3VuZHMubmUueV0sIHopO1xuXG4gICAgICAgIGxldCBjb29yZHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgeCA9IHN3LnggLSB0aGlzLmJ1ZmZlcjsgeCA8PSBuZS54ICsgdGhpcy5idWZmZXI7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IG5lLnkgLSB0aGlzLmJ1ZmZlcjsgeSA8PSBzdy55ICsgdGhpcy5idWZmZXI7IHkrKykge1xuICAgICAgICAgICAgICAgIGNvb3Jkcy5wdXNoKFRpbGUuY29vcmQoeyB4LCB5LCB6IH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29vcmRzO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aWxlcyB0b28gZmFyIG91dHNpZGUgb2Ygdmlld1xuICAgIHBydW5lVGlsZXNGb3JWaWV3ICgpIHtcbiAgICAgICAgLy8gVE9ETzogd2lsbCB0aGlzIGZ1bmN0aW9uIGV2ZXIgYmUgY2FsbGVkIHdoZW4gdmlldyBpc24ndCByZWFkeT9cbiAgICAgICAgaWYgKCF0aGlzLnJlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aWxlcyB0aGF0IGFyZSBhIHNwZWNpZmllZCAjIG9mIHRpbGVzIG91dHNpZGUgb2YgdGhlIHZpZXdwb3J0IGJvcmRlclxuICAgICAgICBsZXQgYm9yZGVyX3RpbGVzID0gW1xuICAgICAgICAgICAgTWF0aC5jZWlsKChNYXRoLmZsb29yKHRoaXMuc2l6ZS5jc3Mud2lkdGggLyBHZW8udGlsZV9zaXplKSArIDIpIC8gMiksXG4gICAgICAgICAgICBNYXRoLmNlaWwoKE1hdGguZmxvb3IodGhpcy5zaXplLmNzcy5oZWlnaHQgLyBHZW8udGlsZV9zaXplKSArIDIpIC8gMilcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLnNjZW5lLnRpbGVfbWFuYWdlci5yZW1vdmVUaWxlcyh0aWxlID0+IHtcbiAgICAgICAgICAgIC8vIElnbm9yZSB2aXNpYmxlIHRpbGVzXG4gICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlIHx8IHRpbGUucHJveHlfZm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGlsZXMgb3V0c2lkZSBnaXZlbiB6b29tIHRoYXQgYXJlIHN0aWxsIGxvYWRpbmdcbiAgICAgICAgICAgIGlmICh0aWxlLmxvYWRpbmcgJiYgdGlsZS5zdHlsZV96b29tICE9PSB0aGlzLnRpbGVfem9vbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEaXNjYXJkIGlmIHRvbyBmYXIgZnJvbSBjdXJyZW50IHpvb21cbiAgICAgICAgICAgIGxldCB6ZGlmZiA9IE1hdGguYWJzKHRpbGUuc3R5bGVfem9vbSAtIHRoaXMudGlsZV96b29tKTtcbiAgICAgICAgICAgIGlmICh6ZGlmZiA+IHRoaXMucHJlc2VydmVfdGlsZXNfd2l0aGluX3pvb20pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGFuZGxlIHRpbGVzIGF0IGRpZmZlcmVudCB6b29tc1xuICAgICAgICAgICAgbGV0IGNvb3JkcyA9IFRpbGUuY29vcmRpbmF0ZUF0Wm9vbSh0aWxlLmNvb3JkcywgdGhpcy50aWxlX3pvb20pO1xuXG4gICAgICAgICAgICAvLyBEaXNjYXJkIHRpbGVzIG91dHNpZGUgYW4gYXJlYSBzdXJyb3VuZGluZyB0aGUgdmlld3BvcnRcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhjb29yZHMueCAtIHRoaXMuY2VudGVyLnRpbGUueCkgLSBib3JkZXJfdGlsZXNbMF0gPiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgVmlldzogcmVtb3ZlIHRpbGUgJHt0aWxlLmtleX0gKGFzICR7Y29vcmRzLnh9LyR7Y29vcmRzLnl9LyR7dGhpcy50aWxlX3pvb219KSBmb3IgYmVpbmcgdG9vIGZhciBvdXQgb2YgdmlzaWJsZSBhcmVhICoqKmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoY29vcmRzLnkgLSB0aGlzLmNlbnRlci50aWxlLnkpIC0gYm9yZGVyX3RpbGVzWzFdID4gdGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFZpZXc6IHJlbW92ZSB0aWxlICR7dGlsZS5rZXl9IChhcyAke2Nvb3Jkcy54fS8ke2Nvb3Jkcy55fS8ke3RoaXMudGlsZV96b29tfSkgZm9yIGJlaW5nIHRvbyBmYXIgb3V0IG9mIHZpc2libGUgYXJlYSAqKipgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWxsb2NhdGUgbW9kZWwtdmlldyBtYXRyaWNlc1xuICAgIC8vIDY0LWJpdCB2ZXJzaW9ucyBhcmUgZm9yIENQVSBjYWxjdWF0aW9uc1xuICAgIC8vIDMyLWJpdCB2ZXJzaW9ucyBhcmUgZG93bnNhbXBsZWQgYW5kIHNlbnQgdG8gR1BVXG4gICAgY3JlYXRlTWF0cmljZXMgKCkge1xuICAgICAgICB0aGlzLm1hdHJpY2VzID0ge307XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWwgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5tb2RlbDMyID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWxfdmlldyA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm1vZGVsX3ZpZXczMiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm5vcm1hbCA9IG5ldyBGbG9hdDY0QXJyYXkoOSk7XG4gICAgICAgIHRoaXMubWF0cmljZXMubm9ybWFsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLmludmVyc2Vfbm9ybWFsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBhbmQgc2V0IG1vZGVsL3ZpZXcgYW5kIG5vcm1hbCBtYXRyaWNlcyBmb3IgYSB0aWxlXG4gICAgc2V0dXBUaWxlICh0aWxlLCBwcm9ncmFtKSB7XG4gICAgICAgIC8vIFRpbGUtc3BlY2lmaWMgc3RhdGVcbiAgICAgICAgLy8gVE9ETzogY2FsYyB0aGVzZSBvbmNlIHBlciB0aWxlIChjdXJyZW50bHkgYmVpbmcgbmVlZGxlc3NseSByZS1jYWxjdWxhdGVkIHBlci10aWxlLXBlci1zdHlsZSlcbiAgICAgICAgdGlsZS5zZXR1cFByb2dyYW0odGhpcy5tYXRyaWNlcywgcHJvZ3JhbSk7XG5cbiAgICAgICAgLy8gTW9kZWwtdmlldyBhbmQgbm9ybWFsIG1hdHJpY2VzXG4gICAgICAgIHRoaXMuY2FtZXJhLnNldHVwTWF0cmljZXModGhpcy5tYXRyaWNlcywgcHJvZ3JhbSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGdlbmVyYWwgdW5pZm9ybXMgdGhhdCBtdXN0IGJlIHVwZGF0ZWQgb25jZSBwZXIgcHJvZ3JhbVxuICAgIHNldHVwUHJvZ3JhbSAocHJvZ3JhbSkge1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzJmdicsICd1X3Jlc29sdXRpb24nLCBbdGhpcy5zaXplLmRldmljZS53aWR0aCwgdGhpcy5zaXplLmRldmljZS5oZWlnaHRdKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9tYXBfcG9zaXRpb24nLCBbdGhpcy5jZW50ZXIubWV0ZXJzLngsIHRoaXMuY2VudGVyLm1ldGVycy55LCB0aGlzLnpvb21dKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X21ldGVyc19wZXJfcGl4ZWwnLCB0aGlzLm1ldGVyc19wZXJfcGl4ZWwpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJywgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3ZpZXdfcGFuX3NuYXBfdGltZXInLCB0aGlzLnBhbl9zbmFwX3RpbWVyKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxaScsICd1X3ZpZXdfcGFubmluZycsIHRoaXMucGFubmluZyk7XG5cbiAgICAgICAgdGhpcy5jYW1lcmEuc2V0dXBQcm9ncmFtKHByb2dyYW0pO1xuICAgIH1cblxuICAgIC8vIFZpZXcgcmVxdWlyZXMgc29tZSBhbmltYXRpb24sIHN1Y2ggYXMgYWZ0ZXIgcGFubmluZyBzdG9wc1xuICAgIGlzQW5pbWF0aW5nICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnBhbl9zbmFwX3RpbWVyIDw9IFZJRVdfUEFOX1NOQVBfVElNRSk7XG4gICAgfVxuXG59XG4iXX0= diff --git a/dist/tangram.min.js b/dist/tangram.min.js index 9db201085..b1e364283 100644 --- a/dist/tangram.min.js +++ b/dist/tangram.min.js @@ -1,18 +1,18 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Tangram=e()}}(function(){var e;return function t(e,r,n){function i(s,a){if(!r[s]){if(!e[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(o)return o(s,!0);var l=new Error("Cannot find module '"+s+"'");throw l.code="MODULE_NOT_FOUND",l}var c=r[s]={exports:{}};e[s][0].call(c.exports,function(t){var r=e[s][1][t];return i(r?r:t)},c,c.exports,t,e,r,n)}return r[s].exports}for(var o="function"==typeof require&&require,s=0;se)throw new RangeError('"size" argument must not be negative')}function l(e,t,r,n){return u(t),0>=t?o(e,t):void 0!==r?"string"==typeof n?o(e,t).fill(r,n):o(e,t).fill(r):o(e,t)}function c(e,t){if(u(t),e=o(e,0>t?0:0|_(t)),!s.TYPED_ARRAY_SUPPORT)for(var r=0;t>r;++r)e[r]=0;return e}function f(e,t,r){if(("string"!=typeof r||""===r)&&(r="utf8"),!s.isEncoding(r))throw new TypeError('"encoding" must be a valid string encoding');var n=0|g(t,r);e=o(e,n);var i=e.write(t,r);return i!==n&&(e=e.slice(0,i)),e}function h(e,t){var r=t.length<0?0:0|_(t.length);e=o(e,r);for(var n=0;r>n;n+=1)e[n]=255&t[n];return e}function d(e,t,r,n){if(t.byteLength,0>r||t.byteLength=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|e}function m(e){return+e!=e&&(e=0),s.alloc(+e)}function g(e,t){if(s.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return W(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return X(e).length;default:if(n)return W(e).length;t=(""+t).toLowerCase(),n=!0}}function v(e,t,r){var n=!1;if((void 0===t||0>t)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),0>=r)return"";if(r>>>=0,t>>>=0,t>=r)return"";for(e||(e="utf8");;)switch(e){case"hex":return N(this,t,r);case"utf8":case"utf-8":return M(this,t,r);case"ascii":return O(this,t,r);case"latin1":case"binary":return z(this,t,r);case"base64":return R(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return j(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function y(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function b(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:-2147483648>r&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:e.length-1),0>r&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(0>r){if(!i)return-1;r=0}if("string"==typeof t&&(t=s.from(t,n)),s.isBuffer(t))return 0===t.length?-1:x(e,t,r,n,i);if("number"==typeof t)return t=255&t,s.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):x(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function x(e,t,r,n,i){function o(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}var s=1,a=e.length,u=t.length;if(void 0!==n&&(n=String(n).toLowerCase(),"ucs2"===n||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;s=2,a/=2,u/=2,r/=2}var l;if(i){var c=-1;for(l=r;a>l;l++)if(o(e,l)===o(t,-1===c?0:l-c)){if(-1===c&&(c=l),l-c+1===u)return c*s}else-1!==c&&(l-=l-c),c=-1}else for(r+u>a&&(r=a-u),l=r;l>=0;l--){for(var f=!0,h=0;u>h;h++)if(o(e,l+h)!==o(t,h)){f=!1;break}if(f)return l}return-1}function w(e,t,r,n){r=Number(r)||0;var i=e.length-r;n?(n=Number(n),n>i&&(n=i)):n=i;var o=t.length;if(o%2!==0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var s=0;n>s;++s){var a=parseInt(t.substr(2*s,2),16);if(isNaN(a))return s;e[r+s]=a}return s}function k(e,t,r,n){return Y(W(t,e.length-r),e,r,n)}function A(e,t,r,n){return Y(Z(t),e,r,n)}function T(e,t,r,n){return A(e,t,r,n)}function E(e,t,r,n){return Y(X(t),e,r,n)}function S(e,t,r,n){return Y(H(t,e.length-r),e,r,n)}function R(e,t,r){return K.fromByteArray(0===t&&r===e.length?e:e.slice(t,r))}function M(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;r>i;){var o=e[i],s=null,a=o>239?4:o>223?3:o>191?2:1;if(r>=i+a){var u,l,c,f;switch(a){case 1:128>o&&(s=o);break;case 2:u=e[i+1],128===(192&u)&&(f=(31&o)<<6|63&u,f>127&&(s=f));break;case 3:u=e[i+1],l=e[i+2],128===(192&u)&&128===(192&l)&&(f=(15&o)<<12|(63&u)<<6|63&l,f>2047&&(55296>f||f>57343)&&(s=f));break;case 4:u=e[i+1],l=e[i+2],c=e[i+3],128===(192&u)&&128===(192&l)&&128===(192&c)&&(f=(15&o)<<18|(63&u)<<12|(63&l)<<6|63&c,f>65535&&1114112>f&&(s=f))}}null===s?(s=65533,a=1):s>65535&&(s-=65536,n.push(s>>>10&1023|55296),s=56320|1023&s),n.push(s),i+=a}return P(n)}function P(e){var t=e.length;if(et>=t)return String.fromCharCode.apply(String,e);for(var r="",n=0;t>n;)r+=String.fromCharCode.apply(String,e.slice(n,n+=et));return r}function O(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;r>i;++i)n+=String.fromCharCode(127&e[i]);return n}function z(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;r>i;++i)n+=String.fromCharCode(e[i]);return n}function N(e,t,r){var n=e.length;(!t||0>t)&&(t=0),(!r||0>r||r>n)&&(r=n);for(var i="",o=t;r>o;++o)i+=q(e[o]);return i}function j(e,t,r){for(var n=e.slice(t,r),i="",o=0;oe)throw new RangeError("offset is not uint");if(e+t>r)throw new RangeError("Trying to access beyond buffer length")}function I(e,t,r,n,i,o){if(!s.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||o>t)throw new RangeError('"value" argument is out of bounds');if(r+n>e.length)throw new RangeError("Index out of range")}function C(e,t,r,n){0>t&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-r,2);o>i;++i)e[r+i]=(t&255<<8*(n?i:1-i))>>>8*(n?i:1-i)}function F(e,t,r,n){0>t&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-r,4);o>i;++i)e[r+i]=t>>>8*(n?i:3-i)&255}function U(e,t,r,n){if(r+n>e.length)throw new RangeError("Index out of range");if(0>r)throw new RangeError("Index out of range")}function D(e,t,r,n,i){return i||U(e,t,r,4,3.4028234663852886e38,-3.4028234663852886e38),$.write(e,t,r,n,23,4),r+4}function B(e,t,r,n,i){return i||U(e,t,r,8,1.7976931348623157e308,-1.7976931348623157e308),$.write(e,t,r,n,52,8),r+8}function G(e){if(e=V(e).replace(tt,""),e.length<2)return"";for(;e.length%4!==0;)e+="=";return e}function V(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function q(e){return 16>e?"0"+e.toString(16):e.toString(16)}function W(e,t){t=t||1/0;for(var r,n=e.length,i=null,o=[],s=0;n>s;++s){if(r=e.charCodeAt(s),r>55295&&57344>r){if(!i){if(r>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(t-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(56320>r){(t-=3)>-1&&o.push(239,191,189),i=r;continue}r=(i-55296<<10|r-56320)+65536}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,128>r){if((t-=1)<0)break;o.push(r)}else if(2048>r){if((t-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(65536>r){if((t-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(1114112>r))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function Z(e){for(var t=[],r=0;r>8,i=r%256,o.push(i),o.push(n);return o}function X(e){return K.toByteArray(G(e))}function Y(e,t,r,n){for(var i=0;n>i&&!(i+r>=t.length||i>=e.length);++i)t[i+r]=e[i];return i}function J(e){return e!==e}var K=e("base64-js"),$=e("ieee754"),Q=e("isarray");r.Buffer=s,r.SlowBuffer=m,r.INSPECT_MAX_BYTES=50,s.TYPED_ARRAY_SUPPORT=void 0!==t.TYPED_ARRAY_SUPPORT?t.TYPED_ARRAY_SUPPORT:n(),r.kMaxLength=i(),s.poolSize=8192,s._augment=function(e){return e.__proto__=s.prototype,e},s.from=function(e,t,r){return a(null,e,t,r)},s.TYPED_ARRAY_SUPPORT&&(s.prototype.__proto__=Uint8Array.prototype,s.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&s[Symbol.species]===s&&Object.defineProperty(s,Symbol.species,{value:null,configurable:!0})),s.alloc=function(e,t,r){return l(null,e,t,r)},s.allocUnsafe=function(e){return c(null,e)},s.allocUnsafeSlow=function(e){return c(null,e)},s.isBuffer=function(e){return!(null==e||!e._isBuffer)},s.compare=function(e,t){if(!s.isBuffer(e)||!s.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var r=e.length,n=t.length,i=0,o=Math.min(r,n);o>i;++i)if(e[i]!==t[i]){r=e[i],n=t[i];break}return n>r?-1:r>n?1:0},s.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},s.concat=function(e,t){if(!Q(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return s.alloc(0);var r;if(void 0===t)for(t=0,r=0;rt;t+=2)y(this,t,t+1);return this},s.prototype.swap32=function(){var e=this.length;if(e%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;e>t;t+=4)y(this,t,t+3),y(this,t+1,t+2);return this},s.prototype.swap64=function(){var e=this.length;if(e%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;e>t;t+=8)y(this,t,t+7),y(this,t+1,t+6),y(this,t+2,t+5),y(this,t+3,t+4);return this},s.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?M(this,0,e):v.apply(this,arguments)},s.prototype.equals=function(e){if(!s.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e?!0:0===s.compare(this,e)},s.prototype.inspect=function(){var e="",t=r.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString("hex",0,t).match(/.{2}/g).join(" "),this.length>t&&(e+=" ... ")),""},s.prototype.compare=function(e,t,r,n,i){if(!s.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),0>t||r>e.length||0>n||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(t>>>=0,r>>>=0,n>>>=0,i>>>=0,this===e)return 0;for(var o=i-n,a=r-t,u=Math.min(o,a),l=this.slice(n,i),c=e.slice(t,r),f=0;u>f;++f)if(l[f]!==c[f]){o=l[f],a=c[f];break}return a>o?-1:o>a?1:0},s.prototype.includes=function(e,t,r){return-1!==this.indexOf(e,t,r)},s.prototype.indexOf=function(e,t,r){return b(this,e,t,r,!0)},s.prototype.lastIndexOf=function(e,t,r){return b(this,e,t,r,!1)},s.prototype.write=function(e,t,r,n){if(void 0===t)n="utf8",r=this.length,t=0;else if(void 0===r&&"string"==typeof t)n=t,r=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t=0|t,isFinite(r)?(r=0|r,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-t;if((void 0===r||r>i)&&(r=i),e.length>0&&(0>r||0>t)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return w(this,e,t,r);case"utf8":case"utf-8":return k(this,e,t,r);case"ascii":return A(this,e,t,r);case"latin1":case"binary":return T(this,e,t,r);case"base64":return E(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},s.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var et=4096;s.prototype.slice=function(e,t){var r=this.length;e=~~e,t=void 0===t?r:~~t,0>e?(e+=r,0>e&&(e=0)):e>r&&(e=r),0>t?(t+=r,0>t&&(t=0)):t>r&&(t=r),e>t&&(t=e);var n;if(s.TYPED_ARRAY_SUPPORT)n=this.subarray(e,t),n.__proto__=s.prototype;else{var i=t-e;n=new s(i,void 0);for(var o=0;i>o;++o)n[o]=this[o+e]}return n},s.prototype.readUIntLE=function(e,t,r){e=0|e,t=0|t,r||L(e,t,this.length);for(var n=this[e],i=1,o=0;++o0&&(i*=256);)n+=this[e+--t]*i;return n},s.prototype.readUInt8=function(e,t){return t||L(e,1,this.length),this[e]},s.prototype.readUInt16LE=function(e,t){return t||L(e,2,this.length),this[e]|this[e+1]<<8},s.prototype.readUInt16BE=function(e,t){return t||L(e,2,this.length),this[e]<<8|this[e+1]},s.prototype.readUInt32LE=function(e,t){return t||L(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},s.prototype.readUInt32BE=function(e,t){return t||L(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},s.prototype.readIntLE=function(e,t,r){e=0|e,t=0|t,r||L(e,t,this.length);for(var n=this[e],i=1,o=0;++o=i&&(n-=Math.pow(2,8*t)),n},s.prototype.readIntBE=function(e,t,r){e=0|e,t=0|t,r||L(e,t,this.length);for(var n=t,i=1,o=this[e+--n];n>0&&(i*=256);)o+=this[e+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*t)),o},s.prototype.readInt8=function(e,t){return t||L(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},s.prototype.readInt16LE=function(e,t){t||L(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt16BE=function(e,t){t||L(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt32LE=function(e,t){return t||L(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},s.prototype.readInt32BE=function(e,t){return t||L(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},s.prototype.readFloatLE=function(e,t){return t||L(e,4,this.length),$.read(this,e,!0,23,4)},s.prototype.readFloatBE=function(e,t){return t||L(e,4,this.length),$.read(this,e,!1,23,4)},s.prototype.readDoubleLE=function(e,t){return t||L(e,8,this.length),$.read(this,e,!0,52,8)},s.prototype.readDoubleBE=function(e,t){return t||L(e,8,this.length),$.read(this,e,!1,52,8)},s.prototype.writeUIntLE=function(e,t,r,n){if(e=+e,t=0|t,r=0|r,!n){var i=Math.pow(2,8*r)-1;I(this,e,t,r,i,0)}var o=1,s=0;for(this[t]=255&e;++s=0&&(s*=256);)this[t+o]=e/s&255;return t+r},s.prototype.writeUInt8=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,1,255,0),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},s.prototype.writeUInt16LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):C(this,e,t,!0),t+2},s.prototype.writeUInt16BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},s.prototype.writeUInt32LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):F(this,e,t,!0),t+4},s.prototype.writeUInt32BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):F(this,e,t,!1),t+4},s.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t=0|t,!n){var i=Math.pow(2,8*r-1);I(this,e,t,r,i-1,-i)}var o=0,s=1,a=0;for(this[t]=255&e;++oe&&0===a&&0!==this[t+o-1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+r},s.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t=0|t,!n){var i=Math.pow(2,8*r-1);I(this,e,t,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[t+o]=255&e;--o>=0&&(s*=256);)0>e&&0===a&&0!==this[t+o+1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+r},s.prototype.writeInt8=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,1,127,-128),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),0>e&&(e=255+e+1),this[t]=255&e,t+1},s.prototype.writeInt16LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):C(this,e,t,!0),t+2},s.prototype.writeInt16BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},s.prototype.writeInt32LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,2147483647,-2147483648),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):F(this,e,t,!0),t+4},s.prototype.writeInt32BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,2147483647,-2147483648),0>e&&(e=4294967295+e+1),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):F(this,e,t,!1),t+4},s.prototype.writeFloatLE=function(e,t,r){return D(this,e,t,!0,r)},s.prototype.writeFloatBE=function(e,t,r){return D(this,e,t,!1,r)},s.prototype.writeDoubleLE=function(e,t,r){return B(this,e,t,!0,r)},s.prototype.writeDoubleBE=function(e,t,r){return B(this,e,t,!1,r)},s.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&r>n&&(n=r),n===r)return 0;if(0===e.length||0===this.length)return 0;if(0>t)throw new RangeError("targetStart out of bounds");if(0>r||r>=this.length)throw new RangeError("sourceStart out of bounds");if(0>n)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-tr&&n>t)for(i=o-1;i>=0;--i)e[i+t]=this[i+r];else if(1e3>o||!s.TYPED_ARRAY_SUPPORT)for(i=0;o>i;++i)e[i+t]=this[i+r];else Uint8Array.prototype.set.call(e,this.subarray(r,r+o),t);return o},s.prototype.fill=function(e,t,r,n){if("string"==typeof e){if("string"==typeof t?(n=t,t=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),1===e.length){var i=e.charCodeAt(0);256>i&&(e=i)}if(void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!s.isEncoding(n))throw new TypeError("Unknown encoding: "+n)}else"number"==typeof e&&(e=255&e);if(0>t||this.length=r)return this;t>>>=0,r=void 0===r?this.length:r>>>0,e||(e=0);var o;if("number"==typeof e)for(o=t;r>o;++o)this[o]=e;else{var a=s.isBuffer(e)?e:W(new s(e,n).toString()),u=a.length;for(o=0;r-t>o;++o)this[o+t]=a[o%u]}return this};var tt=/[^+\/0-9A-Za-z-_]/g}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"base64-js":3,ieee754:4,isarray:5}],3:[function(e,t,r){"use strict";function n(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===e[t-2]?2:"="===e[t-1]?1:0}function i(e){return 3*e.length/4-n(e)}function o(e){var t,r,i,o,s,a,u=e.length;s=n(e),a=new f(3*u/4-s),i=s>0?u-4:u;var l=0;for(t=0,r=0;i>t;t+=4,r+=3)o=c[e.charCodeAt(t)]<<18|c[e.charCodeAt(t+1)]<<12|c[e.charCodeAt(t+2)]<<6|c[e.charCodeAt(t+3)],a[l++]=o>>16&255,a[l++]=o>>8&255,a[l++]=255&o;return 2===s?(o=c[e.charCodeAt(t)]<<2|c[e.charCodeAt(t+1)]>>4,a[l++]=255&o):1===s&&(o=c[e.charCodeAt(t)]<<10|c[e.charCodeAt(t+1)]<<4|c[e.charCodeAt(t+2)]>>2,a[l++]=o>>8&255,a[l++]=255&o),a}function s(e){return l[e>>18&63]+l[e>>12&63]+l[e>>6&63]+l[63&e]}function a(e,t,r){for(var n,i=[],o=t;r>o;o+=3)n=(e[o]<<16)+(e[o+1]<<8)+e[o+2],i.push(s(n));return i.join("")}function u(e){for(var t,r=e.length,n=r%3,i="",o=[],s=16383,u=0,c=r-n;c>u;u+=s)o.push(a(e,u,u+s>c?c:u+s));return 1===n?(t=e[r-1],i+=l[t>>2],i+=l[t<<4&63],i+="=="):2===n&&(t=(e[r-2]<<8)+e[r-1],i+=l[t>>10],i+=l[t>>4&63],i+=l[t<<2&63],i+="="),o.push(i),o.join("")}r.byteLength=i,r.toByteArray=o,r.fromByteArray=u;for(var l=[],c=[],f="undefined"!=typeof Uint8Array?Uint8Array:Array,h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",d=0,p=h.length;p>d;++d)l[d]=h[d],c[h.charCodeAt(d)]=d;c["-".charCodeAt(0)]=62,c["_".charCodeAt(0)]=63},{}],4:[function(e,t,r){r.read=function(e,t,r,n,i){var o,s,a=8*i-n-1,u=(1<>1,c=-7,f=r?i-1:0,h=r?-1:1,d=e[t+f];for(f+=h,o=d&(1<<-c)-1,d>>=-c,c+=a;c>0;o=256*o+e[t+f],f+=h,c-=8);for(s=o&(1<<-c)-1,o>>=-c,c+=n;c>0;s=256*s+e[t+f],f+=h,c-=8);if(0===o)o=1-l;else{if(o===u)return s?0/0:1/0*(d?-1:1);s+=Math.pow(2,n),o-=l}return(d?-1:1)*s*Math.pow(2,o-n)},r.write=function(e,t,r,n,i,o){var s,a,u,l=8*o-i-1,c=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:o-1,p=n?1:-1,_=0>t||0===t&&0>1/t?1:0;for(t=Math.abs(t),isNaN(t)||1/0===t?(a=isNaN(t)?1:0,s=c):(s=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-s))<1&&(s--,u*=2),t+=s+f>=1?h/u:h*Math.pow(2,1-f),t*u>=2&&(s++,u/=2),s+f>=c?(a=0,s=c):s+f>=1?(a=(t*u-1)*Math.pow(2,i),s+=f):(a=t*Math.pow(2,f-1)*Math.pow(2,i),s=0));i>=8;e[r+d]=255&a,d+=p,a/=256,i-=8);for(s=s<0;e[r+d]=255&s,d+=p,s/=256,l-=8);e[r+d-p]|=128*_}},{}],5:[function(e,t){var r={}.toString;t.exports=Array.isArray||function(e){return"[object Array]"==r.call(e)}},{}],6:[function(e,t){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(e){return"function"==typeof e}function i(e){return"number"==typeof e}function o(e){return"object"==typeof e&&null!==e}function s(e){return void 0===e}t.exports=r,r.EventEmitter=r,r.prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(e){if(!i(e)||0>e||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,r,i,a,u,l;if(this._events||(this._events={}),"error"===e&&(!this._events.error||o(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;var c=new Error('Uncaught, unspecified "error" event. ('+t+")");throw c.context=t,c}if(r=this._events[e],s(r))return!1;if(n(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),r.apply(this,a)}else if(o(r))for(a=Array.prototype.slice.call(arguments,1),l=r.slice(),i=l.length,u=0;i>u;u++)l[u].apply(this,a);return!0},r.prototype.addListener=function(e,t){var i;if(!n(t))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,n(t.listener)?t.listener:t),this._events[e]?o(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,o(this._events[e])&&!this._events[e].warned&&(i=s(this._maxListeners)?r.defaultMaxListeners:this._maxListeners,i&&i>0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace())),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function r(){this.removeListener(e,r),i||(i=!0,t.apply(this,arguments))}if(!n(t))throw TypeError("listener must be a function");var i=!1;return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var r,i,s,a;if(!n(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],s=r.length,i=-1,r===t||n(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(o(r)){for(a=s;a-->0;)if(r[a]===t||r[a].listener&&r[a].listener===t){i=a;break}if(0>i)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],n(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?n(this._events[e])?[this._events[e]]:this._events[e].slice():[]},r.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(n(t))return 1;if(t)return t.length}return 0},r.listenerCount=function(e,t){return e.listenerCount(t)}},{}],7:[function(e,t){function r(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function n(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&r(e.slice(0,0))}t.exports=function(e){return null!=e&&(r(e)||n(e)||!!e._isBuffer)}},{}],8:[function(e,t){function r(){throw new Error("setTimeout has not been defined")}function n(){throw new Error("clearTimeout has not been defined")}function i(e){if(c===setTimeout)return setTimeout(e,0);if((c===r||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function o(e){if(f===clearTimeout)return clearTimeout(e);if((f===n||!f)&&clearTimeout)return f=clearTimeout,clearTimeout(e);try{return f(e)}catch(t){try{return f.call(null,e)}catch(t){return f.call(this,e)}}}function s(){_&&d&&(_=!1,d.length?p=d.concat(p):m=-1,p.length&&a())}function a(){if(!_){var e=i(s);_=!0;for(var t=p.length;t;){for(d=p,p=[];++m1)for(var r=1;r=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),_(t)?n.showHidden=t:t&&r._extend(n,t),x(n.showHidden)&&(n.showHidden=!1),x(n.depth)&&(n.depth=2),x(n.colors)&&(n.colors=!1),x(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=o),u(n,e,n.depth)}function o(e,t){var r=i.styles[t];return r?"["+i.colors[r][0]+"m"+e+"["+i.colors[r][1]+"m":e}function s(e){return e}function a(e){var t={};return e.forEach(function(e){t[e]=!0}),t}function u(e,t,n){if(e.customInspect&&t&&E(t.inspect)&&t.inspect!==r.inspect&&(!t.constructor||t.constructor.prototype!==t)){var i=t.inspect(n,e);return y(i)||(i=u(e,i,n)),i}var o=l(e,t);if(o)return o;var s=Object.keys(t),_=a(s);if(e.showHidden&&(s=Object.getOwnPropertyNames(t)),T(t)&&(s.indexOf("message")>=0||s.indexOf("description")>=0))return c(t);if(0===s.length){if(E(t)){var m=t.name?": "+t.name:"";return e.stylize("[Function"+m+"]","special")}if(w(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(A(t))return e.stylize(Date.prototype.toString.call(t),"date");if(T(t))return c(t)}var g="",v=!1,b=["{","}"];if(p(t)&&(v=!0,b=["[","]"]),E(t)){var x=t.name?": "+t.name:"";g=" [Function"+x+"]"}if(w(t)&&(g=" "+RegExp.prototype.toString.call(t)),A(t)&&(g=" "+Date.prototype.toUTCString.call(t)),T(t)&&(g=" "+c(t)),0===s.length&&(!v||0==t.length))return b[0]+g+b[1];if(0>n)return w(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special");e.seen.push(t);var k;return k=v?f(e,t,n,_,s):s.map(function(r){return h(e,t,n,_,r,v)}),e.seen.pop(),d(k,g,b)}function l(e,t){if(x(t))return e.stylize("undefined","undefined");if(y(t)){var r="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(r,"string")}return v(t)?e.stylize(""+t,"number"):_(t)?e.stylize(""+t,"boolean"):m(t)?e.stylize("null","null"):void 0}function c(e){return"["+Error.prototype.toString.call(e)+"]"}function f(e,t,r,n,i){for(var o=[],s=0,a=t.length;a>s;++s)o.push(O(t,String(s))?h(e,t,r,n,String(s),!0):"");return i.forEach(function(i){i.match(/^\d+$/)||o.push(h(e,t,r,n,i,!0))}),o}function h(e,t,r,n,i,o){var s,a,l;if(l=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]},l.get?a=l.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):l.set&&(a=e.stylize("[Setter]","special")),O(n,i)||(s="["+i+"]"),a||(e.seen.indexOf(l.value)<0?(a=m(r)?u(e,l.value,null):u(e,l.value,r-1),a.indexOf("\n")>-1&&(a=o?a.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+a.split("\n").map(function(e){return" "+e}).join("\n"))):a=e.stylize("[Circular]","special")),x(s)){if(o&&i.match(/^\d+$/))return a;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string")) -}return s+": "+a}function d(e,t,r){var n=0,i=e.reduce(function(e,t){return n++,t.indexOf("\n")>=0&&n++,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?r[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+r[1]:r[0]+t+" "+e.join(", ")+" "+r[1]}function p(e){return Array.isArray(e)}function _(e){return"boolean"==typeof e}function m(e){return null===e}function g(e){return null==e}function v(e){return"number"==typeof e}function y(e){return"string"==typeof e}function b(e){return"symbol"==typeof e}function x(e){return void 0===e}function w(e){return k(e)&&"[object RegExp]"===R(e)}function k(e){return"object"==typeof e&&null!==e}function A(e){return k(e)&&"[object Date]"===R(e)}function T(e){return k(e)&&("[object Error]"===R(e)||e instanceof Error)}function E(e){return"function"==typeof e}function S(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function R(e){return Object.prototype.toString.call(e)}function M(e){return 10>e?"0"+e.toString(10):e.toString(10)}function P(){var e=new Date,t=[M(e.getHours()),M(e.getMinutes()),M(e.getSeconds())].join(":");return[e.getDate(),L[e.getMonth()],t].join(" ")}function O(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var z=/%[sdj%]/g;r.format=function(e){if(!y(e)){for(var t=[],r=0;r=o)return e;switch(e){case"%s":return String(n[r++]);case"%d":return Number(n[r++]);case"%j":try{return JSON.stringify(n[r++])}catch(t){return"[Circular]"}default:return e}}),a=n[r];o>r;a=n[++r])s+=m(a)||!k(a)?" "+a:" "+i(a);return s},r.deprecate=function(e,i){function o(){if(!s){if(t.throwDeprecation)throw new Error(i);t.traceDeprecation?console.trace(i):console.error(i),s=!0}return e.apply(this,arguments)}if(x(n.process))return function(){return r.deprecate(e,i).apply(this,arguments)};if(t.noDeprecation===!0)return e;var s=!1;return o};var N,j={};r.debuglog=function(e){if(x(N)&&(N=t.env.NODE_DEBUG||""),e=e.toUpperCase(),!j[e])if(new RegExp("\\b"+e+"\\b","i").test(N)){var n=t.pid;j[e]=function(){var t=r.format.apply(r,arguments);console.error("%s %d: %s",e,n,t)}}else j[e]=function(){};return j[e]},r.inspect=i,i.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},i.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},r.isArray=p,r.isBoolean=_,r.isNull=m,r.isNullOrUndefined=g,r.isNumber=v,r.isString=y,r.isSymbol=b,r.isUndefined=x,r.isRegExp=w,r.isObject=k,r.isDate=A,r.isError=T,r.isFunction=E,r.isPrimitive=S,r.isBuffer=e("./support/isBuffer");var L=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];r.log=function(){console.log("%s - %s",P(),r.format.apply(r,arguments))},r.inherits=e("inherits"),r._extend=function(e,t){if(!t||!k(t))return e;for(var r=Object.keys(t),n=r.length;n--;)e[r[n]]=t[r[n]];return e}}).call(this,e("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./support/isBuffer":10,_process:8,inherits:9}],12:[function(e,t){e("../modules/es6.object.to-string"),e("../modules/es6.string.iterator"),e("../modules/web.dom.iterable"),e("../modules/es6.promise"),t.exports=e("../modules/_core").Promise},{"../modules/_core":20,"../modules/es6.object.to-string":72,"../modules/es6.promise":73,"../modules/es6.string.iterator":74,"../modules/web.dom.iterable":75}],13:[function(e,t){t.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},{}],14:[function(e,t){var r=e("./_wks")("unscopables"),n=Array.prototype;void 0==n[r]&&e("./_hide")(n,r,{}),t.exports=function(e){n[r][e]=!0}},{"./_hide":31,"./_wks":69}],15:[function(e,t){t.exports=function(e,t,r,n){if(!(e instanceof t)||void 0!==n&&n in e)throw TypeError(r+": incorrect invocation!");return e}},{}],16:[function(e,t){var r=e("./_is-object");t.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},{"./_is-object":37}],17:[function(e,t){var r=e("./_to-iobject"),n=e("./_to-length"),i=e("./_to-index");t.exports=function(e){return function(t,o,s){var a,u=r(t),l=n(u.length),c=i(s,l);if(e&&o!=o){for(;l>c;)if(a=u[c++],a!=a)return!0}else for(;l>c;c++)if((e||c in u)&&u[c]===o)return e||c||0;return!e&&-1}}},{"./_to-index":62,"./_to-iobject":64,"./_to-length":65}],18:[function(e,t){var r=e("./_cof"),n=e("./_wks")("toStringTag"),i="Arguments"==r(function(){return arguments}()),o=function(e,t){try{return e[t]}catch(r){}};t.exports=function(e){var t,s,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(s=o(t=Object(e),n))?s:i?r(t):"Object"==(a=r(t))&&"function"==typeof t.callee?"Arguments":a}},{"./_cof":19,"./_wks":69}],19:[function(e,t){var r={}.toString;t.exports=function(e){return r.call(e).slice(8,-1)}},{}],20:[function(e,t){var r=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},{}],21:[function(e,t){var r=e("./_a-function");t.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,i){return e.call(t,r,n,i)}}return function(){return e.apply(t,arguments)}}},{"./_a-function":13}],22:[function(e,t){t.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},{}],23:[function(e,t){t.exports=!e("./_fails")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{"./_fails":27}],24:[function(e,t){var r=e("./_is-object"),n=e("./_global").document,i=r(n)&&r(n.createElement);t.exports=function(e){return i?n.createElement(e):{}}},{"./_global":29,"./_is-object":37}],25:[function(e,t){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],26:[function(e,t){var r=e("./_global"),n=e("./_core"),i=e("./_hide"),o=e("./_redefine"),s=e("./_ctx"),a="prototype",u=function(e,t,l){var c,f,h,d,p=e&u.F,_=e&u.G,m=e&u.S,g=e&u.P,v=e&u.B,y=_?r:m?r[t]||(r[t]={}):(r[t]||{})[a],b=_?n:n[t]||(n[t]={}),x=b[a]||(b[a]={});_&&(l=t);for(c in l)f=!p&&y&&void 0!==y[c],h=(f?y:l)[c],d=v&&f?s(h,r):g&&"function"==typeof h?s(Function.call,h):h,y&&o(y,c,h,e&u.U),b[c]!=h&&i(b,c,d),g&&x[c]!=h&&(x[c]=h)};r.core=n,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,t.exports=u},{"./_core":20,"./_ctx":21,"./_global":29,"./_hide":31,"./_redefine":54}],27:[function(e,t){t.exports=function(e){try{return!!e()}catch(t){return!0}}},{}],28:[function(e,t,r){var n=e("./_ctx"),i=e("./_iter-call"),o=e("./_is-array-iter"),s=e("./_an-object"),a=e("./_to-length"),u=e("./core.get-iterator-method"),l={},c={},r=t.exports=function(e,t,r,f,h){var d,p,_,m,g=h?function(){return e}:u(e),v=n(r,f,t?2:1),y=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(o(g)){for(d=a(e.length);d>y;y++)if(m=t?v(s(p=e[y])[0],p[1]):v(e[y]),m===l||m===c)return m}else for(_=g.call(e);!(p=_.next()).done;)if(m=i(_,v,p.value,t),m===l||m===c)return m};r.BREAK=l,r.RETURN=c},{"./_an-object":16,"./_ctx":21,"./_is-array-iter":36,"./_iter-call":38,"./_to-length":65,"./core.get-iterator-method":70}],29:[function(e,t){var r=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],30:[function(e,t){var r={}.hasOwnProperty;t.exports=function(e,t){return r.call(e,t)}},{}],31:[function(e,t){var r=e("./_object-dp"),n=e("./_property-desc");t.exports=e("./_descriptors")?function(e,t,i){return r.f(e,t,n(1,i))}:function(e,t,r){return e[t]=r,e}},{"./_descriptors":23,"./_object-dp":47,"./_property-desc":52}],32:[function(e,t){t.exports=e("./_global").document&&document.documentElement},{"./_global":29}],33:[function(e,t){t.exports=!e("./_descriptors")&&!e("./_fails")(function(){return 7!=Object.defineProperty(e("./_dom-create")("div"),"a",{get:function(){return 7}}).a})},{"./_descriptors":23,"./_dom-create":24,"./_fails":27}],34:[function(e,t){t.exports=function(e,t,r){var n=void 0===r;switch(t.length){case 0:return n?e():e.call(r);case 1:return n?e(t[0]):e.call(r,t[0]);case 2:return n?e(t[0],t[1]):e.call(r,t[0],t[1]);case 3:return n?e(t[0],t[1],t[2]):e.call(r,t[0],t[1],t[2]);case 4:return n?e(t[0],t[1],t[2],t[3]):e.call(r,t[0],t[1],t[2],t[3])}return e.apply(r,t)}},{}],35:[function(e,t){var r=e("./_cof");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},{"./_cof":19}],36:[function(e,t){var r=e("./_iterators"),n=e("./_wks")("iterator"),i=Array.prototype;t.exports=function(e){return void 0!==e&&(r.Array===e||i[n]===e)}},{"./_iterators":43,"./_wks":69}],37:[function(e,t){t.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},{}],38:[function(e,t){var r=e("./_an-object");t.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(o){var s=e["return"];throw void 0!==s&&r(s.call(e)),o}}},{"./_an-object":16}],39:[function(e,t){"use strict";var r=e("./_object-create"),n=e("./_property-desc"),i=e("./_set-to-string-tag"),o={};e("./_hide")(o,e("./_wks")("iterator"),function(){return this}),t.exports=function(e,t,s){e.prototype=r(o,{next:n(1,s)}),i(e,t+" Iterator")}},{"./_hide":31,"./_object-create":46,"./_property-desc":52,"./_set-to-string-tag":56,"./_wks":69}],40:[function(e,t){"use strict";var r=e("./_library"),n=e("./_export"),i=e("./_redefine"),o=e("./_hide"),s=e("./_has"),a=e("./_iterators"),u=e("./_iter-create"),l=e("./_set-to-string-tag"),c=e("./_object-gpo"),f=e("./_wks")("iterator"),h=!([].keys&&"next"in[].keys()),d="@@iterator",p="keys",_="values",m=function(){return this};t.exports=function(e,t,g,v,y,b,x){u(g,t,v);var w,k,A,T=function(e){if(!h&&e in M)return M[e];switch(e){case p:return function(){return new g(this,e)};case _:return function(){return new g(this,e)}}return function(){return new g(this,e)}},E=t+" Iterator",S=y==_,R=!1,M=e.prototype,P=M[f]||M[d]||y&&M[y],O=P||T(y),z=y?S?T("entries"):O:void 0,N="Array"==t?M.entries||P:P;if(N&&(A=c(N.call(new e)),A!==Object.prototype&&(l(A,E,!0),r||s(A,f)||o(A,f,m))),S&&P&&P.name!==_&&(R=!0,O=function(){return P.call(this)}),r&&!x||!h&&!R&&M[f]||o(M,f,O),a[t]=O,a[E]=m,y)if(w={values:S?O:T(_),keys:b?O:T(p),entries:z},x)for(k in w)k in M||i(M,k,w[k]);else n(n.P+n.F*(h||R),t,w);return w}},{"./_export":26,"./_has":30,"./_hide":31,"./_iter-create":39,"./_iterators":43,"./_library":44,"./_object-gpo":49,"./_redefine":54,"./_set-to-string-tag":56,"./_wks":69}],41:[function(e,t){var r=e("./_wks")("iterator"),n=!1;try{var i=[7][r]();i["return"]=function(){n=!0},Array.from(i,function(){throw 2})}catch(o){}t.exports=function(e,t){if(!t&&!n)return!1;var i=!1;try{var o=[7],s=o[r]();s.next=function(){return{done:i=!0}},o[r]=function(){return s},e(o)}catch(a){}return i}},{"./_wks":69}],42:[function(e,t){t.exports=function(e,t){return{value:t,done:!!e}}},{}],43:[function(e,t){t.exports={}},{}],44:[function(e,t){t.exports=!1},{}],45:[function(e,t){var r=e("./_global"),n=e("./_task").set,i=r.MutationObserver||r.WebKitMutationObserver,o=r.process,s=r.Promise,a="process"==e("./_cof")(o);t.exports=function(){var e,t,u,l=function(){var r,n;for(a&&(r=o.domain)&&r.exit();e;){n=e.fn,e=e.next;try{n()}catch(i){throw e?u():t=void 0,i}}t=void 0,r&&r.enter()};if(a)u=function(){o.nextTick(l)};else if(i){var c=!0,f=document.createTextNode("");new i(l).observe(f,{characterData:!0}),u=function(){f.data=c=!c}}else if(s&&s.resolve){var h=s.resolve();u=function(){h.then(l)}}else u=function(){n.call(r,l)};return function(r){var n={fn:r,next:void 0};t&&(t.next=n),e||(e=n,u()),t=n}}},{"./_cof":19,"./_global":29,"./_task":61}],46:[function(e,t){var r=e("./_an-object"),n=e("./_object-dps"),i=e("./_enum-bug-keys"),o=e("./_shared-key")("IE_PROTO"),s=function(){},a="prototype",u=function(){var t,r=e("./_dom-create")("iframe"),n=i.length,o="<",s=">";for(r.style.display="none",e("./_html").appendChild(r),r.src="javascript:",t=r.contentWindow.document,t.open(),t.write(o+"script"+s+"document.F=Object"+o+"/script"+s),t.close(),u=t.F;n--;)delete u[a][i[n]];return u()};t.exports=Object.create||function(e,t){var i;return null!==e?(s[a]=r(e),i=new s,s[a]=null,i[o]=e):i=u(),void 0===t?i:n(i,t)}},{"./_an-object":16,"./_dom-create":24,"./_enum-bug-keys":25,"./_html":32,"./_object-dps":48,"./_shared-key":57}],47:[function(e,t,r){var n=e("./_an-object"),i=e("./_ie8-dom-define"),o=e("./_to-primitive"),s=Object.defineProperty;r.f=e("./_descriptors")?Object.defineProperty:function(e,t,r){if(n(e),t=o(t,!0),n(r),i)try{return s(e,t,r)}catch(a){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},{"./_an-object":16,"./_descriptors":23,"./_ie8-dom-define":33,"./_to-primitive":67}],48:[function(e,t){var r=e("./_object-dp"),n=e("./_an-object"),i=e("./_object-keys");t.exports=e("./_descriptors")?Object.defineProperties:function(e,t){n(e);for(var o,s=i(t),a=s.length,u=0;a>u;)r.f(e,o=s[u++],t[o]);return e}},{"./_an-object":16,"./_descriptors":23,"./_object-dp":47,"./_object-keys":51}],49:[function(e,t){var r=e("./_has"),n=e("./_to-object"),i=e("./_shared-key")("IE_PROTO"),o=Object.prototype;t.exports=Object.getPrototypeOf||function(e){return e=n(e),r(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?o:null}},{"./_has":30,"./_shared-key":57,"./_to-object":66}],50:[function(e,t){var r=e("./_has"),n=e("./_to-iobject"),i=e("./_array-includes")(!1),o=e("./_shared-key")("IE_PROTO");t.exports=function(e,t){var s,a=n(e),u=0,l=[];for(s in a)s!=o&&r(a,s)&&l.push(s);for(;t.length>u;)r(a,s=t[u++])&&(~i(l,s)||l.push(s));return l}},{"./_array-includes":17,"./_has":30,"./_shared-key":57,"./_to-iobject":64}],51:[function(e,t){var r=e("./_object-keys-internal"),n=e("./_enum-bug-keys");t.exports=Object.keys||function(e){return r(e,n)}},{"./_enum-bug-keys":25,"./_object-keys-internal":50}],52:[function(e,t){t.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},{}],53:[function(e,t){var r=e("./_redefine");t.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},{"./_redefine":54}],54:[function(e,t){var r=e("./_global"),n=e("./_hide"),i=e("./_has"),o=e("./_uid")("src"),s="toString",a=Function[s],u=(""+a).split(s);e("./_core").inspectSource=function(e){return a.call(e)},(t.exports=function(e,t,s,a){var l="function"==typeof s;l&&(i(s,"name")||n(s,"name",t)),e[t]!==s&&(l&&(i(s,o)||n(s,o,e[t]?""+e[t]:u.join(String(t)))),e===r?e[t]=s:a?e[t]?e[t]=s:n(e,t,s):(delete e[t],n(e,t,s)))})(Function.prototype,s,function(){return"function"==typeof this&&this[o]||a.call(this)})},{"./_core":20,"./_global":29,"./_has":30,"./_hide":31,"./_uid":68}],55:[function(e,t){"use strict";var r=e("./_global"),n=e("./_object-dp"),i=e("./_descriptors"),o=e("./_wks")("species");t.exports=function(e){var t=r[e];i&&t&&!t[o]&&n.f(t,o,{configurable:!0,get:function(){return this}})}},{"./_descriptors":23,"./_global":29,"./_object-dp":47,"./_wks":69}],56:[function(e,t){var r=e("./_object-dp").f,n=e("./_has"),i=e("./_wks")("toStringTag");t.exports=function(e,t,o){e&&!n(e=o?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},{"./_has":30,"./_object-dp":47,"./_wks":69}],57:[function(e,t){var r=e("./_shared")("keys"),n=e("./_uid");t.exports=function(e){return r[e]||(r[e]=n(e))}},{"./_shared":58,"./_uid":68}],58:[function(e,t){var r=e("./_global"),n="__core-js_shared__",i=r[n]||(r[n]={});t.exports=function(e){return i[e]||(i[e]={})}},{"./_global":29}],59:[function(e,t){var r=e("./_an-object"),n=e("./_a-function"),i=e("./_wks")("species");t.exports=function(e,t){var o,s=r(e).constructor;return void 0===s||void 0==(o=r(s)[i])?t:n(o)}},{"./_a-function":13,"./_an-object":16,"./_wks":69}],60:[function(e,t){var r=e("./_to-integer"),n=e("./_defined");t.exports=function(e){return function(t,i){var o,s,a=String(n(t)),u=r(i),l=a.length;return 0>u||u>=l?e?"":void 0:(o=a.charCodeAt(u),55296>o||o>56319||u+1===l||(s=a.charCodeAt(u+1))<56320||s>57343?e?a.charAt(u):o:e?a.slice(u,u+2):(o-55296<<10)+(s-56320)+65536)}}},{"./_defined":22,"./_to-integer":63}],61:[function(e,t){var r,n,i,o=e("./_ctx"),s=e("./_invoke"),a=e("./_html"),u=e("./_dom-create"),l=e("./_global"),c=l.process,f=l.setImmediate,h=l.clearImmediate,d=l.MessageChannel,p=0,_={},m="onreadystatechange",g=function(){var e=+this;if(_.hasOwnProperty(e)){var t=_[e];delete _[e],t()}},v=function(e){g.call(e.data)};f&&h||(f=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return _[++p]=function(){s("function"==typeof e?e:Function(e),t)},r(p),p},h=function(e){delete _[e]},"process"==e("./_cof")(c)?r=function(e){c.nextTick(o(g,e,1))}:d?(n=new d,i=n.port2,n.port1.onmessage=v,r=o(i.postMessage,i,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(e){l.postMessage(e+"","*")},l.addEventListener("message",v,!1)):r=m in u("script")?function(e){a.appendChild(u("script"))[m]=function(){a.removeChild(this),g.call(e)}}:function(e){setTimeout(o(g,e,1),0)}),t.exports={set:f,clear:h}},{"./_cof":19,"./_ctx":21,"./_dom-create":24,"./_global":29,"./_html":32,"./_invoke":34}],62:[function(e,t){var r=e("./_to-integer"),n=Math.max,i=Math.min;t.exports=function(e,t){return e=r(e),0>e?n(e+t,0):i(e,t)}},{"./_to-integer":63}],63:[function(e,t){var r=Math.ceil,n=Math.floor;t.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},{}],64:[function(e,t){var r=e("./_iobject"),n=e("./_defined");t.exports=function(e){return r(n(e))}},{"./_defined":22,"./_iobject":35}],65:[function(e,t){var r=e("./_to-integer"),n=Math.min;t.exports=function(e){return e>0?n(r(e),9007199254740991):0}},{"./_to-integer":63}],66:[function(e,t){var r=e("./_defined");t.exports=function(e){return Object(r(e))}},{"./_defined":22}],67:[function(e,t){var r=e("./_is-object");t.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},{"./_is-object":37}],68:[function(e,t){var r=0,n=Math.random();t.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++r+n).toString(36))}},{}],69:[function(e,t){var r=e("./_shared")("wks"),n=e("./_uid"),i=e("./_global").Symbol,o="function"==typeof i,s=t.exports=function(e){return r[e]||(r[e]=o&&i[e]||(o?i:n)("Symbol."+e))};s.store=r},{"./_global":29,"./_shared":58,"./_uid":68}],70:[function(e,t){var r=e("./_classof"),n=e("./_wks")("iterator"),i=e("./_iterators");t.exports=e("./_core").getIteratorMethod=function(e){return void 0!=e?e[n]||e["@@iterator"]||i[r(e)]:void 0}},{"./_classof":18,"./_core":20,"./_iterators":43,"./_wks":69}],71:[function(e,t){"use strict";var r=e("./_add-to-unscopables"),n=e("./_iter-step"),i=e("./_iterators"),o=e("./_to-iobject");t.exports=e("./_iter-define")(Array,"Array",function(e,t){this._t=o(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,r=this._i++;return!e||r>=e.length?(this._t=void 0,n(1)):"keys"==t?n(0,r):"values"==t?n(0,e[r]):n(0,[r,e[r]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},{"./_add-to-unscopables":14,"./_iter-define":40,"./_iter-step":42,"./_iterators":43,"./_to-iobject":64}],72:[function(e){"use strict";var t=e("./_classof"),r={};r[e("./_wks")("toStringTag")]="z",r+""!="[object z]"&&e("./_redefine")(Object.prototype,"toString",function(){return"[object "+t(this)+"]"},!0)},{"./_classof":18,"./_redefine":54,"./_wks":69}],73:[function(e){"use strict";var t,r,n,i=e("./_library"),o=e("./_global"),s=e("./_ctx"),a=e("./_classof"),u=e("./_export"),l=e("./_is-object"),c=e("./_a-function"),f=e("./_an-instance"),h=e("./_for-of"),d=e("./_species-constructor"),p=e("./_task").set,_=e("./_microtask")(),m="Promise",g=o.TypeError,v=o.process,y=o[m],v=o.process,b="process"==a(v),x=function(){},w=!!function(){try{var t=y.resolve(1),r=(t.constructor={})[e("./_wks")("species")]=function(e){e(x,x)};return(b||"function"==typeof PromiseRejectionEvent)&&t.then(x)instanceof r}catch(n){}}(),k=function(e,t){return e===t||e===y&&t===n},A=function(e){var t;return l(e)&&"function"==typeof(t=e.then)?t:!1},T=function(e){return k(y,e)?new E(e):new r(e)},E=r=function(e){var t,r;this.promise=new e(function(e,n){if(void 0!==t||void 0!==r)throw g("Bad Promise constructor");t=e,r=n}),this.resolve=c(t),this.reject=c(r)},S=function(e){try{e()}catch(t){return{error:t}}},R=function(e,t){if(!e._n){e._n=!0;var r=e._c;_(function(){for(var n=e._v,i=1==e._s,o=0,s=function(t){var r,o,s=i?t.ok:t.fail,a=t.resolve,u=t.reject,l=t.domain;try{s?(i||(2==e._h&&O(e),e._h=1),s===!0?r=n:(l&&l.enter(),r=s(n),l&&l.exit()),r===t.promise?u(g("Promise-chain cycle")):(o=A(r))?o.call(r,a,u):a(r)):u(n)}catch(c){u(c)}};r.length>o;)s(r[o++]);e._c=[],e._n=!1,t&&!e._h&&M(e)})}},M=function(e){p.call(o,function(){var t,r,n,i=e._v;if(P(e)&&(t=S(function(){b?v.emit("unhandledRejection",i,e):(r=o.onunhandledrejection)?r({promise:e,reason:i}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",i)}),e._h=b||P(e)?2:1),e._a=void 0,t)throw t.error})},P=function(e){if(1==e._h)return!1;for(var t,r=e._a||e._c,n=0;r.length>n;)if(t=r[n++],t.fail||!P(t.promise))return!1;return!0},O=function(e){p.call(o,function(){var t;b?v.emit("rejectionHandled",e):(t=o.onrejectionhandled)&&t({promise:e,reason:e._v})})},z=function(e){var t=this;t._d||(t._d=!0,t=t._w||t,t._v=e,t._s=2,t._a||(t._a=t._c.slice()),R(t,!0))},N=function(e){var t,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===e)throw g("Promise can't be resolved itself");(t=A(e))?_(function(){var n={_w:r,_d:!1};try{t.call(e,s(N,n,1),s(z,n,1))}catch(i){z.call(n,i)}}):(r._v=e,r._s=1,R(r,!1))}catch(n){z.call({_w:r,_d:!1},n)}}};w||(y=function(e){f(this,y,m,"_h"),c(e),t.call(this);try{e(s(N,this,1),s(z,this,1))}catch(r){z.call(this,r)}},t=function(){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},t.prototype=e("./_redefine-all")(y.prototype,{then:function(e,t){var r=T(d(this,y));return r.ok="function"==typeof e?e:!0,r.fail="function"==typeof t&&t,r.domain=b?v.domain:void 0,this._c.push(r),this._a&&this._a.push(r),this._s&&R(this,!1),r.promise},"catch":function(e){return this.then(void 0,e)}}),E=function(){var e=new t;this.promise=e,this.resolve=s(N,e,1),this.reject=s(z,e,1)}),u(u.G+u.W+u.F*!w,{Promise:y}),e("./_set-to-string-tag")(y,m),e("./_set-species")(m),n=e("./_core")[m],u(u.S+u.F*!w,m,{reject:function(e){var t=T(this),r=t.reject;return r(e),t.promise}}),u(u.S+u.F*(i||!w),m,{resolve:function(e){if(e instanceof y&&k(e.constructor,this))return e;var t=T(this),r=t.resolve;return r(e),t.promise}}),u(u.S+u.F*!(w&&e("./_iter-detect")(function(e){y.all(e)["catch"](x)})),m,{all:function(e){var t=this,r=T(t),n=r.resolve,i=r.reject,o=S(function(){var r=[],o=0,s=1;h(e,!1,function(e){var a=o++,u=!1;r.push(void 0),s++,t.resolve(e).then(function(e){u||(u=!0,r[a]=e,--s||n(r))},i)}),--s||n(r)});return o&&i(o.error),r.promise},race:function(e){var t=this,r=T(t),n=r.reject,i=S(function(){h(e,!1,function(e){t.resolve(e).then(r.resolve,n)})});return i&&n(i.error),r.promise}})},{"./_a-function":13,"./_an-instance":15,"./_classof":18,"./_core":20,"./_ctx":21,"./_export":26,"./_for-of":28,"./_global":29,"./_is-object":37,"./_iter-detect":41,"./_library":44,"./_microtask":45,"./_redefine-all":53,"./_set-species":55,"./_set-to-string-tag":56,"./_species-constructor":59,"./_task":61,"./_wks":69}],74:[function(e){"use strict";var t=e("./_string-at")(!0);e("./_iter-define")(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,r=this._t,n=this._i;return n>=r.length?{value:void 0,done:!0}:(e=t(r,n),this._i+=e.length,{value:e,done:!1})})},{"./_iter-define":40,"./_string-at":60}],75:[function(e){for(var t=e("./es6.array.iterator"),r=e("./_redefine"),n=e("./_global"),i=e("./_hide"),o=e("./_iterators"),s=e("./_wks"),a=s("iterator"),u=s("toStringTag"),l=o.Array,c=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],f=0;5>f;f++){var h,d=c[f],p=n[d],_=p&&p.prototype;if(_){_[a]||i(_,a,l),_[u]||i(_,u,d),o[d]=l;for(h in t)_[h]||r(_,h,t[h],!0)}}},{"./_global":29,"./_hide":31,"./_iterators":43,"./_redefine":54,"./_wks":69,"./es6.array.iterator":71}],76:[function(e,t,r){function n(e){return e=Math.round(e),0>e?0:e>255?255:e}function i(e){return 0>e?0:e>1?1:e}function o(e){return n("%"===e[e.length-1]?parseFloat(e)/100*255:parseInt(e))}function s(e){return i("%"===e[e.length-1]?parseFloat(e)/100:parseFloat(e))}function a(e,t,r){return 0>r?r+=1:r>1&&(r-=1),1>6*r?e+(t-e)*r*6:1>2*r?t:2>3*r?e+(t-e)*(2/3-r)*6:e}function u(e){var t=e.replace(/ /g,"").toLowerCase();if(t in l)return l[t].slice();if("#"===t[0]){if(4===t.length){var r=parseInt(t.substr(1),16);return r>=0&&4095>=r?[(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,1]:null}if(7===t.length){var r=parseInt(t.substr(1),16);return r>=0&&16777215>=r?[(16711680&r)>>16,(65280&r)>>8,255&r,1]:null}return null}var i=t.indexOf("("),u=t.indexOf(")");if(-1!==i&&u+1===t.length){var c=t.substr(0,i),f=t.substr(i+1,u-(i+1)).split(","),h=1;switch(c){case"rgba":if(4!==f.length)return null;h=s(f.pop());case"rgb":return 3!==f.length?null:[o(f[0]),o(f[1]),o(f[2]),h];case"hsla":if(4!==f.length)return null;h=s(f.pop());case"hsl":if(3!==f.length)return null;var d=(parseFloat(f[0])%360+360)%360/360,p=s(f[1]),_=s(f[2]),m=.5>=_?_*(p+1):_+p-_*p,g=2*_-m;return[n(255*a(g,m,d+1/3)),n(255*a(g,m,d)),n(255*a(g,m,d-1/3)),h];default:return null}}return null}var l={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{r.parseCSSColor=u}catch(c){}},{}],77:[function(e,t){"use strict";function r(e,t,r){r=r||2;var i=t&&t.length,s=i?t[0]*r:e.length,a=n(e,0,s,r,!0),u=[];if(!a)return u;var l,f,h,d,p,_,m;if(i&&(a=c(e,t,a,r)),e.length>80*r){l=h=e[0],f=d=e[1];for(var g=r;s>g;g+=r)p=e[g],_=e[g+1],l>p&&(l=p),f>_&&(f=_),p>h&&(h=p),_>d&&(d=_);m=Math.max(h-l,d-f)}return o(a,u,r,l,f,m),u}function n(e,t,r,n,i){var o,s;if(i===P(e,t,r,n)>0)for(o=t;r>o;o+=n)s=S(o,e[o],e[o+1],s);else for(o=r-n;o>=t;o-=n)s=S(o,e[o],e[o+1],s);return s&&x(s,s.next)&&(R(s),s=s.next),s}function i(e,t){if(!e)return e;t||(t=e);var r,n=e;do if(r=!1,n.steiner||!x(n,n.next)&&0!==b(n.prev,n,n.next))n=n.next;else{if(R(n),n=t=n.prev,n===n.next)return null;r=!0}while(r||n!==t);return t}function o(e,t,r,n,c,f,h){if(e){!h&&f&&p(e,n,c,f);for(var d,_,m=e;e.prev!==e.next;)if(d=e.prev,_=e.next,f?a(e,n,c,f):s(e))t.push(d.i/r),t.push(e.i/r),t.push(_.i/r),R(e),e=_.next,m=_.next;else if(e=_,e===m){h?1===h?(e=u(e,t,r),o(e,t,r,n,c,f,2)):2===h&&l(e,t,r,n,c,f):o(i(e),t,r,n,c,f,1);break}}}function s(e){var t=e.prev,r=e,n=e.next;if(b(t,r,n)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(v(t.x,t.y,r.x,r.y,n.x,n.y,i.x,i.y)&&b(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function a(e,t,r,n){var i=e.prev,o=e,s=e.next;if(b(i,o,s)>=0)return!1;for(var a=i.xo.x?i.x>s.x?i.x:s.x:o.x>s.x?o.x:s.x,c=i.y>o.y?i.y>s.y?i.y:s.y:o.y>s.y?o.y:s.y,f=m(a,u,t,r,n),h=m(l,c,t,r,n),d=e.nextZ;d&&d.z<=h;){if(d!==e.prev&&d!==e.next&&v(i.x,i.y,o.x,o.y,s.x,s.y,d.x,d.y)&&b(d.prev,d,d.next)>=0)return!1;d=d.nextZ}for(d=e.prevZ;d&&d.z>=f;){if(d!==e.prev&&d!==e.next&&v(i.x,i.y,o.x,o.y,s.x,s.y,d.x,d.y)&&b(d.prev,d,d.next)>=0)return!1;d=d.prevZ}return!0}function u(e,t,r){var n=e;do{var i=n.prev,o=n.next.next;!x(i,o)&&w(i,n,n.next,o)&&A(i,o)&&A(o,i)&&(t.push(i.i/r),t.push(n.i/r),t.push(o.i/r),R(n),R(n.next),n=e=o),n=n.next}while(n!==e);return n}function l(e,t,r,n,s,a){var u=e;do{for(var l=u.next.next;l!==u.prev;){if(u.i!==l.i&&y(u,l)){var c=E(u,l);return u=i(u,u.next),c=i(c,c.next),o(u,t,r,n,s,a),void o(c,t,r,n,s,a)}l=l.next}u=u.next}while(u!==e)}function c(e,t,r,o){var s,a,u,l,c,d=[];for(s=0,a=t.length;a>s;s++)u=t[s]*o,l=a-1>s?t[s+1]*o:e.length,c=n(e,u,l,o,!1),c===c.next&&(c.steiner=!0),d.push(g(c));for(d.sort(f),s=0;s=n.next.y){var a=n.x+(o-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(i>=a&&a>s){if(s=a,a===i){if(o===n.y)return n;if(o===n.next.y)return n.next}r=n.x=n.x&&n.x>=c&&v(f>o?i:s,o,c,f,f>o?s:i,o,n.x,n.y)&&(u=Math.abs(o-n.y)/(i-n.x),(h>u||u===h&&n.x>r.x)&&A(n,e)&&(r=n,h=u)),n=n.next;return r}function p(e,t,r,n){var i=e;do null===i.z&&(i.z=m(i.x,i.y,t,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,_(i)}function _(e){var t,r,n,i,o,s,a,u,l=1;do{for(r=e,e=null,o=null,s=0;r;){for(s++,n=r,a=0,t=0;l>t&&(a++,n=n.nextZ,n);t++);for(u=l;a>0||u>0&&n;)0===a?(i=n,n=n.nextZ,u--):0!==u&&n?r.z<=n.z?(i=r,r=r.nextZ,a--):(i=n,n=n.nextZ,u--):(i=r,r=r.nextZ,a--),o?o.nextZ=i:e=i,i.prevZ=o,o=i;r=n}o.nextZ=null,l*=2}while(s>1);return e}function m(e,t,r,n,i){return e=32767*(e-r)/i,t=32767*(t-n)/i,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e|t<<1}function g(e){var t=e,r=e;do t.x=0&&(e-s)*(n-a)-(r-s)*(t-a)>=0&&(r-s)*(o-a)-(i-s)*(n-a)>=0}function y(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!k(e,t)&&A(e,t)&&A(t,e)&&T(e,t)}function b(e,t,r){return(t.y-e.y)*(r.x-t.x)-(t.x-e.x)*(r.y-t.y)}function x(e,t){return e.x===t.x&&e.y===t.y}function w(e,t,r,n){return x(e,t)&&x(r,n)||x(e,n)&&x(r,t)?!0:b(e,t,r)>0!=b(e,t,n)>0&&b(r,n,e)>0!=b(r,n,t)>0}function k(e,t){var r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==t.i&&r.next.i!==t.i&&w(r,r.next,e,t))return!0;r=r.next}while(r!==e);return!1}function A(e,t){return b(e.prev,e,e.next)<0?b(e,t,e.next)>=0&&b(e,e.prev,t)>=0:b(e,t,e.prev)<0||b(e,e.next,t)<0}function T(e,t){var r=e,n=!1,i=(e.x+t.x)/2,o=(e.y+t.y)/2;do r.y>o!=r.next.y>o&&i<(r.next.x-r.x)*(o-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next;while(r!==e);return n}function E(e,t){var r=new M(e.i,e.x,e.y),n=new M(t.i,t.x,t.y),i=e.next,o=t.prev;return e.next=t,t.prev=e,r.next=i,i.prev=r,n.next=r,r.prev=n,o.next=n,n.prev=o,n}function S(e,t,r,n){var i=new M(e,t,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function R(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function M(e,t,r){this.i=e,this.x=t,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function P(e,t,r,n){for(var i=0,o=t,s=r-n;r>o;o+=n)i+=(e[s]-e[o])*(e[o+1]+e[s+1]),s=o;return i}t.exports=r,r.deviation=function(e,t,r,n){var i=t&&t.length,o=i?t[0]*r:e.length,s=Math.abs(P(e,0,o,r));if(i)for(var a=0,u=t.length;u>a;a++){var l=t[a]*r,c=u-1>a?t[a+1]*r:e.length;s-=Math.abs(P(e,l,c,r))}var f=0;for(a=0;as;s++)r.vertices.push(e[i][o][s]);i>0&&(n+=e[i-1].length,r.holes.push(n))}return r}},{}],78:[function(e,t){!function(){function e(e,t){c?e.addEventListener("scroll",t,!1):e.attachEvent("scroll",t)}function r(e){document.body?e():c?document.addEventListener("DOMContentLoaded",e):document.attachEvent("onreadystatechange",function(){"interactive"!=document.readyState&&"complete"!=document.readyState||e()})}function n(e){this.a=document.createElement("div"),this.a.setAttribute("aria-hidden","true"),this.a.appendChild(document.createTextNode(e)),this.b=document.createElement("span"),this.c=document.createElement("span"),this.h=document.createElement("span"),this.f=document.createElement("span"),this.g=-1,this.b.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.c.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.f.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.h.style.cssText="display:inline-block;width:200%;height:200%;font-size:16px;max-width:none;",this.b.appendChild(this.h),this.c.appendChild(this.f),this.a.appendChild(this.b),this.a.appendChild(this.c)}function i(e,t){e.a.style.cssText="max-width:none;min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;left:-999px;white-space:nowrap;font:"+t+";"}function o(e){var t=e.a.offsetWidth,r=t+100;return e.f.style.width=r+"px",e.c.scrollLeft=r,e.b.scrollLeft=e.b.scrollWidth+100,e.g!==t?(e.g=t,!0):!1}function s(t,r){function n(){var e=i;o(e)&&null!==e.a.parentNode&&r(e.g)}var i=t;e(t.b,n),e(t.c,n),o(t)}function a(e,t){var r=t||{};this.family=e,this.style=r.style||"normal",this.weight=r.weight||"normal",this.stretch=r.stretch||"normal"}function u(){if(null===h){var e=document.createElement("div");try{e.style.font="condensed 100px sans-serif"}catch(t){}h=""!==e.style.font}return h}function l(e,t){return[e.style,e.weight,u()?e.stretch:"","100px",t].join(" ")}var c=!!document.addEventListener,f=null,h=null,d=!!window.FontFace;a.prototype.load=function(e,t){var o=this,a=e||"BESbswy",u=t||3e3,c=(new Date).getTime();return new Promise(function(e,t){if(d){var h=new Promise(function(e,t){function r(){(new Date).getTime()-c>=u?t():document.fonts.load(l(o,o.family),a).then(function(t){1<=t.length?e():setTimeout(r,25)},function(){t()})}r()}),p=new Promise(function(e,t){setTimeout(t,u)});Promise.race([p,h]).then(function(){e(o)},function(){t(o)})}else r(function(){function r(){var t;(t=-1!=m&&-1!=g||-1!=m&&-1!=v||-1!=g&&-1!=v)&&((t=m!=g&&m!=v&&g!=v)||(null===f&&(t=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),f=!!t&&(536>parseInt(t[1],10)||536===parseInt(t[1],10)&&11>=parseInt(t[2],10))),t=f&&(m==y&&g==y&&v==y||m==b&&g==b&&v==b||m==x&&g==x&&v==x)),t=!t),t&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),e(o))}function h(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),t(o);else{var e=document.hidden;(!0===e||void 0===e)&&(m=d.a.offsetWidth,g=p.a.offsetWidth,v=_.a.offsetWidth,r()),k=setTimeout(h,50)}}var d=new n(a),p=new n(a),_=new n(a),m=-1,g=-1,v=-1,y=-1,b=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",i(d,l(o,"sans-serif")),i(p,l(o,"serif")),i(_,l(o,"monospace")),w.appendChild(d.a),w.appendChild(p.a),w.appendChild(_.a),document.body.appendChild(w),y=d.a.offsetWidth,b=p.a.offsetWidth,x=_.a.offsetWidth,h(),s(d,function(e){m=e,r()}),i(d,l(o,'"'+o.family+'",sans-serif')),s(p,function(e){g=e,r()}),i(p,l(o,'"'+o.family+'",serif')),s(_,function(e){v=e,r()}),i(_,l(o,'"'+o.family+'",monospace'))})})},window.FontFaceObserver=a,window.FontFaceObserver.prototype.check=window.FontFaceObserver.prototype.load=a.prototype.load,"undefined"!=typeof t&&(t.exports=window.FontFaceObserver)}()},{}],79:[function(e,t){"use strict";function r(e,t,r,o,s,a,u,l){if(r/=t,o/=t,u>=r&&o>=l)return e;if(u>o||r>l)return null;for(var c=[],f=0;f=r&&o>=d)c.push(p);else if(!(h>o||r>d)){var g=1===m?n(_,r,o,s):i(_,r,o,s,a,3===m);g.length&&c.push({geometry:g,type:m,tags:e[f].tags||null,min:p.min,max:p.max})}}return c.length?c:null}function n(e,t,r,n){for(var i=[],o=0;o=t&&r>=a&&i.push(s)}return i}function i(e,t,r,n,i,s){for(var a=[],u=0;uc;c++)l=p||_[c],p=_[c+1],h=d||l[n],d=p[n],t>h?d>r?(y.push(i(l,p,t),i(l,p,r)),s||(y=o(a,y,m,g))):d>=t&&y.push(i(l,p,t)):h>r?t>d?(y.push(i(l,p,r),i(l,p,t)),s||(y=o(a,y,m,g))):r>=d&&y.push(i(l,p,r)):(y.push(l),t>d?(y.push(i(l,p,t)),s||(y=o(a,y,m,g))):d>r&&(y.push(i(l,p,r)),s||(y=o(a,y,m,g))));l=_[v-1],h=l[n],h>=t&&r>=h&&y.push(l),f=y[y.length-1],s&&f&&(y[0][0]!==f[0]||y[0][1]!==f[1])&&y.push(y[0]),o(a,y,m,g)}return a}function o(e,t,r,n){return t.length&&(t.area=r,t.dist=n,e.push(t)),[]}t.exports=r},{}],80:[function(e,t){"use strict";function r(e,t){var r=[];if("FeatureCollection"===e.type)for(var i=0;in?-1:n>1?1:n,[r,n,0]}function a(e){for(var t,r,n=0,i=0,o=0;o1)return!1;var s=i.geometry[0].length;if(5!==s)return!1;for(var a=0;s>a;a++){var u=o(i.geometry[0][a],t,e.z2,e.x,e.y);if(u[0]!==-r&&u[0]!==t+r||u[1]!==-r&&u[1]!==t+r)return!1}return!0}t.exports=r;var f=e("./convert"),h=e("./clip"),d=e("./wrap"),p=e("./tile");n.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},n.prototype.splitTile=function(e,t,r,n,i,o,l){for(var f=[e,t,r,n],d=this.options,_=d.debug;f.length;){n=f.pop(),r=f.pop(),t=f.pop(),e=f.pop();var m=1<1&&console.time("creation"),v=this.tiles[g]=p(e,m,r,n,y,t===d.maxZoom),this.tileCoords.push({z:t,x:r,y:n}),_)){_>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,r,n,v.numFeatures,v.numPoints,v.numSimplified),console.timeEnd("creation"));var b="z"+t;this.stats[b]=(this.stats[b]||0)+1,this.total++}if(v.source=e,d.solidChildren||!c(v,d.extent,d.buffer)){if(i){if(t===d.maxZoom||t===i)continue;var x=1<1&&console.time("clipping");var w,k,A,T,E,S,R=.5*d.buffer/d.extent,M=.5-R,P=.5+R,O=1+R;w=k=A=T=null,E=h(e,m,r-R,r+P,0,a,v.min[0],v.max[0]),S=h(e,m,r+M,r+O,0,a,v.min[0],v.max[0]),E&&(w=h(E,m,n-R,n+P,1,u,v.min[1],v.max[1]),k=h(E,m,n+M,n+O,1,u,v.min[1],v.max[1])),S&&(A=h(S,m,n-R,n+P,1,u,v.min[1],v.max[1]),T=h(S,m,n+M,n+O,1,u,v.min[1],v.max[1])),_>1&&console.timeEnd("clipping"),w&&f.push(w,t+1,2*r,2*n),k&&f.push(k,t+1,2*r,2*n+1),A&&f.push(A,t+1,2*r+1,2*n),T&&f.push(T,t+1,2*r+1,2*n+1)}}},n.prototype.getTile=function(e,t,r){var n=this.options,o=n.extent,a=n.debug,u=1<1&&console.log("drilling down to z%d-%d-%d",e,t,r);for(var f,h=e,d=t,p=r;!f&&h>0;)h--,d=Math.floor(d/2),p=Math.floor(p/2),f=this.tiles[s(h,d,p)];if(!f)return null;if(a>1&&console.log("found parent tile z%d-%d-%d",h,d,p),f.source){if(c(f,o,n.buffer))return i(f,o);a>1&&console.time("drilling down"),this.splitTile(f.source,h,d,p,e,t,r),a>1&&console.timeEnd("drilling down")}return this.tiles[l]?i(this.tiles[l],o):null}},{"./clip":79,"./convert":80,"./tile":83,"./wrap":84}],82:[function(e,t){"use strict";function r(e,t){var r,i,o,s,a=t*t,u=e.length,l=0,c=u-1,f=[];for(e[l][2]=1,e[c][2]=1;c;){for(i=0,r=l+1;c>r;r++)o=n(e[r],e[l],e[c]),o>i&&(s=r,i=o);i>a?(e[s][2]=i,f.push(l),f.push(s),l=s):(c=f.pop(),l=f.pop())}}function n(e,t,r){var n=t[0],i=t[1],o=r[0],s=r[1],a=e[0],u=e[1],l=o-n,c=s-i;if(0!==l||0!==c){var f=((a-n)*l+(u-i)*c)/(l*l+c*c);f>1?(n=o,i=s):f>0&&(n+=l*f,i+=c*f)}return l=a-n,c=u-i,l*l+c*c}t.exports=r},{}],83:[function(e,t){"use strict";function r(e,t,r,i,o,s){for(var a={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:r,y:i,z2:t,transformed:!1,min:[2,1],max:[-1,0]},u=0;ua.max[0]&&(a.max[0]=c[0]),c[1]>a.max[1]&&(a.max[1]=c[1])}return a}function n(e,t,r,n){var i,o,s,a,u=t.geometry,l=t.type,c=[],f=r*r;if(1===l)for(i=0;if)&&(h.push(a),e.numSimplified++),e.numPoints++;c.push(h)}else e.numPoints+=s.length;c.length&&e.features.push({geometry:c,type:l,tags:t.tags||null})}t.exports=r},{}],84:[function(e,t){"use strict";function r(e,t,r){var i=e,s=o(e,1,-1-t,t,0,r,-1,2),a=o(e,1,1-t,2+t,0,r,-1,2);return(s||a)&&(i=o(e,1,-t,1+t,0,r,-1,2),s&&(i=n(s,1).concat(i)),a&&(i=i.concat(n(a,-1)))),i}function n(e,t){for(var r=[],n=0;nr;r+=1)i=o[r],e[i]=t[i];return e}function s(e,t){var r,n="";for(r=0;t>r;r+=1)n+=e;return n}function a(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e}t.exports.isNothing=r,t.exports.isObject=n,t.exports.toArray=i,t.exports.repeat=s,t.exports.isNegativeZero=a,t.exports.extend=o},{}],98:[function(e,t){"use strict";function r(e,t){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||"",this.name="YAMLException",this.reason=e,this.mark=t,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():"")}r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t},t.exports=r},{}],99:[function(e,t){"use strict";function r(e){return 10===e||13===e}function n(e){return 9===e||32===e}function i(e){return 9===e||32===e||10===e||13===e}function o(e){return 44===e||91===e||93===e||123===e||125===e}function s(e){var t;return e>=48&&57>=e?e-48:(t=32|e,t>=97&&102>=t?t-97+10:-1)}function a(e){return 120===e?2:117===e?4:85===e?8:0}function u(e){return e>=48&&57>=e?e-48:-1}function l(e){return 48===e?"\x00":97===e?"":98===e?"\b":116===e?" ":9===e?" ":110===e?"\n":118===e?" ":102===e?"\f":114===e?"\r":101===e?"":32===e?" ":34===e?'"':47===e?"/":92===e?"\\":78===e?"…":95===e?" ":76===e?"\u2028":80===e?"\u2029":""}function c(e){return 65535>=e?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}function f(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||V,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function h(e,t){return new D(t,new B(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function d(e,t){throw h(e,t)}function p(e,t){e.onWarning&&e.onWarning.call(null,h(e,t))}function _(e,t,r,n){var i,o,s,a;if(r>t){if(a=e.input.slice(t,r),n)for(i=0,o=a.length;o>i;i+=1)s=a.charCodeAt(i),9===s||s>=32&&1114111>=s||d(e,"expected valid JSON character");else $.test(a)&&d(e,"the stream contains non-printable characters");e.result+=a}}function m(e,t,r,n){var i,o,s,a;for(U.isObject(r)||d(e,"cannot merge mappings; the provided source object is unacceptable"),i=Object.keys(r),s=0,a=i.length;a>s;s+=1)o=i[s],q.call(t,o)||(t[o]=r[o],n[o]=!0)}function g(e,t,r,n,i,o){var s,a;if(i=String(i),null===t&&(t={}),"tag:yaml.org,2002:merge"===n)if(Array.isArray(o))for(s=0,a=o.length;a>s;s+=1)m(e,t,o[s],r);else m(e,t,o,r);else e.json||q.call(r,i)||!q.call(t,i)||d(e,"duplicated mapping key"),t[i]=o,delete r[i];return t}function v(e){var t;t=e.input.charCodeAt(e.position),10===t?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):d(e,"a line break is expected"),e.line+=1,e.lineStart=e.position}function y(e,t,i){for(var o=0,s=e.input.charCodeAt(e.position);0!==s;){for(;n(s);)s=e.input.charCodeAt(++e.position);if(t&&35===s)do s=e.input.charCodeAt(++e.position);while(10!==s&&13!==s&&0!==s);if(!r(s))break;for(v(e),s=e.input.charCodeAt(e.position),o++,e.lineIndent=0;32===s;)e.lineIndent++,s=e.input.charCodeAt(++e.position)}return-1!==i&&0!==o&&e.lineIndent1&&(e.result+=U.repeat("\n",t-1))}function w(e,t,s){var a,u,l,c,f,h,d,p,m,g=e.kind,v=e.result;if(m=e.input.charCodeAt(e.position),i(m)||o(m)||35===m||38===m||42===m||33===m||124===m||62===m||39===m||34===m||37===m||64===m||96===m)return!1;if((63===m||45===m)&&(u=e.input.charCodeAt(e.position+1),i(u)||s&&o(u)))return!1;for(e.kind="scalar",e.result="",l=c=e.position,f=!1;0!==m;){if(58===m){if(u=e.input.charCodeAt(e.position+1),i(u)||s&&o(u))break}else if(35===m){if(a=e.input.charCodeAt(e.position-1),i(a))break}else{if(e.position===e.lineStart&&b(e)||s&&o(m))break;if(r(m)){if(h=e.line,d=e.lineStart,p=e.lineIndent,y(e,!1,-1),e.lineIndent>=t){f=!0,m=e.input.charCodeAt(e.position);continue}e.position=c,e.line=h,e.lineStart=d,e.lineIndent=p;break}}f&&(_(e,l,c,!1),x(e,e.line-h),l=c=e.position,f=!1),n(m)||(c=e.position+1),m=e.input.charCodeAt(++e.position)}return _(e,l,c,!1),e.result?!0:(e.kind=g,e.result=v,!1)}function k(e,t){var n,i,o;if(n=e.input.charCodeAt(e.position),39!==n)return!1;for(e.kind="scalar",e.result="",e.position++,i=o=e.position;0!==(n=e.input.charCodeAt(e.position));)if(39===n){if(_(e,i,e.position,!0),n=e.input.charCodeAt(++e.position),39!==n)return!0;i=o=e.position,e.position++}else r(n)?(_(e,i,o,!0),x(e,y(e,!1,t)),i=o=e.position):e.position===e.lineStart&&b(e)?d(e,"unexpected end of the document within a single quoted scalar"):(e.position++,o=e.position);d(e,"unexpected end of the stream within a single quoted scalar")}function A(e,t){var n,i,o,u,l,f;if(f=e.input.charCodeAt(e.position),34!==f)return!1;for(e.kind="scalar",e.result="",e.position++,n=i=e.position;0!==(f=e.input.charCodeAt(e.position));){if(34===f)return _(e,n,e.position,!0),e.position++,!0;if(92===f){if(_(e,n,e.position,!0),f=e.input.charCodeAt(++e.position),r(f))y(e,!1,t);else if(256>f&&nt[f])e.result+=it[f],e.position++;else if((l=a(f))>0){for(o=l,u=0;o>0;o--)f=e.input.charCodeAt(++e.position),(l=s(f))>=0?u=(u<<4)+l:d(e,"expected hexadecimal character");e.result+=c(u),e.position++}else d(e,"unknown escape sequence");n=i=e.position}else r(f)?(_(e,n,i,!0),x(e,y(e,!1,t)),n=i=e.position):e.position===e.lineStart&&b(e)?d(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}d(e,"unexpected end of the stream within a double quoted scalar")}function T(e,t){var r,n,o,s,a,u,l,c,f,h,p,_=!0,m=e.tag,v=e.anchor,b={};if(p=e.input.charCodeAt(e.position),91===p)s=93,l=!1,n=[];else{if(123!==p)return!1;s=125,l=!0,n={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=n),p=e.input.charCodeAt(++e.position);0!==p;){if(y(e,!0,t),p=e.input.charCodeAt(e.position),p===s)return e.position++,e.tag=m,e.anchor=v,e.kind=l?"mapping":"sequence",e.result=n,!0;_||d(e,"missed comma between flow collection entries"),f=c=h=null,a=u=!1,63===p&&(o=e.input.charCodeAt(e.position+1),i(o)&&(a=u=!0,e.position++,y(e,!0,t))),r=e.line,z(e,t,W,!1,!0),f=e.tag,c=e.result,y(e,!0,t),p=e.input.charCodeAt(e.position),!u&&e.line!==r||58!==p||(a=!0,p=e.input.charCodeAt(++e.position),y(e,!0,t),z(e,t,W,!1,!0),h=e.result),l?g(e,n,b,f,c,h):n.push(a?g(e,null,b,f,c,h):c),y(e,!0,t),p=e.input.charCodeAt(e.position),44===p?(_=!0,p=e.input.charCodeAt(++e.position)):_=!1}d(e,"unexpected end of the stream within a flow collection")}function E(e,t){var i,o,s,a,l=Y,c=!1,f=t,h=0,p=!1;if(a=e.input.charCodeAt(e.position),124===a)o=!1;else{if(62!==a)return!1;o=!0}for(e.kind="scalar",e.result="";0!==a;)if(a=e.input.charCodeAt(++e.position),43===a||45===a)Y===l?l=43===a?K:J:d(e,"repeat of a chomping mode identifier");else{if(!((s=u(a))>=0))break;0===s?d(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?d(e,"repeat of an indentation width identifier"):(f=t+s-1,c=!0)}if(n(a)){do a=e.input.charCodeAt(++e.position);while(n(a));if(35===a)do a=e.input.charCodeAt(++e.position);while(!r(a)&&0!==a)}for(;0!==a;){for(v(e),e.lineIndent=0,a=e.input.charCodeAt(e.position);(!c||e.lineIndentf&&(f=e.lineIndent),r(a))h++;else{if(e.lineIndentt)&&0!==o)d(e,"bad indentation of a sequence entry");else if(e.lineIndentt)&&(z(e,t,X,!0,s)&&(v?_=e.result:m=e.result),v||(g(e,f,h,p,_,m),p=_=m=null),y(e,!0,-1),u=e.input.charCodeAt(e.position)),e.lineIndent>t&&0!==u)d(e,"bad indentation of a mapping entry");else if(e.lineIndentt?p=1:e.lineIndent===t?p=0:e.lineIndentt?p=1:e.lineIndent===t?p=0:e.lineIndentu;u+=1)if(c=e.implicitTypes[u],c.resolve(e.result)){e.result=c.construct(e.result),e.tag=c.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else q.call(e.typeMap,e.tag)?(c=e.typeMap[e.tag],null!==e.result&&c.kind!==e.kind&&d(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+c.kind+'", not "'+e.kind+'"'),c.resolve(e.result)?(e.result=c.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):d(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")):d(e,"unknown tag !<"+e.tag+">");return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||m}function N(e){var t,o,s,a,u=e.position,l=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};0!==(a=e.input.charCodeAt(e.position))&&(y(e,!0,-1),a=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==a));){for(l=!0,a=e.input.charCodeAt(++e.position),t=e.position;0!==a&&!i(a);)a=e.input.charCodeAt(++e.position);for(o=e.input.slice(t,e.position),s=[],o.length<1&&d(e,"directive name must not be less than one character in length");0!==a;){for(;n(a);)a=e.input.charCodeAt(++e.position);if(35===a){do a=e.input.charCodeAt(++e.position);while(0!==a&&!r(a));break}if(r(a))break;for(t=e.position;0!==a&&!i(a);)a=e.input.charCodeAt(++e.position);s.push(e.input.slice(t,e.position))}0!==a&&v(e),q.call(st,o)?st[o](e,o,s):p(e,'unknown document directive "'+o+'"')}return y(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,y(e,!0,-1)):l&&d(e,"directives end mark is expected"),z(e,e.lineIndent-1,X,!1,!0),y(e,!0,-1),e.checkLineBreaks&&Q.test(e.input.slice(u,e.position))&&p(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&b(e)?void(46===e.input.charCodeAt(e.position)&&(e.position+=3,y(e,!0,-1))):void(e.positionn;n+=1)t(o[n])}function I(e,t){var r=j(e,t);if(0===r.length)return void 0;if(1===r.length)return r[0];throw new D("expected a single document in the stream, but found more")}function C(e,t,r){L(e,t,U.extend({schema:G},r))}function F(e,t){return I(e,U.extend({schema:G},t))}for(var U=e("./common"),D=e("./exception"),B=e("./mark"),G=e("./schema/default_safe"),V=e("./schema/default_full"),q=Object.prototype.hasOwnProperty,W=1,Z=2,H=3,X=4,Y=1,J=2,K=3,$=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Q=/[\x85\u2028\u2029]/,et=/[,\[\]\{\}]/,tt=/^(?:!|!!|![a-z\-]+!)$/i,rt=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i,nt=new Array(256),it=new Array(256),ot=0;256>ot;ot++)nt[ot]=l(ot)?1:0,it[ot]=l(ot);var st={YAML:function(e,t,r){var n,i,o;null!==e.version&&d(e,"duplication of %YAML directive"),1!==r.length&&d(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(r[0]),null===n&&d(e,"ill-formed argument of the YAML directive"),i=parseInt(n[1],10),o=parseInt(n[2],10),1!==i&&d(e,"unacceptable YAML version of the document"),e.version=r[0],e.checkLineBreaks=2>o,1!==o&&2!==o&&p(e,"unsupported YAML version of the document")},TAG:function(e,t,r){var n,i;2!==r.length&&d(e,"TAG directive accepts exactly two arguments"),n=r[0],i=r[1],tt.test(n)||d(e,"ill-formed tag handle (first argument) of the TAG directive"),q.call(e.tagMap,n)&&d(e,'there is a previously declared suffix for "'+n+'" tag handle'),rt.test(i)||d(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=i}};t.exports.loadAll=L,t.exports.load=I,t.exports.safeLoadAll=C,t.exports.safeLoad=F},{"./common":97,"./exception":98,"./mark":100,"./schema/default_full":103,"./schema/default_safe":104}],100:[function(e,t){"use strict";function r(e,t,r,n,i){this.name=e,this.buffer=t,this.position=r,this.line=n,this.column=i}var n=e("./common");r.prototype.getSnippet=function(e,t){var r,i,o,s,a;if(!this.buffer)return null;for(e=e||4,t=t||75,r="",i=this.position;i>0&&-1==="\x00\r\n…\u2028\u2029".indexOf(this.buffer.charAt(i-1));)if(i-=1,this.position-i>t/2-1){r=" ... ",i+=5;break}for(o="",s=this.position;st/2-1){o=" ... ",s-=5;break}return a=this.buffer.slice(i,s),n.repeat(" ",e)+r+a+o+"\n"+n.repeat(" ",e+this.position-i+r.length)+"^"},r.prototype.toString=function(e){var t,r="";return this.name&&(r+='in "'+this.name+'" '),r+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(r+=":\n"+t)),r},t.exports=r},{"./common":97}],101:[function(e,t){"use strict";function r(e,t,n){var i=[];return e.include.forEach(function(e){n=r(e,t,n)}),e[t].forEach(function(e){n.forEach(function(t,r){t.tag===e.tag&&i.push(r)}),n.push(e)}),n.filter(function(e,t){return-1===i.indexOf(t)})}function n(){function e(e){n[e.tag]=e}var t,r,n={};for(t=0,r=arguments.length;r>t;t+=1)arguments[t].forEach(e);return n}function i(e){this.include=e.include||[],this.implicit=e.implicit||[],this.explicit=e.explicit||[],this.implicit.forEach(function(e){if(e.loadKind&&"scalar"!==e.loadKind)throw new s("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")}),this.compiledImplicit=r(this,"implicit",[]),this.compiledExplicit=r(this,"explicit",[]),this.compiledTypeMap=n(this.compiledImplicit,this.compiledExplicit)}var o=e("./common"),s=e("./exception"),a=e("./type");i.DEFAULT=null,i.create=function(){var e,t;switch(arguments.length){case 1:e=i.DEFAULT,t=arguments[0];break;case 2:e=arguments[0],t=arguments[1];break;default:throw new s("Wrong number of arguments for Schema.create function")}if(e=o.toArray(e),t=o.toArray(t),!e.every(function(e){return e instanceof i}))throw new s("Specified list of super schemas (or a single Schema object) contains a non-Schema object.");if(!t.every(function(e){return e instanceof a}))throw new s("Specified list of YAML types (or a single Type object) contains a non-Type object.");return new i({include:e,explicit:t})},t.exports=i},{"./common":97,"./exception":98,"./type":107}],102:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({include:[e("./json")]})},{"../schema":101,"./json":106}],103:[function(e,t){"use strict";var r=e("../schema");t.exports=r.DEFAULT=new r({include:[e("./default_safe")],explicit:[e("../type/js/undefined"),e("../type/js/regexp"),e("../type/js/function")]})},{"../schema":101,"../type/js/function":112,"../type/js/regexp":113,"../type/js/undefined":114,"./default_safe":104}],104:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({include:[e("./core")],implicit:[e("../type/timestamp"),e("../type/merge")],explicit:[e("../type/binary"),e("../type/omap"),e("../type/pairs"),e("../type/set")]})},{"../schema":101,"../type/binary":108,"../type/merge":116,"../type/omap":118,"../type/pairs":119,"../type/set":121,"../type/timestamp":123,"./core":102}],105:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({explicit:[e("../type/str"),e("../type/seq"),e("../type/map")]})},{"../schema":101,"../type/map":115,"../type/seq":120,"../type/str":122}],106:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({include:[e("./failsafe")],implicit:[e("../type/null"),e("../type/bool"),e("../type/int"),e("../type/float")]})},{"../schema":101,"../type/bool":109,"../type/float":110,"../type/int":111,"../type/null":117,"./failsafe":105}],107:[function(e,t){"use strict";function r(e){var t={};return null!==e&&Object.keys(e).forEach(function(r){e[r].forEach(function(e){t[String(e)]=r})}),t}function n(e,t){if(t=t||{},Object.keys(t).forEach(function(t){if(-1===o.indexOf(t))throw new i('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')}),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=r(t.styleAliases||null),-1===s.indexOf(this.kind))throw new i('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}var i=e("./exception"),o=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],s=["scalar","sequence","mapping"];t.exports=n},{"./exception":98}],108:[function(e,t){"use strict";function r(e){if(null===e)return!1;var t,r,n=0,i=e.length,o=u;for(r=0;i>r;r++)if(t=o.indexOf(e.charAt(r)),!(t>64)){if(0>t)return!1;n+=6}return n%8===0}function n(e){var t,r,n=e.replace(/[\r\n=]/g,""),i=n.length,o=u,a=0,l=[];for(t=0;i>t;t++)t%4===0&&t&&(l.push(a>>16&255),l.push(a>>8&255),l.push(255&a)),a=a<<6|o.indexOf(n.charAt(t));return r=i%4*6,0===r?(l.push(a>>16&255),l.push(a>>8&255),l.push(255&a)):18===r?(l.push(a>>10&255),l.push(a>>2&255)):12===r&&l.push(a>>4&255),s?new s(l):l}function i(e){var t,r,n="",i=0,o=e.length,s=u;for(t=0;o>t;t++)t%3===0&&t&&(n+=s[i>>18&63],n+=s[i>>12&63],n+=s[i>>6&63],n+=s[63&i]),i=(i<<8)+e[t];return r=o%3,0===r?(n+=s[i>>18&63],n+=s[i>>12&63],n+=s[i>>6&63],n+=s[63&i]):2===r?(n+=s[i>>10&63],n+=s[i>>4&63],n+=s[i<<2&63],n+=s[64]):1===r&&(n+=s[i>>2&63],n+=s[i<<4&63],n+=s[64],n+=s[64]),n}function o(e){return s&&s.isBuffer(e)}var s=e("buffer").Buffer,a=e("../type"),u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";t.exports=new a("tag:yaml.org,2002:binary",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../type":107,buffer:1}],109:[function(e,t){"use strict";function r(e){if(null===e)return!1;var t=e.length;return 4===t&&("true"===e||"True"===e||"TRUE"===e)||5===t&&("false"===e||"False"===e||"FALSE"===e)}function n(e){return"true"===e||"True"===e||"TRUE"===e}function i(e){return"[object Boolean]"===Object.prototype.toString.call(e)}var o=e("../type");t.exports=new o("tag:yaml.org,2002:bool",{kind:"scalar",resolve:r,construct:n,predicate:i,represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"})},{"../type":107}],110:[function(e,t){"use strict";function r(e){return null===e?!1:u.test(e)?!0:!1}function n(e){var t,r,n,i;return t=e.replace(/_/g,"").toLowerCase(),r="-"===t[0]?-1:1,i=[],"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===r?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?0/0:t.indexOf(":")>=0?(t.split(":").forEach(function(e){i.unshift(parseFloat(e,10))}),t=0,n=1,i.forEach(function(e){t+=e*n,n*=60}),r*t):r*parseFloat(t,10)}function i(e,t){var r;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(s.isNegativeZero(e))return"-0.0";return r=e.toString(10),l.test(r)?r.replace("e",".e"):r}function o(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!==0||s.isNegativeZero(e))}var s=e("../common"),a=e("../type"),u=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?|\\.[0-9_]+(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),l=/^[-+]?[0-9]+e/;t.exports=new a("tag:yaml.org,2002:float",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i,defaultStyle:"lowercase"})},{"../common":97,"../type":107}],111:[function(e,t){"use strict";function r(e){return e>=48&&57>=e||e>=65&&70>=e||e>=97&&102>=e}function n(e){return e>=48&&55>=e}function i(e){return e>=48&&57>=e}function o(e){if(null===e)return!1;var t,o=e.length,s=0,a=!1;if(!o)return!1;if(t=e[s],("-"===t||"+"===t)&&(t=e[++s]),"0"===t){if(s+1===o)return!0;if(t=e[++s],"b"===t){for(s++;o>s;s++)if(t=e[s],"_"!==t){if("0"!==t&&"1"!==t)return!1;a=!0}return a}if("x"===t){for(s++;o>s;s++)if(t=e[s],"_"!==t){if(!r(e.charCodeAt(s)))return!1;a=!0}return a}for(;o>s;s++)if(t=e[s],"_"!==t){if(!n(e.charCodeAt(s)))return!1;a=!0}return a}for(;o>s;s++)if(t=e[s],"_"!==t){if(":"===t)break;if(!i(e.charCodeAt(s)))return!1;a=!0}return a?":"!==t?!0:/^(:[0-5]?[0-9])+$/.test(e.slice(s)):!1}function s(e){var t,r,n=e,i=1,o=[];return-1!==n.indexOf("_")&&(n=n.replace(/_/g,"")),t=n[0],("-"===t||"+"===t)&&("-"===t&&(i=-1),n=n.slice(1),t=n[0]),"0"===n?0:"0"===t?"b"===n[1]?i*parseInt(n.slice(2),2):"x"===n[1]?i*parseInt(n,16):i*parseInt(n,8):-1!==n.indexOf(":")?(n.split(":").forEach(function(e){o.unshift(parseInt(e,10))}),n=0,r=1,o.forEach(function(e){n+=e*r,r*=60}),i*n):i*parseInt(n,10)}function a(e){return"[object Number]"===Object.prototype.toString.call(e)&&e%1===0&&!u.isNegativeZero(e)}var u=e("../common"),l=e("../type");t.exports=new l("tag:yaml.org,2002:int",{kind:"scalar",resolve:o,construct:s,predicate:a,represent:{binary:function(e){return"0b"+e.toString(2)},octal:function(e){return"0"+e.toString(8)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return"0x"+e.toString(16).toUpperCase()}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})},{"../common":97,"../type":107}],112:[function(e,t){"use strict";function r(e){if(null===e)return!1;try{var t="("+e+")",r=s.parse(t,{range:!0});return"Program"!==r.type||1!==r.body.length||"ExpressionStatement"!==r.body[0].type||"FunctionExpression"!==r.body[0].expression.type?!1:!0}catch(n){return!1}}function n(e){var t,r="("+e+")",n=s.parse(r,{range:!0}),i=[];if("Program"!==n.type||1!==n.body.length||"ExpressionStatement"!==n.body[0].type||"FunctionExpression"!==n.body[0].expression.type)throw new Error("Failed to resolve function");return n.body[0].expression.params.forEach(function(e){i.push(e.name)}),t=n.body[0].expression.body.range,new Function(i,r.slice(t[0]+1,t[1]-1))}function i(e){return e.toString()}function o(e){return"[object Function]"===Object.prototype.toString.call(e)}var s;try{var a=e;s=a("esprima")}catch(u){"undefined"!=typeof window&&(s=window.esprima)}var l=e("../../type");t.exports=new l("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../../type":107}],113:[function(e,t){"use strict";function r(e){if(null===e)return!1;if(0===e.length)return!1;var t=e,r=/\/([gim]*)$/.exec(e),n="";if("/"===t[0]){if(r&&(n=r[1]),n.length>3)return!1;if("/"!==t[t.length-n.length-1])return!1}return!0}function n(e){var t=e,r=/\/([gim]*)$/.exec(e),n="";return"/"===t[0]&&(r&&(n=r[1]),t=t.slice(1,t.length-n.length-1)),new RegExp(t,n)}function i(e){var t="/"+e.source+"/";return e.global&&(t+="g"),e.multiline&&(t+="m"),e.ignoreCase&&(t+="i"),t}function o(e){return"[object RegExp]"===Object.prototype.toString.call(e)}var s=e("../../type");t.exports=new s("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../../type":107}],114:[function(e,t){"use strict";function r(){return!0}function n(){return void 0}function i(){return""}function o(e){return"undefined"==typeof e}var s=e("../../type");t.exports=new s("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../../type":107}],115:[function(e,t){"use strict";var r=e("../type");t.exports=new r("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return null!==e?e:{}}})},{"../type":107}],116:[function(e,t){"use strict";function r(e){return"<<"===e||null===e}var n=e("../type");t.exports=new n("tag:yaml.org,2002:merge",{kind:"scalar",resolve:r})},{"../type":107}],117:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t=e.length;return 1===t&&"~"===e||4===t&&("null"===e||"Null"===e||"NULL"===e)}function n(){return null}function i(e){return null===e}var o=e("../type");t.exports=new o("tag:yaml.org,2002:null",{kind:"scalar",resolve:r,construct:n,predicate:i,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})},{"../type":107}],118:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t,r,n,i,a,u=[],l=e;for(t=0,r=l.length;r>t;t+=1){if(n=l[t],a=!1,"[object Object]"!==s.call(n))return!1;for(i in n)if(o.call(n,i)){if(a)return!1;a=!0}if(!a)return!1;if(-1!==u.indexOf(i))return!1;u.push(i)}return!0}function n(e){return null!==e?e:[]}var i=e("../type"),o=Object.prototype.hasOwnProperty,s=Object.prototype.toString;t.exports=new i("tag:yaml.org,2002:omap",{kind:"sequence",resolve:r,construct:n})},{"../type":107}],119:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t,r,n,i,s,a=e;for(s=new Array(a.length),t=0,r=a.length;r>t;t+=1){if(n=a[t],"[object Object]"!==o.call(n))return!1;if(i=Object.keys(n),1!==i.length)return!1;s[t]=[i[0],n[i[0]]]}return!0}function n(e){if(null===e)return[];var t,r,n,i,o,s=e;for(o=new Array(s.length),t=0,r=s.length;r>t;t+=1)n=s[t],i=Object.keys(n),o[t]=[i[0],n[i[0]]];return o}var i=e("../type"),o=Object.prototype.toString;t.exports=new i("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:r,construct:n})},{"../type":107}],120:[function(e,t){"use strict";var r=e("../type");t.exports=new r("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return null!==e?e:[]}})},{"../type":107}],121:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t,r=e;for(t in r)if(o.call(r,t)&&null!==r[t])return!1;return!0}function n(e){return null!==e?e:{}}var i=e("../type"),o=Object.prototype.hasOwnProperty;t.exports=new i("tag:yaml.org,2002:set",{kind:"mapping",resolve:r,construct:n})},{"../type":107}],122:[function(e,t){"use strict";var r=e("../type");t.exports=new r("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return null!==e?e:""}})},{"../type":107}],123:[function(e,t){"use strict";function r(e){return null===e?!1:null===s.exec(e)?!1:!0}function n(e){var t,r,n,i,o,a,u,l,c,f,h=0,d=null;if(t=s.exec(e),null===t)throw new Error("Date resolve error");if(r=+t[1],n=+t[2]-1,i=+t[3],!t[4])return new Date(Date.UTC(r,n,i));if(o=+t[4],a=+t[5],u=+t[6],t[7]){for(h=t[7].slice(0,3);h.length<3;)h+="0";h=+h}return t[9]&&(l=+t[10],c=+(t[11]||0),d=6e4*(60*l+c),"-"===t[9]&&(d=-d)),f=new Date(Date.UTC(r,n,i,o,a,u,h)),d&&f.setTime(f.getTime()-d),f}function i(e){return e.toISOString()}var o=e("../type"),s=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?)?$");t.exports=new o("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:r,construct:n,instanceOf:Date,represent:i})},{"../type":107}],124:[function(e,t,r){"use strict";var n=(e("./utils"),e("./support")),i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";r.decode=function(e){var t,r,o,s,a,u,l,c=0,f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");var h=3*e.length/4;e.charAt(e.length-1)===i.charAt(64)&&h--,e.charAt(e.length-2)===i.charAt(64)&&h--;var d;for(d=n.uint8array?new Uint8Array(h):new Array(h);c>4,r=(15&a)<<4|u>>2,o=(3&u)<<6|l,d[f++]=t,64!==u&&(d[f++]=r),64!==l&&(d[f++]=o);return d}},{"./support":150,"./utils":152}],125:[function(e,t){"use strict";function r(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}var n=e("./external"),i=e("./stream/DataWorker"),o=e("./stream/DataLengthProbe"),s=e("./stream/Crc32Probe"),o=e("./stream/DataLengthProbe");r.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new o("data_length")),t=this;return e.on("end",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},r.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new o("uncompressedSize")).pipe(t.compressWorker(r)).pipe(new o("compressedSize")).withStreamInfo("compression",t)},t.exports=r},{"./external":129,"./stream/Crc32Probe":145,"./stream/DataLengthProbe":146,"./stream/DataWorker":147}],126:[function(e,t,r){"use strict";var n=e("./stream/GenericWorker");r.STORE={magic:"\x00\x00",uncompressWorker:function(){return new n("STORE decompression")}},r.DEFLATE=e("./flate")},{"./flate":130,"./stream/GenericWorker":148}],127:[function(e,t){"use strict";function r(){for(var e,t=[],r=0;256>r;r++){e=r;for(var n=0;8>n;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}function n(e,t,r,n){var i=s,o=n+r;e=-1^e;for(var a=n;o>a;a++)e=e>>>8^i[255&(e^t[a])];return-1^e}function i(e,t,r,n){var i=s,o=n+r;e=-1^e;for(var a=n;o>a;a++)e=e>>>8^i[255&(e^t.charCodeAt(a))];return-1^e}var o=e("./utils"),s=r();t.exports=function(e,t){if("undefined"==typeof e||!e.length)return 0;var r="string"!==o.getTypeOf(e);return r?n(0|t,e,e.length,0):i(0|t,e,e.length,0)}},{"./utils":152}],128:[function(e,t,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],129:[function(e,t){"use strict";t.exports={Promise:window.Promise}},{}],130:[function(e,t,r){"use strict";function n(e,t){a.call(this,"FlateWorker/"+e),this._pako=new o[e]({raw:!0,level:t.level||-1}),this.meta={};var r=this;this._pako.onData=function(e){r.push({data:e,meta:r.meta})}}var i="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,o=e("pako"),s=e("./utils"),a=e("./stream/GenericWorker"),u=i?"uint8array":"array";r.magic="\b\x00",s.inherits(n,a),n.prototype.processChunk=function(e){this.meta=e.meta,this._pako.push(s.transformTo(u,e.data),!1)},n.prototype.flush=function(){a.prototype.flush.call(this),this._pako.push([],!0)},n.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},r.compressWorker=function(e){return new n("Deflate",e)},r.uncompressWorker=function(){return new n("Inflate",{})}},{"./stream/GenericWorker":148,"./utils":152,pako:158}],131:[function(e,t){"use strict";function r(){if(!(this instanceof r))return new r;if(arguments.length)throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");this.files={},this.comment=null,this.root="",this.clone=function(){var e=new r;for(var t in this)"function"!=typeof this[t]&&(e[t]=this[t]);return e}}r.prototype=e("./object"),r.prototype.loadAsync=e("./load"),r.support=e("./support"),r.defaults=e("./defaults"),r.loadAsync=function(e,t){return(new r).loadAsync(e,t)},r.external=e("./external"),t.exports=r},{"./defaults":128,"./external":129,"./load":132,"./object":136,"./support":150}],132:[function(e,t){"use strict";function r(e){return new i.Promise(function(t,r){var n=e.decompressed.getContentWorker().pipe(new a);n.on("error",function(e){r(e)}).on("end",function(){n.streamInfo.crc32!==e.decompressed.crc32?r(new Error("Corrupted zip : CRC32 mismatch")):t()}).resume()})}var n=e("./utils"),i=e("./external"),o=e("./utf8"),n=e("./utils"),s=e("./zipEntries"),a=e("./stream/Crc32Probe"),u=e("./nodejsUtils");t.exports=function(e,t){var a=this;return t=n.extend(t||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:o.utf8decode}),u.isNode&&u.isStream(e)?i.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")):n.prepareContent("the loaded zip file",e,!0,t.optimizedBinaryString,t.base64).then(function(e){var r=new s(t);return r.load(e),r}).then(function(e){var n=[i.Promise.resolve(e)],o=e.files;if(t.checkCRC32)for(var s=0;s0?e.substring(0,t):""},h=function(e){return"/"!==e.slice(-1)&&(e+="/"),e},d=function(e,t){return t="undefined"!=typeof t?t:o.createFolders,e=h(e),this.files[e]||c.call(this,e,null,{dir:!0,createFolders:t}),this.files[e]},p={load:function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},forEach:function(e){var t,r,n;for(t in this.files)this.files.hasOwnProperty(t)&&(n=this.files[t],r=t.slice(this.root.length,t.length),r&&t.slice(0,this.root.length)===this.root&&e(r,n))},filter:function(e){var t=[];return this.forEach(function(r,n){e(r,n)&&t.push(n)}),t},file:function(e,t,n){if(1===arguments.length){if(r(e)){var i=e;return this.filter(function(e,t){return!t.dir&&i.test(e)})}var o=this.files[this.root+e];return o&&!o.dir?o:null}return e=this.root+e,c.call(this,e,t,n),this},folder:function(e){if(!e)return this;if(r(e))return this.filter(function(t,r){return r.dir&&e.test(t)});var t=this.root+e,n=d.call(this,t),i=this.clone();return i.root=n.name,i}};t.exports=p},{"./compressedObject":125,"./defaults":128,"./nodejs/NodejsStreamInputAdapter":133,"./nodejsUtils":135,"./stream/GenericWorker":148,"./utils":152,"./zipObject":155}],137:[function(e,t){"use strict";function r(e){n.call(this,e);for(var t=0;t=0;--o)if(this.data[o]===t&&this.data[o+1]===r&&this.data[o+2]===n&&this.data[o+3]===i)return o-this.zero;return-1},r.prototype.readAndCheckSignature=function(e){var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),o=this.readData(4);return t===o[0]&&r===o[1]&&n===o[2]&&i===o[3]},r.prototype.readData=function(e){if(this.checkOffset(e),0===e)return[];var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":152,"./DataReader":138}],138:[function(e,t){"use strict";function r(e){this.data=e,this.length=e.length,this.index=0,this.zero=0}var n=e("../utils");r.prototype={checkOffset:function(e){this.checkIndex(this.index+e)},checkIndex:function(e){if(this.lengthe)throw new Error("End of data reached (data length = "+this.length+", asked index = "+e+"). Corrupted zip ?")},setIndex:function(e){this.checkIndex(e),this.index=e},skip:function(e){this.setIndex(this.index+e)},byteAt:function(){},readInt:function(e){var t,r=0;for(this.checkOffset(e),t=this.index+e-1;t>=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo("string",this.readData(e)) -},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC((e>>25&127)+1980,(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=r},{"../utils":152}],139:[function(e,t){"use strict";function r(e){n.call(this,e)}var n=e("./Uint8ArrayReader"),i=e("../utils");i.inherits(r,n),r.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":152,"./Uint8ArrayReader":141}],140:[function(e,t){"use strict";function r(e){n.call(this,e)}var n=e("./DataReader"),i=e("../utils");i.inherits(r,n),r.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},r.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},r.prototype.readAndCheckSignature=function(e){var t=this.readData(4);return e===t},r.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":152,"./DataReader":138}],141:[function(e,t){"use strict";function r(e){n.call(this,e)}var n=e("./ArrayReader"),i=e("../utils");i.inherits(r,n),r.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":152,"./ArrayReader":137}],142:[function(e,t){"use strict";var r=e("../utils"),n=e("../support"),i=e("./ArrayReader"),o=e("./StringReader"),s=e("./NodeBufferReader"),a=e("./Uint8ArrayReader");t.exports=function(e){var t=r.getTypeOf(e);return r.checkSupport(t),"string"!==t||n.uint8array?"nodebuffer"===t?new s(e):n.uint8array?new a(r.transformTo("uint8array",e)):new i(r.transformTo("array",e)):new o(e)}},{"../support":150,"../utils":152,"./ArrayReader":137,"./NodeBufferReader":139,"./StringReader":140,"./Uint8ArrayReader":141}],143:[function(e,t,r){"use strict";r.LOCAL_FILE_HEADER="PK",r.CENTRAL_FILE_HEADER="PK",r.CENTRAL_DIRECTORY_END="PK",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",r.ZIP64_CENTRAL_DIRECTORY_END="PK",r.DATA_DESCRIPTOR="PK\b"},{}],144:[function(e,t){"use strict";function r(e){n.call(this,"ConvertWorker to "+e),this.destType=e}var n=e("./GenericWorker"),i=e("../utils");i.inherits(r,n),r.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=r},{"../utils":152,"./GenericWorker":148}],145:[function(e,t){"use strict";function r(){n.call(this,"Crc32Probe")}var n=e("./GenericWorker"),i=e("../crc32"),o=e("../utils");o.inherits(r,n),r.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=r},{"../crc32":127,"../utils":152,"./GenericWorker":148}],146:[function(e,t){"use strict";function r(e){i.call(this,"DataLengthProbe for "+e),this.propName=e,this.withStreamInfo(e,0)}var n=e("../utils"),i=e("./GenericWorker");n.inherits(r,i),r.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=r},{"../utils":152,"./GenericWorker":148}],147:[function(e,t){"use strict";function r(e){i.call(this,"DataWorker");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}var n=e("../utils"),i=e("./GenericWorker"),o=16384;n.inherits(r,i),r.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},r.prototype.resume=function(){return i.prototype.resume.call(this)?(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0):!1},r.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},r.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=o,t=null,r=Math.min(this.max,this.index+e);if(this.index>=this.max)return this.end();switch(this.type){case"string":t=this.data.substring(this.index,r);break;case"uint8array":t=this.data.subarray(this.index,r);break;case"array":case"nodebuffer":t=this.data.slice(this.index,r)}return this.index=r,this.push({data:t,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=r},{"../utils":152,"./GenericWorker":148}],148:[function(e,t){"use strict";function r(e){this.name=e||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}r.prototype={push:function(e){this.emit("data",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit("error",e)}return!0},error:function(e){return this.isFinished?!1:(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit("error",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r "+e:e}},t.exports=r},{}],149:[function(e,t){(function(r){"use strict";function n(e,t,r){switch(e){case"blob":return a.newBlob(a.transformTo("arraybuffer",t),r);case"base64":return c.encode(t);default:return a.transformTo(e,t)}}function i(e,t){var n,i=0,o=null,s=0;for(n=0;nc;c++)l[c]=c>=252?6:c>=248?5:c>=240?4:c>=224?3:c>=192?2:1;l[254]=l[254]=1;var f=function(e){var t,r,n,i,o,a=e.length,u=0;for(i=0;a>i;i++)r=e.charCodeAt(i),55296===(64512&r)&&a>i+1&&(n=e.charCodeAt(i+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),i++)),u+=128>r?1:2048>r?2:65536>r?3:4;for(t=s.uint8array?new Uint8Array(u):new Array(u),o=0,i=0;u>o;i++)r=e.charCodeAt(i),55296===(64512&r)&&a>i+1&&(n=e.charCodeAt(i+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),i++)),128>r?t[o++]=r:2048>r?(t[o++]=192|r>>>6,t[o++]=128|63&r):65536>r?(t[o++]=224|r>>>12,t[o++]=128|r>>>6&63,t[o++]=128|63&r):(t[o++]=240|r>>>18,t[o++]=128|r>>>12&63,t[o++]=128|r>>>6&63,t[o++]=128|63&r);return t},h=function(e,t){var r;for(t=t||e.length,t>e.length&&(t=e.length),r=t-1;r>=0&&128===(192&e[r]);)r--;return 0>r?t:0===r?t:r+l[e[r]]>t?r:t},d=function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(r=0,t=0;s>t;)if(n=e[t++],128>n)a[r++]=n;else if(i=l[n],i>4)a[r++]=65533,t+=i-1;else{for(n&=2===i?31:3===i?15:7;i>1&&s>t;)n=n<<6|63&e[t++],i--;i>1?a[r++]=65533:65536>n?a[r++]=n:(n-=65536,a[r++]=55296|n>>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)};r.utf8encode=function(e){return s.nodebuffer?a.newBuffer(e,"utf-8"):f(e)},r.utf8decode=function(e){return s.nodebuffer?o.transformTo("nodebuffer",e).toString("utf-8"):(e=o.transformTo(s.uint8array?"uint8array":"array",e),d(e))},o.inherits(n,u),n.prototype.processChunk=function(e){var t=o.transformTo(s.uint8array?"uint8array":"array",e.data);if(this.leftOver&&this.leftOver.length){if(s.uint8array){var n=t;t=new Uint8Array(n.length+this.leftOver.length),t.set(this.leftOver,0),t.set(n,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var i=h(t),a=t;i!==t.length&&(s.uint8array?(a=t.subarray(0,i),this.leftOver=t.subarray(i,t.length)):(a=t.slice(0,i),this.leftOver=t.slice(i,t.length))),this.push({data:r.utf8decode(a),meta:e.meta})},n.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:r.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},r.Utf8DecodeWorker=n,o.inherits(i,u),i.prototype.processChunk=function(e){this.push({data:r.utf8encode(e.data),meta:e.meta})},r.Utf8EncodeWorker=i},{"./nodejsUtils":135,"./stream/GenericWorker":148,"./support":150,"./utils":152}],152:[function(e,t,r){"use strict";function n(e){var t=null;return t=u.uint8array?new Uint8Array(e.length):new Array(e.length),o(e,t)}function i(e){return e}function o(e,t){for(var r=0;r1;)try{return d.stringifyByChunk(e,n,t)}catch(o){t=Math.floor(t/2)}return d.stringifyByChar(e)}function a(e,t){for(var r=0;r=o)return String.fromCharCode.apply(null,e);for(;o>i;)n.push("array"===t||"nodebuffer"===t?String.fromCharCode.apply(null,e.slice(i,Math.min(i+r,o))):String.fromCharCode.apply(null,e.subarray(i,Math.min(i+r,o)))),i+=r;return n.join("")},stringifyByChar:function(e){for(var t="",r=0;rt?"0":"")+t.toString(16).toUpperCase();return n},r.delay=function(e,t,r){f(function(){e.apply(r||null,t||[])})},r.inherits=function(e,t){var r=function(){};r.prototype=t.prototype,e.prototype=new r},r.extend=function(){var e,t,r={};for(e=0;ei;)e=this.reader.readInt(2),t=this.reader.readInt(4),r=this.reader.readData(t),this.zip64ExtensibleData[e]={id:e,length:t,value:r}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var e,t;for(e=0;ee){var t=!this.isSignature(0,o.LOCAL_FILE_HEADER);throw new Error(t?"Can't find end of central directory : is this a zip file ? If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html":"Corrupted zip : can't find end of central directory")}this.reader.setIndex(e);var r=e;if(this.checkSignature(o.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===i.MAX_VALUE_16BITS||this.diskWithCentralDirStart===i.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===i.MAX_VALUE_16BITS||this.centralDirRecords===i.MAX_VALUE_16BITS||this.centralDirSize===i.MAX_VALUE_32BITS||this.centralDirOffset===i.MAX_VALUE_32BITS){if(this.zip64=!0,e=this.reader.lastIndexOfSignature(o.ZIP64_CENTRAL_DIRECTORY_LOCATOR),0>e)throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");if(this.reader.setIndex(e),this.checkSignature(o.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,o.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(o.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error("Corrupted zip : can't find the ZIP64 end of central directory");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(o.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var n=this.centralDirOffset+this.centralDirSize;this.zip64&&(n+=20,n+=12+this.zip64EndOfCentralSize);var s=r-n;if(s>0)this.isSignature(r,o.CENTRAL_FILE_HEADER)||(this.reader.zero=s);else if(0>s)throw new Error("Corrupted zip: missing "+Math.abs(s)+" bytes.")},prepareReader:function(e){this.reader=n(e)},load:function(e){this.prepareReader(e),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},t.exports=r},{"./reader/readerFor":142,"./signature":143,"./support":150,"./utf8":151,"./utils":152,"./zipEntry":154}],154:[function(e,t){"use strict";function r(e,t){this.options=e,this.loadOptions=t}var n=e("./reader/readerFor"),i=e("./utils"),o=e("./compressedObject"),s=e("./crc32"),a=e("./utf8"),u=e("./compressions"),l=e("./support"),c=0,f=3,h=function(e){for(var t in u)if(u.hasOwnProperty(t)&&u[t].magic===e)return u[t];return null};r.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},readLocalPart:function(e){var t,r;if(e.skip(22),this.fileNameLength=e.readInt(2),r=e.readInt(2),this.fileName=e.readData(this.fileNameLength),e.skip(r),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize === -1 || uncompressedSize === -1)");if(t=h(this.compressionMethod),null===t)throw new Error("Corrupted zip : compression "+i.pretty(this.compressionMethod)+" unknown (inner file : "+i.transformTo("string",this.fileName)+")");this.decompressed=new o(this.compressedSize,this.uncompressedSize,this.crc32,t,e.readData(this.compressedSize))},readCentralPart:function(e){this.versionMadeBy=e.readInt(2),e.skip(2),this.bitFlag=e.readInt(2),this.compressionMethod=e.readString(2),this.date=e.readDate(),this.crc32=e.readInt(4),this.compressedSize=e.readInt(4),this.uncompressedSize=e.readInt(4);var t=e.readInt(2);if(this.extraFieldsLength=e.readInt(2),this.fileCommentLength=e.readInt(2),this.diskNumberStart=e.readInt(2),this.internalFileAttributes=e.readInt(2),this.externalFileAttributes=e.readInt(4),this.localHeaderOffset=e.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");e.skip(t),this.readExtraFields(e),this.parseZIP64ExtraField(e),this.fileComment=e.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var e=this.versionMadeBy>>8;this.dir=16&this.externalFileAttributes?!0:!1,e===c&&(this.dosPermissions=63&this.externalFileAttributes),e===f&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===i.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===i.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===i.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===i.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.indexc){for(var t=0,r=a.length-l;r>t;t++)a[t]=a[t+l];a.length-=l,l=0}}a.length=0,l=0,u=!1}function i(e){var t=1,r=new h(e),n=document.createTextNode("");return r.observe(n,{characterData:!0}),function(){t=-t,n.data=t}}function o(e){return function(){function t(){clearTimeout(r),clearInterval(n),e()}var r=setTimeout(t,0),n=setInterval(t,50)}}t.exports=r;var s,a=[],u=!1,l=0,c=1024,f="undefined"!=typeof e?e:self,h=f.MutationObserver||f.WebKitMutationObserver;s="function"==typeof h?i(n):o(n),r.requestFlush=s,r.makeRequestCallFromTimer=o}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],158:[function(e,t){"use strict";var r=e("./lib/utils/common").assign,n=e("./lib/deflate"),i=e("./lib/inflate"),o=e("./lib/zlib/constants"),s={};r(s,n,i,o),t.exports=s},{"./lib/deflate":159,"./lib/inflate":160,"./lib/utils/common":161,"./lib/zlib/constants":164}],159:[function(e,t,r){"use strict";function n(e){if(!(this instanceof n))return new n(e);this.options=u.assign({level:v,method:b,chunkSize:16384,windowBits:15,memLevel:8,strategy:y,to:""},e||{});var t=this.options;t.raw&&t.windowBits>0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new f,this.strm.avail_out=0;var r=a.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(r!==_)throw new Error(c[r]);if(t.header&&a.deflateSetHeader(this.strm,t.header),t.dictionary){var i;if(i="string"==typeof t.dictionary?l.string2buf(t.dictionary):"[object ArrayBuffer]"===h.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,r=a.deflateSetDictionary(this.strm,i),r!==_)throw new Error(c[r]);this._dict_set=!0}}function i(e,t){var r=new n(t);if(r.push(e,!0),r.err)throw r.msg;return r.result}function o(e,t){return t=t||{},t.raw=!0,i(e,t)}function s(e,t){return t=t||{},t.gzip=!0,i(e,t)}var a=e("./zlib/deflate"),u=e("./utils/common"),l=e("./utils/strings"),c=e("./zlib/messages"),f=e("./zlib/zstream"),h=Object.prototype.toString,d=0,p=4,_=0,m=1,g=2,v=-1,y=0,b=8;n.prototype.push=function(e,t){var r,n,i=this.strm,o=this.options.chunkSize;if(this.ended)return!1;n=t===~~t?t:t===!0?p:d,i.input="string"==typeof e?l.string2buf(e):"[object ArrayBuffer]"===h.call(e)?new Uint8Array(e):e,i.next_in=0,i.avail_in=i.input.length;do{if(0===i.avail_out&&(i.output=new u.Buf8(o),i.next_out=0,i.avail_out=o),r=a.deflate(i,n),r!==m&&r!==_)return this.onEnd(r),this.ended=!0,!1;(0===i.avail_out||0===i.avail_in&&(n===p||n===g))&&this.onData("string"===this.options.to?l.buf2binstring(u.shrinkBuf(i.output,i.next_out)):u.shrinkBuf(i.output,i.next_out))}while((i.avail_in>0||0===i.avail_out)&&r!==m);return n===p?(r=a.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===_):n===g?(this.onEnd(_),i.avail_out=0,!0):!0},n.prototype.onData=function(e){this.chunks.push(e)},n.prototype.onEnd=function(e){e===_&&(this.result="string"===this.options.to?this.chunks.join(""):u.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Deflate=n,r.deflate=i,r.deflateRaw=o,r.gzip=s},{"./utils/common":161,"./utils/strings":162,"./zlib/deflate":166,"./zlib/messages":171,"./zlib/zstream":173}],160:[function(e,t,r){"use strict";function n(e){if(!(this instanceof n))return new n(e);this.options=a.assign({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0===(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new f,this.strm.avail_out=0;var r=s.inflateInit2(this.strm,t.windowBits);if(r!==l.Z_OK)throw new Error(c[r]);this.header=new h,s.inflateGetHeader(this.strm,this.header)}function i(e,t){var r=new n(t);if(r.push(e,!0),r.err)throw r.msg;return r.result}function o(e,t){return t=t||{},t.raw=!0,i(e,t)}var s=e("./zlib/inflate"),a=e("./utils/common"),u=e("./utils/strings"),l=e("./zlib/constants"),c=e("./zlib/messages"),f=e("./zlib/zstream"),h=e("./zlib/gzheader"),d=Object.prototype.toString;n.prototype.push=function(e,t){var r,n,i,o,c,f,h=this.strm,p=this.options.chunkSize,_=this.options.dictionary,m=!1;if(this.ended)return!1;n=t===~~t?t:t===!0?l.Z_FINISH:l.Z_NO_FLUSH,h.input="string"==typeof e?u.binstring2buf(e):"[object ArrayBuffer]"===d.call(e)?new Uint8Array(e):e,h.next_in=0,h.avail_in=h.input.length;do{if(0===h.avail_out&&(h.output=new a.Buf8(p),h.next_out=0,h.avail_out=p),r=s.inflate(h,l.Z_NO_FLUSH),r===l.Z_NEED_DICT&&_&&(f="string"==typeof _?u.string2buf(_):"[object ArrayBuffer]"===d.call(_)?new Uint8Array(_):_,r=s.inflateSetDictionary(this.strm,f)),r===l.Z_BUF_ERROR&&m===!0&&(r=l.Z_OK,m=!1),r!==l.Z_STREAM_END&&r!==l.Z_OK)return this.onEnd(r),this.ended=!0,!1;h.next_out&&(0===h.avail_out||r===l.Z_STREAM_END||0===h.avail_in&&(n===l.Z_FINISH||n===l.Z_SYNC_FLUSH))&&("string"===this.options.to?(i=u.utf8border(h.output,h.next_out),o=h.next_out-i,c=u.buf2string(h.output,i),h.next_out=o,h.avail_out=p-o,o&&a.arraySet(h.output,h.output,i,o,0),this.onData(c)):this.onData(a.shrinkBuf(h.output,h.next_out))),0===h.avail_in&&0===h.avail_out&&(m=!0) -}while((h.avail_in>0||0===h.avail_out)&&r!==l.Z_STREAM_END);return r===l.Z_STREAM_END&&(n=l.Z_FINISH),n===l.Z_FINISH?(r=s.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===l.Z_OK):n===l.Z_SYNC_FLUSH?(this.onEnd(l.Z_OK),h.avail_out=0,!0):!0},n.prototype.onData=function(e){this.chunks.push(e)},n.prototype.onEnd=function(e){e===l.Z_OK&&(this.result="string"===this.options.to?this.chunks.join(""):a.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Inflate=n,r.inflate=i,r.inflateRaw=o,r.ungzip=i},{"./utils/common":161,"./utils/strings":162,"./zlib/constants":164,"./zlib/gzheader":167,"./zlib/inflate":169,"./zlib/messages":171,"./zlib/zstream":173}],161:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;r.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(var n in r)r.hasOwnProperty(n)&&(e[n]=r[n])}}return e},r.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var i={arraySet:function(e,t,r,n,i){if(t.subarray&&e.subarray)return void e.set(t.subarray(r,r+n),i);for(var o=0;n>o;o++)e[i+o]=t[r+o]},flattenChunks:function(e){var t,r,n,i,o,s;for(n=0,t=0,r=e.length;r>t;t++)n+=e[t].length;for(s=new Uint8Array(n),i=0,t=0,r=e.length;r>t;t++)o=e[t],s.set(o,i),i+=o.length;return s}},o={arraySet:function(e,t,r,n,i){for(var o=0;n>o;o++)e[i+o]=t[r+o]},flattenChunks:function(e){return[].concat.apply([],e)}};r.setTyped=function(e){e?(r.Buf8=Uint8Array,r.Buf16=Uint16Array,r.Buf32=Int32Array,r.assign(r,i)):(r.Buf8=Array,r.Buf16=Array,r.Buf32=Array,r.assign(r,o))},r.setTyped(n)},{}],162:[function(e,t,r){"use strict";function n(e,t){if(65537>t&&(e.subarray&&s||!e.subarray&&o))return String.fromCharCode.apply(null,i.shrinkBuf(e,t));for(var r="",n=0;t>n;n++)r+=String.fromCharCode(e[n]);return r}var i=e("./common"),o=!0,s=!0;try{String.fromCharCode.apply(null,[0])}catch(a){o=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(a){s=!1}for(var u=new i.Buf8(256),l=0;256>l;l++)u[l]=l>=252?6:l>=248?5:l>=240?4:l>=224?3:l>=192?2:1;u[254]=u[254]=1,r.string2buf=function(e){var t,r,n,o,s,a=e.length,u=0;for(o=0;a>o;o++)r=e.charCodeAt(o),55296===(64512&r)&&a>o+1&&(n=e.charCodeAt(o+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),o++)),u+=128>r?1:2048>r?2:65536>r?3:4;for(t=new i.Buf8(u),s=0,o=0;u>s;o++)r=e.charCodeAt(o),55296===(64512&r)&&a>o+1&&(n=e.charCodeAt(o+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),o++)),128>r?t[s++]=r:2048>r?(t[s++]=192|r>>>6,t[s++]=128|63&r):65536>r?(t[s++]=224|r>>>12,t[s++]=128|r>>>6&63,t[s++]=128|63&r):(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63,t[s++]=128|r>>>6&63,t[s++]=128|63&r);return t},r.buf2binstring=function(e){return n(e,e.length)},r.binstring2buf=function(e){for(var t=new i.Buf8(e.length),r=0,n=t.length;n>r;r++)t[r]=e.charCodeAt(r);return t},r.buf2string=function(e,t){var r,i,o,s,a=t||e.length,l=new Array(2*a);for(i=0,r=0;a>r;)if(o=e[r++],128>o)l[i++]=o;else if(s=u[o],s>4)l[i++]=65533,r+=s-1;else{for(o&=2===s?31:3===s?15:7;s>1&&a>r;)o=o<<6|63&e[r++],s--;s>1?l[i++]=65533:65536>o?l[i++]=o:(o-=65536,l[i++]=55296|o>>10&1023,l[i++]=56320|1023&o)}return n(l,i)},r.utf8border=function(e,t){var r;for(t=t||e.length,t>e.length&&(t=e.length),r=t-1;r>=0&&128===(192&e[r]);)r--;return 0>r?t:0===r?t:r+u[e[r]]>t?r:t}},{"./common":161}],163:[function(e,t){"use strict";function r(e,t,r,n){for(var i=65535&e|0,o=e>>>16&65535|0,s=0;0!==r;){s=r>2e3?2e3:r,r-=s;do i=i+t[n++]|0,o=o+i|0;while(--s);i%=65521,o%=65521}return i|o<<16|0}t.exports=r},{}],164:[function(e,t){"use strict";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],165:[function(e,t){"use strict";function r(){for(var e,t=[],r=0;256>r;r++){e=r;for(var n=0;8>n;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}function n(e,t,r,n){var o=i,s=n+r;e^=-1;for(var a=n;s>a;a++)e=e>>>8^o[255&(e^t[a])];return-1^e}var i=r();t.exports=n},{}],166:[function(e,t,r){"use strict";function n(e,t){return e.msg=j[t],t}function i(e){return(e<<1)-(e>4?9:0)}function o(e){for(var t=e.length;--t>=0;)e[t]=0}function s(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(P.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function a(e,t){O._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,s(e.strm)}function u(e,t){e.pending_buf[e.pending++]=t}function l(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function c(e,t,r,n){var i=e.avail_in;return i>n&&(i=n),0===i?0:(e.avail_in-=i,P.arraySet(t,e.input,e.next_in,i,r),1===e.state.wrap?e.adler=z(e.adler,t,i,r):2===e.state.wrap&&(e.adler=N(e.adler,t,i,r)),e.next_in+=i,e.total_in+=i,i)}function f(e,t){var r,n,i=e.max_chain_length,o=e.strstart,s=e.prev_length,a=e.nice_match,u=e.strstart>e.w_size-ft?e.strstart-(e.w_size-ft):0,l=e.window,c=e.w_mask,f=e.prev,h=e.strstart+ct,d=l[o+s-1],p=l[o+s];e.prev_length>=e.good_match&&(i>>=2),a>e.lookahead&&(a=e.lookahead);do if(r=t,l[r+s]===p&&l[r+s-1]===d&&l[r]===l[o]&&l[++r]===l[o+1]){o+=2,r++;do;while(l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&h>o);if(n=ct-(h-o),o=h-ct,n>s){if(e.match_start=t,s=n,n>=a)break;d=l[o+s-1],p=l[o+s]}}while((t=f[t&c])>u&&0!==--i);return s<=e.lookahead?s:e.lookahead}function h(e){var t,r,n,i,o,s=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=s+(s-ft)){P.arraySet(e.window,e.window,s,s,0),e.match_start-=s,e.strstart-=s,e.block_start-=s,r=e.hash_size,t=r;do n=e.head[--t],e.head[t]=n>=s?n-s:0;while(--r);r=s,t=r;do n=e.prev[--t],e.prev[t]=n>=s?n-s:0;while(--r);i+=s}if(0===e.strm.avail_in)break;if(r=c(e.strm,e.window,e.strstart+e.lookahead,i),e.lookahead+=r,e.lookahead+e.insert>=lt)for(o=e.strstart-e.insert,e.ins_h=e.window[o],e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(h(e),0===e.lookahead&&t===L)return bt;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,a(e,!1),0===e.strm.avail_out))return bt;if(e.strstart-e.block_start>=e.w_size-ft&&(a(e,!1),0===e.strm.avail_out))return bt}return e.insert=0,t===F?(a(e,!0),0===e.strm.avail_out?wt:kt):e.strstart>e.block_start&&(a(e,!1),0===e.strm.avail_out)?bt:bt}function p(e,t){for(var r,n;;){if(e.lookahead=lt&&(e.ins_h=(e.ins_h<=lt)if(n=O._tr_tally(e,e.strstart-e.match_start,e.match_length-lt),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=lt){e.match_length--;do e.strstart++,e.ins_h=(e.ins_h<=lt&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=lt-1)),e.prev_length>=lt&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-lt,n=O._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-lt),e.lookahead-=e.prev_length-1,e.prev_length-=2;do++e.strstart<=i&&(e.ins_h=(e.ins_h<=lt&&e.strstart>0&&(i=e.strstart-1,n=s[i],n===s[++i]&&n===s[++i]&&n===s[++i])){o=e.strstart+ct;do;while(n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&o>i);e.match_length=ct-(o-i),e.match_length>e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=lt?(r=O._tr_tally(e,1,e.match_length-lt),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=O._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(a(e,!1),0===e.strm.avail_out))return bt}return e.insert=0,t===F?(a(e,!0),0===e.strm.avail_out?wt:kt):e.last_lit&&(a(e,!1),0===e.strm.avail_out)?bt:xt}function g(e,t){for(var r;;){if(0===e.lookahead&&(h(e),0===e.lookahead)){if(t===L)return bt;break}if(e.match_length=0,r=O._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(a(e,!1),0===e.strm.avail_out))return bt}return e.insert=0,t===F?(a(e,!0),0===e.strm.avail_out?wt:kt):e.last_lit&&(a(e,!1),0===e.strm.avail_out)?bt:xt}function v(e,t,r,n,i){this.good_length=e,this.max_lazy=t,this.nice_length=r,this.max_chain=n,this.func=i}function y(e){e.window_size=2*e.w_size,o(e.head),e.max_lazy_match=M[e.level].max_lazy,e.good_match=M[e.level].good_length,e.nice_match=M[e.level].nice_length,e.max_chain_length=M[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=lt-1,e.match_available=0,e.ins_h=0}function b(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=$,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new P.Buf16(2*at),this.dyn_dtree=new P.Buf16(2*(2*ot+1)),this.bl_tree=new P.Buf16(2*(2*st+1)),o(this.dyn_ltree),o(this.dyn_dtree),o(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new P.Buf16(ut+1),this.heap=new P.Buf16(2*it+1),o(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new P.Buf16(2*it+1),o(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function x(e){var t;return e&&e.state?(e.total_in=e.total_out=0,e.data_type=K,t=e.state,t.pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap?dt:vt,e.adler=2===t.wrap?0:1,t.last_flush=L,O._tr_init(t),D):n(e,G)}function w(e){var t=x(e);return t===D&&y(e.state),t}function k(e,t){return e&&e.state?2!==e.state.wrap?G:(e.state.gzhead=t,D):G}function A(e,t,r,i,o,s){if(!e)return G;var a=1;if(t===W&&(t=6),0>i?(a=0,i=-i):i>15&&(a=2,i-=16),1>o||o>Q||r!==$||8>i||i>15||0>t||t>9||0>s||s>Y)return n(e,G);8===i&&(i=9);var u=new b;return e.state=u,u.strm=e,u.wrap=a,u.gzhead=null,u.w_bits=i,u.w_size=1<U||0>t)return e?n(e,G):G;if(a=e.state,!e.output||!e.input&&0!==e.avail_in||a.status===yt&&t!==F)return n(e,0===e.avail_out?q:G);if(a.strm=e,r=a.last_flush,a.last_flush=t,a.status===dt)if(2===a.wrap)e.adler=0,u(a,31),u(a,139),u(a,8),a.gzhead?(u(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),u(a,255&a.gzhead.time),u(a,a.gzhead.time>>8&255),u(a,a.gzhead.time>>16&255),u(a,a.gzhead.time>>24&255),u(a,9===a.level?2:a.strategy>=H||a.level<2?4:0),u(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(u(a,255&a.gzhead.extra.length),u(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(e.adler=N(e.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=pt):(u(a,0),u(a,0),u(a,0),u(a,0),u(a,0),u(a,9===a.level?2:a.strategy>=H||a.level<2?4:0),u(a,At),a.status=vt);else{var h=$+(a.w_bits-8<<4)<<8,d=-1;d=a.strategy>=H||a.level<2?0:a.level<6?1:6===a.level?2:3,h|=d<<6,0!==a.strstart&&(h|=ht),h+=31-h%31,a.status=vt,l(a,h),0!==a.strstart&&(l(a,e.adler>>>16),l(a,65535&e.adler)),e.adler=1}if(a.status===pt)if(a.gzhead.extra){for(c=a.pending;a.gzindex<(65535&a.gzhead.extra.length)&&(a.pending!==a.pending_buf_size||(a.gzhead.hcrc&&a.pending>c&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),s(e),c=a.pending,a.pending!==a.pending_buf_size));)u(a,255&a.gzhead.extra[a.gzindex]),a.gzindex++;a.gzhead.hcrc&&a.pending>c&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),a.gzindex===a.gzhead.extra.length&&(a.gzindex=0,a.status=_t)}else a.status=_t;if(a.status===_t)if(a.gzhead.name){c=a.pending;do{if(a.pending===a.pending_buf_size&&(a.gzhead.hcrc&&a.pending>c&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),s(e),c=a.pending,a.pending===a.pending_buf_size)){f=1;break}f=a.gzindexc&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),0===f&&(a.gzindex=0,a.status=mt)}else a.status=mt;if(a.status===mt)if(a.gzhead.comment){c=a.pending;do{if(a.pending===a.pending_buf_size&&(a.gzhead.hcrc&&a.pending>c&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),s(e),c=a.pending,a.pending===a.pending_buf_size)){f=1;break}f=a.gzindexc&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),0===f&&(a.status=gt)}else a.status=gt;if(a.status===gt&&(a.gzhead.hcrc?(a.pending+2>a.pending_buf_size&&s(e),a.pending+2<=a.pending_buf_size&&(u(a,255&e.adler),u(a,e.adler>>8&255),e.adler=0,a.status=vt)):a.status=vt),0!==a.pending){if(s(e),0===e.avail_out)return a.last_flush=-1,D}else if(0===e.avail_in&&i(t)<=i(r)&&t!==F)return n(e,q);if(a.status===yt&&0!==e.avail_in)return n(e,q);if(0!==e.avail_in||0!==a.lookahead||t!==L&&a.status!==yt){var p=a.strategy===H?g(a,t):a.strategy===X?m(a,t):M[a.level].func(a,t);if((p===wt||p===kt)&&(a.status=yt),p===bt||p===wt)return 0===e.avail_out&&(a.last_flush=-1),D;if(p===xt&&(t===I?O._tr_align(a):t!==U&&(O._tr_stored_block(a,0,0,!1),t===C&&(o(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),s(e),0===e.avail_out))return a.last_flush=-1,D}return t!==F?D:a.wrap<=0?B:(2===a.wrap?(u(a,255&e.adler),u(a,e.adler>>8&255),u(a,e.adler>>16&255),u(a,e.adler>>24&255),u(a,255&e.total_in),u(a,e.total_in>>8&255),u(a,e.total_in>>16&255),u(a,e.total_in>>24&255)):(l(a,e.adler>>>16),l(a,65535&e.adler)),s(e),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?D:B)}function S(e){var t;return e&&e.state?(t=e.state.status,t!==dt&&t!==pt&&t!==_t&&t!==mt&&t!==gt&&t!==vt&&t!==yt?n(e,G):(e.state=null,t===vt?n(e,V):D)):G}function R(e,t){var r,n,i,s,a,u,l,c,f=t.length;if(!e||!e.state)return G;if(r=e.state,s=r.wrap,2===s||1===s&&r.status!==dt||r.lookahead)return G;for(1===s&&(e.adler=z(e.adler,t,f,0)),r.wrap=0,f>=r.w_size&&(0===s&&(o(r.head),r.strstart=0,r.block_start=0,r.insert=0),c=new P.Buf8(r.w_size),P.arraySet(c,t,f-r.w_size,r.w_size,0),t=c,f=r.w_size),a=e.avail_in,u=e.next_in,l=e.input,e.avail_in=f,e.next_in=0,e.input=t,h(r);r.lookahead>=lt;){n=r.strstart,i=r.lookahead-(lt-1);do r.ins_h=(r.ins_h<m&&(_+=S[o++]<>>24,_>>>=w,m-=w,w=x>>>16&255,0===w)R[a++]=65535&x;else{if(!(16&w)){if(0===(64&w)){x=g[(65535&x)+(_&(1<m&&(_+=S[o++]<>>=w,m-=w),15>m&&(_+=S[o++]<>>24,_>>>=w,m-=w,w=x>>>16&255,!(16&w)){if(0===(64&w)){x=v[(65535&x)+(_&(1<m&&(_+=S[o++]<m&&(_+=S[o++]<c){e.msg="invalid distance too far back",i.mode=r;break e}if(_>>>=w,m-=w,w=a-u,A>w){if(w=A-w,w>h&&i.sane){e.msg="invalid distance too far back",i.mode=r;break e}if(T=0,E=p,0===d){if(T+=f-w,k>w){k-=w;do R[a++]=p[T++];while(--w);T=a-A,E=R}}else if(w>d){if(T+=f+d-w,w-=d,k>w){k-=w;do R[a++]=p[T++];while(--w);if(T=0,k>d){w=d,k-=w;do R[a++]=p[T++];while(--w);T=a-A,E=R}}}else if(T+=d-w,k>w){k-=w;do R[a++]=p[T++];while(--w);T=a-A,E=R}for(;k>2;)R[a++]=E[T++],R[a++]=E[T++],R[a++]=E[T++],k-=3;k&&(R[a++]=E[T++],k>1&&(R[a++]=E[T++]))}else{T=a-A;do R[a++]=R[T++],R[a++]=R[T++],R[a++]=R[T++],k-=3;while(k>2);k&&(R[a++]=R[T++],k>1&&(R[a++]=R[T++]))}break}}break}}while(s>o&&l>a);k=m>>3,o-=k,m-=k<<3,_&=(1<o?5+(s-o):5-(o-s),e.avail_out=l>a?257+(l-a):257-(a-l),i.hold=_,i.bits=m}},{}],169:[function(e,t,r){"use strict";function n(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function i(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new v.Buf16(320),this.work=new v.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function o(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=C,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new v.Buf32(_t),t.distcode=t.distdyn=new v.Buf32(mt),t.sane=1,t.back=-1,M):z}function s(e){var t;return e&&e.state?(t=e.state,t.wsize=0,t.whave=0,t.wnext=0,o(e)):z}function a(e,t){var r,n;return e&&e.state?(n=e.state,0>t?(r=0,t=-t):(r=(t>>4)+1,48>t&&(t&=15)),t&&(8>t||t>15)?z:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,s(e))):z}function u(e,t){var r,n;return e?(n=new i,e.state=n,n.window=null,r=a(e,t),r!==M&&(e.state=null),r):z}function l(e){return u(e,vt)}function c(e){if(yt){var t;for(m=new v.Buf32(512),g=new v.Buf32(32),t=0;144>t;)e.lens[t++]=8;for(;256>t;)e.lens[t++]=9;for(;280>t;)e.lens[t++]=7;for(;288>t;)e.lens[t++]=8;for(w(A,e.lens,0,288,m,0,e.work,{bits:9}),t=0;32>t;)e.lens[t++]=5;w(T,e.lens,0,32,g,0,e.work,{bits:5}),yt=!1}e.lencode=m,e.lenbits=9,e.distcode=g,e.distbits=5}function f(e,t,r,n){var i,o=e.state;return null===o.window&&(o.wsize=1<=o.wsize?(v.arraySet(o.window,t,r-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):(i=o.wsize-o.wnext,i>n&&(i=n),v.arraySet(o.window,t,r-n,i,o.wnext),n-=i,n?(v.arraySet(o.window,t,r-n,n,0),o.wnext=n,o.whave=o.wsize):(o.wnext+=i,o.wnext===o.wsize&&(o.wnext=0),o.whaved;){if(0===u)break e;u--,h+=i[s++]<>>8&255,r.check=b(r.check,St,2,0),h=0,d=0,r.mode=F;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&h)<<8)+(h>>8))%31){e.msg="incorrect header check",r.mode=ht;break}if((15&h)!==I){e.msg="unknown compression method",r.mode=ht;break}if(h>>>=4,d-=4,wt=(15&h)+8,0===r.wbits)r.wbits=wt;else if(wt>r.wbits){e.msg="invalid window size",r.mode=ht;break}r.dmax=1<d;){if(0===u)break e;u--,h+=i[s++]<>8&1),512&r.flags&&(St[0]=255&h,St[1]=h>>>8&255,r.check=b(r.check,St,2,0)),h=0,d=0,r.mode=U;case U:for(;32>d;){if(0===u)break e;u--,h+=i[s++]<>>8&255,St[2]=h>>>16&255,St[3]=h>>>24&255,r.check=b(r.check,St,4,0)),h=0,d=0,r.mode=D;case D:for(;16>d;){if(0===u)break e;u--,h+=i[s++]<>8),512&r.flags&&(St[0]=255&h,St[1]=h>>>8&255,r.check=b(r.check,St,2,0)),h=0,d=0,r.mode=B;case B:if(1024&r.flags){for(;16>d;){if(0===u)break e;u--,h+=i[s++]<>>8&255,r.check=b(r.check,St,2,0)),h=0,d=0}else r.head&&(r.head.extra=null);r.mode=G;case G:if(1024&r.flags&&(m=r.length,m>u&&(m=u),m&&(r.head&&(wt=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),v.arraySet(r.head.extra,i,s,m,wt)),512&r.flags&&(r.check=b(r.check,i,m,s)),u-=m,s+=m,r.length-=m),r.length))break e;r.length=0,r.mode=V;case V:if(2048&r.flags){if(0===u)break e;m=0;do wt=i[s+m++],r.head&&wt&&r.length<65536&&(r.head.name+=String.fromCharCode(wt));while(wt&&u>m);if(512&r.flags&&(r.check=b(r.check,i,m,s)),u-=m,s+=m,wt)break e}else r.head&&(r.head.name=null);r.length=0,r.mode=q;case q:if(4096&r.flags){if(0===u)break e;m=0;do wt=i[s+m++],r.head&&wt&&r.length<65536&&(r.head.comment+=String.fromCharCode(wt));while(wt&&u>m);if(512&r.flags&&(r.check=b(r.check,i,m,s)),u-=m,s+=m,wt)break e}else r.head&&(r.head.comment=null);r.mode=W;case W:if(512&r.flags){for(;16>d;){if(0===u)break e;u--,h+=i[s++]<>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=X;break;case Z:for(;32>d;){if(0===u)break e;u--,h+=i[s++]<>>=7&d,d-=7&d,r.mode=lt;break}for(;3>d;){if(0===u)break e;u--,h+=i[s++]<>>=1,d-=1,3&h){case 0:r.mode=J;break;case 1:if(c(r),r.mode=rt,t===R){h>>>=2,d-=2;break e}break;case 2:r.mode=Q;break;case 3:e.msg="invalid block type",r.mode=ht}h>>>=2,d-=2;break;case J:for(h>>>=7&d,d-=7&d;32>d;){if(0===u)break e;u--,h+=i[s++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=ht;break}if(r.length=65535&h,h=0,d=0,r.mode=K,t===R)break e;case K:r.mode=$;case $:if(m=r.length){if(m>u&&(m=u),m>l&&(m=l),0===m)break e;v.arraySet(o,i,s,m,a),u-=m,s+=m,l-=m,a+=m,r.length-=m;break}r.mode=X;break;case Q:for(;14>d;){if(0===u)break e;u--,h+=i[s++]<>>=5,d-=5,r.ndist=(31&h)+1,h>>>=5,d-=5,r.ncode=(15&h)+4,h>>>=4,d-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=ht;break}r.have=0,r.mode=et;case et:for(;r.haved;){if(0===u)break e;u--,h+=i[s++]<>>=3,d-=3}for(;r.have<19;)r.lens[Rt[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,At={bits:r.lenbits},kt=w(k,r.lens,0,19,r.lencode,0,r.work,At),r.lenbits=At.bits,kt){e.msg="invalid code lengths set",r.mode=ht;break}r.have=0,r.mode=tt;case tt:for(;r.have>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=mt);){if(0===u)break e;u--,h+=i[s++]<vt)h>>>=mt,d-=mt,r.lens[r.have++]=vt;else{if(16===vt){for(Tt=mt+2;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=mt,d-=mt,0===r.have){e.msg="invalid bit length repeat",r.mode=ht;break}wt=r.lens[r.have-1],m=3+(3&h),h>>>=2,d-=2}else if(17===vt){for(Tt=mt+3;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=mt,d-=mt,wt=0,m=3+(7&h),h>>>=3,d-=3}else{for(Tt=mt+7;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=mt,d-=mt,wt=0,m=11+(127&h),h>>>=7,d-=7}if(r.have+m>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=ht;break}for(;m--;)r.lens[r.have++]=wt}}if(r.mode===ht)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=ht;break}if(r.lenbits=9,At={bits:r.lenbits},kt=w(A,r.lens,0,r.nlen,r.lencode,0,r.work,At),r.lenbits=At.bits,kt){e.msg="invalid literal/lengths set",r.mode=ht;break}if(r.distbits=6,r.distcode=r.distdyn,At={bits:r.distbits},kt=w(T,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,At),r.distbits=At.bits,kt){e.msg="invalid distances set",r.mode=ht;break}if(r.mode=rt,t===R)break e;case rt:r.mode=nt;case nt:if(u>=6&&l>=258){e.next_out=a,e.avail_out=l,e.next_in=s,e.avail_in=u,r.hold=h,r.bits=d,x(e,_),a=e.next_out,o=e.output,l=e.avail_out,s=e.next_in,i=e.input,u=e.avail_in,h=r.hold,d=r.bits,r.mode===X&&(r.back=-1);break}for(r.back=0;Et=r.lencode[h&(1<>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=mt);){if(0===u)break e;u--,h+=i[s++]<>yt)],mt=Et>>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=yt+mt);){if(0===u)break e;u--,h+=i[s++]<>>=yt,d-=yt,r.back+=yt}if(h>>>=mt,d-=mt,r.back+=mt,r.length=vt,0===gt){r.mode=ut;break}if(32>){r.back=-1,r.mode=X;break}if(64>){e.msg="invalid literal/length code",r.mode=ht;break}r.extra=15>,r.mode=it;case it:if(r.extra){for(Tt=r.extra;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=r.extra,d-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=ot;case ot:for(;Et=r.distcode[h&(1<>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=mt);){if(0===u)break e;u--,h+=i[s++]<>yt)],mt=Et>>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=yt+mt);){if(0===u)break e;u--,h+=i[s++]<>>=yt,d-=yt,r.back+=yt}if(h>>>=mt,d-=mt,r.back+=mt,64>){e.msg="invalid distance code",r.mode=ht;break}r.offset=vt,r.extra=15>,r.mode=st;case st:if(r.extra){for(Tt=r.extra;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=r.extra,d-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=ht;break}r.mode=at;case at:if(0===l)break e;if(m=_-l,r.offset>m){if(m=r.offset-m,m>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=ht;break}m>r.wnext?(m-=r.wnext,g=r.wsize-m):g=r.wnext-m,m>r.length&&(m=r.length),_t=r.window}else _t=o,g=a-r.offset,m=r.length;m>l&&(m=l),l-=m,r.length-=m;do o[a++]=_t[g++];while(--m);0===r.length&&(r.mode=nt);break;case ut:if(0===l)break e;o[a++]=r.length,l--,r.mode=nt;break;case lt:if(r.wrap){for(;32>d;){if(0===u)break e;u--,h|=i[s++]<d;){if(0===u)break e;u--,h+=i[s++]<=M;M++)B[M]=0;for(P=0;p>P;P++)B[t[d+P]]++;for(N=R,z=n;z>=1&&0===B[z];z--);if(N>z&&(N=z),0===z)return _[m++]=20971520,_[m++]=20971520,v.bits=1,0;for(O=1;z>O&&0===B[O];O++);for(O>N&&(N=O),I=1,M=1;n>=M;M++)if(I<<=1,I-=B[M],0>I)return-1;if(I>0&&(e===s||1!==z))return-1;for(G[1]=0,M=1;n>M;M++)G[M+1]=G[M]+B[M];for(P=0;p>P;P++)0!==t[d+P]&&(g[G[t[d+P]]++]=P);if(e===s?(U=V=g,A=19):e===a?(U=l,D-=257,V=c,q-=257,A=256):(U=f,V=h,A=-1),F=0,P=0,M=O,k=m,j=N,L=0,x=-1,C=1<i||e===u&&C>o)return 1;for(var W=0;;){W++,T=M-L,g[P]A?(E=V[q+g[P]],S=U[D+g[P]]):(E=96,S=0),y=1<>L)+b]=T<<24|E<<16|S|0;while(0!==b);for(y=1<>=1;if(0!==y?(F&=y-1,F+=y):F=0,P++,0===--B[M]){if(M===z)break;M=t[d+g[P]]}if(M>N&&(F&w)!==x){for(0===L&&(L=N),k+=O,j=M-L,I=1<j+L&&(I-=B[j+L],!(0>=I));)j++,I<<=1;if(C+=1<i||e===u&&C>o)return 1;x=F&w,_[x]=N<<24|j<<16|k-m|0}}return 0!==F&&(_[k+F]=M-L<<24|64<<16|0),v.bits=N,0}},{"../utils/common":161}],171:[function(e,t){"use strict";t.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],172:[function(e,t,r){"use strict";function n(e){for(var t=e.length;--t>=0;)e[t]=0}function i(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function o(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function s(e){return 256>e?ut[e]:ut[256+(e>>>7)]}function a(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function u(e,t,r){e.bi_valid>Y-r?(e.bi_buf|=t<>Y-e.bi_valid,e.bi_valid+=r-Y):(e.bi_buf|=t<>>=1,r<<=1;while(--t>0);return r>>>1}function f(e){16===e.bi_valid?(a(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}function h(e,t){var r,n,i,o,s,a,u=t.dyn_tree,l=t.max_code,c=t.stat_desc.static_tree,f=t.stat_desc.has_stree,h=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,_=0;for(o=0;X>=o;o++)e.bl_count[o]=0;for(u[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;H>r;r++)n=e.heap[r],o=u[2*u[2*n+1]+1]+1,o>p&&(o=p,_++),u[2*n+1]=o,n>l||(e.bl_count[o]++,s=0,n>=d&&(s=h[n-d]),a=u[2*n],e.opt_len+=a*(o+s),f&&(e.static_len+=a*(c[2*n+1]+s)));if(0!==_){do{for(o=p-1;0===e.bl_count[o];)o--;e.bl_count[o]--,e.bl_count[o+1]+=2,e.bl_count[p]--,_-=2}while(_>0);for(o=p;0!==o;o--)for(n=e.bl_count[o];0!==n;)i=e.heap[--r],i>l||(u[2*i+1]!==o&&(e.opt_len+=(o-u[2*i+1])*u[2*i],u[2*i+1]=o),n--)}}function d(e,t,r){var n,i,o=new Array(X+1),s=0;for(n=1;X>=n;n++)o[n]=s=s+r[n-1]<<1;for(i=0;t>=i;i++){var a=e[2*i+1];0!==a&&(e[2*i]=c(o[a]++,a))}}function p(){var e,t,r,n,o,s=new Array(X+1);for(r=0,n=0;G-1>n;n++)for(ct[n]=r,e=0;e<1<n;n++)for(ft[n]=o,e=0;e<1<>=7;W>n;n++)for(ft[n]=o<<7,e=0;e<1<=t;t++)s[t]=0;for(e=0;143>=e;)st[2*e+1]=8,e++,s[8]++;for(;255>=e;)st[2*e+1]=9,e++,s[9]++;for(;279>=e;)st[2*e+1]=7,e++,s[7]++;for(;287>=e;)st[2*e+1]=8,e++,s[8]++;for(d(st,q+1,s),e=0;W>e;e++)at[2*e+1]=5,at[2*e]=c(e,5);ht=new i(st,tt,V+1,q,X),dt=new i(at,rt,0,W,X),pt=new i(new Array(0),nt,0,Z,J)}function _(e){var t;for(t=0;q>t;t++)e.dyn_ltree[2*t]=0;for(t=0;W>t;t++)e.dyn_dtree[2*t]=0;for(t=0;Z>t;t++)e.bl_tree[2*t]=0;e.dyn_ltree[2*K]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function m(e){e.bi_valid>8?a(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function g(e,t,r,n){m(e),n&&(a(e,r),a(e,~r)),z.arraySet(e.pending_buf,e.window,t,r,e.pending),e.pending+=r}function v(e,t,r,n){var i=2*t,o=2*r;return e[i]r;r++)0!==o[2*r]?(e.heap[++e.heap_len]=l=r,e.depth[r]=0):o[2*r+1]=0;for(;e.heap_len<2;)i=e.heap[++e.heap_len]=2>l?++l:0,o[2*i]=1,e.depth[i]=0,e.opt_len--,a&&(e.static_len-=s[2*i+1]);for(t.max_code=l,r=e.heap_len>>1;r>=1;r--)y(e,o,r);i=u;do r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],y(e,o,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,o[2*i]=o[2*r]+o[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,o[2*r+1]=o[2*n+1]=i,e.heap[1]=i++,y(e,o,1);while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],h(e,t),d(o,l,e.bl_count)}function w(e,t,r){var n,i,o=-1,s=t[1],a=0,u=7,l=4;for(0===s&&(u=138,l=3),t[2*(r+1)+1]=65535,n=0;r>=n;n++)i=s,s=t[2*(n+1)+1],++aa?e.bl_tree[2*i]+=a:0!==i?(i!==o&&e.bl_tree[2*i]++,e.bl_tree[2*$]++):10>=a?e.bl_tree[2*Q]++:e.bl_tree[2*et]++,a=0,o=i,0===s?(u=138,l=3):i===s?(u=6,l=3):(u=7,l=4))}function k(e,t,r){var n,i,o=-1,s=t[1],a=0,c=7,f=4;for(0===s&&(c=138,f=3),n=0;r>=n;n++)if(i=s,s=t[2*(n+1)+1],!(++aa){do l(e,i,e.bl_tree);while(0!==--a)}else 0!==i?(i!==o&&(l(e,i,e.bl_tree),a--),l(e,$,e.bl_tree),u(e,a-3,2)):10>=a?(l(e,Q,e.bl_tree),u(e,a-3,3)):(l(e,et,e.bl_tree),u(e,a-11,7));a=0,o=i,0===s?(c=138,f=3):i===s?(c=6,f=3):(c=7,f=4)}}function A(e){var t;for(w(e,e.dyn_ltree,e.l_desc.max_code),w(e,e.dyn_dtree,e.d_desc.max_code),x(e,e.bl_desc),t=Z-1;t>=3&&0===e.bl_tree[2*it[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}function T(e,t,r,n){var i;for(u(e,t-257,5),u(e,r-1,5),u(e,n-4,4),i=0;n>i;i++)u(e,e.bl_tree[2*it[i]+1],3);k(e,e.dyn_ltree,t-1),k(e,e.dyn_dtree,r-1)}function E(e){var t,r=4093624447;for(t=0;31>=t;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return j;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return L;for(t=32;V>t;t++)if(0!==e.dyn_ltree[2*t])return L;return j}function S(e){_t||(p(),_t=!0),e.l_desc=new o(e.dyn_ltree,ht),e.d_desc=new o(e.dyn_dtree,dt),e.bl_desc=new o(e.bl_tree,pt),e.bi_buf=0,e.bi_valid=0,_(e)}function R(e,t,r,n){u(e,(C<<1)+(n?1:0),3),g(e,t,r,!0)}function M(e){u(e,F<<1,3),l(e,K,st),f(e)}function P(e,t,r,n){var i,o,s=0;e.level>0?(e.strm.data_type===I&&(e.strm.data_type=E(e)),x(e,e.l_desc),x(e,e.d_desc),s=A(e),i=e.opt_len+3+7>>>3,o=e.static_len+3+7>>>3,i>=o&&(i=o)):i=o=r+5,i>=r+4&&-1!==t?R(e,t,r,n):e.strategy===N||o===i?(u(e,(F<<1)+(n?1:0),3),b(e,st,at)):(u(e,(U<<1)+(n?1:0),3),T(e,e.l_desc.max_code+1,e.d_desc.max_code+1,s+1),b(e,e.dyn_ltree,e.dyn_dtree)),_(e),n&&m(e)}function O(e,t,r){return e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(lt[r]+V+1)]++,e.dyn_dtree[2*s(t)]++),e.last_lit===e.lit_bufsize-1}var z=e("../utils/common"),N=4,j=0,L=1,I=2,C=0,F=1,U=2,D=3,B=258,G=29,V=256,q=V+1+G,W=30,Z=19,H=2*q+1,X=15,Y=16,J=7,K=256,$=16,Q=17,et=18,tt=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],rt=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],nt=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],it=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],ot=512,st=new Array(2*(q+2));n(st);var at=new Array(2*W);n(at);var ut=new Array(ot);n(ut);var lt=new Array(B-D+1);n(lt);var ct=new Array(G);n(ct);var ft=new Array(W);n(ft);var ht,dt,pt,_t=!1;r._tr_init=S,r._tr_stored_block=R,r._tr_flush_block=P,r._tr_tally=O,r._tr_align=M},{"../utils/common":161}],173:[function(e,t){"use strict";function r(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}t.exports=r},{}],174:[function(e,t){"use strict";function r(e){return this instanceof r?(u.call(this,e),l.call(this,e),e&&e.readable===!1&&(this.readable=!1),e&&e.writable===!1&&(this.writable=!1),this.allowHalfOpen=!0,e&&e.allowHalfOpen===!1&&(this.allowHalfOpen=!1),void this.once("end",n)):new r(e)}function n(){this.allowHalfOpen||this._writableState.ended||s(i,this)}function i(e){e.end()}var o=Object.keys||function(e){var t=[];for(var r in e)t.push(r);return t};t.exports=r;var s=e("process-nextick-args"),a=e("core-util-is");a.inherits=e("inherits");var u=e("./_stream_readable"),l=e("./_stream_writable");a.inherits(r,u);for(var c=o(l.prototype),f=0;f0)if(t.ended&&!i){var a=new Error("stream.push() after EOF");e.emit("error",a)}else if(t.endEmitted&&i){var a=new Error("stream.unshift() after end event");e.emit("error",a)}else{var u;!t.decoder||i||n||(r=t.decoder.write(r),u=!t.objectMode&&0===r.length),i||(t.reading=!1),u||(t.flowing&&0===t.length&&!t.sync?(e.emit("data",r),e.read(0)):(t.length+=t.objectMode?1:r.length,i?t.buffer.unshift(r):t.buffer.push(r),t.needReadable&&f(e))),d(e,t)}else i||(t.reading=!1);return s(t)}function s(e){return!e.ended&&(e.needReadable||e.length=L?e=L:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}function u(e,t){return 0===t.length&&t.ended?0:t.objectMode?0===e?0:1:null===e||isNaN(e)?t.flowing&&t.buffer.length?t.buffer[0].length:t.length:0>=e?0:(e>t.highWaterMark&&(t.highWaterMark=a(e)),e>t.length?t.ended?t.length:(t.needReadable=!0,0):e)}function l(e,t){var r=null;return S.isBuffer(t)||"string"==typeof t||null===t||void 0===t||e.objectMode||(r=new TypeError("Invalid non-string/buffer chunk")),r}function c(e,t){if(!t.ended){if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,f(e)}}function f(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(z("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?T(h,e):h(e))}function h(e){z("emit readable"),e.emit("readable"),y(e)}function d(e,t){t.readingMore||(t.readingMore=!0,T(p,e,t))}function p(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=i)r=o?n.join(""):1===n.length?n[0]:S.concat(n,i),n.length=0;else if(el&&e>u;l++){var a=n[0],f=Math.min(e-u,a.length);o?r+=a.slice(0,f):a.copy(r,u,0,f),f0)throw new Error("endReadable called on non-empty stream");t.endEmitted||(t.ended=!0,T(w,t,e))}function w(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function k(e,t){for(var r=0,n=e.length;n>r;r++)t(e[r],r)}function A(e,t){for(var r=0,n=e.length;n>r;r++)if(e[r]===t)return r;return-1}t.exports=i;var T=e("process-nextick-args"),E=e("isarray"),S=e("buffer").Buffer;i.ReadableState=n;var R,M=(e("events"),function(e,t){return e.listeners(t).length});!function(){try{R=e("stream")}catch(t){}finally{R||(R=e("events").EventEmitter)}}();var S=e("buffer").Buffer,P=e("core-util-is");P.inherits=e("inherits");var O=e("util"),z=void 0;z=O&&O.debuglog?O.debuglog("stream"):function(){};var N;P.inherits(i,R);var j,j;i.prototype.push=function(e,t){var r=this._readableState;return r.objectMode||"string"!=typeof e||(t=t||r.defaultEncoding,t!==r.encoding&&(e=new S(e,t),t="")),o(this,r,e,t,!1)},i.prototype.unshift=function(e){var t=this._readableState;return o(this,t,e,"",!0)},i.prototype.isPaused=function(){return this._readableState.flowing===!1},i.prototype.setEncoding=function(t){return N||(N=e("string_decoder/").StringDecoder),this._readableState.decoder=new N(t),this._readableState.encoding=t,this};var L=8388608;i.prototype.read=function(e){z("read",e);var t=this._readableState,r=e;if(("number"!=typeof e||e>0)&&(t.emittedReadable=!1),0===e&&t.needReadable&&(t.length>=t.highWaterMark||t.ended))return z("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?x(this):f(this),null;if(e=u(e,t),0===e&&t.ended)return 0===t.length&&x(this),null;var n=t.needReadable;z("need readable",n),(0===t.length||t.length-e0?b(e,t):null,null===i&&(t.needReadable=!0,e=0),t.length-=e,0!==t.length||t.ended||(t.needReadable=!0),r!==e&&t.ended&&0===t.length&&x(this),null!==i&&this.emit("data",i),i},i.prototype._read=function(){this.emit("error",new Error("not implemented"))},i.prototype.pipe=function(e,t){function n(e){z("onunpipe"),e===f&&o()}function i(){z("onend"),e.end()}function o(){z("cleanup"),e.removeListener("close",u),e.removeListener("finish",l),e.removeListener("drain",m),e.removeListener("error",a),e.removeListener("unpipe",n),f.removeListener("end",i),f.removeListener("end",o),f.removeListener("data",s),g=!0,!h.awaitDrain||e._writableState&&!e._writableState.needDrain||m()}function s(t){z("ondata");var r=e.write(t);!1===r&&(1!==h.pipesCount||h.pipes[0]!==e||1!==f.listenerCount("data")||g||(z("false write response, pause",f._readableState.awaitDrain),f._readableState.awaitDrain++),f.pause())}function a(t){z("onerror",t),c(),e.removeListener("error",a),0===M(e,"error")&&e.emit("error",t)}function u(){e.removeListener("finish",l),c()}function l(){z("onfinish"),e.removeListener("close",u),c()}function c(){z("unpipe"),f.unpipe(e)}var f=this,h=this._readableState;switch(h.pipesCount){case 0:h.pipes=e;break;case 1:h.pipes=[h.pipes,e];break;default:h.pipes.push(e)}h.pipesCount+=1,z("pipe count=%d opts=%j",h.pipesCount,t);var d=(!t||t.end!==!1)&&e!==r.stdout&&e!==r.stderr,p=d?i:o;h.endEmitted?T(p):f.once("end",p),e.on("unpipe",n);var m=_(f);e.on("drain",m);var g=!1;return f.on("data",s),e._events&&e._events.error?E(e._events.error)?e._events.error.unshift(a):e._events.error=[a,e._events.error]:e.on("error",a),e.once("close",u),e.once("finish",l),e.emit("pipe",f),h.flowing||(z("pipe resume"),f.resume()),e},i.prototype.unpipe=function(e){var t=this._readableState;if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this),this);if(!e){var r=t.pipes,n=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var i=0;n>i;i++)r[i].emit("unpipe",this);return this}var o=A(t.pipes,e);return-1===o?this:(t.pipes.splice(o,1),t.pipesCount-=1,1===t.pipesCount&&(t.pipes=t.pipes[0]),e.emit("unpipe",this),this)},i.prototype.on=function(e,t){var r=R.prototype.on.call(this,e,t);if("data"===e&&!1!==this._readableState.flowing&&this.resume(),"readable"===e&&!this._readableState.endEmitted){var n=this._readableState;n.readableListening||(n.readableListening=!0,n.emittedReadable=!1,n.needReadable=!0,n.reading?n.length&&f(this,n):T(m,this))}return r},i.prototype.addListener=i.prototype.on,i.prototype.resume=function(){var e=this._readableState;return e.flowing||(z("resume"),e.flowing=!0,g(this,e)),this},i.prototype.pause=function(){return z("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(z("pause"),this._readableState.flowing=!1,this.emit("pause")),this},i.prototype.wrap=function(e){var t=this._readableState,r=!1,n=this;e.on("end",function(){if(z("wrapped end"),t.decoder&&!t.ended){var e=t.decoder.end();e&&e.length&&n.push(e)}n.push(null)}),e.on("data",function(i){if(z("wrapped data"),t.decoder&&(i=t.decoder.write(i)),(!t.objectMode||null!==i&&void 0!==i)&&(t.objectMode||i&&i.length)){var o=n.push(i);o||(r=!0,e.pause())}});for(var i in e)void 0===this[i]&&"function"==typeof e[i]&&(this[i]=function(t){return function(){return e[t].apply(e,arguments)}}(i));var o=["error","close","destroy","pause","resume"];return k(o,function(t){e.on(t,n.emit.bind(n,t))}),n._read=function(t){z("wrapped _read",t),r&&(r=!1,e.resume())},n},i._fromList=b}).call(this,e("_process"))},{"./_stream_duplex":174,_process:8,buffer:2,"core-util-is":179,events:6,inherits:180,isarray:181,"process-nextick-args":182,"string_decoder/":183,util:1}],177:[function(e,t){"use strict";function r(e){this.afterTransform=function(t,r){return n(e,t,r)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null,this.writeencoding=null}function n(e,t,r){var n=e._transformState;n.transforming=!1;var i=n.writecb;if(!i)return e.emit("error",new Error("no writecb in Transform class"));n.writechunk=null,n.writecb=null,null!==r&&void 0!==r&&e.push(r),i(t);var o=e._readableState;o.reading=!1,(o.needReadable||o.length-1?setImmediate:k,T=e("buffer").Buffer;s.WritableState=o;var E=e("core-util-is");E.inherits=e("inherits");var S,R={deprecate:e("util-deprecate")};!function(){try{S=e("stream")}catch(t){}finally{S||(S=e("events").EventEmitter)}}();var T=e("buffer").Buffer;E.inherits(s,S);var M;o.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(o.prototype,"buffer",{get:R.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")})}catch(e){}}();var M;s.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe. Not readable."))},s.prototype.write=function(e,t,r){var i=this._writableState,o=!1;return"function"==typeof t&&(r=t,t=null),T.isBuffer(e)?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=n),i.ended?a(this,r):u(this,i,e,r)&&(i.pendingcb++,o=c(this,i,e,t,r)),o},s.prototype.cork=function(){var e=this._writableState;e.corked++},s.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.finished||e.bufferProcessing||!e.bufferedRequest||g(this,e))},s.prototype.setDefaultEncoding=function(e){if("string"==typeof e&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+e);this._writableState.defaultEncoding=e},s.prototype._write=function(e,t,r){r(new Error("not implemented"))},s.prototype._writev=null,s.prototype.end=function(e,t,r){var n=this._writableState;"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!==e&&void 0!==e&&this.write(e,t),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||x(this,n,r)}}).call(this,e("_process"))},{"./_stream_duplex":174,_process:8,buffer:2,"core-util-is":179,events:6,inherits:180,"process-nextick-args":182,"util-deprecate":184}],179:[function(e,t,r){(function(e){function t(e){return Array.isArray?Array.isArray(e):"[object Array]"===m(e)}function n(e){return"boolean"==typeof e}function i(e){return null===e}function o(e){return null==e}function s(e){return"number"==typeof e}function a(e){return"string"==typeof e}function u(e){return"symbol"==typeof e}function l(e){return void 0===e}function c(e){return"[object RegExp]"===m(e)}function f(e){return"object"==typeof e&&null!==e}function h(e){return"[object Date]"===m(e)}function d(e){return"[object Error]"===m(e)||e instanceof Error}function p(e){return"function"==typeof e}function _(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function m(e){return Object.prototype.toString.call(e)}r.isArray=t,r.isBoolean=n,r.isNull=i,r.isNullOrUndefined=o,r.isNumber=s,r.isString=a,r.isSymbol=u,r.isUndefined=l,r.isRegExp=c,r.isObject=f,r.isDate=h,r.isError=d,r.isFunction=p,r.isPrimitive=_,r.isBuffer=e.isBuffer}).call(this,{isBuffer:e("../../../../../../browserify/node_modules/insert-module-globals/node_modules/is-buffer/index.js")})},{"../../../../../../browserify/node_modules/insert-module-globals/node_modules/is-buffer/index.js":7}],180:[function(e,t,r){arguments[4][9][0].apply(r,arguments)},{dup:9}],181:[function(e,t,r){arguments[4][5][0].apply(r,arguments)},{dup:5}],182:[function(e,t){(function(e){"use strict";function r(t,r,n,i){if("function"!=typeof t)throw new TypeError('"callback" argument must be a function');var o,s,a=arguments.length;switch(a){case 0:case 1:return e.nextTick(t);case 2:return e.nextTick(function(){t.call(null,r)});case 3:return e.nextTick(function(){t.call(null,r,n)});case 4:return e.nextTick(function(){t.call(null,r,n,i)});default:for(o=new Array(a-1),s=0;s=this.charLength-this.charReceived?this.charLength-this.charReceived:e.length;if(e.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived=55296&&56319>=n)){if(this.charReceived=this.charLength=0,0===e.length)return t;break}this.charLength+=this.surrogateSize,t=""}this.detectIncompleteChar(e);var i=e.length;this.charLength&&(e.copy(this.charBuffer,0,e.length-this.charReceived,i),i-=this.charReceived),t+=e.toString(this.encoding,0,i);var i=t.length-1,n=t.charCodeAt(i);if(n>=55296&&56319>=n){var o=this.surrogateSize;return this.charLength+=o,this.charReceived+=o,this.charBuffer.copy(this.charBuffer,o,0,o),e.copy(this.charBuffer,0,0,o),t.substring(0,i)}return t},l.prototype.detectIncompleteChar=function(e){for(var t=e.length>=3?3:e.length;t>0;t--){var r=e[e.length-t]; -if(1==t&&r>>5==6){this.charLength=2;break}if(2>=t&&r>>4==14){this.charLength=3;break}if(3>=t&&r>>3==30){this.charLength=4;break}}this.charReceived=t},l.prototype.end=function(e){var t="";if(e&&e.length&&(t=this.write(e)),this.charReceived){var r=this.charReceived,n=this.charBuffer,i=this.encoding;t+=n.slice(0,r).toString(i)}return t}},{buffer:2}],184:[function(e,t){(function(e){function r(e,t){function r(){if(!i){if(n("throwDeprecation"))throw new Error(t);n("traceDeprecation")?console.trace(t):console.warn(t),i=!0}return e.apply(this,arguments)}if(n("noDeprecation"))return e;var i=!1;return r}function n(t){try{if(!e.localStorage)return!1}catch(r){return!1}var n=e.localStorage[t];return null==n?!1:"true"===String(n).toLowerCase()}t.exports=r}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],185:[function(e,t,r){var n=function(){try{return e("stream")}catch(t){}}();r=t.exports=e("./lib/_stream_readable.js"),r.Stream=n||r,r.Readable=r,r.Writable=e("./lib/_stream_writable.js"),r.Duplex=e("./lib/_stream_duplex.js"),r.Transform=e("./lib/_stream_transform.js"),r.PassThrough=e("./lib/_stream_passthrough.js")},{"./lib/_stream_duplex.js":174,"./lib/_stream_passthrough.js":175,"./lib/_stream_readable.js":176,"./lib/_stream_transform.js":177,"./lib/_stream_writable.js":178}],186:[function(e,t){"use strict";function r(e){var t;e&&e.length&&(t=e,e=t.length);var r=new Uint8Array(e||0);return t&&r.set(t),r.readUInt32LE=i.readUInt32LE,r.writeUInt32LE=i.writeUInt32LE,r.readInt32LE=i.readInt32LE,r.writeInt32LE=i.writeInt32LE,r.readFloatLE=i.readFloatLE,r.writeFloatLE=i.writeFloatLE,r.readDoubleLE=i.readDoubleLE,r.writeDoubleLE=i.writeDoubleLE,r.toString=i.toString,r.write=i.write,r.slice=i.slice,r.copy=i.copy,r._isBuffer=!0,r}function n(e){for(var t,r,n=e.length,i=[],o=0;n>o;o++){if(t=e.charCodeAt(o),t>55295&&57344>t){if(!r){t>56319||o+1===n?i.push(239,191,189):r=t;continue}if(56320>t){i.push(239,191,189),r=t;continue}t=r-55296<<10|t-56320|65536,r=null}else r&&(i.push(239,191,189),r=null);128>t?i.push(t):2048>t?i.push(t>>6|192,63&t|128):65536>t?i.push(t>>12|224,t>>6&63|128,63&t|128):i.push(t>>18|240,t>>12&63|128,t>>6&63|128,63&t|128)}return i}t.exports=r;var i,o,s,a=e("ieee754");i={readUInt32LE:function(e){return(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},writeUInt32LE:function(e,t){this[t]=e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24},readInt32LE:function(e){return(this[e]|this[e+1]<<8|this[e+2]<<16)+(this[e+3]<<24)},readFloatLE:function(e){return a.read(this,e,!0,23,4)},readDoubleLE:function(e){return a.read(this,e,!0,52,8)},writeFloatLE:function(e,t){return a.write(this,e,t,!0,23,4)},writeDoubleLE:function(e,t){return a.write(this,e,t,!0,52,8)},toString:function(e,t,r){var n="",i="";t=t||0,r=Math.min(this.length,r||this.length);for(var o=t;r>o;o++){var s=this[o];127>=s?(n+=decodeURIComponent(i)+String.fromCharCode(s),i=""):i+="%"+s.toString(16)}return n+=decodeURIComponent(i)},write:function(e,t){for(var r=e===o?s:n(e),i=0;i>3,o=this.pos;e(i,t,this),this.pos===o&&this.skip(n)}return t},readMessage:function(e,t){return this.readFields(e,t,this.readVarint()+this.pos)},readFixed32:function(){var e=this.buf.readUInt32LE(this.pos);return this.pos+=4,e},readSFixed32:function(){var e=this.buf.readInt32LE(this.pos);return this.pos+=4,e},readFixed64:function(){var e=this.buf.readUInt32LE(this.pos)+this.buf.readUInt32LE(this.pos+4)*p;return this.pos+=8,e},readSFixed64:function(){var e=this.buf.readUInt32LE(this.pos)+this.buf.readInt32LE(this.pos+4)*p;return this.pos+=8,e},readFloat:function(){var e=this.buf.readFloatLE(this.pos);return this.pos+=4,e},readDouble:function(){var e=this.buf.readDoubleLE(this.pos);return this.pos+=8,e},readVarint:function(){var e,t,r,n,i,o,s=this.buf;if(r=s[this.pos++],128>r)return r;if(r=127&r,n=s[this.pos++],128>n)return r|n<<7;if(n=(127&n)<<7,i=s[this.pos++],128>i)return r|n|i<<14;if(i=(127&i)<<14,o=s[this.pos++],128>o)return r|n|i|o<<21;if(e=r|n|i|(127&o)<<21,t=s[this.pos++],e+=268435456*(127&t),128>t)return e;if(t=s[this.pos++],e+=34359738368*(127&t),128>t)return e;if(t=s[this.pos++],e+=4398046511104*(127&t),128>t)return e;if(t=s[this.pos++],e+=562949953421312*(127&t),128>t)return e;if(t=s[this.pos++],e+=72057594037927940*(127&t),128>t)return e;if(t=s[this.pos++],e+=0x8000000000000000*(127&t),128>t)return e;throw new Error("Expected varint not more than 10 bytes")},readVarint64:function(){var e=this.pos,t=this.readVarint();if(m>t)return t;for(var r=this.pos-2;255===this.buf[r];)r--;e>r&&(r=e),t=0;for(var n=0;r-e+1>n;n++){var i=127&~this.buf[e+n];t+=4>n?i<<7*n:i*Math.pow(2,7*n)}return-t-1},readSVarint:function(){var e=this.readVarint();return e%2===1?(e+1)/-2:e/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var e=this.readVarint()+this.pos,t=this.buf.toString("utf8",this.pos,e);return this.pos=e,t},readBytes:function(){var e=this.readVarint()+this.pos,t=this.buf.slice(this.pos,e);return this.pos=e,t},readPackedVarint:function(){for(var e=this.readVarint()+this.pos,t=[];this.pos127;);else if(t===n.Bytes)this.pos=this.readVarint()+this.pos;else if(t===n.Fixed32)this.pos+=4;else{if(t!==n.Fixed64)throw new Error("Unimplemented type: "+t);this.pos+=8}},writeTag:function(e,t){this.writeVarint(e<<3|t)},realloc:function(e){for(var t=this.length||16;t=e)this.realloc(1),this.buf[this.pos++]=e;else if(16383>=e)this.realloc(2),this.buf[this.pos++]=e>>>0&127|128,this.buf[this.pos++]=e>>>7&127;else if(2097151>=e)this.realloc(3),this.buf[this.pos++]=e>>>0&127|128,this.buf[this.pos++]=e>>>7&127|128,this.buf[this.pos++]=e>>>14&127;else if(268435455>=e)this.realloc(4),this.buf[this.pos++]=e>>>0&127|128,this.buf[this.pos++]=e>>>7&127|128,this.buf[this.pos++]=e>>>14&127|128,this.buf[this.pos++]=e>>>21&127;else{for(var t=this.pos;e>=128;)this.realloc(1),this.buf[this.pos++]=255&e|128,e/=128;if(this.realloc(1),this.buf[this.pos++]=0|e,this.pos-t>10)throw new Error("Given varint doesn't fit into 10 bytes")}},writeSVarint:function(e){this.writeVarint(0>e?2*-e-1:2*e)},writeBoolean:function(e){this.writeVarint(Boolean(e))},writeString:function(e){e=String(e);var t=d.byteLength(e);this.writeVarint(t),this.realloc(t),this.buf.write(e,this.pos),this.pos+=t},writeFloat:function(e){this.realloc(4),this.buf.writeFloatLE(e,this.pos),this.pos+=4},writeDouble:function(e){this.realloc(8),this.buf.writeDoubleLE(e,this.pos),this.pos+=8},writeBytes:function(e){var t=e.length;this.writeVarint(t),this.realloc(t);for(var r=0;t>r;r++)this.buf[this.pos++]=e[r]},writeMessage:function(e,t,r){this.writeTag(e,n.Bytes),this.pos++;var i=this.pos;t(r,this);var o=this.pos-i,s=127>=o?1:16383>=o?2:2097151>=o?3:268435455>=o?4:Math.ceil(Math.log(o)/(7*Math.LN2));if(s>1){this.realloc(s-1);for(var a=this.pos-1;a>=i;a--)this.buf[a+s-1]=this.buf[a]}this.pos=i-1,this.writeVarint(o),this.pos+=o},writePackedVarint:function(e,t){this.writeMessage(e,i,t)},writePackedSVarint:function(e,t){this.writeMessage(e,o,t)},writePackedBoolean:function(e,t){this.writeMessage(e,u,t)},writePackedFloat:function(e,t){this.writeMessage(e,s,t)},writePackedDouble:function(e,t){this.writeMessage(e,a,t)},writePackedFixed32:function(e,t){this.writeMessage(e,l,t)},writePackedSFixed32:function(e,t){this.writeMessage(e,c,t)},writePackedFixed64:function(e,t){this.writeMessage(e,f,t)},writePackedSFixed64:function(e,t){this.writeMessage(e,h,t)},writeBytesField:function(e,t){this.writeTag(e,n.Bytes),this.writeBytes(t)},writeFixed32Field:function(e,t){this.writeTag(e,n.Fixed32),this.writeFixed32(t)},writeSFixed32Field:function(e,t){this.writeTag(e,n.Fixed32),this.writeSFixed32(t)},writeFixed64Field:function(e,t){this.writeTag(e,n.Fixed64),this.writeFixed64(t)},writeSFixed64Field:function(e,t){this.writeTag(e,n.Fixed64),this.writeSFixed64(t)},writeVarintField:function(e,t){this.writeTag(e,n.Varint),this.writeVarint(t)},writeSVarintField:function(e,t){this.writeTag(e,n.Varint),this.writeSVarint(t)},writeStringField:function(e,t){this.writeTag(e,n.Bytes),this.writeString(t)},writeFloatField:function(e,t){this.writeTag(e,n.Fixed32),this.writeFloat(t)},writeDoubleField:function(e,t){this.writeTag(e,n.Fixed64),this.writeDouble(t)},writeBooleanField:function(e,t){this.writeVarintField(e,Boolean(t))}}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./buffer":186}],188:[function(e,t,r){arguments[4][4][0].apply(r,arguments)},{dup:4}],189:[function(e,t){"use stric";var r="\\/\\*",n="\\/\\*(?!\\*?\\!)",i="(.|[\\r\\n]|\\n)*?\\*\\/\\n?\\n?",o=/(^|[^\S\n])(?:\/\/)([\s\S]+?)$/gm,s=/(^|[^\S\n])(?:\/\/[^!])([\s\S]+?)$/gm,a=t.exports=function(e,t){return e?a.block(a.line(e,t),t):""};a.block=function(e,t){t=t||{};var o=new RegExp(r+i,"gm");return t.safe&&(o=new RegExp(n+i,"gm")),e?e.replace(o,""):""},a.line=function(e,t){t=t||{};var r=o;return t.safe&&(r=s),e?e.replace(r,""):""}},{}],190:[function(t,r,n){!function(t,i){"object"==typeof n&&"undefined"!=typeof r?i(n):"function"==typeof e&&e.amd?e(["exports"],i):i(t.topojson=t.topojson||{})}(this,function(e){"use strict";function t(e,t){var n=t.id,i=t.bbox,o=null==t.properties?{}:t.properties,s=r(e,t);return null==n&&null==i?{type:"Feature",properties:o,geometry:s}:null==i?{type:"Feature",id:n,properties:o,geometry:s}:{type:"Feature",id:n,bbox:i,properties:o,geometry:s}}function r(e,t){function r(e,t){t.length&&t.pop();for(var r=f[0>e?~e:e],i=0,o=r.length;o>i;++i)t.push(c(r[i].slice(),i));0>e&&n(t,o)}function i(e){return c(e.slice())}function s(e){for(var t=[],n=0,i=e.length;i>n;++n)r(e[n],t);return t.length<2&&t.push(t[0].slice()),t}function a(e){for(var t=s(e);t.length<4;)t.push(t[0].slice());return t}function u(e){return e.map(a)}function l(e){var t,r=e.type;switch(r){case"GeometryCollection":return{type:r,geometries:e.geometries.map(l)};case"Point":t=i(e.coordinates);break;case"MultiPoint":t=e.coordinates.map(i);break;case"LineString":t=s(e.arcs);break;case"MultiLineString":t=e.arcs.map(s);break;case"Polygon":t=u(e.arcs);break;case"MultiPolygon":t=e.arcs.map(u);break;default:return null}return{type:r,coordinates:t}}var c=o(e),f=e.arcs;return l(t)}var n=function(e,t){for(var r,n=e.length,i=n-t;i<--n;)r=e[i],e[i++]=e[n],e[n]=r},i=function(e){return e},o=function(e){if(null==(t=e.transform))return i;var t,r,n,o=t.scale[0],s=t.scale[1],a=t.translate[0],u=t.translate[1];return function(e,t){return t||(r=n=0),e[0]=(r+=e[0])*o+a,e[1]=(n+=e[1])*s+u,e}},s=function(e,r){return"GeometryCollection"===r.type?{type:"FeatureCollection",features:r.geometries.map(function(r){return t(e,r)})}:t(e,r)};e.feature=s,Object.defineProperty(e,"__esModule",{value:!0})})},{}],191:[function(e,t){t.exports.VectorTile=e("./lib/vectortile.js"),t.exports.VectorTileFeature=e("./lib/vectortilefeature.js"),t.exports.VectorTileLayer=e("./lib/vectortilelayer.js")},{"./lib/vectortile.js":192,"./lib/vectortilefeature.js":193,"./lib/vectortilelayer.js":194}],192:[function(e,t){"use strict";function r(e,t){this.layers=e.readFields(n,{},t)}function n(e,t,r){if(3===e){var n=new i(r,r.readVarint()+r.pos);n.length&&(t[n.name]=n)}}var i=e("./vectortilelayer");t.exports=r},{"./vectortilelayer":194}],193:[function(e,t){"use strict";function r(e,t,r,i,o){this.properties={},this.extent=r,this.type=0,this._pbf=e,this._geometry=-1,this._keys=i,this._values=o,e.readFields(n,this,t)}function n(e,t,r){1==e?t._id=r.readVarint():2==e?i(r,t):3==e?t.type=r.readVarint():4==e&&(t._geometry=r.pos)}function i(e,t){for(var r=e.readVarint()+e.pos;e.pos>3}if(i--,1===n||2===n)s+=e.readSVarint(),a+=e.readSVarint(),1===n&&(t&&u.push(t),t=[]),t.push(new o(s,a));else{if(7!==n)throw new Error("unknown command "+n);t.push(t[0].clone())}}return t&&u.push(t),u},r.prototype.bbox=function(){var e=this._pbf;e.pos=this._geometry;for(var t=e.readVarint()+e.pos,r=1,n=0,i=0,o=0,s=1/0,a=-1/0,u=1/0,l=-1/0;e.pos>3}if(n--,1===r||2===r)i+=e.readSVarint(),o+=e.readSVarint(),s>i&&(s=i),i>a&&(a=i),u>o&&(u=o),o>l&&(l=o);else if(7!==r)throw new Error("unknown command "+r)}return[s,u,a,l]},r.prototype.toGeoJSON=function(e,t,n){for(var i=this.extent*Math.pow(2,n),o=this.extent*e,s=this.extent*t,a=this.loadGeometry(),u=r.types[this.type],l=0;l>3;t=1===n?e.readString():2===n?e.readFloat():3===n?e.readDouble():4===n?e.readVarint64():5===n?e.readVarint():6===n?e.readSVarint():7===n?e.readBoolean():null}return t}var o=e("./vectortilefeature.js");t.exports=r,r.prototype.feature=function(e){if(0>e||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];var t=this._pbf.readVarint()+this._pbf.pos;return new o(this._pbf,t,this.extent,this._keys,this._values)}},{"./vectortilefeature.js":193}],195:[function(e,t){"use strict";function r(e,t){this.x=e,this.y=t}t.exports=r,r.prototype={clone:function(){return new r(this.x,this.y)},add:function(e){return this.clone()._add(e)},sub:function(e){return this.clone()._sub(e)},mult:function(e){return this.clone()._mult(e)},div:function(e){return this.clone()._div(e)},rotate:function(e){return this.clone()._rotate(e)},matMult:function(e){return this.clone()._matMult(e)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(e){return this.x===e.x&&this.y===e.y},dist:function(e){return Math.sqrt(this.distSqr(e))},distSqr:function(e){var t=e.x-this.x,r=e.y-this.y;return t*t+r*r},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(e){return Math.atan2(this.y-e.y,this.x-e.x)},angleWith:function(e){return this.angleWithSep(e.x,e.y)},angleWithSep:function(e,t){return Math.atan2(this.x*t-this.y*e,this.x*e+this.y*t)},_matMult:function(e){var t=e[0]*this.x+e[1]*this.y,r=e[2]*this.x+e[3]*this.y;return this.x=t,this.y=r,this},_add:function(e){return this.x+=e.x,this.y+=e.y,this},_sub:function(e){return this.x-=e.x,this.y-=e.y,this},_mult:function(e){return this.x*=e,this.y*=e,this},_div:function(e){return this.x/=e,this.y/=e,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var e=this.y;return this.y=this.x,this.x=-e,this},_rotate:function(e){var t=Math.cos(e),r=Math.sin(e),n=t*this.x-r*this.y,i=r*this.x+t*this.y;return this.x=n,this.y=i,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},r.convert=function(e){return e instanceof r?e:Array.isArray(e)?new r(e[0],e[1]):e}},{}],196:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function i(e,t,r){var n=u[0],i=u[1];return e[0]<=n.x+r&&t[0]<=n.x+r||e[0]>=i.x-r&&t[0]>=i.x-r||e[1]>=n.y-r&&t[1]>=n.y-r||e[1]<=i.y+r&&t[1]<=i.y+r?!0:!1}function o(e,t){t=t||0;var r=u[0],n=u[1];return e[0]<=r.x+t||e[0]>=n.x-t||e[1]>=r.y-t||e[1]<=n.y+t}Object.defineProperty(r,"__esModule",{value:!0}),r.default_uvs=r.tile_bounds=void 0,r.outsideTile=i,r.isCoordOutsideTile=o;{var s=e("../geo"),a=n(s),u=r.tile_bounds=[{x:0,y:0},{x:a.default.tile_scale,y:-a.default.tile_scale}];r.default_uvs=[0,0,1,1]}},{"../geo":201}],197:[function(e,t,r){"use strict";function n(e,t,r,n,s){var a=n.texcoord_index,u=n.position_index,l=n.shape_index,c=n.offset_index,f=s.quad,h=s.quad_normalize,d=s.offset,p=s.angle,_=s.shape_w,m=s.texcoord_scale,g=s.texcoord_normalize;h=h||1;var v=f[0]/2*h,y=f[1]/2*h,b=[[-v,-y],[v,-y],[v,y],[-v,y]],x=t.vertex_elements,w=t.vertex_count,k=void 0;if(a){g=g||1;var A=m||o.default_uvs,T=i(A,4),E=T[0],S=T[1],R=T[2],M=T[3];k=[[E,S],[R,S],[R,M],[E,M]]}for(var P=e.length,O=0;P>O;O++){for(var z=e[O],N=0;4>N;N++)a&&(r[a+0]=k[N][0]*g,r[a+1]=k[N][1]*g),r[u+0]=z[0],r[u+1]=z[1],r[l+0]=b[N][0],r[l+1]=b[N][1],r[l+2]=p,r[l+3]=_,r[c+0]=d[0],r[c+1]=d[1],t.addVertex(r);x.push(w+0),x.push(w+1),x.push(w+2),x.push(w+2),x.push(w+3),x.push(w+0),w+=4}}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){var r=[],n=!0,i=!1,o=void 0;try{for(var s,a=e[Symbol.iterator]();!(n=(s=a.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(u){i=!0,o=u}finally{try{!n&&a["return"]&&a["return"]()}finally{if(i)throw o}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();r.buildQuadsForPoints=n;var o=e("./common")},{"./common":196}],198:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function i(e,t,r,n){var i=n.texcoord_index,o=n.texcoord_scale,u=n.texcoord_normalize,c=t.vertex_elements;if(i){u=u||1;var f=o||h.default_uvs,d=a(f,4),_=d[0],m=d[1],g=d[2],v=d[3]}for(var y=e.length,b=0;y>b;b++){var x=t.vertex_count,w=e[b];if(i)var k=l.default.findBoundingBox(w),A=a(k,4),T=A[0],E=A[1],S=A[2],R=A[3],M=S-T,P=R-E,O=(g-_)/M,z=(v-m)/P;for(var N=0;Nz;z++)for(var N=e[z],j=0;jL;L++){var I=L,C=L+1;if(k=e[I],A=e[C],!w.default.isEqual(k,A)){if(c&&T.outsideTile(k,A,_)){p(k,M,[1,P],t),p(k,w.default.neg(M),[0,P],t),d(1,t);var F=a(e,I+1,_);return void(F&&r.push(F))}E=M,M=w.default.normalize(w.default.perp(k,A)),n===R.miter?f(P,k,E,M,g,!1,t):h(n,P,k,E,M,!1,t),P+=m*w.default.length(w.default.sub(A,k))}}k=A,E=M,o?(M=w.default.normalize(w.default.perp(k,e[1])),l(k,E,M,n,P,t)):(p(k,E,[1,P],t),p(k,w.default.neg(E),[0,P],t),d(1,t),T.isCoordOutsideTile(k)||v(k,P,E,i,!1,t))}}}function s(e){if(T.isCoordOutsideTile(e[0]))return 0;for(var t=0;t=2?e.slice(n):!1}function u(e,t,r,n,i){if(void 0===n||T.isCoordOutsideTile(e))p(e,r,[1,0],i),p(e,w.default.neg(r),[0,0],i);else{var o=0;n===R.miter?f(o,e,t,r,i.miter_len_sq,!0,i):h(n,o,e,t,r,!0,i)}}function l(e,t,r,n,i,o){if(T.isCoordOutsideTile(e))p(e,t,[1,i],o),p(e,w.default.neg(t),[0,i],o),d(1,o);else{var s=c(t,r);n===R.miter&&w.default.lengthSq(s)>o.miter_len_sq&&(n=R.bevel),n===R.miter?(p(e,s,[1,i],o),p(e,w.default.neg(s),[0,i],o),d(1,o)):(p(e,t,[1,i],o),p(e,w.default.neg(t),[0,i],o),d(1,o))}}function c(e,t){var r=w.default.normalize(w.default.add(e,t)),n=2/(1+Math.abs(w.default.dot(e,r)));return w.default.mult(r,n*n)}function f(e,t,r,n,i,o,s){var a=c(r,n);w.default.lengthSq(a)>i?h(R.miter,e,t,r,n,o,s):(p(t,a,[1,e],s),p(t,w.default.neg(a),[0,e],s),o||d(1,s))}function h(e,t,r,n,i,o,s){var a=c(n,i),u=i[0]*n[1]-i[1]*n[0]>0;u?(p(r,a,[1,t],s),p(r,w.default.neg(n),[0,t],s),o||d(1,s),e===R.bevel?g(r,w.default.neg(n),a,w.default.neg(i),[0,t],[1,t],[0,t],s):e===R.round&&m(r,w.default.neg(n),a,w.default.neg(i),[0,t],[1,t],[0,t],!1,s),p(r,a,[1,t],s),p(r,w.default.neg(i),[0,t],s)):(p(r,n,[1,t],s),p(r,w.default.neg(a),[0,t],s),o||d(1,s),e===R.bevel?g(r,n,w.default.neg(a),i,[1,t],[0,t],[1,t],s):e===R.round&&m(r,n,w.default.neg(a),i,[1,t],[0,t],[1,t],!1,s),p(r,i,[1,t],s),p(r,w.default.neg(a),[0,t],s))}function d(e,t){for(var r=t.vertex_data.vertex_elements,n=t.vertex_data.vertex_count,i=n-2*e-2,o=0;e>o;o++)r.push(i+2*o+2),r.push(i+2*o+1),r.push(i+2*o+0),r.push(i+2*o+2),r.push(i+2*o+3),r.push(i+2*o+1)}function p(e,t,r,n){var i=n.vertex_template,o=n.vertex_data;_(i,e,r,t,n),o.addVertex(i)}function _(e,t,r,n,i){e[0]=t[0],e[1]=t[1],i.texcoord_index&&r&&(e[i.texcoord_index+0]=r[0]*i.texcoord_normalize,e[i.texcoord_index+1]=r[1]*i.texcoord_normalize),i.scaling_index&&(e[i.scaling_index+0]=n[0]*i.scaling_normalize,e[i.scaling_index+1]=n[1]*i.scaling_normalize,e[i.scaling_index+2]=i.half_width)}function m(e,t,r,n,i,o,s,a,u){for(var l=t[0]*n[1]-t[1]*n[0],c=w.default.dot(t,n),f=Math.atan2(l,c);f>=Math.PI;)f-=2*Math.PI;var h=y(f,u.half_width);if(!(1>h)){var d=u.vertex_data.vertex_count,_=u.vertex_data.vertex_elements;p(e,r,o,u),p(e,t,i,u);var m=t;if(void 0!==u.texcoord_index){var g;if(a){g=[];var v=w.default.sub(i,o)}else{g=w.default.set(i);var b=w.default.div(w.default.sub(s,i),h)}}for(var x=f/h,k=0;h>k;k++)m=w.default.rot(m,x),void 0!==u.texcoord_index&&(a?(v=w.default.rot(v,x),g[0]=v[0]+o[0],g[1]=v[1]*u.texcoord_width*u.v_scale+o[1]):g=w.default.add(g,b)),p(e,m,g,u),_.push(d+k+(l>0?2:1)),_.push(d),_.push(d+k+(l>0?1:2))}}function g(e,t,r,n,i,o,s,a){var u=a.vertex_data.vertex_count;p(e,r,o,a),p(e,t,i,a),p(e,n,s,a);var l=t[0]*n[1]-t[1]*n[0]>0,c=a.vertex_data.vertex_elements;l?(c.push(u+2),c.push(u+0),c.push(u+1)):(c.push(u+1),c.push(u+0),c.push(u+2))}function v(e,t,r,n,i,o){var s=w.default.neg(r);switch(n){case S.square:var a;i?(a=[r[1],-r[0]],p(e,w.default.add(r,a),[1,t],o),p(e,w.default.add(s,a),[0,t],o),t+=.5*o.texcoord_width*o.v_scale,p(e,r,[1,t],o),p(e,s,[0,t],o)):(a=[-r[1],r[0]],p(e,r,[1,t],o),p(e,s,[0,t],o),t+=.5*o.texcoord_width*o.v_scale,p(e,w.default.add(r,a),[1,t],o),p(e,w.default.add(s,a),[0,t],o)),d(1,o);break;case S.round:var u,l,c,f,h;i?(u=r,l=s,void 0!==o.texcoord_index&&(t+=.5*o.texcoord_width*o.v_scale,c=[1,t],f=[0,t],h=[.5,t])):(u=s,l=r,void 0!==o.texcoord_index&&(c=[0,t],f=[1,t],h=[.5,t])),m(e,u,E,l,c,h,f,!0,o);break;case S.butt:return}}function y(e,t){0>e&&(e=-e);var r=t>2*M.MIN_FAN_WIDTH?Math.log2(t/M.MIN_FAN_WIDTH):1;return Math.ceil(e/Math.PI*r)}function b(e,t){for(var r=[],n=0;n2&&void 0!==arguments[2]?arguments[2]:{};s(this,e),this.view=r,this.position=n.position,this.zoom=n.zoom}return u(e,[{key:"update",value:function(){}},{key:"setupProgram",value:function(){}},{key:"updateView",value:function(){if(this.position||this.zoom){var e={};this.position&&(e={lng:this.position[0],lat:this.position[1],zoom:this.position[2]}),this.zoom&&(e.zoom=this.zoom),this.view.setView(e)}}},{key:"setupMatrices",value:function(e,t){d.mat4.multiply(e.model_view32,this.view_matrix,e.model),t.uniform("Matrix4fv","u_modelView",e.model_view32),d.mat3.normalFromMat4(e.normal32,e.model_view32),d.mat3.invert(e.inverse_normal32,e.normal32),t.uniform("Matrix3fv","u_normalMatrix",e.normal32),t.uniform("Matrix3fv","u_inverseNormalMatrix",e.inverse_normal32)}}],[{key:"create",value:function(e,t,r){switch(r.type){case"isometric":return new m(e,t,r);case"flat":return new g(e,t,r);case"perspective":default:return new _(e,t,r)}}}]),e}();r.default=p;var _=function(e){function t(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};s(this,t);var o=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r,n));return o.type="perspective",o.focal_length=n.focal_length,o.fov=n.fov,o.focal_length||o.fov||(o.focal_length=[[16,2],[17,2.5],[18,3],[19,4],[20,6]]),o.vanishing_point=n.vanishing_point||[0,0],o.vanishing_point=o.vanishing_point.map(parseFloat),o.vanishing_point_skew=[],o.position_meters=null,o.view_matrix=new Float64Array(16),o.projection_matrix=new Float32Array(16),h.default.replaceBlock("camera","\n uniform mat4 u_projection;\n uniform vec3 u_eye;\n uniform vec2 u_vanishing_point;\n\n void cameraProjection (inout vec4 position) {\n position = u_projection * position;\n }"),o -}return o(t,e),u(t,[{key:"constrainCamera",value:function(e){var t=e.view_height,r=e.height,n=e.focal_length,i=e.fov;return r?(n=2*r/t,i=2*Math.atan(1/n)):(n?i=2*Math.atan(1/n):i&&(i=i*Math.PI/180,n=1/Math.tan(i/2)),r=t/2*n),{view_height:t,height:r,focal_length:n,fov:i}}},{key:"updateMatrices",value:function(){var e=this.view.size.css.height*this.view.meters_per_pixel,t=this.constrainCamera({view_height:e,focal_length:c.default.interpolate(this.view.zoom,this.focal_length),fov:c.default.interpolate(this.view.zoom,this.fov)}),r=t.height,n=t.fov,i=[this.view.center.meters.x,this.view.center.meters.y,r];this.position_meters=i,d.mat4.lookAt(this.view_matrix,d.vec3.fromValues(i[0],i[1],0),d.vec3.fromValues(i[0],i[1],-1),d.vec3.fromValues(0,1,0)),d.mat4.perspective(this.projection_matrix,n,this.view.aspect,1,2*r),this.vanishing_point_skew[0]=this.vanishing_point[0]/this.view.size.css.width,this.vanishing_point_skew[1]=this.vanishing_point[1]/this.view.size.css.height,this.projection_matrix[8]=2*-this.vanishing_point_skew[0],this.projection_matrix[9]=2*-this.vanishing_point_skew[1],d.mat4.translate(this.projection_matrix,this.projection_matrix,d.vec3.fromValues(e/2*this.view.aspect*2*-this.vanishing_point_skew[0],e/2*2*-this.vanishing_point_skew[1],0)),d.mat4.translate(this.projection_matrix,this.projection_matrix,d.vec3.fromValues(0,0,-r))}},{key:"update",value:function(){a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"update",this).call(this),this.updateMatrices()}},{key:"setupProgram",value:function(e){e.uniform("Matrix4fv","u_projection",this.projection_matrix),e.uniform("3f","u_eye",[0,0,this.position_meters[2]]),e.uniform("2fv","u_vanishing_point",this.vanishing_point_skew)}}]),t}(p),m=function(e){function t(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};s(this,t);var o=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r,n));return o.type="isometric",o.axis=n.axis||{x:0,y:1},2===o.axis.length&&(o.axis={x:o.axis[0],y:o.axis[1]}),o.position_meters=null,o.viewport_height=null,o.view_matrix=new Float64Array(16),o.projection_matrix=new Float32Array(16),h.default.replaceBlock("camera","\n uniform mat4 u_projection;\n uniform vec3 u_eye;\n uniform vec2 u_vanishing_point;\n\n void cameraProjection (inout vec4 position) {\n position = u_projection * position;\n // position.xy += position.z * u_isometric_axis;\n\n // Reverse z for depth buffer so up is negative,\n // and scale down values so objects higher than one screen height will not get clipped\n // pull forward slightly to avoid going past far clipping plane\n position.z = -position.z / 100. + 1. - 0.001;\n }"),o}return o(t,e),u(t,[{key:"update",value:function(){a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"update",this).call(this),this.viewport_height=this.view.size.css.height*this.view.meters_per_pixel;var e=[this.view.center.meters.x,this.view.center.meters.y,this.viewport_height];this.position_meters=e,d.mat4.identity(this.view_matrix),d.mat4.translate(this.view_matrix,this.view_matrix,d.vec3.fromValues(-e[0],-e[1],0)),d.mat4.identity(this.projection_matrix),this.projection_matrix[8]=this.axis.x/this.view.aspect,this.projection_matrix[9]=this.axis.y,d.mat4.scale(this.projection_matrix,this.projection_matrix,d.vec3.fromValues(2/this.view.size.meters.x,2/this.view.size.meters.y,2/this.view.size.meters.y))}},{key:"setupProgram",value:function(e){e.uniform("Matrix4fv","u_projection",this.projection_matrix),e.uniform("3fv","u_eye",[0,0,this.viewport_height]),e.uniform("2fv","u_vanishing_point",[0,0])}}]),t}(p),g=function(e){function t(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};s(this,t);var o=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r,n));return o.type="flat",o}return o(t,e),u(t,[{key:"update",value:function(){this.axis.x=0,this.axis.y=0,a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"update",this).call(this)}}]),t}(m)},{"./gl/shader_program":207,"./utils/gl-matrix":256,"./utils/utils":265}],201:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,i=function(){function e(e,t){var r=[],n=!0,i=!1,o=void 0;try{for(var s,a=e[Symbol.iterator]();!(n=(s=a.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(u){i=!0,o=u}finally{try{!n&&a["return"]&&a["return"]()}finally{if(i)throw o}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();r.default=n={},n.default_source_max_zoom=18,n.default_view_max_zoom=20,n.tile_size=256,n.half_circumference_meters=20037508.342789244,n.circumference_meters=2*n.half_circumference_meters,n.min_zoom_meters_per_pixel=n.circumference_meters/n.tile_size;var o=[];n.metersPerPixel=function(e){return o[e]=o[e]||n.min_zoom_meters_per_pixel/Math.pow(2,e),o[e]};var s=[];n.metersPerTile=function(e){return s[e]=s[e]||n.circumference_meters/Math.pow(2,e),s[e]},n.tile_scale=4096,n.units_per_pixel=n.tile_scale/n.tile_size,n.height_scale=16;var a=[];n.unitsPerMeter=function(e){return a[e]=a[e]||n.tile_scale/(n.tile_size*n.metersPerPixel(e)),a[e]},n.metersForTile=function(e){return{x:e.x*n.circumference_meters/Math.pow(2,e.z)-n.half_circumference_meters,y:-(e.y*n.circumference_meters/Math.pow(2,e.z)-n.half_circumference_meters)}},n.tileForMeters=function(e,t){var r=i(e,2),o=r[0],s=r[1];return{x:Math.floor((o+n.half_circumference_meters)/(n.circumference_meters/Math.pow(2,t))),y:Math.floor((-s+n.half_circumference_meters)/(n.circumference_meters/Math.pow(2,t))),z:t}},n.wrapTile=function(e){var t=e.x,r=e.y,n=e.z,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{x:!0,y:!1},o=(1<180||-180>e)&&(e=((e+180)%360+360)%360-180),e},n.transformGeometry=function(e,t){null!=e&&("Point"===e.type?t(e.coordinates):"LineString"===e.type||"MultiPoint"===e.type?e.coordinates.forEach(t):"Polygon"===e.type||"MultiLineString"===e.type?e.coordinates.forEach(function(e){return e.forEach(t)}):"MultiPolygon"===e.type&&e.coordinates.forEach(function(e){e.forEach(function(e){return e.forEach(t)})}))},n.boxIntersect=function(e,t){return!(t.sw.x>e.ne.x||t.ne.xe.ne.y||t.ne.ys;s++){var a=e[0][s];a[0]r&&(r=a[0]),a[1]>i&&(i=a[1])}return[t,n,r,i]},n.geometryType=function(e){return"Polygon"===e||"MultiPolygon"===e?"polygon":"LineString"===e||"MultiLineString"===e?"line":"Point"===e||"MultiPoint"===e?"point":void 0},n.centroid=function(e){for(var t=0,r=0,n=0,i=e[0],o=i.length,s=0,a=o-1;o>s;a=s,s++){var u=i[s],l=i[a],c=u[1]*l[0]-l[1]*u[0];t+=(u[0]+l[0])*c,r+=(u[1]+l[1])*c,n+=3*c}return[t/n,r/n]},n.multiCentroid=function(e){for(var t=e.length,r=[0,0],i=0;in;n++){var i=e[n],o=e[n+1];t+=i[0]*o[1]-o[0]*i[1]}return t+=e[r-1][0]*e[0][1]-e[0][0]*e[r-1][1]},n.polygonRingArea=function(e){return Math.abs(n.signedPolygonRingAreaSum(e))/2},n.polygonArea=function(e){return n.polygonRingArea(e[0])},n.multiPolygonArea=function(e){for(var t=0,r=0;r0?"CW":0>t?"CCW":void 0}},{}],202:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;r.default=n={},n.BYTE=5120,n.UNSIGNED_BYTE=5121,n.SHORT=5122,n.UNSIGNED_SHORT=5123,n.INT=5124,n.UNSIGNED_INT=5125,n.FLOAT=5126},{}],203:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;r.default=n={},n.getContext=function(e,t){var r=!1;null==e&&(e=document.createElement("canvas"),e.style.position="absolute",e.style.top=0,e.style.left=0,e.style.zIndex=-1,document.body.appendChild(e),r=!0);var i=e.getContext("webgl",t)||e.getContext("experimental-webgl",t);if(!i)throw new Error("Couldn't create WebGL context.");return r?(n.resize(i,window.innerWidth,window.innerHeight,t.device_pixel_ratio),window.addEventListener("resize",function(){n.resize(i,window.innerWidth,window.innerHeight,t.device_pixel_ratio)})):n.resize(i,parseFloat(e.style.width),parseFloat(e.style.height),t.device_pixel_ratio),i},n.resize=function(e,t,r,n){n=n||window.devicePixelRatio||1,e.canvas.style.width=t+"px",e.canvas.style.height=r+"px",e.canvas.width=Math.round(t*n),e.canvas.height=Math.round(r*n),e.bindFramebuffer(e.FRAMEBUFFER,null),e.viewport(0,0,e.canvas.width,e.canvas.height)}},{}],204:[function(e,t,r){"use strict";function n(e,t){var r=i.filter(function(t){return t[0]===e})[0];return r=r&&r[1],r||(i.push([e,{}]),r=i[i.length-1][1]),r[t]||(r[t]=e.getExtension(t)),r[t]}Object.defineProperty(r,"__esModule",{value:!0}),r.default=n;var i=[]},{}],205:[function(e,t,r){"use strict";function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t=2&&o.length<=4?t.push({type:"vec"+o.length,method:o.length+"fv",name:r,value:o,key:i,uniforms:e}):o.length>4&&t.push({type:"float[]",method:"1fv",name:r+"[0]",value:o,key:i,uniforms:e});else if("string"==typeof o[0])for(n=0;n=2&&o[0].length<=4)for(n=0;n=2&&t.length<=4?r="vec"+t.length:(r="float",n=t.length):"string"==typeof t[0]&&(r="sampler2D",n=t.length):"boolean"==typeof t?r="bool":"string"==typeof t&&(r="sampler2D");var i="";return i+=r+" "+e,n&&(i+="["+n+"]"),i+=";\n"},i.defineUniform=function(e,t){return"uniform "+i.defineVariable(e,t)},i.isUniformDefined=function(e,t){var r=new RegExp("uniform[^;]+(?:{[\\s\\S]*})?[^;]*\\b"+e+"\\b","g");return t.match(r)?!0:!1},i.isSymbolReferenced=function(e,t){var r=new RegExp("\\b"+e+"\\b","g");return t.search(r)>=0?!0:!1},i.expandVec3=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=void 0;if(Array.isArray(e)){if(2!==e.length)return e;r=[].concat(n(e),[t]).map(parseFloat)}else r=[e,e,e].map(parseFloat);return r&&r.every(function(e){return"number"==typeof e&&!isNaN(e)})?r:void 0},i.expandVec4=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=void 0;if(Array.isArray(e)){if(3!==e.length)return e;r=[].concat(n(e),[t]).map(parseFloat)}else r=[e,e,e,t].map(parseFloat);return r&&r.every(function(e){return"number"==typeof e&&!isNaN(e)})?r:void 0}},{}],206:[function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r0?"precision highp float;\n":"precision mediump float;\n",i.TANGRAM_VERTEX_SHADER=!0,i.TANGRAM_FRAGMENT_SHADER=!1,this.computed_vertex_source=f+e.buildDefineString(i)+this.computed_vertex_source,i.TANGRAM_VERTEX_SHADER=!1,i.TANGRAM_FRAGMENT_SHADER=!0,this.computed_fragment_source=e.buildExtensionString(n)+f+e.buildDefineString(i)+this.computed_fragment_source,this.computed_vertex_source=this.computed_vertex_source.replace(b,""),this.computed_fragment_source=this.computed_fragment_source.replace(b,"");try{this.program=e.updateProgram(this.gl,this.program,this.computed_vertex_source,this.computed_fragment_source),this.compiled=!0,this.compiling=!1}catch(d){throw this.program=null,this.compiled=!1,this.compiling=!1,this.error=d,("vertex"===d.type||"fragment"===d.type)&&(this.shader_errors=d.errors,this.shader_errors.forEach(function(e){e.type=d.type,e.block=t.block(d.type,e.line)})),new Error("ShaderProgram.compile(): program "+this.id+" ("+this.name+") error:",d)}this.use(),this.refreshUniforms(),this.refreshAttributes()}},{key:"buildDefineList",value:function(){var t,r={};for(t in e.defines)r[t]=e.defines[t];for(t in this.defines)r[t]=this.defines[t];return r}},{key:"buildShaderBlockList",value:function(){var t=void 0,r={};for(t in e.blocks)if(r[t]=[],Array.isArray(e.blocks[t])){var n;(n=r[t]).push.apply(n,i(e.blocks[t].map(function(e,r){return{key:t,source:e,num:r,scope:"ShaderProgram"}})))}else r[t]=[{key:t,source:e.blocks[t],num:0,scope:"ShaderProgram"}];for(t in this.blocks)if(r[t]=r[t]||[],Array.isArray(this.blocks[t]))for(var o=this.block_scopes&&this.block_scopes[t]||[],s=null,a=0,u=0;u0&&(this.computed_vertex_source=i.join("\n")+this.computed_vertex_source),o.length>0&&(this.computed_fragment_source=o.join("\n")+this.computed_fragment_source)}}},{key:"setUniforms",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:!0;if(this.compiled){t&&(this.texture_unit=0);for(var r=c.default.parseUniforms(e),n=0;ni&&i1?r={scope:s[1],name:s[2],num:s[3]}:(s=o.match(/\/\/ tangram-block-end: ([A-Za-z0-9_-]+), ([A-Za-z0-9_-]+), (\d+)/),s&&s.length>1&&(r=null)),r&&(r.line=null==r.line?-1:r.line+1,r.source=o)}return r}},{key:"checkExtensions",value:function(){var e=this,t=[];return this.extensions.forEach(function(r){var n=p.default(e.gl,r),i="TANGRAM_EXTENSION_"+r;e.defines[i]=null!=n,n?t.push(r):u.default("debug","Could not enable extension '"+r+"'")}),t}}]),e}();r.default=x,x.id=0,x.current=null,x.defines={},x.blocks={},x.reset=function(){x.programs_by_source={},x.shaders_by_source={}},x.reset(),x.buildDefineString=function(e){var t="";for(var r in e)null!=e[r]&&e[r]!==!1&&(t+="boolean"==typeof e[r]&&e[r]===!0?"#define "+r+"\n":"number"==typeof e[r]&&Math.floor(e[r])===e[r]?"#define "+r+" "+e[r].toFixed(1)+"\n":"#define "+r+" "+e[r]+"\n");return t},x.buildExtensionString=function(e){e=e||[];var t="";return e.forEach(function(e){t+="#ifdef GL_"+e+"\n#extension GL_"+e+" : enable\n#endif\n"}),t},x.addBlock=function(e){var t;x.blocks[e]=x.blocks[e]||[];for(var r=arguments.length,n=Array(r>1?r-1:0),i=1;r>i;i++)n[i-1]=arguments[i];(t=x.blocks[e]).push.apply(t,n)},x.removeBlock=function(e){x.blocks[e]=[]},x.replaceBlock=function(e){x.removeBlock(e);for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;t>n;n++)r[n-1]=arguments[n];x.addBlock.apply(x,[e].concat(r))},x.updateProgram=function(e,t,r,n){var i=r+"::"+n;if(x.programs_by_source[i])return u.default("trace","Reusing identical source GL program object"),x.programs_by_source[i];try{var o=x.createShader(e,r,e.VERTEX_SHADER),s=x.createShader(e,n,e.FRAGMENT_SHADER)}catch(a){throw u.default("error",a.message),a}if(e.useProgram(null),null!=t)for(var l=e.getAttachedShaders(t),c=0;c2&&void 0!==arguments[2]?arguments[2]:{};i(this,e),this.gl=t,this.texture=t.createTexture(),this.texture&&(this.valid=!0),this.bind(),this.name=r,this.retain_count=0,this.source=null,this.source_type=null,this.config_type=null,this.loading=null,this.loaded=!1,this.filtering=n.filtering,this.sprites=n.sprites,this.texcoords={},this.sizes={},this.setData(1,1,new Uint8Array([0,0,0,255]),{filtering:"nearest"}),e.textures[this.name]&&(this.retain_count=e.textures[this.name].retain_count,e.textures[this.name].retain_count=0,e.textures[this.name].destroy()),e.textures[this.name]=this,e.texture_configs[this.name]=Object.assign({name:r},n),this.load(n),a.default("trace","creating Texture "+this.name)}return o(e,[{key:"destroy",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=t.force;return this.retain_count>0&&!r?void a.default("error","Texture '"+this.name+"': destroying texture with retain count of '"+this.retain_count+"'"):void(this.valid&&(this.gl.deleteTexture(this.texture),this.texture=null,delete this.data,this.data=null,delete e.textures[this.name],this.valid=!1,a.default("trace","destroying Texture "+this.name)))}},{key:"retain",value:function(){this.retain_count++}},{key:"release",value:function(){this.retain_count<=0&&a.default("error","Texture '"+this.name+"': releasing texture with retain count of '"+this.retain_count+"'"),this.retain_count--,this.retain_count<=0&&this.destroy()}},{key:"bind",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.valid&&(e.activeUnit!==t&&(this.gl.activeTexture(this.gl.TEXTURE0+t),e.activeUnit=t,e.boundTexture=null),e.boundTexture!==this.texture&&(this.gl.bindTexture(this.gl.TEXTURE_2D,this.texture),e.boundTexture=this.texture))}},{key:"load",value:function(e){var t=this;return e?(this.loading=null,"string"==typeof e.url?(this.config_type="url",this.setUrl(e.url,e)):e.element?(this.config_type="element",this.setElement(e.element,e)):e.data&&e.width&&e.height&&(this.config_type="data",this.setData(e.width,e.height,e.data,e)),this.loading=this.loading&&this.loading.then(function(){return t.calculateSprites(),t})||Promise.resolve(this),this.loading):this.loading||Promise.resolve(this)}},{key:"setUrl",value:function(t){var r=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.valid?(this.url=t,this.source=this.url,this.source_type="url",this.loading=new Promise(function(t){var i=new Image;i.onload=function(){try{r.setElement(i,n)}catch(o){r.loaded=!1,a.default("warn","Texture '"+r.name+"': failed to load url: '"+r.source+"'",o,n),e.trigger("warning",{message:"Failed to load texture from "+r.source,error:o,texture:n})}r.loaded=!0,t(r)},i.onerror=function(i){r.loaded=!1,a.default("warn","Texture '"+r.name+"': failed to load url: '"+r.source+"'",i,n),e.trigger("warning",{message:"Failed to load texture from "+r.source,error:i,texture:n}),t(r)},l.default.isSafari()&&"data:"===r.source.slice(0,5)||(i.crossOrigin="anonymous"),i.src=r.source}),this.loading):void 0}},{key:"setData",value:function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.width=e,this.height=t,this.source=r,this.source_type="data",Array.isArray(this.source)&&(this.source=new Uint8Array(this.source)),this.update(n),this.setFiltering(n),this.loaded=!0,this.loading=Promise.resolve(this),this.loading}},{key:"setElement",value:function(t,r){var n=t;if("string"==typeof t&&(t=document.querySelector(t)),t instanceof HTMLCanvasElement||t instanceof HTMLImageElement||t instanceof HTMLVideoElement)this.source=t,this.source_type="element",this.update(r),this.setFiltering(r);else{this.loaded=!1;var i="the 'element' parameter (`element: "+JSON.stringify(n)+"`) must be a CSS ";i+="selector string, or a , or